1 /*
2 * Copyright (c) 2022-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 "ext_extension_stub.h"
17
18 #include <cstdint>
19 #include <sstream>
20
21 #include "b_error/b_error.h"
22 #include "b_error/b_excep_utils.h"
23 #include "filemgmt_libhilog.h"
24
25 namespace OHOS::FileManagement::Backup {
26 using namespace std;
27
ExtExtensionStub()28 ExtExtensionStub::ExtExtensionStub()
29 {
30 opToInterfaceMap_[static_cast<uint32_t>(IExtensionInterfaceCode::CMD_GET_FILE_HANDLE)] =
31 &ExtExtensionStub::CmdGetFileHandle;
32 opToInterfaceMap_[static_cast<uint32_t>(IExtensionInterfaceCode::CMD_HANDLE_CLAER)] =
33 &ExtExtensionStub::CmdHandleClear;
34 opToInterfaceMap_[static_cast<uint32_t>(IExtensionInterfaceCode::CMD_HANDLE_BACKUP)] =
35 &ExtExtensionStub::CmdHandleBackup;
36 opToInterfaceMap_[static_cast<uint32_t>(IExtensionInterfaceCode::CMD_PUBLISH_FILE)] =
37 &ExtExtensionStub::CmdPublishFile;
38 opToInterfaceMap_[static_cast<uint32_t>(IExtensionInterfaceCode::CMD_HANDLE_RESTORE)] =
39 &ExtExtensionStub::CmdHandleRestore;
40 opToInterfaceMap_[static_cast<uint32_t>(IExtensionInterfaceCode::CMD_GET_INCREMENTAL_FILE_HANDLE)] =
41 &ExtExtensionStub::CmdGetIncrementalFileHandle;
42 opToInterfaceMap_[static_cast<uint32_t>(IExtensionInterfaceCode::CMD_PUBLISH_INCREMENTAL_FILE)] =
43 &ExtExtensionStub::CmdPublishIncrementalFile;
44 opToInterfaceMap_[static_cast<uint32_t>(IExtensionInterfaceCode::CMD_HANDLE_INCREMENTAL_BACKUP)] =
45 &ExtExtensionStub::CmdHandleIncrementalBackup;
46 opToInterfaceMap_[static_cast<uint32_t>(IExtensionInterfaceCode::CMD_GET_INCREMENTAL_BACKUP_FILE_HANDLE)] =
47 &ExtExtensionStub::CmdGetIncrementalBackupFileHandle;
48 opToInterfaceMap_[static_cast<uint32_t>(IExtensionInterfaceCode::CMD_GET_BACKUP_INFO)] =
49 &ExtExtensionStub::CmdGetBackupInfo;
50 opToInterfaceMap_[static_cast<uint32_t>(IExtensionInterfaceCode::CMD_INCREMENTAL_ON_BACKUP)] =
51 &ExtExtensionStub::CmdIncrementalOnBackup;
52 opToInterfaceMap_[static_cast<uint32_t>(IExtensionInterfaceCode::CMD_UPDATE_FD_SENDRATE)] =
53 &ExtExtensionStub::CmdUpdateFdSendRate;
54 opToInterfaceMap_[static_cast<uint32_t>(IExtensionInterfaceCode::CMD_HANDLE_USER_0_BACKUP)] =
55 &ExtExtensionStub::CmdHandleUser0Backup;
56 }
57
OnRemoteRequest(uint32_t code,MessageParcel & data,MessageParcel & reply,MessageOption & option)58 int32_t ExtExtensionStub::OnRemoteRequest(uint32_t code,
59 MessageParcel &data,
60 MessageParcel &reply,
61 MessageOption &option)
62 {
63 const std::u16string descriptor = ExtExtensionStub::GetDescriptor();
64 const std::u16string remoteDescriptor = data.ReadInterfaceToken();
65 if (descriptor != remoteDescriptor) {
66 return BError(BError::Codes::EXT_INVAL_ARG, "Invalid remote descriptor");
67 }
68
69 HILOGI("Begin to call procedure indexed %{public}u", code);
70 auto interfaceIndex = opToInterfaceMap_.find(code);
71 if (interfaceIndex == opToInterfaceMap_.end() || !interfaceIndex->second) {
72 HILOGE("Cannot response request %{public}d : unknown procedure", code);
73 return IPCObjectStub::OnRemoteRequest(code, data, reply, option);
74 }
75
76 return BExcepUltils::ExceptionCatcherLocked(
77 [&]() { return ErrCode((this->*(interfaceIndex->second))(data, reply)); });
78 }
79
CmdGetFileHandle(MessageParcel & data,MessageParcel & reply)80 ErrCode ExtExtensionStub::CmdGetFileHandle(MessageParcel &data, MessageParcel &reply)
81 {
82 string fileName;
83 if (!data.ReadString(fileName)) {
84 return BError(BError::Codes::EXT_INVAL_ARG, "Failed to receive fileName").GetCode();
85 }
86
87 int32_t errCode = ERR_OK;
88 UniqueFd fd = GetFileHandle(fileName, errCode);
89 bool fdFlag = fd < 0 ? false : true;
90 reply.WriteBool(fdFlag);
91 reply.WriteInt32(errCode);
92 if (fdFlag == true && !reply.WriteFileDescriptor(fd)) {
93 return BError(BError::Codes::EXT_BROKEN_IPC, "Failed to send out the file").GetCode();
94 }
95 return BError(BError::Codes::OK);
96 }
97
CmdHandleClear(MessageParcel & data,MessageParcel & reply)98 ErrCode ExtExtensionStub::CmdHandleClear(MessageParcel &data, MessageParcel &reply)
99 {
100 ErrCode res = HandleClear();
101 if (!reply.WriteInt32(res)) {
102 stringstream ss;
103 ss << "Failed to send the result " << res;
104 return BError(BError::Codes::EXT_BROKEN_IPC, ss.str()).GetCode();
105 }
106 return BError(BError::Codes::OK);
107 }
108
CmdHandleBackup(MessageParcel & data,MessageParcel & reply)109 ErrCode ExtExtensionStub::CmdHandleBackup(MessageParcel &data, MessageParcel &reply)
110 {
111 bool isClearData = true;
112 isClearData = data.ReadBool();
113 ErrCode res = HandleBackup(isClearData);
114 if (!reply.WriteInt32(res)) {
115 stringstream ss;
116 ss << "Failed to send the result " << res;
117 return BError(BError::Codes::EXT_BROKEN_IPC, ss.str()).GetCode();
118 }
119 return BError(BError::Codes::OK);
120 }
121
CmdPublishFile(MessageParcel & data,MessageParcel & reply)122 ErrCode ExtExtensionStub::CmdPublishFile(MessageParcel &data, MessageParcel &reply)
123 {
124 string fileName;
125 if (!data.ReadString(fileName)) {
126 return BError(BError::Codes::EXT_INVAL_ARG, "Failed to receive fileName");
127 }
128
129 ErrCode res = PublishFile(fileName);
130 if (!reply.WriteInt32(res)) {
131 stringstream ss;
132 ss << "Failed to send the result " << res;
133 return BError(BError::Codes::EXT_BROKEN_IPC, ss.str()).GetCode();
134 }
135 return BError(BError::Codes::OK);
136 }
137
CmdHandleRestore(MessageParcel & data,MessageParcel & reply)138 ErrCode ExtExtensionStub::CmdHandleRestore(MessageParcel &data, MessageParcel &reply)
139 {
140 bool isClearData = true;
141 isClearData = data.ReadBool();
142 ErrCode res = HandleRestore(isClearData);
143 if (!reply.WriteInt32(res)) {
144 stringstream ss;
145 ss << "Failed to send the result " << res;
146 return BError(BError::Codes::EXT_BROKEN_IPC, ss.str()).GetCode();
147 }
148 return BError(BError::Codes::OK);
149 }
150
CmdGetIncrementalFileHandle(MessageParcel & data,MessageParcel & reply)151 ErrCode ExtExtensionStub::CmdGetIncrementalFileHandle(MessageParcel &data, MessageParcel &reply)
152 {
153 string fileName;
154 if (!data.ReadString(fileName)) {
155 return BError(BError::Codes::EXT_INVAL_ARG, "Failed to receive fileName").GetCode();
156 }
157
158 auto[errCode, fd, reportFd] = GetIncrementalFileHandle(fileName);
159 if (!reply.WriteInt32(errCode)) {
160 return BError(BError::Codes::EXT_BROKEN_IPC, "Failed to send out the file").GetCode();
161 }
162 if (!reply.WriteFileDescriptor(fd)) {
163 return BError(BError::Codes::EXT_BROKEN_IPC, "Failed to send out the file").GetCode();
164 }
165 if (!reply.WriteFileDescriptor(reportFd)) {
166 return BError(BError::Codes::EXT_BROKEN_IPC, "Failed to send out the file").GetCode();
167 }
168 return BError(BError::Codes::OK);
169 }
170
CmdPublishIncrementalFile(MessageParcel & data,MessageParcel & reply)171 ErrCode ExtExtensionStub::CmdPublishIncrementalFile(MessageParcel &data, MessageParcel &reply)
172 {
173 string fileName;
174 if (!data.ReadString(fileName)) {
175 return BError(BError::Codes::EXT_INVAL_ARG, "Failed to receive fileName");
176 }
177
178 ErrCode res = PublishIncrementalFile(fileName);
179 if (!reply.WriteInt32(res)) {
180 stringstream ss;
181 ss << "Failed to send the result " << res;
182 return BError(BError::Codes::EXT_BROKEN_IPC, ss.str()).GetCode();
183 }
184 return BError(BError::Codes::OK);
185 }
186
CmdHandleIncrementalBackup(MessageParcel & data,MessageParcel & reply)187 ErrCode ExtExtensionStub::CmdHandleIncrementalBackup(MessageParcel &data, MessageParcel &reply)
188 {
189 UniqueFd incrementalFd(data.ReadFileDescriptor());
190 UniqueFd manifestFd(data.ReadFileDescriptor());
191 ErrCode res = HandleIncrementalBackup(move(incrementalFd), move(manifestFd));
192 if (!reply.WriteInt32(res)) {
193 stringstream ss;
194 ss << "Failed to send the result " << res;
195 return BError(BError::Codes::EXT_BROKEN_IPC, ss.str()).GetCode();
196 }
197 return BError(BError::Codes::OK);
198 }
199
CmdIncrementalOnBackup(MessageParcel & data,MessageParcel & reply)200 ErrCode ExtExtensionStub::CmdIncrementalOnBackup(MessageParcel &data, MessageParcel &reply)
201 {
202 bool isClearData = true;
203 isClearData = data.ReadBool();
204 ErrCode res = IncrementalOnBackup(isClearData);
205 if (!reply.WriteInt32(res)) {
206 stringstream ss;
207 ss << "Failed to send the result " << res;
208 return BError(BError::Codes::EXT_BROKEN_IPC, ss.str()).GetCode();
209 }
210 return BError(BError::Codes::OK);
211 }
212
CmdGetIncrementalBackupFileHandle(MessageParcel & data,MessageParcel & reply)213 ErrCode ExtExtensionStub::CmdGetIncrementalBackupFileHandle(MessageParcel &data, MessageParcel &reply)
214 {
215 auto [incrementalFd, manifestFd] = GetIncrementalBackupFileHandle();
216 if (!reply.WriteFileDescriptor(incrementalFd)) {
217 return BError(BError::Codes::EXT_BROKEN_IPC, "Failed to send out the file").GetCode();
218 }
219 if (!reply.WriteFileDescriptor(manifestFd)) {
220 return BError(BError::Codes::EXT_BROKEN_IPC, "Failed to send out the file").GetCode();
221 }
222 return BError(BError::Codes::OK);
223 }
224
CmdGetBackupInfo(MessageParcel & data,MessageParcel & reply)225 ErrCode ExtExtensionStub::CmdGetBackupInfo(MessageParcel &data, MessageParcel &reply)
226 {
227 HILOGI("CmdGetBackupInfo Begin");
228 std::string result;
229 int ret = GetBackupInfo(result);
230 if (!reply.WriteInt32(ret)) {
231 return BError(BError::Codes::EXT_BROKEN_IPC, "Failed to send out the ret").GetCode();
232 }
233 if (!reply.WriteString(result)) {
234 return BError(BError::Codes::EXT_BROKEN_IPC, "Failed to send out the result").GetCode();
235 }
236 return BError(BError::Codes::OK);
237 }
238
CmdUpdateFdSendRate(MessageParcel & data,MessageParcel & reply)239 ErrCode ExtExtensionStub::CmdUpdateFdSendRate(MessageParcel &data, MessageParcel &reply)
240 {
241 HILOGD("CmdUpdateFdSendRate Begin");
242 std::string bundleName;
243 if (!data.ReadString(bundleName)) {
244 return BError(BError::Codes::EXT_INVAL_ARG, "Failed to receive bundleName").GetCode();
245 }
246 int32_t sendRate;
247 if (!data.ReadInt32(sendRate)) {
248 return BError(BError::Codes::EXT_INVAL_ARG, "Failed to receive sendRate").GetCode();
249 }
250 int ret = UpdateFdSendRate(bundleName, sendRate);
251 if (!reply.WriteInt32(ret)) {
252 return BError(BError::Codes::EXT_BROKEN_IPC, "Failed to send out the ret").GetCode();
253 }
254 return BError(BError::Codes::OK);
255 }
256
CmdHandleUser0Backup(MessageParcel & data,MessageParcel & reply)257 ErrCode ExtExtensionStub::CmdHandleUser0Backup(MessageParcel &data, MessageParcel &reply)
258 {
259 HILOGD("CmdHandleUser0Backup Begin");
260 int ret = User0OnBackup();
261 if (!reply.WriteInt32(ret)) {
262 return BError(BError::Codes::EXT_BROKEN_IPC, "Failed to send out the ret").GetCode();
263 }
264 return BError(BError::Codes::OK);
265 }
266 } // namespace OHOS::FileManagement::Backup