17c804472Sopenharmony_ci/*
27c804472Sopenharmony_ci * Copyright (c) 2023 Huawei Device Co., Ltd.
37c804472Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License");
47c804472Sopenharmony_ci * you may not use this file except in compliance with the License.
57c804472Sopenharmony_ci * You may obtain a copy of the License at
67c804472Sopenharmony_ci *
77c804472Sopenharmony_ci *     http://www.apache.org/licenses/LICENSE-2.0
87c804472Sopenharmony_ci *
97c804472Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software
107c804472Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS,
117c804472Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
127c804472Sopenharmony_ci * See the License for the specific language governing permissions and
137c804472Sopenharmony_ci * limitations under the License.
147c804472Sopenharmony_ci */
157c804472Sopenharmony_ci
167c804472Sopenharmony_ci#include "location.h"
177c804472Sopenharmony_ci
187c804472Sopenharmony_ci#include "PreviewerEngineLog.h"
197c804472Sopenharmony_ci#include "SharedData.h"
207c804472Sopenharmony_ci#include "VirtualLocation.h"
217c804472Sopenharmony_ci
227c804472Sopenharmony_cistatic const int32_t RES_OK = 0;
237c804472Sopenharmony_cistatic const int32_t RES_ERROR = -1;
247c804472Sopenharmony_ci
257c804472Sopenharmony_ci#ifdef __cplusplus
267c804472Sopenharmony_ci#if __cplusplus
277c804472Sopenharmony_ciextern "C" {
287c804472Sopenharmony_ci#endif
297c804472Sopenharmony_ci#endif /* __cplusplus */
307c804472Sopenharmony_ci
317c804472Sopenharmony_ciconst char* GetGeoLocationType(void)
327c804472Sopenharmony_ci{
337c804472Sopenharmony_ci    return "gps";
347c804472Sopenharmony_ci}
357c804472Sopenharmony_ci
367c804472Sopenharmony_ciconst char* GetSupportedGeoCoordTypes()
377c804472Sopenharmony_ci{
387c804472Sopenharmony_ci    return "wgs84";
397c804472Sopenharmony_ci}
407c804472Sopenharmony_ci
417c804472Sopenharmony_ciint32_t GetGeoLocation(LocDataUpdateCallback callback, LocTimeoutCallback timeoutCallback, void *arg, uint32_t timeout)
427c804472Sopenharmony_ci{
437c804472Sopenharmony_ci    (void)timeoutCallback;
447c804472Sopenharmony_ci    (void)arg;
457c804472Sopenharmony_ci    (void)timeout;
467c804472Sopenharmony_ci    if (callback == nullptr) {
477c804472Sopenharmony_ci        ELOG("callback is nullptr");
487c804472Sopenharmony_ci        return RES_ERROR;
497c804472Sopenharmony_ci    }
507c804472Sopenharmony_ci    callback(VirtualLocation::GetInstance().GetMockPointer(), VirtualLocation::GetInstance().GetMockLen());
517c804472Sopenharmony_ci    return RES_OK;
527c804472Sopenharmony_ci}
537c804472Sopenharmony_ci
547c804472Sopenharmony_ciint32_t SubGeoLocation(LocDataUpdateCallback callback)
557c804472Sopenharmony_ci{
567c804472Sopenharmony_ci    callback(VirtualLocation::GetInstance().GetMockPointer(), VirtualLocation::GetInstance().GetMockLen());
577c804472Sopenharmony_ci    VirtualLocation::GetInstance().SetCallBack(callback);
587c804472Sopenharmony_ci    VirtualLocation::GetInstance().SetSubscribe(true);
597c804472Sopenharmony_ci    return RES_OK;
607c804472Sopenharmony_ci}
617c804472Sopenharmony_ci
627c804472Sopenharmony_civoid UnSubGeoLocation(LocDataUpdateCallback callback)
637c804472Sopenharmony_ci{
647c804472Sopenharmony_ci    if (callback == VirtualLocation::GetInstance().GetCallBack()) {
657c804472Sopenharmony_ci        VirtualLocation::GetInstance().SetSubscribe(false);
667c804472Sopenharmony_ci    }
677c804472Sopenharmony_ci}
687c804472Sopenharmony_ci
697c804472Sopenharmony_civoid DestroyGeoLocation(LocDataUpdateCallback callback)
707c804472Sopenharmony_ci{
717c804472Sopenharmony_ci    VirtualLocation::GetInstance().SetCallBack(callback);
727c804472Sopenharmony_ci    VirtualLocation::GetInstance().SetSubscribe(false);
737c804472Sopenharmony_ci}
747c804472Sopenharmony_ci
757c804472Sopenharmony_ciint32_t SerializeLocData(const int8_t *rawData, uint32_t len, LocationData *result)
767c804472Sopenharmony_ci{
777c804472Sopenharmony_ci    if (rawData != VirtualLocation::GetInstance().GetMockPointer()) {
787c804472Sopenharmony_ci        ELOG("Serialize rawData invalid.");
797c804472Sopenharmony_ci        return RES_ERROR;
807c804472Sopenharmony_ci    }
817c804472Sopenharmony_ci
827c804472Sopenharmony_ci    if (len != VirtualLocation::GetInstance().GetMockLen()) {
837c804472Sopenharmony_ci        ELOG("Serialize len invalid.");
847c804472Sopenharmony_ci        return RES_ERROR;
857c804472Sopenharmony_ci    }
867c804472Sopenharmony_ci
877c804472Sopenharmony_ci    if (result == nullptr) {
887c804472Sopenharmony_ci        ELOG("result is nullptr.");
897c804472Sopenharmony_ci        return RES_ERROR;
907c804472Sopenharmony_ci    }
917c804472Sopenharmony_ci
927c804472Sopenharmony_ci    result->accuracy = VirtualLocation::GetInstance().GetAccuracy();
937c804472Sopenharmony_ci    result->latitude = SharedData<double>::GetData(SharedDataType::LATITUDE);
947c804472Sopenharmony_ci    result->longitude = SharedData<double>::GetData(SharedDataType::LONGITUDE);
957c804472Sopenharmony_ci    result->time = VirtualLocation::GetInstance().GetTime();
967c804472Sopenharmony_ci    return RES_OK;
977c804472Sopenharmony_ci}
987c804472Sopenharmony_ci
997c804472Sopenharmony_ci#ifdef __cplusplus
1007c804472Sopenharmony_ci#if __cplusplus
1017c804472Sopenharmony_ci}
1027c804472Sopenharmony_ci#endif
1037c804472Sopenharmony_ci#endif  /* __cplusplus */
104