/* * Copyright (c) 2022-2025 Huawei Device Co., Ltd. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #ifndef OHOS_FILEMGMT_BACKUP_SERVICE_H #define OHOS_FILEMGMT_BACKUP_SERVICE_H #include #include #include #include "b_jsonutil/b_jsonutil.h" #include "b_json/b_json_clear_data_config.h" #include "b_json/b_json_entity_caps.h" #include "b_json/b_json_service_disposal_config.h" #include "b_radar/radar_total_statistic.h" #include "b_radar/radar_app_statistic.h" #include "iservice_reverse.h" #include "iremote_stub.h" #include "module_sched/sched_scheduler.h" #include "service_stub.h" #include "svc_session_manager.h" #include "system_ability.h" #include "thread_pool.h" namespace OHOS::FileManagement::Backup { struct ExtensionMutexInfo { std::string bundleName; std::mutex callbackMutex; ExtensionMutexInfo(std::string bundleName_) : bundleName(bundleName_) {}; }; struct BundleTaskInfo { std::string reportTime; ErrCode errCode; }; const int INVALID_FD = -1; constexpr const int32_t CONNECT_WAIT_TIME_S = 15; class Service : public SystemAbility, public ServiceStub, protected NoCopyable { DECLARE_SYSTEM_ABILITY(Service); // 以下都是IPC接口 public: ErrCode InitRestoreSession(const sptr& remote) override; ErrCode InitRestoreSessionWithErrMsg(const sptr& reverseIpcRemoteObject, int32_t &errCodeForMsg, std::string& errMsg) override; ErrCode InitBackupSession(const sptr& remote) override; ErrCode InitBackupSessionWithErrMsg(const sptr& remote, int32_t &errCodeForMsg, std::string &errMsg) override; ErrCode Start() override; ErrCode GetLocalCapabilities(int& fd) override; ErrCode GetLocalCapabilitiesForBundleInfos(int& fd) override; ErrCode PublishFile(const BFileInfo &fileInfo) override; ErrCode AppFileReady(const std::string &fileName, int fd, int32_t errCode) override; ErrCode AppFileReadyWithoutFd(const std::string &fileName, int32_t errCode) override; ErrCode AppDone(ErrCode errCode) override; ErrCode ServiceResultReport(const std::string& restoreRetInfo, BackupRestoreScenario sennario, ErrCode errCode) override; ErrCode GetFileHandle(const std::string &bundleName, const std::string &fileName) override; ErrCode AppendBundlesRestoreSessionDataByDetail( int fd, const std::vector& bundleNames, const std::vector& detailInfos, int32_t restoreType, int32_t userId) override; ErrCode AppendBundlesRestoreSessionData(int fd, const std::vector& bundleNames, int32_t restoreType, int32_t userId) override; ErrCode AppendBundlesBackupSession(const std::vector &bundleNames) override; ErrCode AppendBundlesDetailsBackupSession(const std::vector &bundleNames, const std::vector &bundleInfos) override; ErrCode Finish() override; ErrCode Release() override; ErrCode CancelForResult(const std::string& bundleName, int32_t &result) override; ErrCode GetLocalCapabilitiesIncremental(const std::vector& bundleNames, int& fd) override; ErrCode GetAppLocalListAndDoIncrementalBackup() override; ErrCode InitIncrementalBackupSession(const sptr& remote) override; ErrCode InitIncrementalBackupSessionWithErrMsg(const sptr& remote, int32_t &errCodeForMsg, std::string &errMsg) override; ErrCode AppendBundlesIncrementalBackupSession(const std::vector &bundlesToBackup) override; ErrCode AppendBundlesIncrementalBackupSessionWithBundleInfos(const std::vector& bundlesToBackup, const std::vector& bundleInfos) override; ErrCode PublishIncrementalFile(const BFileInfo &fileInfo) override; ErrCode PublishSAIncrementalFile(const BFileInfo& fileInfo, int fd) override; ErrCode PublishSAIncrementalFile(const BFileInfo &fileInfo, UniqueFd fd); ErrCode AppIncrementalFileReady(const std::string& fileName, int fd, int manifestFd, int32_t appIncrementalFileReadyErrCode) override; ErrCode AppIncrementalFileReadyWithoutFd(const std::string& fileName, int32_t appIncrementalFileReadyErrCode) override; ErrCode AppIncrementalDone(ErrCode errCode) override; ErrCode GetIncrementalFileHandle(const std::string &bundleName, const std::string &fileName) override; ErrCode GetBackupInfo(const BundleName &bundleName, std::string &result) override; ErrCode UpdateTimer(const BundleName &bundleName, uint32_t timeout, bool &result) override; ErrCode UpdateSendRate(const std::string &bundleName, int32_t sendRate, bool &result) override; ErrCode ReportAppProcessInfo(const std::string& processInfo, BackupRestoreScenario sennario) override; ErrCode StartExtTimer(bool &isExtStart) override; ErrCode StartFwkTimer(bool &isFwkStart) override; ErrCode StopExtTimer(bool &isExtStop) override; ErrCode RefreshDataSize(int64_t totalDataSize) override; ErrCode SAResultReport(const std::string bundleName, const std::string resultInfo, const ErrCode errCode, const BackupRestoreScenario sennario); void StartGetFdTask(std::string bundleName, wptr ptr); ErrCode GetBackupDataSize(bool isPreciseScan, const std::vector& bundleNameList) override; ErrCode CleanBundleTempDir(const std::string &bundleName) override; ErrCode HandleExtDisconnect(BackupRestoreScenario scenario, bool isAppResultReport, ErrCode errCode) override; ErrCode GetExtOnRelease(bool &isExtOnRelease) override; ErrCode GetCompatibilityInfo(const std::string &bundleName, const std::string &extInfo, std::string &compatInfo) override; // 以下都是非IPC接口 public: void OnStart() override; void OnStop() override; void StopAll(const wptr &obj, bool force = false); int Dump(int fd, const std::vector &args) override; /** * @brief 执行启动 backup extension * * @param bundleName * @return ErrCode */ virtual ErrCode LaunchBackupExtension(const BundleName &bundleName); /** * @brief 执行启动 backup sa extension * * @param bundleName * @return ErrCode */ ErrCode LaunchBackupSAExtension(const BundleName &bundleName); /** * @brief backup extension died * * @param bundleName 应用名称 */ void OnBackupExtensionDied(const std::string &&bundleName, bool isCleanCalled = false); /** * @brief extension启动连接成功 * * @param bundleName 应用名称 */ void ExtConnectDone(std::string bundleName); /** * @brief extension启动连接失败 * * @param bundleName 应用名称 */ void ExtConnectFailed(const std::string &bundleName, ErrCode ret); /** * @brief 执行backup extension 备份恢复流程 * * @param bundleName 应用名称 */ virtual void ExtStart(const std::string &bundleName); /** * @brief 备份恢复开始,设置处置位 * * @param bundleName 应用名称 * */ void SendStartAppGalleryNotify(const std::string &bundleName); /** * @brief 备份恢复结束,清理处置位 * * @param bundleName 应用名称 * */ void SendEndAppGalleryNotify(const std::string &bundleName); /** * @brief 备份恢复异常结束,清理处置位 * */ void SendErrAppGalleryNotify(); /** * @brief SA开始时,清理配置文件中的处置位 * */ void ClearDisposalOnSaStart(); /** * @brief 备份恢复全部结束,删除配置文件 * * */ void DeleteDisConfigFile(); /** * @brief 尝试清理处置 * * @param bundleName 应用名称 * */ void TryToClearDispose(const BundleName &bundleName); /** * @brief 结束会话删除session,卸载服务 * */ void SessionDeactive(); /** * @brief 构造拉起应用所需的want * * @param bundleName 应用名称 * */ AAFwk::Want CreateConnectWant (const BundleName &bundleName); /** * @brief SA backup回调 * * @param bundleName 应用名称 * @param fd 备份数据 * @param result SA备份的结果(异常) * @param errCode backup的错误 * */ void OnSABackup(const std::string &bundleName, const int &fd, const std::string &result, const ErrCode &errCode); /** * @brief SA restore回调 * * @param bundleName 应用名称 * @param result SA恢复的结果(异常) * @param errCode restore的错误 * */ void OnSARestore(const std::string &bundleName, const std::string &result, const ErrCode &errCode); /** * @brief GetBackupInfo extension成功回调 * * @param obj 当前对象 * @param bundleName 应用名称 * */ std::function GetBackupInfoConnectDone(wptr obj, const std::string &bundleName); /** * @brief GetBackupInfo extension死亡回调 * * @param obj 当前对象 * @param bundleName 应用名称 * */ std::function GetBackupInfoConnectDied( wptr obj, const std::string &bundleName); /** * @brief timeout callback * * @param ptr 当前对象 * @param bundleName 应用名称 */ std::function TimeOutCallback(wptr ptr, std::string bundleName); /** * @brief do timeout * * @param ptr 当前对象 * @param bundleName 应用名称 */ void DoTimeout(wptr ptr, std::string bundleName); /** * @brief 清理残留数据 * * @param bundleName 应用名称 * */ ErrCode ClearResidualBundleData(const std::string &bundleName); /** * @brief 添加清理记录 * * @param bundleName 应用名称 * */ void AddClearBundleRecord(const std::string &bundleName); /** * @brief 删除清理记录 * * @param bundleName 应用名称 * */ void DelClearBundleRecord(const std::vector &bundleNames); /** * @brief 获取extension锁 * * @param bundleName 应用名称 * */ std::shared_ptr GetExtensionMutex(const BundleName &bundleName); /** * @brief 清理extension锁 * * @param bundleName 应用名称 * */ void RemoveExtensionMutex(const BundleName &bundleName); void StartRunningTimer(const std::string &bundleName); string BundleNameWithUserId(const string& bundleName, const int32_t userId); std::tuple SplitBundleName(const string& bundleNameWithId); void AppendBundles(const std::vector &bundleNames); void ReportOnBundleStarted(IServiceReverseType::Scenario scenario, const std::string &bundleName); ErrCode AppIncrementalFileReady(const std::string &bundleName, const std::string &fileName, UniqueFd fd, UniqueFd manifestFd, int32_t errCode); ErrCode SendFileHandle(const std::string &bundleName, const std::string &fileName); ErrCode SendIncrementalFileHandle(const std::string &bundleName, const std::string &fileName); void SetExtOnRelease(const BundleName &bundleName, bool isOnRelease); void RemoveExtOnRelease(const BundleName &bundleName); void DoNoticeClientFinish(const std::string &bundleName, ErrCode errCode, bool isRestoreEnd); public: explicit Service(int32_t saID, bool runOnCreate = false) : SystemAbility(saID, runOnCreate) { threadPool_.Start(BConstants::EXTENSION_THREAD_POOL_COUNT); sendScannendResultThreadPool_.Start(BConstants::SA_THREAD_POOL_COUNT); getDataSizeThreadPool_.Start(BConstants::SA_THREAD_POOL_COUNT); callbackScannedInfoThreadPool_.Start(BConstants::SA_THREAD_POOL_COUNT); session_ = sptr(new SvcSessionManager(wptr(this))); disposal_ = make_shared(); clearRecorder_ = make_shared(); sched_ = sptr(new SchedScheduler(wptr(this), wptr(session_))); }; ~Service() override { threadPool_.Stop(); sendScannendResultThreadPool_.Stop(); getDataSizeThreadPool_.Stop(); callbackScannedInfoThreadPool_.Stop(); }; private: /** * @brief 验证调用者 * */ ErrCode VerifyCaller(); /** * @brief 获取调用者名称 * * @return std::string */ std::string GetCallerName(); /** * @brief 获取用户id * * @return int32_t */ int32_t GetUserIdDefault(); /** * @brief 验证调用者 * * @param scenario Scenario状态 */ ErrCode VerifyCaller(IServiceReverseType::Scenario scenario); /** * @brief 验证调用者并返回名称 * * @return ErrCode */ ErrCode VerifyCallerAndGetCallerName(std::string &bundleName); /** * @brief 清除Session Sched相关资源 * * @param bundleName 应用名称 */ void ClearSessionAndSchedInfo(const std::string &bundleName); /** * @brief 上报总体统计打点 */ void TotalStatReport(ErrCode errCode); /** * @brief 整个备份恢复流程结束 * * @param errCode 错误码 */ void OnAllBundlesFinished(ErrCode errCode); /** * @brief 执行调度器 * */ void OnStartSched(); /** * @brief 通知客户端程序扩展能力处理结果 * * @param bundleName 应用名称 * */ void NoticeClientFinish(const std::string &bundleName, ErrCode errCode); /** * @brief 处理有依赖的应用恢复 * * @param bundleName 应用名称 * */ void HandleRestoreDepsBundle(const std::string &bundleName); /** * @brief 增量备份恢复逻辑处理 * * @param bundleName * @return true * @return false */ bool IncrementalBackup(const std::string &bundleName); /** * @brief extension连接断开 * * @param bundleName */ void ExtConnectDied(const std::string &bundleName); /** * @brief 设置当前session的关键信息 * * @param restoreBundleInfos 待恢复的应用 * @param restoreBundleNames 待恢复的应用包信息 * @param bundleNameDetailMap bundle和detail的对应关系 * @param isClearDataFlags 清理数据标志集合 * @param restoreType 任务类型 * @param backupVersion 旧机backupVersion */ void SetCurrentSessProperties(std::vector &restoreBundleInfos, std::vector &restoreBundleNames, std::map> &bundleNameDetailMap, std::map &isClearDataFlags, RestoreTypeEnum restoreType, std::string &backupVersion); /** * @brief set session info * * @param restoreBundleInfos: bundles to be restored * @param restoreBundleNames: bundles info to be restored * @param restoreType: retore type * @param backupVersion backupVersion of old device */ void SetCurrentSessProperties(std::vector &restoreBundleInfos, std::vector &restoreBundleNames, RestoreTypeEnum restoreType, std::string &backupVersion); void SetCurrentSessProperties(BJsonEntityCaps::BundleInfo &info, std::map &isClearDataFlags, const std::string &bundleNameIndexInfo); /** * @brief add useridinfo to current backup session * * @param bundleNames: bundleNames list * @param userId: userId * @param backupBundleInfos: backupBundleInfos * @param isIncBackup: isIncBackup * */ void SetCurrentBackupSessProperties(const std::vector &bundleNames, int32_t userId, std::vector &backupBundleInfos, bool isIncBackup); /** * @brief send userid to app * * @param bundleName: bundleName * @param userId: userId * */ void SendUserIdToApp(std::string &bundleName, int32_t userId); /** * @brief 通知权限模块 * * @param bundleName 包名称 * */ void HandleCurBundleEndWork(std::string bundleName, const BackupRestoreScenario sennario); /** * @brief SA 备份恢复结束 * * @param bundleName SAID * * @return ErrCode OK if saDone, otherwise saDone failed. */ ErrCode SADone(const ErrCode errCode, std::string bundleName); /** * @brief SA备份恢复入口 * * @param bundleName SAID * * @return ErrCode OK if backup sa, otherwise backup sa failed. */ ErrCode BackupSA(std::string bundleName); /** * @brief SA增量备份恢复入口 * * @param bundleName SAID * * @return ErrCode OK if backup sa, otherwise backup sa failed. */ ErrCode IncrementalBackupSA(std::string bundleName); /** * @brief 执行通知调用方 * * @param errCode 错误码 * @param callerName 业务调用方 * */ void NotifyCallerCurAppDone(ErrCode errCode, const std::string &callerName); /** * @brief 执行通知调用方 * * @param errCode 错误码 * @param callerName 业务调用方 * */ void NotifyCallerCurAppIncrementDone(ErrCode errCode, const std::string &callerName); void SetWant(AAFwk::Want &want, const BundleName &bundleName, const BConstants::ExtensionAction &action); /** * @brief GetBackupInfo 任务执行 * * @param bundleName 应用名称 * @param result 业务结果出参 * */ ErrCode GetBackupInfoCmdHandle(const BundleName &bundleName, std::string &result); /** * @brief 添加需要清理的Session * * @param bundleNames 需要清理的应用包信息 * */ ErrCode AppendBundlesClearSession(const std::vector &bundleNames); /** * @brief 设置是否自占用Session * * @param isOccupyingSession 框架是否自占用session * */ void SetOccupySession(bool isOccupyingSession); /** * @brief 尝试拉起某个应用的extension * * @param bundleName 目标应用 * @param extConnection 框架和应用的连接 * */ ErrCode TryToConnectExt(const std::string& bundleName, sptr& extConnection); void ReportOnExtConnectFailed(const IServiceReverseType::Scenario scenario, const std::string &bundleName, const ErrCode ret); void ReleaseOnException(); vector MakeDetailList(const vector &bundleNames); vector GetBundleNameByDetails(const std::vector &bundlesToBackup); void HandleCurGroupBackupInfos(vector &bundleInfos, std::map> &bundleNameDetailMap, std::map &isClearDataFlags); void HandleCurGroupIncBackupInfos(vector &bundleInfos, std::map> &bundleNameDetailMap, std::map &isClearDataFlags); void TimeoutRadarReport(IServiceReverseType::Scenario scenario, std::string &bundleName); void OnBundleStarted(BError error, sptr session, const BundleName &bundleName); void HandleExceptionOnAppendBundles(sptr session, const vector &appendBundleNames, const vector &restoreBundleNames); void BundleBeginRadarReport(const std::string &bundleName, const ErrCode errCode, const IServiceReverseType::Scenario scenario); void BundleEndRadarReport(const std::string &bundleName, ErrCode errCode, const IServiceReverseType::Scenario scenario); void FileReadyRadarReport(const std::string &bundleName, const std::string &fileName, const ErrCode errCode, const IServiceReverseType::Scenario scenario); void ExtensionConnectFailRadarReport(const std::string &bundleName, const ErrCode errCode, const IServiceReverseType::Scenario scenario); void OnStartResRadarReport(const std::vector &bundleNameList, int32_t stage); void PermissionCheckFailRadar(const std::string &info, const std::string &func); bool IsReportBundleExecFail(const std::string &bundleName); void ClearBundleRadarReport(); void UpdateBundleRadarReport(const std::string &bundleName); bool IsReportFileReadyFail(const std::string &bundleName); void ClearFileReadyRadarReport(); void UpdateFailedBundles(const std::string &bundleName, BundleTaskInfo taskInfo); void ClearFailedBundles(); void CreateDirIfNotExist(const std::string &path); void GetOldDeviceBackupVersion(); std::vector GetSupportBackupBundleNames(vector &bundleInfos, bool isIncBackup, const vector &srcBundleNames); void RefreshBundleDataSize(const vector &newBundleInfos, std::string bundleName, wptr ptr); void HandleNotSupportBundleNames(const std::vector &srcBundleNames, std::vector &supportBundleNames, bool isIncBackup); void SetBundleIncDataInfo(const std::vector &bundlesToBackup, std::vector &supportBundleNames); void CancelTask(std::string bundleName, wptr ptr); bool CancelSessionClean(sptr session, std::string bundleName); void SetUserIdAndRestoreType(RestoreTypeEnum restoreType, int32_t userId); ErrCode VerifySendRateParam(); ErrCode HandleCurBundleFileReady(const std::string &bundleName, const std::string &fileName, bool isIncBackup); ErrCode HandleCurAppDone(ErrCode errCode, const std::string &bundleName, bool isIncBackup); void StartCurBundleBackupOrRestore(const std::string &bundleName); void CallOnBundleEndByScenario(const std::string &bundleName, BackupRestoreScenario scenario, ErrCode errCode); void GetDataSizeStepByStep(bool isPreciseScan, vector bundleNameList, string &scanning); void GetPresumablySize(vector bundleNameList, string &scanning); void GetPrecisesSize(vector bundleNameList, string &scanning); void WriteToList(BJsonUtil::BundleDataSize bundleDataSize); void DeleteFromList(size_t scannedSize); void WriteScannedInfoToList(const string &bundleName, int64_t dataSize, int64_t incDataSize); void SendScannedInfo(const string &scannendInfos, sptr session); void CyclicSendScannedInfo(bool isPreciseScan, vector bundleNameList); bool GetScanningInfo(wptr obj, size_t scannedSize, string &scanning); void SetScanningInfo(string &scanning, string name); ErrCode Cancel(const std::string& bundleName, int32_t &result); void HandleOnReleaseAndDisconnect(sptr sessionPtr, const std::string &bundleName); ErrCode InitRestoreSession(const sptr& remote, std::string &errMsg); ErrCode InitBackupSession(const sptr& remote, std::string &errMsg); ErrCode InitIncrementalBackupSession(const sptr& remote, std::string &errMsg); UniqueFd GetLocalCapabilities(); UniqueFd GetLocalCapabilitiesForBundleInfos(); ErrCode AppFileReady(const std::string &fileName, UniqueFd fd, int32_t errCode); ErrCode AppIncrementalFileReady(const std::string &fileName, UniqueFd fd, UniqueFd manifestFd, int32_t errCode); ErrCode AppendBundlesRestoreSession(UniqueFd fd, const std::vector &bundleNames, const std::vector &bundleInfos, RestoreTypeEnum restoreType = RestoreTypeEnum::RESTORE_DATA_WAIT_SEND, int32_t userId = DEFAULT_INVAL_VALUE); ErrCode AppendBundlesRestoreSession(UniqueFd fd, const std::vector &bundleNames, RestoreTypeEnum restoreType = RestoreTypeEnum::RESTORE_DATA_WAIT_SEND, int32_t userId = DEFAULT_INVAL_VALUE); UniqueFd GetLocalCapabilitiesIncremental(const std::vector &bundleNames); ErrCode AppendBundlesIncrementalBackupSession(const std::vector &bundlesToBackup, const std::vector &infos); ErrCode HelpToAppIncrementalFileReady(const string &bundleName, const string &fileName, sptr proxy); vector GetRestoreBundleNames(UniqueFd fd, sptr session, const vector &bundleNames, std::string &oldBackupVersion); void AppStatReportErr(const string &bundleName, const string &func, RadarError err); void SaStatReport(const string &bundleName, const string &func, RadarError err); void ClearIncrementalStatFile(int32_t userId, const string &bundleName); BJsonCachedEntity CreateJsonEntity(UniqueFd &fd, vector &bundleInfos, const std::vector &bundleNames); void TotalStart() { if (totalStatistic_ != nullptr) { totalStatistic_->totalSpendTime_.Start(); } } void GetBundleInfoStart() { if (totalStatistic_ != nullptr) { totalStatistic_->getBundleInfoSpend_.Start(); } } void GetBundleInfoEnd() { if (totalStatistic_ != nullptr) { totalStatistic_->getBundleInfoSpend_.End(); } } void UpdateHandleCnt(ErrCode errCode) { if (totalStatistic_ != nullptr) { if (errCode == ERR_OK) { totalStatistic_->succBundleCount_.fetch_add(1); } else { totalStatistic_->failBundleCount_.fetch_add(1); } } } private: static sptr instance_; static std::mutex instanceLock_; std::mutex getBackupInfoProcLock_; std::mutex getBackupInfoSyncLock_; std::condition_variable getBackupInfoCondition_; static inline std::atomic seed {1}; std::atomic isConnectDied_ {false}; std::atomic isOccupyingSession_ {false}; std::atomic isCreatingIncreaseFile_ {0}; sptr session_; sptr sched_; std::shared_ptr disposal_; std::shared_ptr clearRecorder_; std::atomic isInRelease_ {false}; std::atomic isRmConfigFile_ {true}; friend class ServiceTest; OHOS::ThreadPool threadPool_; std::mutex bundleExecRadarLock_; std::set bundleExecRadarSet_; std::mutex fileReadyRadarLock_; std::map fileReadyRadarMap_; std::mutex extensionMutexLock_; std::mutex failedBundlesLock_; std::mutex scannedListLock_; std::mutex getDataSizeLock_; OHOS::ThreadPool callbackScannedInfoThreadPool_; OHOS::ThreadPool getDataSizeThreadPool_; OHOS::ThreadPool sendScannendResultThreadPool_; std::condition_variable getDataSizeCon_; std::atomic isScannedEnd_ {false}; std::atomic onScanning_ {false}; std::shared_ptr totalStatistic_ = nullptr; std::shared_mutex statMapMutex_; std::map> saStatisticMap_; std::map> backupExtOnReleaseMap_; public: std::map> backupExtMutexMap_; std::map failedBundles_; std::atomic successBundlesNum_ {0}; std::vector bundleDataSizeList_; std::string scannedInfo_; }; } // namespace OHOS::FileManagement::Backup #endif // OHOS_FILEMGMT_BACKUP_SERVICE_H