From 0f058821833192ddb7ce89a507b3800065509e03 Mon Sep 17 00:00:00 2001 From: hobbycao Date: Sat, 20 Apr 2024 08:50:43 +0800 Subject: [PATCH] feat: add notify error to app Signed-off-by: hobbycao --- .../native/backup_ext/src/ext_extension.cpp | 4 --- .../backup_ext/src/ext_extension_stub.cpp | 4 ++- .../src/service_incremental_proxy.cpp | 6 ++-- .../backup_kit_inner/src/service_proxy.cpp | 4 ++- .../src/service_reverse_stub.cpp | 32 +++++++++++++++---- .../js/backup/session_backup_n_exporter.cpp | 7 +++- .../session_incremental_backup_n_exporter.cpp | 7 +++- .../js/backup/session_restore_n_exporter.cpp | 7 +++- .../service_incremental_reverse_proxy.cpp | 12 ++++--- .../src/module_ipc/service_reverse_proxy.cpp | 6 ++-- .../backup_sa/src/module_ipc/service_stub.cpp | 30 +++++++++++------ .../src/module_ipc/svc_extension_proxy.cpp | 7 +++- 12 files changed, 91 insertions(+), 35 deletions(-) diff --git a/frameworks/native/backup_ext/src/ext_extension.cpp b/frameworks/native/backup_ext/src/ext_extension.cpp index a20b893b7..cd15ea97b 100644 --- a/frameworks/native/backup_ext/src/ext_extension.cpp +++ b/frameworks/native/backup_ext/src/ext_extension.cpp @@ -252,7 +252,6 @@ ErrCode BackupExtExtension::GetIncrementalFileHandle(const string &fileName) UniqueFd fd(open(tarName.data(), O_RDWR | O_CREAT | O_TRUNC, S_IRUSR | S_IWUSR)); if (fd < 0) { HILOGE("Failed to open tar file = %{private}s, err = %{public}d", tarName.c_str(), errno); - throw BError(BError::Codes::EXT_INVAL_ARG, string("open tar file failed")); } // 对应的简报文件 @@ -264,7 +263,6 @@ ErrCode BackupExtExtension::GetIncrementalFileHandle(const string &fileName) UniqueFd reportFd(open(reportName.data(), O_RDWR | O_CREAT | O_TRUNC, S_IRUSR | S_IWUSR)); if (reportFd < 0) { HILOGE("Failed to open report file = %{private}s, err = %{public}d", reportName.c_str(), errno); - throw BError(BError::Codes::EXT_INVAL_ARG, string("open report file failed")); } HILOGI("extension: Will notify AppIncrementalFileReady"); auto proxy = ServiceProxy::GetInstance(); @@ -333,7 +331,6 @@ static ErrCode BigFileReady(sptr proxy) UniqueFd fd(open(item.fileName.data(), O_RDONLY)); if (fd < 0) { HILOGE("open file failed, file name is %{public}s, err = %{public}d", item.fileName.c_str(), errno); - continue; } ret = proxy->AppFileReady(item.hashName, std::move(fd)); @@ -1361,7 +1358,6 @@ static ErrCode IncrementalBigFileReady(const TarMap &pkgInfo, if (fd < 0) { HILOGE("IncrementalBigFileReady open file failed, file name is %{public}s, err = %{public}d", path.c_str(), errno); - continue; } struct ReportFileInfo info = bigInfos.find(path)->second; diff --git a/frameworks/native/backup_ext/src/ext_extension_stub.cpp b/frameworks/native/backup_ext/src/ext_extension_stub.cpp index 8b9cea84e..b3246e5fb 100644 --- a/frameworks/native/backup_ext/src/ext_extension_stub.cpp +++ b/frameworks/native/backup_ext/src/ext_extension_stub.cpp @@ -79,7 +79,9 @@ ErrCode ExtExtensionStub::CmdGetFileHandle(MessageParcel &data, MessageParcel &r } UniqueFd fd = GetFileHandle(fileName); - if (!reply.WriteFileDescriptor(fd)) { + bool fdFlag = (fd < 0) ? false : true; + reply.WriteBool(fdFlag); + if (fdFlag == true && !reply.WriteFileDescriptor(fd)) { return BError(BError::Codes::EXT_BROKEN_IPC, "Failed to send out the file").GetCode(); } return BError(BError::Codes::OK); diff --git a/frameworks/native/backup_kit_inner/src/service_incremental_proxy.cpp b/frameworks/native/backup_kit_inner/src/service_incremental_proxy.cpp index f3122b139..c5c403f0b 100644 --- a/frameworks/native/backup_kit_inner/src/service_incremental_proxy.cpp +++ b/frameworks/native/backup_kit_inner/src/service_incremental_proxy.cpp @@ -174,10 +174,12 @@ ErrCode ServiceProxy::AppIncrementalFileReady(const std::string &fileName, Uniqu if (!data.WriteString(fileName)) { return BError(BError::Codes::SDK_INVAL_ARG, "Failed to send the filename").GetCode(); } - if (!data.WriteFileDescriptor(fd)) { + bool fdFlag = (fd < 0 || manifestFd < 0) ? false : true; + data.WriteBool(fdFlag); + if (fdFlag == true && !data.WriteFileDescriptor(fd)) { return BError(BError::Codes::SDK_INVAL_ARG, "Failed to send the fd").GetCode(); } - if (!data.WriteFileDescriptor(manifestFd)) { + if (fdFlag == true && !data.WriteFileDescriptor(manifestFd)) { return BError(BError::Codes::SDK_INVAL_ARG, "Failed to send the fd").GetCode(); } diff --git a/frameworks/native/backup_kit_inner/src/service_proxy.cpp b/frameworks/native/backup_kit_inner/src/service_proxy.cpp index 9dcf09155..79cb97a32 100644 --- a/frameworks/native/backup_kit_inner/src/service_proxy.cpp +++ b/frameworks/native/backup_kit_inner/src/service_proxy.cpp @@ -162,7 +162,9 @@ ErrCode ServiceProxy::AppFileReady(const string &fileName, UniqueFd fd) if (!data.WriteString(fileName)) { return BError(BError::Codes::SDK_INVAL_ARG, "Failed to send the filename").GetCode(); } - if (!data.WriteFileDescriptor(fd)) { + bool fdFlag = (fd < 0) ? false : true; + data.WriteBool(fdFlag); + if (fdFlag == true && !data.WriteFileDescriptor(fd)) { return BError(BError::Codes::SDK_INVAL_ARG, "Failed to send the fd").GetCode(); } diff --git a/frameworks/native/backup_kit_inner/src/service_reverse_stub.cpp b/frameworks/native/backup_kit_inner/src/service_reverse_stub.cpp index 892992ff1..6f6452d3d 100644 --- a/frameworks/native/backup_kit_inner/src/service_reverse_stub.cpp +++ b/frameworks/native/backup_kit_inner/src/service_reverse_stub.cpp @@ -23,7 +23,7 @@ namespace OHOS::FileManagement::Backup { using namespace std; - +const int INVALID_FD = -1; int32_t ServiceReverseStub::OnRemoteRequest(uint32_t code, MessageParcel &data, MessageParcel &reply, @@ -102,7 +102,11 @@ int32_t ServiceReverseStub::CmdBackupOnFileReady(MessageParcel &data, MessagePar { auto bundleName = data.ReadString(); auto fileName = data.ReadString(); - int fd = data.ReadFileDescriptor(); + int fd = INVALID_FD; + bool fdFlag = data.ReadBool(); + if (fdFlag == true) { + fd = data.ReadFileDescriptor(); + } BackupOnFileReady(bundleName, fileName, fd); return BError(BError::Codes::OK); } @@ -164,7 +168,11 @@ int32_t ServiceReverseStub::CmdRestoreOnFileReady(MessageParcel &data, MessagePa { auto bundleName = data.ReadString(); auto fileName = data.ReadString(); - int fd = data.ReadFileDescriptor(); + int fd = INVALID_FD; + bool fdFlag = data.ReadBool(); + if (fdFlag == true) { + fd = data.ReadFileDescriptor(); + } RestoreOnFileReady(bundleName, fileName, fd); return BError(BError::Codes::OK); } @@ -187,8 +195,13 @@ int32_t ServiceReverseStub::CmdIncrementalBackupOnFileReady(MessageParcel &data, { auto bundleName = data.ReadString(); auto fileName = data.ReadString(); - int fd = data.ReadFileDescriptor(); - int manifestFd = data.ReadFileDescriptor(); + int fd = INVALID_FD; + int manifestFd = INVALID_FD; + bool fdFlag = data.ReadBool(); + if (fdFlag == true) { + fd = data.ReadFileDescriptor(); + manifestFd = data.ReadFileDescriptor(); + } IncrementalBackupOnFileReady(bundleName, fileName, fd, manifestFd); return BError(BError::Codes::OK); } @@ -250,8 +263,13 @@ int32_t ServiceReverseStub::CmdIncrementalRestoreOnFileReady(MessageParcel &data { auto bundleName = data.ReadString(); auto fileName = data.ReadString(); - int fd = data.ReadFileDescriptor(); - int manifestFd = data.ReadFileDescriptor(); + int fd = INVALID_FD; + int manifestFd = INVALID_FD; + bool fdFlag = data.ReadBool(); + if (fdFlag == true) { + fd = data.ReadFileDescriptor(); + manifestFd = data.ReadFileDescriptor(); + } IncrementalRestoreOnFileReady(bundleName, fileName, fd, manifestFd); return BError(BError::Codes::OK); } diff --git a/interfaces/kits/js/backup/session_backup_n_exporter.cpp b/interfaces/kits/js/backup/session_backup_n_exporter.cpp index 946387e4e..f57854c53 100644 --- a/interfaces/kits/js/backup/session_backup_n_exporter.cpp +++ b/interfaces/kits/js/backup/session_backup_n_exporter.cpp @@ -57,12 +57,17 @@ static void OnFileReady(weak_ptr pCallbacks, const BFileInfo & if (err) { return {env, err.GetNapiErr(env)}; } + + int32_t errCode = fd->Get() < 0 ? BError::BackupErrorCode::E_IO : 0; + HILOGI("callback function backup onFileReady cbCompl errcode: %{public}d", errCode); + if (errCode != 0) { + return {env, NError(errCode).GetNapiErr(env)}; + } NVal obj = NVal::CreateObject(env); obj.AddProp({ NVal::DeclareNapiProperty(BConstants::BUNDLE_NAME.c_str(), NVal::CreateUTF8String(env, bundleName).val_), NVal::DeclareNapiProperty(BConstants::URI.c_str(), NVal::CreateUTF8String(env, fileName).val_), NVal::DeclareNapiProperty(BConstants::FD.c_str(), NVal::CreateInt32(env, fd->Release()).val_)}); - return {obj}; }; diff --git a/interfaces/kits/js/backup/session_incremental_backup_n_exporter.cpp b/interfaces/kits/js/backup/session_incremental_backup_n_exporter.cpp index 1619d8567..7afeb047c 100644 --- a/interfaces/kits/js/backup/session_incremental_backup_n_exporter.cpp +++ b/interfaces/kits/js/backup/session_incremental_backup_n_exporter.cpp @@ -61,6 +61,12 @@ static void OnFileReady(weak_ptr pCallbacks, const BFileInfo & if (err) { return {env, err.GetNapiErr(env)}; } + + int32_t errCode = fd->Get() < 0 ? BError::BackupErrorCode::E_IO : 0; + HILOGI("callback function incremental backup onFileReady cbCompl errcode: %{public}d", errCode); + if (errCode != 0) { + return {env, NError(errCode).GetNapiErr(env)}; + } NVal obj = NVal::CreateObject(env); obj.AddProp({ NVal::DeclareNapiProperty(BConstants::BUNDLE_NAME.c_str(), NVal::CreateUTF8String(env, bundleName).val_), @@ -68,7 +74,6 @@ static void OnFileReady(weak_ptr pCallbacks, const BFileInfo & NVal::DeclareNapiProperty(BConstants::FD.c_str(), NVal::CreateInt32(env, fd->Release()).val_), NVal::DeclareNapiProperty(BConstants::MANIFEST_FD.c_str(), NVal::CreateInt32(env, manifestFd->Release()).val_)}); - return {obj}; }; diff --git a/interfaces/kits/js/backup/session_restore_n_exporter.cpp b/interfaces/kits/js/backup/session_restore_n_exporter.cpp index 48d760fde..8f2535a53 100644 --- a/interfaces/kits/js/backup/session_restore_n_exporter.cpp +++ b/interfaces/kits/js/backup/session_restore_n_exporter.cpp @@ -98,6 +98,12 @@ static void OnFileReadySheet(weak_ptr pCallbacks, if (err) { return {env, err.GetNapiErr(env)}; } + + int32_t errCode = fd->Get() < 0 ? BError::BackupErrorCode::E_IO : 0; + HILOGI("callback function restore OnFileReadySheet errCode: %{public}d", errCode); + if (errCode != 0) { + return {env, NError(errCode).GetNapiErr(env)}; + } NVal obj = NVal::CreateObject(env); obj.AddProp({ NVal::DeclareNapiProperty(BConstants::BUNDLE_NAME.c_str(), NVal::CreateUTF8String(env, bundleName).val_), @@ -105,7 +111,6 @@ static void OnFileReadySheet(weak_ptr pCallbacks, NVal::DeclareNapiProperty(BConstants::FD.c_str(), NVal::CreateInt32(env, fd->Release()).val_), NVal::DeclareNapiProperty(BConstants::MANIFEST_FD.c_str(), NVal::CreateInt32(env, manifestFd->Release()).val_)}); - return {obj}; }; diff --git a/services/backup_sa/src/module_ipc/service_incremental_reverse_proxy.cpp b/services/backup_sa/src/module_ipc/service_incremental_reverse_proxy.cpp index c98b02554..9feb20992 100644 --- a/services/backup_sa/src/module_ipc/service_incremental_reverse_proxy.cpp +++ b/services/backup_sa/src/module_ipc/service_incremental_reverse_proxy.cpp @@ -27,8 +27,10 @@ void ServiceReverseProxy::IncrementalBackupOnFileReady(string bundleName, string { BExcepUltils::BAssert(Remote(), BError::Codes::SDK_INVAL_ARG, "Remote is nullptr"); MessageParcel data; - if (!data.WriteInterfaceToken(GetDescriptor()) || !data.WriteString(bundleName) || !data.WriteString(fileName) || - !data.WriteFileDescriptor(fd) || !data.WriteFileDescriptor(manifestFd)) { + bool fdFlag = (fd < 0 || manifestFd < 0) ? false : true; + if (!data.WriteInterfaceToken(GetDescriptor()) || !data.WriteString(bundleName) || + !data.WriteString(fileName) || !data.WriteBool(fdFlag) || + (fdFlag == true && (!data.WriteFileDescriptor(fd) || !data.WriteFileDescriptor(manifestFd)))) { throw BError(BError::Codes::SA_BROKEN_IPC); } @@ -194,8 +196,10 @@ void ServiceReverseProxy::IncrementalRestoreOnFileReady(string bundleName, strin { BExcepUltils::BAssert(Remote(), BError::Codes::SDK_INVAL_ARG, "Remote is nullptr"); MessageParcel data; - if (!data.WriteInterfaceToken(GetDescriptor()) || !data.WriteString(bundleName) || !data.WriteString(fileName) || - !data.WriteFileDescriptor(fd) || !data.WriteFileDescriptor(manifestFd)) { + bool fdFlag = (fd < 0 || manifestFd < 0) ? false : true; + if (!data.WriteInterfaceToken(GetDescriptor()) || !data.WriteString(bundleName) || + !data.WriteString(fileName) || !data.WriteBool(fdFlag) || + (fdFlag == true && (!data.WriteFileDescriptor(fd) || !data.WriteFileDescriptor(manifestFd)))) { throw BError(BError::Codes::SA_BROKEN_IPC); } diff --git a/services/backup_sa/src/module_ipc/service_reverse_proxy.cpp b/services/backup_sa/src/module_ipc/service_reverse_proxy.cpp index 85a21ee1d..438012dae 100644 --- a/services/backup_sa/src/module_ipc/service_reverse_proxy.cpp +++ b/services/backup_sa/src/module_ipc/service_reverse_proxy.cpp @@ -27,8 +27,9 @@ void ServiceReverseProxy::BackupOnFileReady(string bundleName, string fileName, { BExcepUltils::BAssert(Remote(), BError::Codes::SDK_INVAL_ARG, "Remote is nullptr"); MessageParcel data; + bool fdFlag = (fd < 0) ? false : true; if (!data.WriteInterfaceToken(GetDescriptor()) || !data.WriteString(bundleName) || !data.WriteString(fileName) || - !data.WriteFileDescriptor(fd)) { + !data.WriteBool(fdFlag) || (fdFlag == true && !data.WriteFileDescriptor(fd))) { throw BError(BError::Codes::SA_BROKEN_IPC); } @@ -174,8 +175,9 @@ void ServiceReverseProxy::RestoreOnFileReady(string bundleName, string fileName, { BExcepUltils::BAssert(Remote(), BError::Codes::SDK_INVAL_ARG, "Remote is nullptr"); MessageParcel data; + bool fdFlag = (fd < 0) ? false : true; if (!data.WriteInterfaceToken(GetDescriptor()) || !data.WriteString(bundleName) || !data.WriteString(fileName) || - !data.WriteFileDescriptor(fd)) { + !data.WriteBool(fdFlag) || (fdFlag == true && !data.WriteFileDescriptor(fd))) { throw BError(BError::Codes::SA_BROKEN_IPC); } diff --git a/services/backup_sa/src/module_ipc/service_stub.cpp b/services/backup_sa/src/module_ipc/service_stub.cpp index 9dbc49af9..1e3402d1d 100644 --- a/services/backup_sa/src/module_ipc/service_stub.cpp +++ b/services/backup_sa/src/module_ipc/service_stub.cpp @@ -31,6 +31,7 @@ namespace OHOS::FileManagement::Backup { using namespace std; +const int INVALID_FD = -1; ServiceStub::ServiceStub() { @@ -180,9 +181,13 @@ int32_t ServiceStub::CmdAppFileReady(MessageParcel &data, MessageParcel &reply) if (!data.ReadString(fileName)) { return BError(BError::Codes::SA_INVAL_ARG, "Failed to receive fileName"); } - UniqueFd fd(data.ReadFileDescriptor()); - if (fd < 0) { - return BError(BError::Codes::SA_INVAL_ARG, "Failed to receive fd"); + bool fdFlag = data.ReadBool(); + UniqueFd fd = UniqueFd(INVALID_FD); + if (fdFlag == true) { + fd = UniqueFd(data.ReadFileDescriptor()); + if (fd < 0) { + return BError(BError::Codes::SA_INVAL_ARG, "Failed to receive fd"); + } } int res = AppFileReady(fileName, move(fd)); @@ -448,14 +453,19 @@ int32_t ServiceStub::CmdAppIncrementalFileReady(MessageParcel &data, MessageParc if (!data.ReadString(fileName)) { return BError(BError::Codes::SA_INVAL_ARG, "Failed to receive fileName"); } - UniqueFd fd(data.ReadFileDescriptor()); - if (fd < 0) { - return BError(BError::Codes::SA_INVAL_ARG, "Failed to receive fd"); - } + bool fdFlag = data.ReadBool(); + UniqueFd fd = UniqueFd(INVALID_FD); + UniqueFd manifestFd = UniqueFd(INVALID_FD); + if (fdFlag == true) { + fd = UniqueFd(data.ReadFileDescriptor()); + if (fd < 0) { + return BError(BError::Codes::SA_INVAL_ARG, "Failed to receive fd"); + } - UniqueFd manifestFd(data.ReadFileDescriptor()); - if (manifestFd < 0) { - return BError(BError::Codes::SA_INVAL_ARG, "Failed to receive manifestFd"); + manifestFd = UniqueFd(data.ReadFileDescriptor()); + if (manifestFd < 0) { + return BError(BError::Codes::SA_INVAL_ARG, "Failed to receive manifestFd"); + } } int res = AppIncrementalFileReady(fileName, move(fd), move(manifestFd)); diff --git a/services/backup_sa/src/module_ipc/svc_extension_proxy.cpp b/services/backup_sa/src/module_ipc/svc_extension_proxy.cpp index c753481c4..1ec60ad6e 100644 --- a/services/backup_sa/src/module_ipc/svc_extension_proxy.cpp +++ b/services/backup_sa/src/module_ipc/svc_extension_proxy.cpp @@ -24,6 +24,7 @@ namespace OHOS::FileManagement::Backup { using namespace std; +const int INVALID_FD = -1; UniqueFd SvcExtensionProxy::GetFileHandle(const string &fileName) { @@ -48,7 +49,11 @@ UniqueFd SvcExtensionProxy::GetFileHandle(const string &fileName) } HILOGI("Successful"); - UniqueFd fd(reply.ReadFileDescriptor()); + bool fdFlag = reply.ReadBool(); + UniqueFd fd = UniqueFd(INVALID_FD); + if (fdFlag == true) { + fd = UniqueFd(reply.ReadFileDescriptor()); + } return UniqueFd(fd.Release()); } -- Gitee