From 51b79d3a4494381a1f6729e15b823e48dbe83f09 Mon Sep 17 00:00:00 2001 From: hanlu Date: Thu, 1 Jun 2023 22:07:35 +0800 Subject: [PATCH] f Signed-off-by: hanlu --- .../js/napi/common/src/datashare_js_utils.cpp | 3 +- .../common/src/datashare_predicates_proxy.cpp | 4 +- .../observer/src/napi_subscriber_manager.cpp | 2 +- .../include/base_connection.h | 0 .../native/common/include/callbacks_manager.h | 18 +-- .../common/src/ishared_result_set_stub.cpp | 1 - .../native/consumer/src/datashare_helper.cpp | 19 ++- .../include/js_datashare_ext_ability.h | 11 +- .../provider/src/js_datashare_ext_ability.cpp | 118 ++++++++++++++++-- .../proxy/include/idata_share_service.h | 2 +- .../src/published_data_subscriber_manager.cpp | 5 +- .../proxy/src/rdb_subscriber_manager.cpp | 3 +- interfaces/inner_api/BUILD.gn | 4 +- interfaces/inner_api/common/BUILD.gn | 4 + .../common/include/datashare_errno.h | 5 + .../include/datashare_predicates_objects.h | 3 +- .../common/include/datashare_template.h | 10 +- .../common/include/datashare_values_bucket.h | 3 +- .../inner_api/common/libdatashare_common.map | 3 + .../consumer/include/datashare_helper.h | 6 +- 20 files changed, 181 insertions(+), 43 deletions(-) rename frameworks/native/{consumer => common}/include/base_connection.h (100%) diff --git a/frameworks/js/napi/common/src/datashare_js_utils.cpp b/frameworks/js/napi/common/src/datashare_js_utils.cpp index 3861c2ee..a0642273 100644 --- a/frameworks/js/napi/common/src/datashare_js_utils.cpp +++ b/frameworks/js/napi/common/src/datashare_js_utils.cpp @@ -615,7 +615,7 @@ bool DataShareJSUtils::UnwrapPublishedDataItem(napi_env env, napi_value jsObject std::string strSubId; if (!UnwrapStringByPropertyName(env, jsObject, "subscriberId", strSubId)) { LOG_ERROR("Convert subscriberId failed"); - return {}; + return false; } publishedDataItem.subscriberId_ = atoll(strSubId.c_str()); return true; @@ -640,7 +640,6 @@ bool DataShareJSUtils::UnwrapPublishedDataItemVector(napi_env env, napi_value va std::vector &publishedDataItems) { uint32_t arraySize = 0; - std::string strValue; if (!IsArrayForNapiValue(env, value, arraySize)) { LOG_ERROR("IsArrayForNapiValue is false"); diff --git a/frameworks/js/napi/common/src/datashare_predicates_proxy.cpp b/frameworks/js/napi/common/src/datashare_predicates_proxy.cpp index 13e22552..47287de2 100644 --- a/frameworks/js/napi/common/src/datashare_predicates_proxy.cpp +++ b/frameworks/js/napi/common/src/datashare_predicates_proxy.cpp @@ -696,9 +696,9 @@ napi_value DataSharePredicatesProxy::Limit(napi_env env, napi_callback_info info napi_get_cb_info(env, info, &argc, args, &thiz, nullptr); NAPI_ASSERT(env, argc > 1, "Invalid argvs!"); int number = 0; - napi_status status = napi_get_value_int32(env, args[0], &number); + napi_get_value_int32(env, args[0], &number); int offset = 0; - status = napi_get_value_int32(env, args[1], &offset); + napi_get_value_int32(env, args[1], &offset); auto nativePredicates = GetNativePredicates(env, info); if (nativePredicates == nullptr) { LOG_ERROR("GetNativePredicates failed."); diff --git a/frameworks/js/napi/observer/src/napi_subscriber_manager.cpp b/frameworks/js/napi/observer/src/napi_subscriber_manager.cpp index a0694caa..ffd6bf19 100644 --- a/frameworks/js/napi/observer/src/napi_subscriber_manager.cpp +++ b/frameworks/js/napi/observer/src/napi_subscriber_manager.cpp @@ -189,7 +189,7 @@ void NapiPublishedSubscriberManager::Emit(const PublishedDataChangeNode &changeN if (callbacks.empty()) { LOG_WARN("%{private}s nobody subscribe, but still notify", data.key_.c_str()); } - for (auto &obs : callbacks) { + for (auto const &obs : callbacks) { results[obs].datas_.emplace_back(data.key_, data.subscriberId_, data.GetData()); } } diff --git a/frameworks/native/consumer/include/base_connection.h b/frameworks/native/common/include/base_connection.h similarity index 100% rename from frameworks/native/consumer/include/base_connection.h rename to frameworks/native/common/include/base_connection.h diff --git a/frameworks/native/common/include/callbacks_manager.h b/frameworks/native/common/include/callbacks_manager.h index 63fb7427..ea5cd55c 100644 --- a/frameworks/native/common/include/callbacks_manager.h +++ b/frameworks/native/common/include/callbacks_manager.h @@ -187,13 +187,14 @@ std::vector CallbacksManager::EnableObservers(co continue; } std::vector> enabledObservers = GetEnabledObservers(key); - if (enabledObservers.size() == 0) { - firstRegisterKey.emplace_back(key); - } for (auto &item: callbacks_[key]) { item.enabled_ = true; } - result.emplace_back(key, E_OK); + if (!enabledObservers.empty()) { + result.emplace_back(key, E_OK); + continue; + } + firstRegisterKey.emplace_back(key); } } processOnFirstEnabled(firstRegisterKey, result); @@ -215,13 +216,14 @@ std::vector CallbacksManager::DisableObservers(c continue; } std::vector> enabledObservers = GetEnabledObservers(key); - if (enabledObservers.size() > 0) { - lastDisabledKeys.emplace_back(key); - } for (auto &item: callbacks_[key]) { item.enabled_ = false; } - result.emplace_back(key, E_OK); + if (enabledObservers.empty()) { + result.emplace_back(key, E_OK); + continue; + } + lastDisabledKeys.emplace_back(key); } } processOnLastDisable(lastDisabledKeys, result); diff --git a/frameworks/native/common/src/ishared_result_set_stub.cpp b/frameworks/native/common/src/ishared_result_set_stub.cpp index d56c11d7..722daae4 100644 --- a/frameworks/native/common/src/ishared_result_set_stub.cpp +++ b/frameworks/native/common/src/ishared_result_set_stub.cpp @@ -14,7 +14,6 @@ */ #include "ishared_result_set_stub.h" -#include #include "datashare_log.h" #include "datashare_errno.h" diff --git a/frameworks/native/consumer/src/datashare_helper.cpp b/frameworks/native/consumer/src/datashare_helper.cpp index 7fdaa115..ad9fb326 100644 --- a/frameworks/native/consumer/src/datashare_helper.cpp +++ b/frameworks/native/consumer/src/datashare_helper.cpp @@ -27,8 +27,10 @@ namespace OHOS { namespace DataShare { using namespace AppExecFwk; namespace { -const std::string SCHEME_DATASHARE = "datashare"; -const std::string SCHEME_DATASHARE_PROXY = "datashareproxy"; +static constexpr const char *SCHEME_DATASHARE = "datashare"; +static constexpr const char *SCHEME_DATASHARE_PROXY = "datashareproxy"; +static constexpr const char *DATA_SHARE_PREFIX = "datashare:///"; +static constexpr const char *FILE_PREFIX = "file://"; constexpr int INVALID_VALUE = -1; } // namespace class ObserverImpl : public AAFwk::DataAbilityObserverStub { @@ -85,6 +87,15 @@ DataShareHelper::~DataShareHelper() { } +std::string DataShareHelper::TransferUriPrefix(const std::string &originPrefix, const std::string &replacedPrefix, + const std::string &originUriStr) +{ + if (originUriStr.find(originPrefix) != 0) { + return originUriStr; + } + return replacedPrefix + originUriStr.substr(originPrefix.length()); +} + /** * @brief You can use this method to specify the Uri of the data to operate and set the binding relationship * between the ability using the Data template (data share for short) and the associated client process in @@ -123,7 +134,9 @@ std::shared_ptr DataShareHelper::Creator(const sptr context; + }; NativeValue* CallObjectMethod(const char *name, NativeValue * const *argv = nullptr, size_t argc = 0, bool isAsync = true); + NativeValue *CallObjectMethod( + const char *name, NativeValue **argv, size_t argc, std::shared_ptr asyncContext); void GetSrcPath(std::string &srcPath); napi_value MakePredicates(napi_env env, const DataSharePredicates &predicates); static NativeValue* AsyncCallback(NativeEngine* engine, NativeCallbackInfo* info); + static NativeValue* AsyncCallbackWithContext(NativeEngine* engine, NativeCallbackInfo* info); void CheckAndSetAsyncResult(NativeEngine* engine); + static void NotifyToDataShareService(); static void UnWrapBusinessError(napi_env env, napi_value info, DatashareBusinessError &businessError); static napi_valuetype UnWrapPropertyType(napi_env env, napi_value info, const std::string &key); diff --git a/frameworks/native/provider/src/js_datashare_ext_ability.cpp b/frameworks/native/provider/src/js_datashare_ext_ability.cpp index dfbe00de..8ad18334 100644 --- a/frameworks/native/provider/src/js_datashare_ext_ability.cpp +++ b/frameworks/native/provider/src/js_datashare_ext_ability.cpp @@ -16,20 +16,20 @@ #include "js_datashare_ext_ability.h" #include "ability_info.h" +#include "data_share_manager_impl.h" #include "dataobs_mgr_client.h" -#include "datashare_stub_impl.h" #include "datashare_log.h" +#include "datashare_predicates_proxy.h" +#include "datashare_stub_impl.h" +#include "iservice_registry.h" #include "js_datashare_ext_ability_context.h" #include "js_runtime.h" #include "js_runtime_utils.h" -#include "napi/native_api.h" -#include "napi/native_node_api.h" #include "napi_common_util.h" #include "napi_common_want.h" -#include "napi_remote_object.h" - #include "napi_datashare_values_bucket.h" -#include "datashare_predicates_proxy.h" +#include "napi_remote_object.h" +#include "system_ability_definition.h" namespace OHOS { namespace DataShare { @@ -129,7 +129,9 @@ void JsDataShareExtAbility::OnStart(const AAFwk::Want &want) napi_value napiWant = OHOS::AppExecFwk::WrapWant(env, want); NativeValue* nativeWant = reinterpret_cast(napiWant); NativeValue* argv[] = {nativeWant}; - CallObjectMethod("onCreate", argv, sizeof(argv)/sizeof(argv[0])); + std::shared_ptr context = std::make_shared(); + context->isNeedNotify_ = true; + CallObjectMethod("onCreate", argv, sizeof(argv)/sizeof(argv[0]), context); napi_close_handle_scope(env, scope); } @@ -214,6 +216,76 @@ NativeValue* JsDataShareExtAbility::AsyncCallback(NativeEngine* engine, NativeCa return engine->CreateUndefined(); } +NativeValue* JsDataShareExtAbility::AsyncCallbackWithContext(NativeEngine* engine, NativeCallbackInfo* info) +{ + if (engine == nullptr || info == nullptr) { + LOG_ERROR("invalid param."); + return nullptr; + } + if (info->functionInfo == nullptr || info->functionInfo->data == nullptr) { + LOG_ERROR("invalid object."); + return engine->CreateUndefined(); + } + + AsyncPoint* instance = static_cast(info->functionInfo->data); + if (instance != nullptr) { + if (instance->context->isNeedNotify_) { + NotifyToDataShareService(); + } + } + delete instance; + return engine->CreateUndefined(); +} + +NativeValue *JsDataShareExtAbility::CallObjectMethod( + const char *name, NativeValue *argv[], size_t argc, std::shared_ptr asyncContext) +{ + if (!jsObj_) { + LOG_WARN("Not found DataShareExtAbility.js"); + return nullptr; + } + + HandleEscape handleEscape(jsRuntime_); + auto &nativeEngine = jsRuntime_.GetNativeEngine(); + + NativeValue *value = jsObj_->Get(); + NativeObject *obj = ConvertNativeValueTo(value); + if (obj == nullptr) { + LOG_ERROR("Failed to get DataShareExtAbility object"); + return nullptr; + } + + NativeValue *method = obj->GetProperty(name); + if (method == nullptr) { + LOG_ERROR("Failed to get '%{public}s' from DataShareExtAbility object", name); + return nullptr; + } + + AsyncPoint *point = new (std::nothrow)AsyncPoint(); + if (point == nullptr) { + LOG_ERROR("JsDataShareExtAbility::CallObjectMethod new AsyncPoint error."); + return nullptr; + } + point->context = asyncContext; + size_t count = argc + 1; + NativeValue **args = new (std::nothrow) NativeValue *[count]; + if (args == nullptr) { + LOG_ERROR("JsDataShareExtAbility::CallObjectMethod new NativeValue error."); + delete point; + return nullptr; + } + for (size_t i = 0; i < argc; i++) { + args[i] = argv[i]; + } + + args[argc] = nativeEngine.CreateFunction(ASYNC_CALLBACK_NAME.c_str(), ASYNC_CALLBACK_NAME.length(), + JsDataShareExtAbility::AsyncCallbackWithContext, point); + + auto result = handleEscape.Escape(nativeEngine.CallFunction(value, method, args, count)); + delete[] args; + return result; +} + NativeValue* JsDataShareExtAbility::CallObjectMethod(const char* name, NativeValue* const* argv, size_t argc, bool isAsync) { @@ -780,6 +852,38 @@ napi_valuetype JsDataShareExtAbility::UnWrapPropertyType(napi_env env, napi_valu return type; } +void JsDataShareExtAbility::NotifyToDataShareService() +{ + auto manager = SystemAbilityManagerClient::GetInstance().GetSystemAbilityManager(); + if (manager == nullptr) { + LOG_ERROR("get system ability manager failed"); + return; + } + auto remoteObject = manager->CheckSystemAbility(DISTRIBUTED_KV_DATA_SERVICE_ABILITY_ID); + if (remoteObject == nullptr) { + LOG_ERROR("CheckSystemAbility failed"); + return; + } + auto serviceProxy = std::make_shared(remoteObject); + if (serviceProxy == nullptr) { + LOG_ERROR("make_shared failed"); + return; + } + auto remote = serviceProxy->GetFeatureInterface("data_share"); + if (remote == nullptr) { + LOG_ERROR("Get DataShare service failed!"); + return; + } + MessageParcel data; + MessageParcel reply; + MessageOption option(MessageOption::TF_ASYNC); + if (!data.WriteInterfaceToken(IDataShareService::GetDescriptor())) { + LOG_ERROR("Write descriptor failed!"); + return; + } + remote->SendRequest(IDataShareService::DATA_SHARE_SERVICE_CMD_NOTIFY, data, reply, option); +} + bool MakeNapiColumn(napi_env env, napi_value &napiColumns, const std::vector &columns) { napi_status status = napi_create_array(env, &napiColumns); diff --git a/frameworks/native/proxy/include/idata_share_service.h b/frameworks/native/proxy/include/idata_share_service.h index 568dd1a1..9c2fe7a3 100644 --- a/frameworks/native/proxy/include/idata_share_service.h +++ b/frameworks/native/proxy/include/idata_share_service.h @@ -42,7 +42,7 @@ public: DATA_SHARE_SERVICE_CMD_UNSUBSCRIBE_PUBLISHED, DATA_SHARE_SERVICE_CMD_ENABLE_SUBSCRIBE_PUBLISHED, DATA_SHARE_SERVICE_CMD_DISABLE_SUBSCRIBE_PUBLISHED, - DATA_SHARE_SERVICE_CMD_QUERY_ASSERT, + DATA_SHARE_SERVICE_CMD_NOTIFY, DATA_SHARE_SERVICE_CMD_MAX }; diff --git a/frameworks/native/proxy/src/published_data_subscriber_manager.cpp b/frameworks/native/proxy/src/published_data_subscriber_manager.cpp index b32acd97..19f10b08 100644 --- a/frameworks/native/proxy/src/published_data_subscriber_manager.cpp +++ b/frameworks/native/proxy/src/published_data_subscriber_manager.cpp @@ -136,10 +136,9 @@ std::vector PublishedDataSubscriberManager::EnableObservers(std std::vector PublishedDataSubscriberManager::DisableObservers(std::shared_ptr proxy, const std::vector &uris, int64_t subscriberId) { - std::vector results; if (proxy == nullptr) { LOG_ERROR("proxy is nullptr"); - return results; + return std::vector(); } std::vector keys; std::for_each(uris.begin(), uris.end(), [&keys, &subscriberId](auto &uri) { @@ -172,7 +171,7 @@ void PublishedDataSubscriberManager::Emit(PublishedDataChangeNode &changeNode) LOG_WARN("%{private}s nobody subscribe, but still notify", data.key_.c_str()); continue; } - for (auto &obs : callbacks) { + for (auto const &obs : callbacks) { results[obs].datas_.emplace_back(data.key_, data.subscriberId_, data.GetData()); } } diff --git a/frameworks/native/proxy/src/rdb_subscriber_manager.cpp b/frameworks/native/proxy/src/rdb_subscriber_manager.cpp index 07c91423..d88fee9e 100644 --- a/frameworks/native/proxy/src/rdb_subscriber_manager.cpp +++ b/frameworks/native/proxy/src/rdb_subscriber_manager.cpp @@ -141,10 +141,9 @@ std::vector RdbSubscriberManager::EnableObservers(std::shared_p std::vector RdbSubscriberManager::DisableObservers(std::shared_ptr proxy, const std::vector &uris, const TemplateId &templateId) { - std::vector results; if (proxy == nullptr) { LOG_ERROR("proxy is nullptr"); - return results; + return std::vector(); } std::vector keys; std::for_each(uris.begin(), uris.end(), [&keys, &templateId](auto &uri) { diff --git a/interfaces/inner_api/BUILD.gn b/interfaces/inner_api/BUILD.gn index ca280e64..0388b5b4 100644 --- a/interfaces/inner_api/BUILD.gn +++ b/interfaces/inner_api/BUILD.gn @@ -58,8 +58,6 @@ ohos_shared_library("datashare_consumer") { "${datashare_native_consumer_path}/src/datashare_helper.cpp", "${datashare_native_consumer_path}/src/datashare_proxy.cpp", "${datashare_native_proxy_path}/src/data_proxy_observer_stub.cpp", - "${datashare_native_proxy_path}/src/data_share_manager_impl.cpp", - "${datashare_native_proxy_path}/src/data_share_service_proxy.cpp", "${datashare_native_proxy_path}/src/published_data_subscriber_manager.cpp", "${datashare_native_proxy_path}/src/rdb_subscriber_manager.cpp", ] @@ -82,7 +80,6 @@ ohos_shared_library("datashare_consumer") { "ipc:ipc_single", "ipc_js:rpc", "napi:ace_napi", - "samgr:samgr_proxy", ] subsystem_name = "distributeddatamgr" @@ -123,6 +120,7 @@ ohos_shared_library("datashare_provider") { "ipc:ipc_single", "ipc_js:rpc", "napi:ace_napi", + "samgr:samgr_proxy", ] subsystem_name = "distributeddatamgr" diff --git a/interfaces/inner_api/common/BUILD.gn b/interfaces/inner_api/common/BUILD.gn index 06abf4c7..3871042c 100644 --- a/interfaces/inner_api/common/BUILD.gn +++ b/interfaces/inner_api/common/BUILD.gn @@ -37,6 +37,7 @@ ohos_shared_library("datashare_common") { "${datashare_base_path}/interfaces/inner_api/common/include", "${datashare_base_path}/interfaces/inner_api/consumer/include", "${datashare_base_path}/interfaces/inner_api/provider/include", + "${datashare_native_proxy_path}/include", "//foundation/communication/ipc/ipc/native/src/napi_common/include", "//foundation/distributeddatamgr/kv_store/frameworks/common", ] @@ -55,6 +56,8 @@ ohos_shared_library("datashare_common") { "${datashare_common_native_path}/src/ishared_result_set_proxy.cpp", "${datashare_common_native_path}/src/ishared_result_set_stub.cpp", "${datashare_common_native_path}/src/shared_block.cpp", + "${datashare_native_proxy_path}/src/data_share_manager_impl.cpp", + "${datashare_native_proxy_path}/src/data_share_service_proxy.cpp", ] deps = [ "${ability_runtime_path}/frameworks/native/ability/native:abilitykit_native" ] @@ -76,6 +79,7 @@ ohos_shared_library("datashare_common") { "ipc:ipc_napi_common", "ipc:ipc_single", "napi:ace_napi", + "samgr:samgr_proxy", ] subsystem_name = "distributeddatamgr" diff --git a/interfaces/inner_api/common/include/datashare_errno.h b/interfaces/inner_api/common/include/datashare_errno.h index 950d24f8..e2e8c7f0 100644 --- a/interfaces/inner_api/common/include/datashare_errno.h +++ b/interfaces/inner_api/common/include/datashare_errno.h @@ -84,6 +84,11 @@ constexpr int E_SUBSCRIBER_NOT_EXIST = (E_BASE + 47); * @brief Cannot find the uri */ constexpr int E_URI_NOT_EXIST = (E_BASE + 48); + +/** +* @brief Cannot find the bundleName +*/ +constexpr int E_BUNDLE_NAME_NOT_EXIST = (E_BASE + 49); } // namespace DataShare } // namespace OHOS diff --git a/interfaces/inner_api/common/include/datashare_predicates_objects.h b/interfaces/inner_api/common/include/datashare_predicates_objects.h index 21d269d5..4335157d 100644 --- a/interfaces/inner_api/common/include/datashare_predicates_objects.h +++ b/interfaces/inner_api/common/include/datashare_predicates_objects.h @@ -48,7 +48,8 @@ public: /** * @brief Use Type replace variant namespace. */ - using Type = std::variant, std::vector, std::vector, std::vector>; + using Type = std::variant, std::vector, + std::vector, std::vector>; Type value; /** diff --git a/interfaces/inner_api/common/include/datashare_template.h b/interfaces/inner_api/common/include/datashare_template.h index d2b9ddbf..79167ffa 100644 --- a/interfaces/inner_api/common/include/datashare_template.h +++ b/interfaces/inner_api/common/include/datashare_template.h @@ -106,11 +106,11 @@ struct PublishedDataItem { PublishedDataItem &operator=(const PublishedDataItem &) = delete; virtual ~PublishedDataItem() { - if (value_.index() == 0) { - AshmemNode &node = std::get(value_); - if (node.isManaged && node.ashmem != nullptr) { - node.ashmem->UnmapAshmem(); - node.ashmem->CloseAshmem(); + AshmemNode *node = std::get_if(&value_); + if (node != nullptr) { + if (node->isManaged && node->ashmem != nullptr) { + node->ashmem->UnmapAshmem(); + node->ashmem->CloseAshmem(); } } } diff --git a/interfaces/inner_api/common/include/datashare_values_bucket.h b/interfaces/inner_api/common/include/datashare_values_bucket.h index 68bf6727..03f15ab6 100644 --- a/interfaces/inner_api/common/include/datashare_values_bucket.h +++ b/interfaces/inner_api/common/include/datashare_values_bucket.h @@ -35,7 +35,8 @@ public: * @param string Specifies the parameter of the type. * @param values is the value of the corresponding type. */ - explicit DataShareValuesBucket(std::map values) : valuesMap(std::move(values)){}; + explicit DataShareValuesBucket(std::map values) + : valuesMap(std::move(values)){}; /** * @brief Destructor. */ diff --git a/interfaces/inner_api/common/libdatashare_common.map b/interfaces/inner_api/common/libdatashare_common.map index d0120308..673d7496 100644 --- a/interfaces/inner_api/common/libdatashare_common.map +++ b/interfaces/inner_api/common/libdatashare_common.map @@ -22,6 +22,9 @@ *Error*; *ISharedResultSet*; *ITypesUtil*; + *DataShareManagerImpl*; + *DataShareServiceProxy*; + *DataShareKvServiceProxy*; local: *; }; \ No newline at end of file diff --git a/interfaces/inner_api/consumer/include/datashare_helper.h b/interfaces/inner_api/consumer/include/datashare_helper.h index 6adbcc53..c0107ad5 100644 --- a/interfaces/inner_api/consumer/include/datashare_helper.h +++ b/interfaces/inner_api/consumer/include/datashare_helper.h @@ -19,13 +19,13 @@ #include #include #include -#include #include -#include "base_connection.h" #include "app/context.h" +#include "base_connection.h" #include "datashare_business_error.h" #include "datashare_template.h" +#include "published_data_subscriber_manager.h" #include "rdb_subscriber_manager.h" #include "uri.h" @@ -398,6 +398,8 @@ private: std::shared_ptr connection_ = nullptr; static bool RegObserver(const Uri &uri, const sptr &dataObserver); static bool UnregObserver(const Uri &uri, const sptr &dataObserver); + static std::string TransferUriPrefix(const std::string &originPrefix, const std::string &replacedPrefix, + const std::string &originUriStr); std::shared_ptr rdbSubscriberManager_ = nullptr; std::shared_ptr publishedDataSubscriberManager_ = nullptr; }; -- Gitee