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