• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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