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