1 /* 2 * Copyright (c) 2023-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 #ifndef OHOS_FILEMGMT_CLOUD_SYNC_NAPI_H 17 #define OHOS_FILEMGMT_CLOUD_SYNC_NAPI_H 18 19 #include "cloud_sync_callback.h" 20 #include "cloud_optimize_callback.h" 21 #include "cloud_sync_common.h" 22 #include "data_ability_observer_interface.h" 23 #include "data_ability_observer_stub.h" 24 #include "dataobs_mgr_client.h" 25 #include "filemgmt_libn.h" 26 #include "uv.h" 27 28 namespace OHOS::FileManagement::CloudSync { 29 const int32_t ARGS_ONE = 1; 30 31 struct BundleEntity { 32 std::string bundleName_; BundleEntityBundleEntity33 explicit BundleEntity(const std::string bundleName): bundleName_(bundleName){}; 34 }; 35 36 struct CloudChangeListener { 37 NotifyType notifyType; 38 AAFwk::ChangeInfo changeInfo; 39 std::string strUri; 40 }; 41 42 struct RegisterParams { 43 std::string uri; 44 bool recursion; 45 napi_ref cbOnRef; 46 }; 47 48 struct BatchContext { 49 std::vector<std::string> uriList; 50 std::vector<int32_t> resultList; 51 }; 52 53 class CloudSyncCallbackImpl; 54 class ChangeListenerNapi; 55 class CloudNotifyObserver; 56 class CloudSyncNapi : public LibN::NExporter { 57 public: 58 void SetClassName(const std::string classname); 59 std::string GetClassName() override; 60 bool Export() override; 61 bool ToExport(std::vector<napi_property_descriptor> props); 62 static napi_value Constructor(napi_env env, napi_callback_info info); 63 64 static napi_value Start(napi_env env, napi_callback_info info); 65 static napi_value Stop(napi_env env, napi_callback_info info); 66 static napi_value OnCallback(napi_env env, napi_callback_info info); 67 static napi_value OffCallback(napi_env env, napi_callback_info info); 68 static std::tuple<int32_t, int32_t> GetSingleFileSyncState(const std::string &uri); 69 static std::tuple<int32_t, int32_t> GetFileSyncStateForBatch(const std::string &uri); 70 static napi_value GetBatchFileSyncState(const napi_env &env, const LibN::NFuncArg &funcArg); 71 static napi_value GetFileSyncState(napi_env env, napi_callback_info info); 72 static napi_value GetCoreFileSyncState(napi_env env, napi_callback_info info); 73 static napi_value RegisterChange(napi_env env, napi_callback_info info); 74 static napi_value UnregisterChange(napi_env env, napi_callback_info info); 75 static napi_value OptimizeStorage(napi_env env, napi_callback_info info); 76 static napi_value StartOptimizeStorage(napi_env env, napi_callback_info info); 77 static napi_value StopOptimizeStorage(napi_env env, napi_callback_info info); 78 79 static std::string GetBundleName(const napi_env &env, const LibN::NFuncArg &funcArg); 80 static bool InitArgsOnCallback(const napi_env &env, LibN::NFuncArg &funcArg); 81 static bool InitArgsOffCallback(const napi_env &env, LibN::NFuncArg &funcArg); CloudSyncNapi(napi_env env,napi_value exports)82 CloudSyncNapi(napi_env env, napi_value exports) : NExporter(env, exports) {}; 83 ~CloudSyncNapi() = default; 84 85 protected: 86 static inline std::shared_ptr<CloudSyncCallbackImpl> callback_{nullptr}; 87 88 private: 89 static bool CheckRef(napi_env env, napi_ref ref, ChangeListenerNapi &listObj, const std::string &uri); 90 static int32_t RegisterToObs(napi_env env, const RegisterParams ®isterParams); 91 static napi_value UnregisterFromObs(napi_env env, const std::string &uri); 92 static int32_t HandOptimizeStorageParams(napi_env env, napi_callback_info info, LibN::NFuncArg &funcArg, 93 OptimizeSpaceOptions &optimizeOptions); 94 std::string className_; 95 static std::mutex sOnOffMutex_; 96 }; 97 98 class CloudSyncCallbackImpl : public CloudSyncCallback, public std::enable_shared_from_this<CloudSyncCallbackImpl> { 99 public: 100 CloudSyncCallbackImpl(napi_env env, napi_value fun); 101 ~CloudSyncCallbackImpl() = default; 102 void OnSyncStateChanged(SyncType type, SyncPromptState state) override; 103 void OnSyncStateChanged(CloudSyncState state, ErrorType error) override; 104 void OnDeathRecipient() override; 105 void DeleteReference(); 106 107 class UvChangeMsg { 108 public: UvChangeMsg(std::shared_ptr<CloudSyncCallbackImpl> cloudSyncCallbackIn,CloudSyncState state,ErrorType error)109 UvChangeMsg(std::shared_ptr<CloudSyncCallbackImpl> cloudSyncCallbackIn, CloudSyncState state, ErrorType error) 110 : cloudSyncCallback_(cloudSyncCallbackIn), state_(state), error_(error) 111 { 112 } ~UvChangeMsg()113 ~UvChangeMsg() {} 114 std::weak_ptr<CloudSyncCallbackImpl> cloudSyncCallback_; 115 CloudSyncState state_; 116 ErrorType error_; 117 }; 118 119 private: 120 static void OnComplete(UvChangeMsg *msg); 121 napi_env env_; 122 napi_ref cbOnRef_ = nullptr; 123 static CloudSyncState preState_; 124 static ErrorType preError_; 125 }; 126 127 class ChangeListenerNapi { 128 public: 129 class UvChangeMsg { 130 public: UvChangeMsg(napi_env env,napi_ref ref,AAFwk::ChangeInfo & changeInfo,std::string strUri)131 UvChangeMsg(napi_env env, napi_ref ref, AAFwk::ChangeInfo &changeInfo, std::string strUri) 132 : env_(env), ref_(ref), changeInfo_(changeInfo), strUri_(std::move(strUri)) 133 { 134 data_ = nullptr; 135 } ~UvChangeMsg()136 ~UvChangeMsg() {} 137 napi_env env_; 138 napi_ref ref_; 139 AAFwk::ChangeInfo changeInfo_; 140 uint8_t *data_; 141 std::string strUri_; 142 }; 143 ChangeListenerNapi(napi_env env)144 explicit ChangeListenerNapi(napi_env env) : env_(env) {} 145 ChangeListenerNapi(const ChangeListenerNapi & listener)146 ChangeListenerNapi(const ChangeListenerNapi &listener) 147 { 148 this->env_ = listener.env_; 149 this->cbOnRef_ = listener.cbOnRef_; 150 this->cbOffRef_ = listener.cbOffRef_; 151 this->observers_ = listener.observers_; 152 } 153 154 ChangeListenerNapi &operator=(const ChangeListenerNapi &listener) 155 { 156 this->env_ = listener.env_; 157 this->cbOnRef_ = listener.cbOnRef_; 158 this->cbOffRef_ = listener.cbOffRef_; 159 this->observers_ = listener.observers_; 160 return *this; 161 } 162 ~ChangeListenerNapi()163 ~ChangeListenerNapi(){}; 164 void OnChange(CloudChangeListener &listener, const napi_ref cbRef); 165 int32_t SendEvent(UvChangeMsg *msg); 166 static napi_value SolveOnChange(napi_env env, UvChangeMsg *msg); 167 napi_ref cbOnRef_ = nullptr; 168 napi_ref cbOffRef_ = nullptr; 169 std::vector<std::shared_ptr<CloudNotifyObserver>> observers_; 170 171 private: 172 napi_env env_ = nullptr; 173 }; 174 175 class CloudNotifyObserver { 176 public: CloudNotifyObserver(const ChangeListenerNapi & listObj,std::string uri,napi_ref ref)177 CloudNotifyObserver(const ChangeListenerNapi &listObj, std::string uri, napi_ref ref) 178 : listObj_(listObj), uri_(uri), ref_(ref) 179 { 180 } 181 ~CloudNotifyObserver() = default; 182 183 void OnChange(); 184 void OnchangeExt(const AAFwk::ChangeInfo &changeInfo); 185 186 ChangeListenerNapi listObj_; 187 std::string uri_; 188 napi_ref ref_; 189 }; 190 191 class CloudOptimizeCallbackImpl : public CloudOptimizeCallback, 192 public std::enable_shared_from_this<CloudOptimizeCallbackImpl> { 193 public: CloudOptimizeCallbackImpl(napi_env env,LibN::NVal callbcakVal)194 CloudOptimizeCallbackImpl(napi_env env, LibN::NVal callbcakVal) : env_(env), cbOnRef_(callbcakVal) {} 195 ~CloudOptimizeCallbackImpl() = default; 196 void OnOptimizeProcess(const OptimizeState state, const int32_t progress) override; 197 198 private: 199 napi_env env_ = nullptr;; 200 LibN::NRef cbOnRef_; 201 }; 202 } // namespace OHOS::FileManagement::CloudSync 203 #endif // OHOS_FILEMGMT_CLOUD_SYNC_NAPI_H 204