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