1 /*
2 * Copyright (c) 2023 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_sync/data_sync_manager.h"
17
18 #include <thread>
19 #include <vector>
20
21 #include "dfs_error.h"
22 #include "gallery_data_syncer.h"
23 #include "ipc/cloud_sync_callback_manager.h"
24 #include "sdk_helper.h"
25 #include "sync_rule/battery_status.h"
26 #include "sync_rule/cloud_status.h"
27 #include "sync_rule/network_status.h"
28 #include "utils_log.h"
29
30 namespace OHOS::FileManagement::CloudSync {
31
TriggerStartSync(const std::string & bundleName,const int32_t userId,bool forceFlag,SyncTriggerType triggerType)32 int32_t DataSyncManager::TriggerStartSync(const std::string &bundleName,
33 const int32_t userId,
34 bool forceFlag,
35 SyncTriggerType triggerType)
36 {
37 auto dataSyncer = GetDataSyncer(bundleName, userId);
38 if (!dataSyncer) {
39 LOGE("Get dataSyncer failed, bundleName: %{private}s", bundleName.c_str());
40 return E_INVAL_ARG;
41 }
42
43 auto ret = IsSkipSync(bundleName, userId);
44 if (ret != E_OK) {
45 return ret;
46 }
47 /* get sdk helper */
48 auto sdkHelper = std::make_shared<SdkHelper>();
49 ret = sdkHelper->Init(userId, bundleName);
50 if (ret != E_OK) {
51 LOGE("get sdk helper err %{public}d", ret);
52 return ret;
53 }
54
55 dataSyncer->SetSdkHelper(sdkHelper);
56 std::thread([dataSyncer, forceFlag, triggerType]() { dataSyncer->StartSync(forceFlag, triggerType); }).detach();
57
58 return E_OK;
59 }
60
TriggerStopSync(const std::string & bundleName,const int32_t userId,SyncTriggerType triggerType)61 int32_t DataSyncManager::TriggerStopSync(const std::string &bundleName,
62 const int32_t userId,
63 SyncTriggerType triggerType)
64 {
65 auto dataSyncer = GetDataSyncer(bundleName, userId);
66 if (!dataSyncer) {
67 LOGE("Get dataSyncer failed, bundleName: %{private}s", bundleName.c_str());
68 return E_INVAL_ARG;
69 }
70
71 /* get sdk helper */
72 auto sdkHelper = std::make_shared<SdkHelper>();
73 auto ret = sdkHelper->Init(userId, bundleName);
74 if (ret != E_OK) {
75 LOGE("get sdk helper err %{public}d", ret);
76 return ret;
77 }
78 dataSyncer->SetSdkHelper(sdkHelper);
79 std::thread([dataSyncer, triggerType]() { dataSyncer->StopSync(triggerType); }).detach();
80 return E_OK;
81 }
82
RegisterCloudSyncCallback(const std::string & bundleName,const int32_t userId)83 void DataSyncManager::RegisterCloudSyncCallback(const std::string &bundleName, const int32_t userId)
84 {
85 auto dataSyncer = GetDataSyncer(bundleName, userId);
86 if (!dataSyncer) {
87 LOGE("Get dataSyncer failed, bundleName: %{private}s", bundleName.c_str());
88 return;
89 }
90
91 /* notify app current sync state */
92 dataSyncer->NotifyCurrentSyncState();
93 }
94
StartDownloadFile(const std::string & bundleName,const int32_t userId,const std::string path)95 int32_t DataSyncManager::StartDownloadFile(const std::string &bundleName, const int32_t userId, const std::string path)
96 {
97 auto dataSyncer = GetDataSyncer(bundleName, userId);
98 if (!dataSyncer) {
99 LOGE("Get dataSyncer failed, bundleName: %{private}s", bundleName.c_str());
100 return E_INVAL_ARG;
101 }
102
103 /* get sdk helper */
104 auto sdkHelper = std::make_shared<SdkHelper>();
105 auto ret = sdkHelper->Init(userId, bundleName);
106 if (ret != E_OK) {
107 LOGE("get sdk helper err %{public}d", ret);
108 return ret;
109 }
110
111 dataSyncer->SetSdkHelper(sdkHelper);
112 std::thread([dataSyncer, path, userId]() { dataSyncer->StartDownloadFile(path, userId); }).detach();
113 return E_OK;
114 }
115
StopDownloadFile(const std::string & bundleName,const int32_t userId,const std::string path)116 int32_t DataSyncManager::StopDownloadFile(const std::string &bundleName, const int32_t userId, const std::string path)
117 {
118 auto dataSyncer = GetDataSyncer(bundleName, userId);
119 if (!dataSyncer) {
120 LOGE("Get dataSyncer failed, bundleName: %{private}s", bundleName.c_str());
121 return E_INVAL_ARG;
122 }
123 std::thread([dataSyncer, userId, path]() { dataSyncer->StopDownloadFile(path, userId); }).detach();
124 return E_OK;
125 }
126
RegisterDownloadFileCallback(const std::string & bundleName,const int32_t userId,const sptr<ICloudDownloadCallback> & downloadCallback)127 int32_t DataSyncManager::RegisterDownloadFileCallback(const std::string &bundleName,
128 const int32_t userId,
129 const sptr<ICloudDownloadCallback>& downloadCallback)
130 {
131 auto dataSyncer = GetDataSyncer(bundleName, userId);
132 if (!dataSyncer) {
133 LOGE("Get dataSyncer failed, bundleName: %{private}s", bundleName.c_str());
134 return E_INVAL_ARG;
135 }
136 std::thread([dataSyncer, userId, downloadCallback]() {
137 dataSyncer->RegisterDownloadFileCallback(userId, downloadCallback);
138 }).detach();
139 return E_OK;
140 }
141
UnregisterDownloadFileCallback(const std::string & bundleName,const int32_t userId)142 int32_t DataSyncManager::UnregisterDownloadFileCallback(const std::string &bundleName,
143 const int32_t userId)
144 {
145 auto dataSyncer = GetDataSyncer(bundleName, userId);
146 if (!dataSyncer) {
147 LOGE("Get dataSyncer failed, bundleName: %{private}s", bundleName.c_str());
148 return E_INVAL_ARG;
149 }
150 std::thread([dataSyncer, userId]() { dataSyncer->UnregisterDownloadFileCallback(userId); }).detach();
151 return E_OK;
152 }
153
TriggerRecoverySync(SyncTriggerType triggerType)154 int32_t DataSyncManager::TriggerRecoverySync(SyncTriggerType triggerType)
155 {
156 std::vector<std::string> needSyncApps;
157 {
158 std::lock_guard<std::mutex> lck(dataSyncMutex_);
159 if (currentUserId_ == INVALID_USER_ID) {
160 LOGE("useId is invalid");
161 return E_INVAL_ARG;
162 }
163
164 for (auto dataSyncer : dataSyncers_) {
165 if (dataSyncer->GetUserId() == currentUserId_) {
166 if ((triggerType == SyncTriggerType::NETWORK_AVAIL_TRIGGER) ||
167 (dataSyncer->GetSyncState() == SyncState::SYNC_FAILED)) {
168 auto bundleName = dataSyncer->GetBundleName();
169 needSyncApps.push_back(bundleName);
170 }
171 }
172 }
173 }
174
175 if (needSyncApps.size() == 0) {
176 LOGI("not need to trigger sync");
177 return E_OK;
178 }
179
180 int32_t ret = E_OK;
181 for (const auto &app : needSyncApps) {
182 ret = TriggerStartSync(app, currentUserId_, false, triggerType);
183 if (ret) {
184 LOGE("trigger sync failed, ret = %{public}d, bundleName = %{public}s", ret, app.c_str());
185 }
186 }
187 return ret;
188 }
189
GetDataSyncer(const std::string & bundleName,const int32_t userId)190 std::shared_ptr<DataSyncer> DataSyncManager::GetDataSyncer(const std::string &bundleName, const int32_t userId)
191 {
192 std::lock_guard<std::mutex> lck(dataSyncMutex_);
193 currentUserId_ = userId;
194 for (auto dataSyncer : dataSyncers_) {
195 if ((dataSyncer->GetBundleName() == bundleName) && (dataSyncer->GetUserId() == userId)) {
196 return dataSyncer;
197 }
198 }
199
200 std::shared_ptr<DataSyncer> dataSyncer_ = std::make_shared<GalleryDataSyncer>(bundleName, userId);
201 int32_t ret = dataSyncer_->Init(bundleName, userId);
202 if (ret != E_OK) {
203 return nullptr;
204 }
205 dataSyncers_.push_back(dataSyncer_);
206 return dataSyncer_;
207 }
208
IsSkipSync(const std::string & bundleName,const int32_t userId) const209 int32_t DataSyncManager::IsSkipSync(const std::string &bundleName, const int32_t userId) const
210 {
211 if (NetworkStatus::GetNetConnStatus() == NetworkStatus::NetConnStatus::NO_NETWORK) {
212 LOGE("network is not available");
213 return E_SYNC_FAILED_NETWORK_NOT_AVAILABLE;
214 }
215 if (!CloudStatus::IsCloudStatusOkay(bundleName, userId)) {
216 LOGE("cloud status is not OK");
217 return E_CLOUD_SDK;
218 }
219 if (!BatteryStatus::IsBatteryCapcityOkay()) {
220 return E_SYNC_FAILED_BATTERY_TOO_LOW;
221 }
222 return E_OK;
223 }
224
CleanCloudFile(const int32_t userId,const std::string & bundleName,const int action)225 int32_t DataSyncManager::CleanCloudFile(const int32_t userId, const std::string &bundleName, const int action)
226 {
227 LOGD("Enter function CleanCloudFile");
228 auto dataSyncer = GetDataSyncer(bundleName, userId);
229 if (!dataSyncer) {
230 LOGE(" Clean Get dataSyncer failed, bundleName: %{private}s", bundleName.c_str());
231 return E_INVAL_ARG;
232 }
233 /* get sdk helper */
234 auto sdkHelper = std::make_shared<SdkHelper>();
235 auto ret = sdkHelper->Init(userId, bundleName);
236 if (ret != E_OK) {
237 LOGE("get sdk helper err %{public}d", ret);
238 return ret;
239 }
240
241 dataSyncer->SetSdkHelper(sdkHelper);
242 LOGD("dataSyncer.bundleName_ is %s", dataSyncer->GetBundleName().c_str());
243 LOGD("dataSyncer.userId_ is %d", dataSyncer->GetUserId());
244 return dataSyncer->Clean(action);
245 }
246 } // namespace OHOS::FileManagement::CloudSync
247