1 /*
2 * Copyright (c) 2023 Huawei Device Co., Ltd.
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at
6 *
7 * http://www.apache.org/licenses/LICENSE-2.0
8 *
9 * Unless required by applicable law or agreed to in writing, software
10 * distributed under the License is distributed on an "AS IS" BASIS,
11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 * See the License for the specific language governing permissions and
13 * limitations under the License.
14 */
15
16 #include "location.h"
17
18 #include "PreviewerEngineLog.h"
19 #include "SharedData.h"
20 #include "VirtualLocation.h"
21
22 using namespace std;
23
24 static const int32_t RES_OK = 0;
25 static const int32_t RES_ERROR = -1;
26
27 #ifdef __cplusplus
28 #if __cplusplus
29 extern "C" {
30 #endif
31 #endif /* __cplusplus */
32
GetGeoLocationType(void)33 const char* GetGeoLocationType(void)
34 {
35 return "gps";
36 }
37
GetSupportedGeoCoordTypes()38 const char* GetSupportedGeoCoordTypes()
39 {
40 return "wgs84";
41 }
42
GetGeoLocation(LocDataUpdateCallback callback,LocTimeoutCallback timeoutCallback,void * arg,uint32_t timeout)43 int32_t GetGeoLocation(LocDataUpdateCallback callback, LocTimeoutCallback timeoutCallback, void *arg, uint32_t timeout)
44 {
45 (void)timeoutCallback;
46 (void)arg;
47 (void)timeout;
48 if (callback == nullptr) {
49 ELOG("callback is nullptr");
50 return RES_ERROR;
51 }
52 callback(VirtualLocation::GetInstance().GetMockPointer(), VirtualLocation::GetInstance().GetMockLen());
53 return RES_OK;
54 }
55
SubGeoLocation(LocDataUpdateCallback callback)56 int32_t SubGeoLocation(LocDataUpdateCallback callback)
57 {
58 callback(VirtualLocation::GetInstance().GetMockPointer(), VirtualLocation::GetInstance().GetMockLen());
59 VirtualLocation::GetInstance().SetCallBack(callback);
60 VirtualLocation::GetInstance().SetSubscribe(true);
61 return RES_OK;
62 }
63
UnSubGeoLocation(LocDataUpdateCallback callback)64 void UnSubGeoLocation(LocDataUpdateCallback callback)
65 {
66 if (callback == VirtualLocation::GetInstance().GetCallBack()) {
67 VirtualLocation::GetInstance().SetSubscribe(false);
68 }
69 }
70
DestroyGeoLocation(LocDataUpdateCallback callback)71 void DestroyGeoLocation(LocDataUpdateCallback callback)
72 {
73 VirtualLocation::GetInstance().SetCallBack(callback);
74 VirtualLocation::GetInstance().SetSubscribe(false);
75 }
76
SerializeLocData(const int8_t * rawData,uint32_t len,LocationData * result)77 int32_t SerializeLocData(const int8_t *rawData, uint32_t len, LocationData *result)
78 {
79 if (rawData != VirtualLocation::GetInstance().GetMockPointer()) {
80 ELOG("Serialize rawData invalid.");
81 return RES_ERROR;
82 }
83
84 if (len != VirtualLocation::GetInstance().GetMockLen()) {
85 ELOG("Serialize len invalid.");
86 return RES_ERROR;
87 }
88
89 if (result == nullptr) {
90 ELOG("result is nullptr.");
91 return RES_ERROR;
92 }
93
94 result->accuracy = VirtualLocation::GetInstance().GetAccuracy();
95 result->latitude = SharedData<double>::GetData(SharedDataType::LATITUDE);
96 result->longitude = SharedData<double>::GetData(SharedDataType::LONGITUDE);
97 result->time = VirtualLocation::GetInstance().GetTime();
98 return RES_OK;
99 }
100
101 #ifdef __cplusplus
102 #if __cplusplus
103 }
104 #endif
105 #endif /* __cplusplus */
106