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