• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2022 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 #ifndef LOCATOR_CALLBACK_HOST_H
17 #define LOCATOR_CALLBACK_HOST_H
18 
19 #include "iremote_stub.h"
20 #include "napi/native_api.h"
21 #include "uv.h"
22 
23 #include "common_utils.h"
24 #include "constant_definition.h"
25 #include "i_locator_callback.h"
26 #include "location.h"
27 
28 namespace OHOS {
29 namespace Location {
30 class LocatorCallbackHost : public IRemoteStub<ILocatorCallback> {
31 public:
32     LocatorCallbackHost();
33     virtual ~LocatorCallbackHost();
34     virtual int OnRemoteRequest(uint32_t code,
35         MessageParcel& data, MessageParcel& reply, MessageOption& option) override;
36     void DoSendWork(uv_loop_s *&loop, uv_work_t *&work);
37     void DoSendErrorCode(uv_loop_s *&loop, uv_work_t *&work);
38     bool SendErrorCode(const int& errorCode);
39 
40     void OnLocationReport(const std::unique_ptr<Location>& location) override;
41     void OnLocatingStatusChange(const int status) override;
42     void OnErrorReport(const int errorCode) override;
43     void DeleteAllCallbacks();
44     void DeleteHandler();
45     void DeleteSuccessHandler();
46     void DeleteFailHandler();
47     void DeleteCompleteHandler();
48     void InitLatch();
49     bool IsSystemGeoLocationApi();
50     bool IsSingleLocationRequest();
51     void CountDown();
52     void Wait(int time);
53     int GetCount();
54     void SetCount(int count);
55 
56     template <typename T>
InitContext(T * context)57     bool InitContext(T* context)
58     {
59         if (context == nullptr) {
60             LBSLOGE(LOCATOR_CALLBACK, "context == nullptr.");
61             return false;
62         }
63         context->env = env_;
64         if (IsSystemGeoLocationApi()) {
65             context->callback[SUCCESS_CALLBACK] = successHandlerCb_;
66             context->callback[FAIL_CALLBACK] = failHandlerCb_;
67             context->callback[COMPLETE_CALLBACK] = completeHandlerCb_;
68         } else {
69             context->callback[SUCCESS_CALLBACK] = handlerCb_;
70             context->deferred = deferred_;
71         }
72         return true;
73     }
74 
GetEnv()75     inline napi_env GetEnv() const
76     {
77         return env_;
78     }
79 
SetEnv(const napi_env & env)80     inline void SetEnv(const napi_env& env)
81     {
82         env_ = env;
83     }
84 
GetHandleCb()85     inline napi_ref GetHandleCb() const
86     {
87         return handlerCb_;
88     }
89 
SetHandleCb(const napi_ref & handlerCb)90     inline void SetHandleCb(const napi_ref& handlerCb)
91     {
92         handlerCb_ = handlerCb;
93     }
94 
GetSuccHandleCb()95     inline napi_ref GetSuccHandleCb() const
96     {
97         return successHandlerCb_;
98     }
99 
SetSuccHandleCb(const napi_ref & successHandlerCb)100     inline void SetSuccHandleCb(const napi_ref& successHandlerCb)
101     {
102         successHandlerCb_ = successHandlerCb;
103     }
104 
GetFailHandleCb()105     inline napi_ref GetFailHandleCb() const
106     {
107         return failHandlerCb_;
108     }
109 
SetFailHandleCb(const napi_ref & failHandlerCb)110     inline void SetFailHandleCb(const napi_ref& failHandlerCb)
111     {
112         failHandlerCb_ = failHandlerCb;
113     }
114 
GetCompleteHandleCb()115     inline napi_ref GetCompleteHandleCb() const
116     {
117         return completeHandlerCb_;
118     }
119 
SetCompleteHandleCb(const napi_ref & completeHandlerCb)120     inline void SetCompleteHandleCb(const napi_ref& completeHandlerCb)
121     {
122         completeHandlerCb_ = completeHandlerCb;
123     }
124 
GetFixNumber()125     inline int GetFixNumber() const
126     {
127         return fixNumber_;
128     }
129 
SetFixNumber(const int fixNumber)130     inline void SetFixNumber(const int fixNumber)
131     {
132         fixNumber_ = fixNumber;
133     }
134 
GetDeferred()135     inline napi_deferred GetDeferred() const
136     {
137         return deferred_;
138     }
139 
SetDeferred(const napi_deferred & deferred)140     inline void SetDeferred(const napi_deferred& deferred)
141     {
142         deferred_ = deferred;
143     }
144 
SetLocationPriority(const int locationPriority)145     inline void SetLocationPriority(const int locationPriority)
146     {
147         locationPriority_ = locationPriority;
148     }
149 
GetLocationPriority()150     inline int GetLocationPriority()
151     {
152         return locationPriority_;
153     }
154 
GetSingleLocation()155     inline std::shared_ptr<Location> GetSingleLocation()
156     {
157         std::unique_lock<std::mutex> guard(mutex_);
158         return singleLocation_;
159     }
160     bool NeedSetSingleLocation(const std::unique_ptr<Location>& location);
161     bool IfReportAccuracyLocation();
162     void SetSingleLocation(const std::unique_ptr<Location>& location);
163 
164 private:
165     napi_env env_;
166     napi_ref handlerCb_;
167     napi_ref successHandlerCb_;
168     napi_ref failHandlerCb_;
169     napi_ref completeHandlerCb_;
170     int fixNumber_;
171     napi_deferred deferred_;
172     std::mutex mutex_;
173     CountDownLatch* latch_;
174     std::shared_ptr<Location> singleLocation_;
175     int locationPriority_;
176     bool inHdArea_;
177 };
178 } // namespace Location
179 } // namespace OHOS
180 #endif // LOCATOR_CALLBACK_HOST_H
181