1 /*
2 * Copyright (c) 2021-2025 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 "ipc/daemon_stub.h"
17
18 #include "copy/ipc_wrapper.h"
19 #include "dfs_error.h"
20 #include "dfsu_access_token_helper.h"
21 #include "dm_device_info.h"
22 #include "ipc/distributed_file_daemon_ipc_interface_code.h"
23 #include "ipc_skeleton.h"
24 #include "utils_log.h"
25 #include "securec.h"
26
27 namespace OHOS {
28 namespace Storage {
29 namespace DistributedFile {
30 using namespace OHOS::FileManagement;
31 const int32_t DATA_UID = 3012;
32
DaemonStub()33 DaemonStub::DaemonStub()
34 {
35 opToInterfaceMap_[static_cast<uint32_t>(DistributedFileDaemonInterfaceCode::DISTRIBUTED_FILE_OPEN_P2P_CONNECTION)] =
36 &DaemonStub::HandleOpenP2PConnection;
37 opToInterfaceMap_[static_cast<uint32_t>(
38 DistributedFileDaemonInterfaceCode::DISTRIBUTED_FILE_CLOSE_P2P_CONNECTION)] =
39 &DaemonStub::HandleCloseP2PConnection;
40 opToInterfaceMap_[static_cast<uint32_t>(
41 DistributedFileDaemonInterfaceCode::DISTRIBUTED_FILE_OPEN_P2P_CONNECTION_EX)] =
42 &DaemonStub::HandleOpenP2PConnectionEx;
43 opToInterfaceMap_[static_cast<uint32_t>(
44 DistributedFileDaemonInterfaceCode::DISTRIBUTED_FILE_CLOSE_P2P_CONNECTION_EX)] =
45 &DaemonStub::HandleCloseP2PConnectionEx;
46 opToInterfaceMap_[static_cast<uint32_t>(DistributedFileDaemonInterfaceCode::DISTRIBUTED_FILE_PREPARE_SESSION)] =
47 &DaemonStub::HandlePrepareSession;
48 opToInterfaceMap_[static_cast<uint32_t>(DistributedFileDaemonInterfaceCode::DISTRIBUTED_FILE_CANCEL_COPY_TASK)] =
49 &DaemonStub::HandleCancelCopyTask;
50 opToInterfaceMap_[static_cast<uint32_t>(
51 DistributedFileDaemonInterfaceCode::DISTRIBUTED_FILE_CANCEL_INNER_COPY_TASK)] =
52 &DaemonStub::HandleInnerCancelCopyTask;
53 opToInterfaceMap_[static_cast<uint32_t>(DistributedFileDaemonInterfaceCode::DISTRIBUTED_FILE_REQUEST_SEND_FILE)] =
54 &DaemonStub::HandleRequestSendFile;
55 opToInterfaceMap_[static_cast<uint32_t>(
56 DistributedFileDaemonInterfaceCode::DISTRIBUTED_FILE_GET_REMOTE_COPY_INFO)] =
57 &DaemonStub::HandleGetRemoteCopyInfo;
58 opToInterfaceMap_[static_cast<uint32_t>(
59 DistributedFileDaemonInterfaceCode::DISTRIBUTED_FILE_REGISTER_ASSET_CALLBACK)] =
60 &DaemonStub::HandleRegisterRecvCallback;
61 opToInterfaceMap_[static_cast<uint32_t>(
62 DistributedFileDaemonInterfaceCode::DISTRIBUTED_FILE_UN_REGISTER_ASSET_CALLBACK)] =
63 &DaemonStub::HandleUnRegisterRecvCallback;
64 opToInterfaceMap_[static_cast<uint32_t>(DistributedFileDaemonInterfaceCode::DISTRIBUTED_FILE_PUSH_ASSET)] =
65 &DaemonStub::HandlePushAsset;
66 opToInterfaceMap_[static_cast<uint32_t>(DistributedFileDaemonInterfaceCode::GET_DFS_URI_IS_DIR_FROM_LOCAL)] =
67 &DaemonStub::HandleGetDfsUrisDirFromLocal;
68 opToInterfaceMap_[static_cast<uint32_t>(
69 DistributedFileDaemonInterfaceCode::DISTRIBUTED_FILE_GET_DFS_SWITCH_STATUS)] =
70 &DaemonStub::HandleGetDfsSwitchStatus;
71 opToInterfaceMap_[static_cast<uint32_t>(
72 DistributedFileDaemonInterfaceCode::DISTRIBUTED_FILE_UPDATE_DFS_SWITCH_STATUS)] =
73 &DaemonStub::HandleUpdateDfsSwitchStatus;
74 opToInterfaceMap_[static_cast<uint32_t>(
75 DistributedFileDaemonInterfaceCode::DISTRIBUTED_FILE_GET_CONNECTED_DEVICE_LIST)] =
76 &DaemonStub::HandleGetConnectedDeviceList;
77 }
78
OnRemoteRequest(uint32_t code,MessageParcel & data,MessageParcel & reply,MessageOption & option)79 int32_t DaemonStub::OnRemoteRequest(uint32_t code, MessageParcel &data, MessageParcel &reply, MessageOption &option)
80 {
81 if (data.ReadInterfaceToken() != GetDescriptor()) {
82 return DFS_DAEMON_DESCRIPTOR_IS_EMPTY;
83 }
84 if (code != static_cast<uint32_t>(DistributedFileDaemonInterfaceCode::DISTRIBUTED_FILE_REQUEST_SEND_FILE) &&
85 code != static_cast<uint32_t>(DistributedFileDaemonInterfaceCode::DISTRIBUTED_FILE_GET_REMOTE_COPY_INFO) &&
86 !IPCSkeleton::IsLocalCalling()) {
87 LOGE("function is only allowed to be called locally.");
88 return E_ALLOW_LOCAL_CALL_ONLY;
89 }
90 auto iter = opToInterfaceMap_.find(code);
91 if (iter == opToInterfaceMap_.end() || iter->second == nullptr) {
92 LOGE("Cannot response request %d: unknown tranction", code);
93 return IPCObjectStub::OnRemoteRequest(code, data, reply, option);
94 }
95 auto memberFunc = iter->second;
96 return (this->*memberFunc)(data, reply);
97 }
98
HandleOpenP2PConnection(MessageParcel & data,MessageParcel & reply)99 int32_t DaemonStub::HandleOpenP2PConnection(MessageParcel &data, MessageParcel &reply)
100 {
101 LOGI("Begin OpenP2PConnection");
102 if (!DfsuAccessTokenHelper::CheckCallerPermission(PERM_DISTRIBUTED_DATASYNC)) {
103 LOGE("[HandleOpenP2PConnection] DATASYNC permission denied");
104 return E_PERMISSION_DENIED;
105 }
106 DistributedHardware::DmDeviceInfo deviceInfo;
107 auto ret = strcpy_s(deviceInfo.deviceId, DM_MAX_DEVICE_ID_LEN, data.ReadCString());
108 if (ret != 0) {
109 LOGE("strcpy for source device id failed, ret is %{public}d", ret);
110 return -1;
111 }
112 ret = strcpy_s(deviceInfo.deviceName, DM_MAX_DEVICE_NAME_LEN, data.ReadCString());
113 if (ret != 0) {
114 LOGE("strcpy for source device name failed, ret is %{public}d", ret);
115 return -1;
116 }
117 ret = strcpy_s(deviceInfo.networkId, DM_MAX_DEVICE_ID_LEN, data.ReadCString());
118 if (ret != 0) {
119 LOGE("strcpy for source network id failed, ret is %{public}d", ret);
120 return -1;
121 }
122 deviceInfo.deviceTypeId = data.ReadUint16();
123 deviceInfo.range = static_cast<int32_t>(data.ReadUint32());
124 deviceInfo.authForm = static_cast<DistributedHardware::DmAuthForm>(data.ReadInt32());
125
126 int32_t res = OpenP2PConnection(deviceInfo);
127 reply.WriteInt32(res);
128 LOGI("End OpenP2PConnection, res = %{public}d", res);
129 return res;
130 }
131
HandleCloseP2PConnection(MessageParcel & data,MessageParcel & reply)132 int32_t DaemonStub::HandleCloseP2PConnection(MessageParcel &data, MessageParcel &reply)
133 {
134 LOGI("Begin CloseP2PConnection");
135 if (!DfsuAccessTokenHelper::CheckCallerPermission(PERM_DISTRIBUTED_DATASYNC)) {
136 LOGE("[HandleCloseP2PConnection] DATASYNC permission denied");
137 return E_PERMISSION_DENIED;
138 }
139 DistributedHardware::DmDeviceInfo deviceInfo;
140 auto ret = strcpy_s(deviceInfo.deviceId, DM_MAX_DEVICE_ID_LEN, data.ReadCString());
141 if (ret != 0) {
142 LOGE("strcpy for source device id failed, ret is %{public}d", ret);
143 return -1;
144 }
145 ret = strcpy_s(deviceInfo.deviceName, DM_MAX_DEVICE_NAME_LEN, data.ReadCString());
146 if (ret != 0) {
147 LOGE("strcpy for source device name failed, ret is %{public}d", ret);
148 return -1;
149 }
150 ret = strcpy_s(deviceInfo.networkId, DM_MAX_DEVICE_ID_LEN, data.ReadCString());
151 if (ret != 0) {
152 LOGE("strcpy for source network id failed, ret is %{public}d", ret);
153 return -1;
154 }
155 deviceInfo.deviceTypeId = data.ReadUint16();
156 deviceInfo.range = static_cast<int32_t>(data.ReadUint32());
157 deviceInfo.authForm = static_cast<DistributedHardware::DmAuthForm>(data.ReadInt32());
158
159 int32_t res = CloseP2PConnection(deviceInfo);
160 reply.WriteInt32(res);
161 LOGI("End CloseP2PConnection");
162 return res;
163 }
164
HandleOpenP2PConnectionEx(MessageParcel & data,MessageParcel & reply)165 int32_t DaemonStub::HandleOpenP2PConnectionEx(MessageParcel &data, MessageParcel &reply)
166 {
167 LOGI("DaemonStub::Begin OpenP2PConnectionEx");
168 std::string networkId;
169 if (!data.ReadString(networkId)) {
170 LOGE("read networkId failed");
171 return E_IPC_READ_FAILED;
172 }
173 auto remote = data.ReadRemoteObject();
174 if (remote == nullptr) {
175 LOGE("read remoteObject failed");
176 return E_IPC_READ_FAILED;
177 }
178 auto remoteReverseObj = iface_cast<IFileDfsListener>(remote);
179 if (remoteReverseObj == nullptr) {
180 LOGE("remoteReverseObj is null");
181 return E_INVAL_ARG;
182 }
183 int32_t res = OpenP2PConnectionEx(networkId, remoteReverseObj);
184 reply.WriteInt32(res);
185 LOGI("DaemonStub::End OpenP2PConnection, res = %{public}d.", res);
186 return res;
187 }
188
HandleCloseP2PConnectionEx(MessageParcel & data,MessageParcel & reply)189 int32_t DaemonStub::HandleCloseP2PConnectionEx(MessageParcel &data, MessageParcel &reply)
190 {
191 LOGI("DaemonStub::Begin CloseP2PConnection.");
192 std::string networkId;
193 if (!data.ReadString(networkId)) {
194 LOGE("read networkId failed");
195 return E_IPC_READ_FAILED;
196 }
197
198 int32_t res = CloseP2PConnectionEx(networkId);
199 reply.WriteInt32(res);
200 LOGI("DaemonStub::End CloseP2PConnection");
201 return res;
202 }
203
HandlePrepareSession(MessageParcel & data,MessageParcel & reply)204 int32_t DaemonStub::HandlePrepareSession(MessageParcel &data, MessageParcel &reply)
205 {
206 LOGI("DaemonStub::Begin HandlePrepareSession.");
207 std::string srcUri;
208 if (!data.ReadString(srcUri)) {
209 LOGE("read srcUri failed");
210 return E_IPC_READ_FAILED;
211 }
212 if (!DfsuAccessTokenHelper::CheckUriPermission(srcUri)) {
213 LOGE("permission verify failed");
214 return E_PERMISSION_DENIED;
215 }
216 std::string dstUri;
217 if (!data.ReadString(dstUri)) {
218 LOGE("read dstUri failed");
219 return E_IPC_READ_FAILED;
220 }
221 std::string srcDeviceId;
222 if (!data.ReadString(srcDeviceId)) {
223 LOGE("read srcDeviceId failed");
224 return E_IPC_READ_FAILED;
225 }
226 auto listener = data.ReadRemoteObject();
227 if (listener == nullptr) {
228 LOGE("read listener failed");
229 return E_IPC_READ_FAILED;
230 }
231 HmdfsInfo info{};
232 if (!data.ReadString(info.copyPath)) {
233 LOGE("read info.copyPath failed");
234 return E_IPC_READ_FAILED;
235 }
236 if (!data.ReadBool(info.dirExistFlag)) {
237 LOGE("read info.dirExistFlag failed");
238 return E_IPC_READ_FAILED;
239 }
240 int32_t res = PrepareSession(srcUri, dstUri, srcDeviceId, listener, info);
241 if (!reply.WriteString(info.sessionName)) {
242 LOGE("Write sessionName failed");
243 return E_IPC_WRITE_FAILED;
244 }
245 reply.WriteInt32(res);
246 LOGD("End PrepareSession, ret = %{public}d.", res);
247 return res;
248 }
249
HandleRequestSendFile(MessageParcel & data,MessageParcel & reply)250 int32_t DaemonStub::HandleRequestSendFile(MessageParcel &data, MessageParcel &reply)
251 {
252 LOGI("Begin HandleRequestSendFile");
253 std::string srcUri;
254 if (!data.ReadString(srcUri)) {
255 LOGE("read srcUri failed");
256 return E_IPC_READ_FAILED;
257 }
258 std::string dstPath;
259 if (!data.ReadString(dstPath)) {
260 LOGE("read dstPath failed");
261 return E_IPC_READ_FAILED;
262 }
263 std::string dstDeviceId;
264 if (!data.ReadString(dstDeviceId)) {
265 LOGE("read remoteDeviceId failed");
266 return E_IPC_READ_FAILED;
267 }
268 std::string sessionName;
269 if (!data.ReadString(sessionName)) {
270 LOGE("read sessionName failed");
271 return E_IPC_READ_FAILED;
272 }
273 auto res = RequestSendFile(srcUri, dstPath, dstDeviceId, sessionName);
274 reply.WriteInt32(res);
275 LOGD("End RequestSendFile, ret = %{public}d.", res);
276 return res;
277 }
278
HandleGetRemoteCopyInfo(MessageParcel & data,MessageParcel & reply)279 int32_t DaemonStub::HandleGetRemoteCopyInfo(MessageParcel &data, MessageParcel &reply)
280 {
281 LOGI("Begin HandleGetRemoteCopyInfo");
282 std::string srcUri;
283 if (!data.ReadString(srcUri)) {
284 LOGE("read srcUri failed");
285 return E_IPC_READ_FAILED;
286 }
287 bool isFile = false;
288 bool isDir = false;
289 auto res = GetRemoteCopyInfo(srcUri, isFile, isDir);
290 if (res != E_OK) {
291 LOGE("GetRemoteCopyInfo failed");
292 return E_IPC_READ_FAILED;
293 }
294 if (!reply.WriteBool(isFile)) {
295 LOGE("Write isFile failed");
296 return E_IPC_READ_FAILED;
297 }
298 if (!reply.WriteBool(isDir)) {
299 LOGE("Write isDir failed");
300 return E_IPC_READ_FAILED;
301 }
302 if (!reply.WriteInt32(res)) {
303 LOGE("Write res failed");
304 return E_IPC_READ_FAILED;
305 }
306 LOGD("End GetRemoteCopyInfo, ret = %{public}d.", res);
307 return res;
308 }
309
HandleCancelCopyTask(MessageParcel & data,MessageParcel & reply)310 int32_t DaemonStub::HandleCancelCopyTask(MessageParcel &data, MessageParcel &reply)
311 {
312 LOGI("Begin HandleCancelCopyTask");
313 std::string sessionName;
314 if (!data.ReadString(sessionName)) {
315 LOGE("read sessionName failed");
316 return E_IPC_READ_FAILED;
317 }
318 return CancelCopyTask(sessionName);
319 }
320
HandleInnerCancelCopyTask(MessageParcel & data,MessageParcel & reply)321 int32_t DaemonStub::HandleInnerCancelCopyTask(MessageParcel &data, MessageParcel &reply)
322 {
323 LOGI("Begin HandleCancelCopyTask");
324 std::string srcUri;
325 if (!data.ReadString(srcUri)) {
326 LOGE("read srcUri failed");
327 return E_IPC_READ_FAILED;
328 }
329 std::string dstUri;
330 if (!data.ReadString(dstUri)) {
331 LOGE("read dstUri failed");
332 return E_IPC_READ_FAILED;
333 }
334 return CancelCopyTask(srcUri, dstUri);
335 }
336
HandleRegisterRecvCallback(MessageParcel & data,MessageParcel & reply)337 int32_t DaemonStub::HandleRegisterRecvCallback(MessageParcel &data, MessageParcel &reply)
338 {
339 LOGI("Begin RegisterRecvCallback");
340 auto uid = IPCSkeleton::GetCallingUid();
341 if (uid != DATA_UID) {
342 LOGE("Permission denied, caller is not data!");
343 return E_PERMISSION_DENIED;
344 }
345 if (!DfsuAccessTokenHelper::CheckCallerPermission(PERM_DISTRIBUTED_DATASYNC)) {
346 LOGE("[RegisterRecvCallback] DATASYNC permission denied");
347 return E_PERMISSION_DENIED;
348 }
349 auto object = data.ReadRemoteObject();
350 if (object == nullptr) {
351 LOGE("RegisterRecvCallback failed, object is nullptr.");
352 return E_IPC_READ_FAILED;
353 }
354 auto recvCallback = iface_cast<IAssetRecvCallback>(object);
355 if (recvCallback == nullptr) {
356 LOGE("RegisterRecvCallback failed, Callback is nullptr");
357 return E_INVAL_ARG;
358 }
359 int32_t res = RegisterAssetCallback(recvCallback);
360 if (!reply.WriteInt32(res)) {
361 LOGE("RegisterRecvCallback write res failed, res is %{public}d", res);
362 return E_IPC_READ_FAILED;
363 }
364 return res;
365 }
366
HandleUnRegisterRecvCallback(MessageParcel & data,MessageParcel & reply)367 int32_t DaemonStub::HandleUnRegisterRecvCallback(MessageParcel &data, MessageParcel &reply)
368 {
369 LOGI("Begin UnRegisterRecvCallback");
370 auto uid = IPCSkeleton::GetCallingUid();
371 if (uid != DATA_UID) {
372 LOGE("Permission denied, caller is not data!");
373 return E_PERMISSION_DENIED;
374 }
375 if (!DfsuAccessTokenHelper::CheckCallerPermission(PERM_DISTRIBUTED_DATASYNC)) {
376 LOGE("[UnRegisterRecvCallback] DATASYNC permission denied");
377 return E_PERMISSION_DENIED;
378 }
379 auto object = data.ReadRemoteObject();
380 if (object == nullptr) {
381 LOGE("UnRegisterRecvCallback failed, object is nullptr.");
382 return E_IPC_READ_FAILED;
383 }
384 auto recvCallback = iface_cast<IAssetRecvCallback>(object);
385 if (recvCallback == nullptr) {
386 LOGE("UnRegisterRecvCallback failed, Callback is nullptr");
387 return E_INVAL_ARG;
388 }
389 int32_t res = UnRegisterAssetCallback(recvCallback);
390 if (!reply.WriteInt32(res)) {
391 LOGE("UnRegisterRecvCallback write res failed, res is %{public}d", res);
392 return E_IPC_READ_FAILED;
393 }
394 return res;
395 }
396
HandlePushAsset(MessageParcel & data,MessageParcel & reply)397 int32_t DaemonStub::HandlePushAsset(MessageParcel &data, MessageParcel &reply)
398 {
399 LOGI("Begin PushAsset");
400 auto uid = IPCSkeleton::GetCallingUid();
401 if (uid != DATA_UID) {
402 LOGE("Permission denied, caller is not data!");
403 return E_PERMISSION_DENIED;
404 }
405 if (!DfsuAccessTokenHelper::CheckCallerPermission(PERM_DISTRIBUTED_DATASYNC)) {
406 LOGE("[PushAsset] DATASYNC permission denied");
407 return E_PERMISSION_DENIED;
408 }
409 int32_t userId;
410 if (!data.ReadInt32(userId)) {
411 LOGE("read userId failed");
412 return E_INVAL_ARG;
413 }
414
415 sptr<AssetObj> assetObj = data.ReadParcelable<AssetObj>();
416 if (!assetObj) {
417 LOGE("object of AssetObj is nullptr");
418 return E_INVAL_ARG;
419 }
420
421 auto object = data.ReadRemoteObject();
422 if (object == nullptr) {
423 LOGE("PushAsset failed, object is nullptr.");
424 return E_IPC_READ_FAILED;
425 }
426 auto sendCallback = iface_cast<IAssetSendCallback>(object);
427 if (sendCallback == nullptr) {
428 LOGE("PushAsset failed, Callback is nullptr");
429 return E_INVAL_ARG;
430 }
431
432 int32_t res = PushAsset(userId, assetObj, sendCallback);
433 if (!reply.WriteInt32(res)) {
434 LOGE("PushAsset write res failed, res is %{public}d", res);
435 return E_IPC_READ_FAILED;
436 }
437 return res;
438 }
439
HandleGetDfsUrisDirFromLocal(MessageParcel & data,MessageParcel & reply)440 int32_t DaemonStub::HandleGetDfsUrisDirFromLocal(MessageParcel &data, MessageParcel &reply)
441 {
442 std::vector<std::string> uriList;
443 if (IpcWrapper::ReadBatchUris(data, uriList) != E_OK) {
444 LOGE("read uriList failed");
445 return E_IPC_READ_FAILED;
446 }
447 LOGI("stub uriList.size(): %{public}d", static_cast<int>(uriList.size()));
448 int32_t userId;
449 if (!data.ReadInt32(userId)) {
450 LOGE("read userId failed");
451 return E_IPC_READ_FAILED;
452 }
453 std::unordered_map<std::string, AppFileService::ModuleRemoteFileShare::HmdfsUriInfo> uriToDfsUriMaps;
454 int32_t res = GetDfsUrisDirFromLocal(uriList, userId, uriToDfsUriMaps);
455 if (!reply.WriteInt32(res)) {
456 LOGE("Failed to send result");
457 return E_IPC_WRITE_FAILED;
458 }
459 if (res != FileManagement::E_OK) {
460 LOGE("GetDfsUrisDirFromLocal failed");
461 return FileManagement::E_OK;
462 }
463 std::vector<std::string> total;
464 for (auto it = uriToDfsUriMaps.begin(); it != uriToDfsUriMaps.end(); ++it) {
465 total.push_back(it->first);
466 total.push_back((it->second).uriStr);
467 total.push_back(std::to_string((it->second).fileSize));
468 }
469 LOGI("stub total.size(): %{public}d", static_cast<int>(total.size()));
470 if (!IpcWrapper::WriteBatchUris(reply, total)) {
471 LOGE("Failed to send user uriStr");
472 return E_IPC_WRITE_FAILED;
473 }
474 LOGI("HandleGetDfsUrisDirFromLocal end");
475 return res;
476 }
477
HandleGetDfsSwitchStatus(MessageParcel & data,MessageParcel & reply)478 int32_t DaemonStub::HandleGetDfsSwitchStatus(MessageParcel &data, MessageParcel &reply)
479 {
480 if (!DfsuAccessTokenHelper::CheckCallerPermission(FILE_ACCESS_MANAGER_PERMISSION)) {
481 LOGE("Permission denied: FILE_ACCESS_MANAGER_PERMISSION");
482 return E_PERMISSION_DENIED;
483 }
484 std::string networkId;
485 if (!data.ReadString(networkId)) {
486 LOGE("Read networkId failed");
487 return E_IPC_READ_FAILED;
488 }
489 int32_t switchStatus = -1;
490 int32_t res = GetDfsSwitchStatus(networkId, switchStatus);
491 if (!reply.WriteInt32(res)) {
492 LOGE("HandleGetDfsSwitchStatus write res failed, res is %{public}d", res);
493 return E_IPC_WRITE_FAILED;
494 }
495 if (res != E_OK) {
496 LOGE("GetDfsSwitchStatus failed, res is %{public}d", res);
497 return E_OK;
498 }
499 if (!reply.WriteInt32(switchStatus)) {
500 LOGE("HandleGetDfsSwitchStatus write switchStatus failed, switchStatus is %{public}d", switchStatus);
501 return E_IPC_WRITE_FAILED;
502 }
503 return E_OK;
504 }
505
HandleUpdateDfsSwitchStatus(MessageParcel & data,MessageParcel & reply)506 int32_t DaemonStub::HandleUpdateDfsSwitchStatus(MessageParcel &data, MessageParcel &reply)
507 {
508 if (!DfsuAccessTokenHelper::CheckCallerPermission(FILE_ACCESS_MANAGER_PERMISSION)) {
509 LOGE("Permission denied: FILE_ACCESS_MANAGER_PERMISSION");
510 return E_PERMISSION_DENIED;
511 }
512 int32_t switchStatus = 0;
513 if (!data.ReadInt32(switchStatus)) {
514 LOGE("Read switchStatus failed");
515 return E_IPC_READ_FAILED;
516 }
517 int32_t res = UpdateDfsSwitchStatus(switchStatus);
518 if (!reply.WriteInt32(res)) {
519 LOGE("HandleUpdateDfsSwitchStatus write res failed, res is %{public}d", res);
520 return E_IPC_WRITE_FAILED;
521 }
522 return E_OK;
523 }
524
HandleGetConnectedDeviceList(MessageParcel & data,MessageParcel & reply)525 int32_t DaemonStub::HandleGetConnectedDeviceList(MessageParcel &data, MessageParcel &reply)
526 {
527 if (!DfsuAccessTokenHelper::CheckCallerPermission(FILE_ACCESS_MANAGER_PERMISSION)) {
528 LOGE("Permission denied: FILE_ACCESS_MANAGER_PERMISSION");
529 return E_PERMISSION_DENIED;
530 }
531 std::vector<DfsDeviceInfo> deviceList;
532 int32_t res = GetConnectedDeviceList(deviceList);
533 if (!reply.WriteInt32(res)) {
534 LOGE("HandleGetConnectedDeviceList write res failed, res is %{public}d", res);
535 return E_IPC_WRITE_FAILED;
536 }
537 if (res != E_OK) {
538 LOGE("GetConnectedDeviceList failed, res is %{public}d", res);
539 return E_OK;
540 }
541 size_t len = deviceList.size();
542 if (!reply.WriteInt32(len)) {
543 LOGE("HandleGetConnectedDeviceList write length failed");
544 return E_IPC_WRITE_FAILED;
545 }
546 for (size_t i = 0; i < len; ++i) {
547 if (!reply.WriteString(deviceList[i].networkId_)) {
548 LOGE("Write networkId failed");
549 return E_IPC_WRITE_FAILED;
550 }
551 if (!reply.WriteString(deviceList[i].path_)) {
552 LOGE("Write path failed");
553 return E_IPC_WRITE_FAILED;
554 }
555 }
556 return E_OK;
557 }
558 } // namespace DistributedFile
559 } // namespace Storage
560 } // namespace OHOS