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 #include "data_share_manager_impl.h"
17
18 #include <thread>
19
20 #include "datashare_errno.h"
21 #include "datashare_log.h"
22 #include "datashare_radar_reporter.h"
23 #include "ikvstore_data_service.h"
24 #include "ipc_skeleton.h"
25 #include "iservice_registry.h"
26 #include "system_ability_definition.h"
27 #include "rdb_subscriber_manager.h"
28 #include "published_data_subscriber_manager.h"
29
30 namespace OHOS {
31 namespace DataShare {
32
33 std::mutex DataShareManagerImpl::pmutex_;
34 DataShareManagerImpl* DataShareManagerImpl::manager_ = nullptr;
35
GetInstance()36 DataShareManagerImpl* DataShareManagerImpl::GetInstance()
37 {
38 if (manager_ != nullptr) {
39 return manager_;
40 }
41 std::lock_guard<std::mutex> lock(pmutex_);
42 if (manager_ != nullptr) {
43 return manager_;
44 }
45 manager_ = new DataShareManagerImpl();
46 if (manager_ == nullptr) {
47 LOG_ERROR("DataShareManagerImpl: GetInstance failed");
48 }
49 auto saManager = SystemAbilityManagerClient::GetInstance().GetSystemAbilityManager();
50 if (saManager == nullptr) {
51 LOG_ERROR("Failed to get saMgrProxy.");
52 return manager_;
53 }
54 sptr<DataShareClientStatusChangeStub> callback(new DataShareClientStatusChangeStub(manager_));
55 saManager->SubscribeSystemAbility(DISTRIBUTED_KV_DATA_SERVICE_ABILITY_ID, callback);
56 return manager_;
57 }
58
GetDistributedDataManager()59 sptr<DataShareKvServiceProxy> DataShareManagerImpl::GetDistributedDataManager()
60 {
61 auto manager = SystemAbilityManagerClient::GetInstance().GetSystemAbilityManager();
62 if (manager == nullptr) {
63 LOG_ERROR("get system ability manager failed");
64 return nullptr;
65 }
66 auto remoteObject = manager->CheckSystemAbility(DISTRIBUTED_KV_DATA_SERVICE_ABILITY_ID);
67 if (remoteObject == nullptr) {
68 LOG_ERROR("get distributed data manager failed");
69 return nullptr;
70 }
71 sptr<DataShareKvServiceProxy> proxy = new (std::nothrow)DataShareKvServiceProxy(remoteObject);
72 if (proxy == nullptr) {
73 LOG_ERROR("new DataShareKvServiceProxy fail.");
74 return nullptr;
75 }
76 return proxy;
77 }
78
LinkToDeath(const sptr<IRemoteObject> remote)79 void DataShareManagerImpl::LinkToDeath(const sptr<IRemoteObject> remote)
80 {
81 sptr<DataShareManagerImpl::ServiceDeathRecipient> deathRecipient = new (std::nothrow)
82 DataShareManagerImpl::ServiceDeathRecipient(this);
83 if (deathRecipient == nullptr) {
84 LOG_ERROR("DataShareManagerImpl::LinkToDeath new ServiceDeathRecipient error.");
85 return;
86 }
87 if (!remote->AddDeathRecipient(deathRecipient)) {
88 LOG_ERROR("add death recipient failed");
89 }
90 LOG_DEBUG("link to death success");
91 }
92
GetDataShareServiceProxy()93 sptr<DataShareServiceProxy> DataShareManagerImpl::GetDataShareServiceProxy()
94 {
95 if (dataMgrService_ == nullptr) {
96 dataMgrService_ = GetDistributedDataManager();
97 }
98 if (dataMgrService_ == nullptr) {
99 LOG_ERROR("Get distributed data manager failed!");
100 RADAR_REPORT(__FUNCTION__, RadarReporter::CREATE_DATASHARE_HELPER,
101 RadarReporter::DISTRIBUTEDDATA_START, RadarReporter::FAILED,
102 RadarReporter::ERROR_CODE, RadarReporter::DISTRIBUTEDDATA_NOT_START);
103 return nullptr;
104 }
105 auto remote = dataMgrService_->GetFeatureInterface("data_share");
106 if (remote == nullptr) {
107 LOG_ERROR("Get DataShare service failed!");
108 return nullptr;
109 }
110 RegisterClientDeathObserver();
111 return iface_cast<DataShareServiceProxy>(remote);
112 }
113
RegisterClientDeathObserver()114 void DataShareManagerImpl::RegisterClientDeathObserver()
115 {
116 if (dataMgrService_ == nullptr || bundleName_.empty()) {
117 return;
118 }
119 LOG_INFO("RegisterClientDeathObserver bundleName is %{public}s", bundleName_.c_str());
120 if (clientDeathObserverPtr_ == nullptr) {
121 clientDeathObserverPtr_ = new (std::nothrow) DataShareClientDeathObserverStub();
122 }
123 if (clientDeathObserverPtr_ == nullptr) {
124 LOG_WARN("new KvStoreClientDeathObserver failed");
125 return;
126 }
127 auto status = dataMgrService_->RegisterClientDeathObserver(bundleName_, clientDeathObserverPtr_);
128 if (!status) {
129 LOG_ERROR("RegisterClientDeathObserver failed, bundleName is %{public}s", bundleName_.c_str());
130 return;
131 }
132 }
133
DataShareManagerImpl()134 DataShareManagerImpl::DataShareManagerImpl()
135 {
136 SetDeathCallback([](std::shared_ptr<DataShareServiceProxy> proxy) {
137 LOG_INFO("RecoverObs start");
138 RdbSubscriberManager::GetInstance().RecoverObservers(proxy);
139 PublishedDataSubscriberManager::GetInstance().RecoverObservers(proxy);
140 });
141 }
142
~DataShareManagerImpl()143 DataShareManagerImpl::~DataShareManagerImpl()
144 {
145 }
146
GetProxy()147 std::shared_ptr<DataShareServiceProxy> DataShareManagerImpl::GetProxy()
148 {
149 if (dataShareService_ != nullptr) {
150 return dataShareService_;
151 }
152
153 std::lock_guard<std::mutex> lock(mutex_);
154 if (dataShareService_ != nullptr) {
155 return dataShareService_;
156 }
157
158 auto service = GetDataShareServiceProxy();
159 if (service == nullptr) {
160 return nullptr;
161 }
162 sptr<IDataShareService> serviceBase = service;
163 LinkToDeath(serviceBase->AsObject().GetRefPtr());
164 dataShareService_ = std::shared_ptr<DataShareServiceProxy>(
165 service.GetRefPtr(), [holder = service](const auto *) {});
166 return dataShareService_;
167 }
168
GetServiceProxy()169 std::shared_ptr<DataShareServiceProxy> DataShareManagerImpl::GetServiceProxy()
170 {
171 auto manager = DataShareManagerImpl::GetInstance();
172 if (manager == nullptr) {
173 LOG_ERROR("manager_ is nullptr");
174 return nullptr;
175 }
176 return manager->GetProxy();
177 }
178
ResetServiceHandle()179 void DataShareManagerImpl::ResetServiceHandle()
180 {
181 LOG_DEBUG("enter");
182 std::lock_guard<std::mutex> lock(mutex_);
183 dataMgrService_ = nullptr;
184 dataShareService_ = nullptr;
185 }
186
SetDeathCallback(std::function<void (std::shared_ptr<DataShareServiceProxy>)> deathCallback)187 void DataShareManagerImpl::SetDeathCallback(std::function<void(std::shared_ptr<DataShareServiceProxy>)> deathCallback)
188 {
189 deathCallback_ = deathCallback;
190 }
191
SetBundleName(const std::string & bundleName)192 void DataShareManagerImpl::SetBundleName(const std::string &bundleName)
193 {
194 bundleName_ = bundleName;
195 }
196
OnRemoteDied()197 void DataShareManagerImpl::OnRemoteDied()
198 {
199 LOG_INFO("#######datashare service has dead");
200 ResetServiceHandle();
201 }
202
SetRegisterCallback(GeneralControllerServiceImpl * ptr,std::function<void ()> registerCallback)203 void DataShareManagerImpl::SetRegisterCallback(GeneralControllerServiceImpl* ptr,
204 std::function<void()> registerCallback)
205 {
206 observers_.ComputeIfAbsent(ptr, [®isterCallback](const GeneralControllerServiceImpl*) {
207 return std::move(registerCallback);
208 });
209 }
210
RemoveRegisterCallback(GeneralControllerServiceImpl * ptr)211 void DataShareManagerImpl::RemoveRegisterCallback(GeneralControllerServiceImpl* ptr)
212 {
213 observers_.Erase(ptr);
214 }
215
OnAddSystemAbility(int32_t systemAbilityId,const std::string & deviceId)216 void DataShareManagerImpl::OnAddSystemAbility(int32_t systemAbilityId, const std::string& deviceId)
217 {
218 if (systemAbilityId != DISTRIBUTED_KV_DATA_SERVICE_ABILITY_ID) {
219 LOG_ERROR("SystemAbilityId must be DISTRIBUTED_KV_DATA_SERVICE_ABILITY_ID, but it is %{public}d",
220 systemAbilityId);
221 return;
222 }
223 observers_.ForEach([](const auto &, auto &callback) {
224 callback();
225 return false;
226 });
227 auto serviceProxy = GetServiceProxy();
228 if (serviceProxy != nullptr) {
229 deathCallback_(serviceProxy);
230 }
231 }
232
SetCallCount(const std::string & funcName,const std::string & uri)233 void DataShareManagerImpl::SetCallCount(const std::string &funcName, const std::string &uri)
234 {
235 dataShareCallReporter_.Count(funcName, uri);
236 }
237 }
238 }
239