1 /* 2 * Copyright (c) 2024 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 "b_incremental_restore_session.h" 17 18 #include "b_error/b_error.h" 19 #include "b_radar/b_radar.h" 20 #include "filemgmt_libhilog.h" 21 #include "service_proxy.h" 22 #include "service_reverse.h" 23 24 namespace OHOS::FileManagement::Backup { 25 using namespace std; 26 ~BIncrementalRestoreSession()27 BIncrementalRestoreSession::~BIncrementalRestoreSession() 28 { 29 if (!deathRecipient_) { 30 HILOGI("Death Recipient is nullptr"); 31 return; 32 } 33 auto proxy = ServiceProxy::GetServiceProxyPointer(); 34 if (proxy == nullptr) { 35 return; 36 } 37 auto remoteObject = proxy->AsObject(); 38 if (remoteObject != nullptr) { 39 remoteObject->RemoveDeathRecipient(deathRecipient_); 40 } 41 deathRecipient_ = nullptr; 42 } 43 Init(Callbacks callbacks)44 unique_ptr<BIncrementalRestoreSession> BIncrementalRestoreSession::Init(Callbacks callbacks) 45 { 46 try { 47 HILOGI("Init IncrementalRestoreSession Begin"); 48 auto restore = make_unique<BIncrementalRestoreSession>(); 49 ServiceProxy::InvaildInstance(); 50 auto proxy = ServiceProxy::GetInstance(); 51 if (proxy == nullptr) { 52 HILOGI("Failed to get backup service"); 53 return nullptr; 54 } 55 int32_t res = proxy->InitRestoreSession(sptr(new ServiceReverse(callbacks))); 56 if (res != ERR_OK) { 57 HILOGE("Failed to Restore because of %{public}d", res); 58 AppRadar::Info info ("", "", "create restore session failed"); 59 AppRadar::GetInstance().RecordRestoreFuncRes(info, "BIncrementalRestoreSession::Init", 60 AppRadar::GetInstance().GetUserId(), BizStageRestore::BIZ_STAGE_CREATE_RESTORE_SESSION_FAIL, res); 61 return nullptr; 62 } 63 64 restore->RegisterBackupServiceDied(callbacks.onBackupServiceDied); 65 return restore; 66 } catch (const exception &e) { 67 HILOGE("Failed to Restore because of %{public}s", e.what()); 68 } 69 return nullptr; 70 } 71 PublishFile(BFileInfo fileInfo)72 ErrCode BIncrementalRestoreSession::PublishFile(BFileInfo fileInfo) 73 { 74 auto proxy = ServiceProxy::GetInstance(); 75 if (proxy == nullptr) { 76 return BError(BError::Codes::SDK_BROKEN_IPC, "Failed to get backup service").GetCode(); 77 } 78 return proxy->PublishIncrementalFile(fileInfo); 79 } 80 PublishSAFile(BFileInfo fileInfo,UniqueFd fd)81 ErrCode BIncrementalRestoreSession::PublishSAFile(BFileInfo fileInfo, UniqueFd fd) 82 { 83 auto proxy = ServiceProxy::GetInstance(); 84 if (proxy == nullptr) { 85 return BError(BError::Codes::SDK_BROKEN_IPC, "Failed to get backup service").GetCode(); 86 } 87 return proxy->PublishSAIncrementalFile(fileInfo, move(fd)); 88 } 89 GetFileHandle(const string & bundleName,const string & fileName)90 ErrCode BIncrementalRestoreSession::GetFileHandle(const string &bundleName, const string &fileName) 91 { 92 auto proxy = ServiceProxy::GetInstance(); 93 if (proxy == nullptr) { 94 return BError(BError::Codes::SDK_BROKEN_IPC, "Failed to get backup service").GetCode(); 95 } 96 97 return proxy->GetIncrementalFileHandle(bundleName, fileName); 98 } 99 AppendBundles(UniqueFd remoteCap,vector<BundleName> bundlesToRestore)100 ErrCode BIncrementalRestoreSession::AppendBundles(UniqueFd remoteCap, vector<BundleName> bundlesToRestore) 101 { 102 auto proxy = ServiceProxy::GetInstance(); 103 if (proxy == nullptr) { 104 return BError(BError::Codes::SDK_BROKEN_IPC, "Failed to get backup service").GetCode(); 105 } 106 ErrCode res = proxy->AppendBundlesRestoreSession(move(remoteCap), bundlesToRestore); 107 if (res != ERR_OK) { 108 std::string ss; 109 for (const auto &bundle : bundlesToRestore) { 110 ss += bundle + ", "; 111 } 112 AppRadar::Info info(ss.c_str(), "", ""); 113 AppRadar::GetInstance().RecordRestoreFuncRes(info, "BIncrementalRestoreSession::AppendBundles", 114 AppRadar::GetInstance().GetUserId(), BizStageRestore::BIZ_STAGE_APPEND_BUNDLES_FAIL, res); 115 } 116 return res; 117 } 118 AppendBundles(UniqueFd remoteCap,vector<BundleName> bundlesToRestore,std::vector<std::string> detailInfos)119 ErrCode BIncrementalRestoreSession::AppendBundles(UniqueFd remoteCap, vector<BundleName> bundlesToRestore, 120 std::vector<std::string> detailInfos) 121 { 122 auto proxy = ServiceProxy::GetInstance(); 123 if (proxy == nullptr) { 124 return BError(BError::Codes::SDK_BROKEN_IPC, "Failed to get backup service").GetCode(); 125 } 126 ErrCode res = proxy->AppendBundlesRestoreSession(move(remoteCap), bundlesToRestore, detailInfos); 127 if (res != ERR_OK) { 128 std::string ss; 129 for (const auto &bundle : bundlesToRestore) { 130 ss += bundle + ", "; 131 } 132 AppRadar::Info info(ss.c_str(), "", "AppendBundles with infos"); 133 AppRadar::GetInstance().RecordRestoreFuncRes(info, "BIncrementalRestoreSession::AppendBundles", 134 AppRadar::GetInstance().GetUserId(), BizStageRestore::BIZ_STAGE_APPEND_BUNDLES_FAIL, res); 135 } 136 return res; 137 } 138 Release()139 ErrCode BIncrementalRestoreSession::Release() 140 { 141 auto proxy = ServiceProxy::GetInstance(); 142 if (proxy == nullptr) { 143 return BError(BError::Codes::SDK_BROKEN_IPC, "Failed to get backup service").GetCode(); 144 } 145 146 return proxy->Release(); 147 } 148 RegisterBackupServiceDied(function<void ()> functor)149 void BIncrementalRestoreSession::RegisterBackupServiceDied(function<void()> functor) 150 { 151 auto proxy = ServiceProxy::GetInstance(); 152 if (proxy == nullptr || !functor) { 153 return; 154 } 155 auto remoteObj = proxy->AsObject(); 156 if (!remoteObj) { 157 throw BError(BError::Codes::SA_BROKEN_IPC, "Proxy's remote object can't be nullptr"); 158 } 159 160 auto callback = [functor](const wptr<IRemoteObject> &obj) { 161 HILOGI("Backup service died"); 162 ServiceProxy::InvaildInstance(); 163 functor(); 164 }; 165 deathRecipient_ = sptr(new SvcDeathRecipient(callback)); 166 remoteObj->AddDeathRecipient(deathRecipient_); 167 } 168 } // namespace OHOS::FileManagement::Backup