1 /*
2 * Copyright (c) 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 #define LOG_TAG "ConnectManager"
17 #include "communication/connect_manager.h"
18
19 #include "log_print.h"
20
21 namespace OHOS::AppDistributedKv {
22 std::mutex ConnectManager::mtx_;
23 std::shared_ptr<ConnectManager> ConnectManager::instance_ = nullptr;
24 ConnectManager::CloseSessionTask ConnectManager::closeSessionTask_ = nullptr;
25 ConcurrentMap<std::string, ConnectManager::SessionCloseListener> ConnectManager::sessionCloseListener_;
26 ConcurrentMap<std::string, ConnectManager::SessionOpenListener> ConnectManager::sessionOpenListener_;
27
GetInstance()28 std::shared_ptr<ConnectManager> ConnectManager::GetInstance()
29 {
30 static std::once_flag onceFlag;
31 std::call_once(onceFlag, [&]() {
32 std::lock_guard<std::mutex> lock(mtx_);
33 if (instance_ == nullptr) {
34 instance_ = std::make_shared<ConnectManager>();
35 }
36 });
37 return instance_;
38 }
39
RegisterInstance(std::shared_ptr<ConnectManager> instance)40 bool ConnectManager::RegisterInstance(std::shared_ptr<ConnectManager> instance)
41 {
42 std::lock_guard<std::mutex> lock(mtx_);
43 if (instance_ != nullptr) {
44 ZLOGW("ConnectManager instance has been replaced!");
45 }
46 instance_ = instance;
47 return true;
48 }
49
CloseSession(const std::string & networkId)50 bool ConnectManager::CloseSession(const std::string &networkId)
51 {
52 if (closeSessionTask_ != nullptr) {
53 return closeSessionTask_(networkId);
54 }
55 return false;
56 }
57
RegisterCloseSessionTask(CloseSessionTask task)58 bool ConnectManager::RegisterCloseSessionTask(CloseSessionTask task)
59 {
60 if (closeSessionTask_ != nullptr) {
61 ZLOGE("Register close session task error, task already exists.");
62 return false;
63 }
64 closeSessionTask_ = std::move(task);
65 return true;
66 }
67
RegisterSessionCloseListener(const std::string & name,SessionCloseListener listener)68 bool ConnectManager::RegisterSessionCloseListener(const std::string &name, SessionCloseListener listener)
69 {
70 bool success = false;
71 sessionCloseListener_.Compute(name, [&success, &listener](const auto &key, auto &value) {
72 if (value != nullptr) {
73 ZLOGE("Register session close listener error, type:%{public}s already exists.", key.c_str());
74 return true;
75 }
76 value = std::move(listener);
77 success = true;
78 return true;
79 });
80 return success;
81 }
82
UnRegisterSessionCloseListener(const std::string & name)83 void ConnectManager::UnRegisterSessionCloseListener(const std::string &name)
84 {
85 sessionCloseListener_.Erase(name);
86 }
87
OnSessionClose(const std::string & networkId)88 void ConnectManager::OnSessionClose(const std::string &networkId)
89 {
90 sessionCloseListener_.ForEach([&networkId](const auto &key, auto &listener) {
91 listener(networkId);
92 return false;
93 });
94 }
95
RegisterSessionOpenListener(const std::string & name,SessionOpenListener listener)96 bool ConnectManager::RegisterSessionOpenListener(const std::string &name, SessionOpenListener listener)
97 {
98 bool success = false;
99 sessionOpenListener_.Compute(name, [&success, &listener](const auto &key, auto &value) {
100 if (value != nullptr) {
101 ZLOGE("Register session open listener error, type:%{public}s already exists.", key.c_str());
102 return true;
103 }
104 value = std::move(listener);
105 success = true;
106 return true;
107 });
108 return success;
109 }
110
UnRegisterSessionOpenListener(const std::string & name)111 void ConnectManager::UnRegisterSessionOpenListener(const std::string &name)
112 {
113 sessionOpenListener_.Erase(name);
114 }
115
OnSessionOpen(const std::string & networkId)116 void ConnectManager::OnSessionOpen(const std::string &networkId)
117 {
118 sessionOpenListener_.ForEach([&networkId](const auto &key, auto &listener) {
119 listener(networkId);
120 return false;
121 });
122 }
123
OnStart()124 void ConnectManager::OnStart()
125 {
126 }
127
OnDestory()128 void ConnectManager::OnDestory()
129 {
130 }
131
ApplyConnect(const std::string & networkId,ConnectTask task)132 int32_t ConnectManager::ApplyConnect(__attribute__((unused)) const std::string &networkId, ConnectTask task)
133 {
134 task();
135 return 0;
136 }
137 } // OHOS::AppDistributedKv