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, [&registerCallback](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