1 /*
2 * Copyright (c) 2021 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 "dataobs_mgr_service.h"
17
18 #include <functional>
19 #include <memory>
20 #include <string>
21 #include <unistd.h>
22 #include "string_ex.h"
23
24 #include "dataobs_mgr_errors.h"
25 #include "hilog_wrapper.h"
26 #include "if_system_ability_manager.h"
27 #include "ipc_skeleton.h"
28 // #include "sa_mgr_client.h"
29 #include "system_ability_definition.h"
30
31 namespace OHOS {
32 namespace AAFwk {
33 const bool REGISTER_RESULT =
34 SystemAbility::MakeAndRegisterAbility(DelayedSingleton<DataObsMgrService>::GetInstance().get());
35
DataObsMgrService()36 DataObsMgrService::DataObsMgrService()
37 : SystemAbility(DATAOBS_MGR_SERVICE_SA_ID, true),
38 eventLoop_(nullptr),
39 handler_(nullptr),
40 state_(DataObsServiceRunningState::STATE_NOT_START)
41 {
42 dataObsMgrInner_ = std::make_shared<DataObsMgrInner>();
43 }
44
~DataObsMgrService()45 DataObsMgrService::~DataObsMgrService()
46 {}
47
OnStart()48 void DataObsMgrService::OnStart()
49 {
50 if (state_ == DataObsServiceRunningState::STATE_RUNNING) {
51 HILOG_INFO("Dataobs Manager Service has already started.");
52 return;
53 }
54 HILOG_INFO("Dataobs Manager Service started.");
55 if (!Init()) {
56 HILOG_ERROR("failed to init service.");
57 return;
58 }
59 state_ = DataObsServiceRunningState::STATE_RUNNING;
60 eventLoop_->Run();
61 /* Publish service maybe failed, so we need call this function at the last,
62 * so it can't affect the TDD test program */
63 bool ret = Publish(DelayedSingleton<DataObsMgrService>::GetInstance().get());
64 if (!ret) {
65 HILOG_ERROR("DataObsMgrService::Init Publish failed!");
66 return;
67 }
68
69 HILOG_INFO("Ability Manager Service start success.");
70 }
71
Init()72 bool DataObsMgrService::Init()
73 {
74 eventLoop_ = AppExecFwk::EventRunner::Create("DataObsMgrService");
75 if (eventLoop_ == nullptr) {
76 return false;
77 }
78
79 handler_ = std::make_shared<AppExecFwk::EventHandler>(eventLoop_);
80 if (handler_ == nullptr) {
81 return false;
82 }
83
84 HILOG_INFO("init success");
85 return true;
86 }
87
OnStop()88 void DataObsMgrService::OnStop()
89 {
90 HILOG_INFO("stop service");
91 eventLoop_.reset();
92 handler_.reset();
93 state_ = DataObsServiceRunningState::STATE_NOT_START;
94 }
95
QueryServiceState() const96 DataObsServiceRunningState DataObsMgrService::QueryServiceState() const
97 {
98 return state_;
99 }
100
RegisterObserver(const Uri & uri,const sptr<IDataAbilityObserver> & dataObserver)101 int DataObsMgrService::RegisterObserver(const Uri &uri, const sptr<IDataAbilityObserver> &dataObserver)
102 {
103 HILOG_INFO("DataObsMgrService::RegisterObserver called start");
104 if (dataObserver == nullptr) {
105 HILOG_ERROR("DataObsMgrService::RegisterObserver failed!. dataObserver is nullptr");
106 return DATA_OBSERVER_IS_NULL;
107 }
108
109 if (handler_ == nullptr) {
110 HILOG_ERROR("DataObsMgrService::RegisterObserver failed!. handler is nullptr");
111 return DATAOBS_SERVICE_HANDLER_IS_NULL;
112 }
113
114 if (dataObsMgrInner_ == nullptr) {
115 HILOG_ERROR("DataObsMgrService::RegisterObserver failed!. dataObsMgrInner_ is nullptr");
116 return DATAOBS_SERVICE_INNER_IS_NULL;
117 }
118
119 if (dataObsMgrInner_->CheckNeedLimmit()) {
120 return DATAOBS_SERVICE_TASK_LIMMIT;
121 }
122
123 if (dataObsMgrInner_->CheckRegisteFull(uri)) {
124 return DATAOBS_SERVICE_OBS_LIMMIT;
125 }
126
127 std::function <void()> registerObserverFunc =
128 std::bind(&DataObsMgrInner::HandleRegisterObserver, dataObsMgrInner_, uri, dataObserver);
129
130 dataObsMgrInner_->AtomicAddTaskCount();
131 bool ret = handler_->PostTask(registerObserverFunc);
132 if (!ret) {
133 dataObsMgrInner_->AtomicSubTaskCount();
134 HILOG_ERROR("DataObsMgrService::RegisterObserver PostTask error");
135 return DATAOBS_SERVICE_POST_TASK_FAILED;
136 }
137 HILOG_INFO("DataObsMgrService::RegisterObserver called end");
138 return NO_ERROR;
139 }
140
UnregisterObserver(const Uri & uri,const sptr<IDataAbilityObserver> & dataObserver)141 int DataObsMgrService::UnregisterObserver(const Uri &uri, const sptr<IDataAbilityObserver> &dataObserver)
142 {
143 HILOG_INFO("DataObsMgrService::UnregisterObserver called start");
144 if (dataObserver == nullptr) {
145 HILOG_ERROR("DataObsMgrService::UnregisterObserver failed!. dataObserver is nullptr");
146 return DATA_OBSERVER_IS_NULL;
147 }
148
149 if (handler_ == nullptr) {
150 HILOG_ERROR("DataObsMgrService::UnregisterObserver failed!. handler is nullptr");
151 return DATAOBS_SERVICE_HANDLER_IS_NULL;
152 }
153
154 if (dataObsMgrInner_ == nullptr) {
155 HILOG_ERROR("DataObsMgrService::UnregisterObserver failed!. dataObsMgrInner_ is nullptr");
156 return DATAOBS_SERVICE_INNER_IS_NULL;
157 }
158
159 if (dataObsMgrInner_->CheckNeedLimmit()) {
160 return DATAOBS_SERVICE_TASK_LIMMIT;
161 }
162
163 std::function <void()> unregisterObserverFunc =
164 std::bind(&DataObsMgrInner::HandleUnregisterObserver, dataObsMgrInner_, uri, dataObserver);
165
166 dataObsMgrInner_->AtomicAddTaskCount();
167 bool ret = handler_->PostSyncTask(unregisterObserverFunc);
168 if (!ret) {
169 dataObsMgrInner_->AtomicSubTaskCount();
170 HILOG_ERROR("DataObsMgrService::UnregisterObserver PostTask error");
171 return DATAOBS_SERVICE_POST_TASK_FAILED;
172 }
173 HILOG_INFO("DataObsMgrService::UnregisterObserver called end");
174 return NO_ERROR;
175 }
176
NotifyChange(const Uri & uri)177 int DataObsMgrService::NotifyChange(const Uri &uri)
178 {
179 HILOG_INFO("DataObsMgrService::NotifyChange called start");
180 if (handler_ == nullptr) {
181 HILOG_ERROR("DataObsMgrService::NotifyChange failed!. handler is nullptr");
182 return DATAOBS_SERVICE_HANDLER_IS_NULL;
183 }
184
185 if (dataObsMgrInner_ == nullptr) {
186 HILOG_ERROR("DataObsMgrService::NotifyChange failed!. dataObsMgrInner_ is nullptr");
187 return DATAOBS_SERVICE_INNER_IS_NULL;
188 }
189
190 if (dataObsMgrInner_->CheckNeedLimmit()) {
191 return DATAOBS_SERVICE_TASK_LIMMIT;
192 }
193
194 std::function <void()> notifyChangeFunc = std::bind(&DataObsMgrInner::HandleNotifyChange, dataObsMgrInner_, uri);
195
196 dataObsMgrInner_->AtomicAddTaskCount();
197 bool ret = handler_->PostTask(notifyChangeFunc);
198 if (!ret) {
199 dataObsMgrInner_->AtomicSubTaskCount();
200 HILOG_ERROR("DataObsMgrService::NotifyChange PostTask error");
201 return DATAOBS_SERVICE_POST_TASK_FAILED;
202 }
203 return NO_ERROR;
204 HILOG_INFO("DataObsMgrService::NotifyChange called end");
205 }
206
GetEventHandler()207 std::shared_ptr<EventHandler> DataObsMgrService::GetEventHandler()
208 {
209 return handler_;
210 }
211
212 } // namespace AAFwk
213 } // namespace OHOS
214