1 /*
2 * Copyright (c) 2023 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 #include "softbus_session_manager.h"
17
18 #include "avsession_log.h"
19 #include "avsession_errors.h"
20 #include "migrate_avsession_constant.h"
21 #include "audio_device_manager.h"
22
23 namespace OHOS::AVSession {
GetInstance()24 SoftbusSessionManager& SoftbusSessionManager::GetInstance()
25 {
26 static SoftbusSessionManager softbusSessionListener;
27 return softbusSessionListener;
28 }
29
OnBind(int32_t socket,PeerSocketInfo info)30 static void OnBind(int32_t socket, PeerSocketInfo info)
31 {
32 SLOGI("OnBind sessionId[%{public}d] result[%{public}s]", socket, info.networkId);
33 SoftbusSessionManager::GetInstance().OnBind(socket, info);
34 }
35
OnShutdown(int32_t socket,ShutdownReason reason)36 static void OnShutdown(int32_t socket, ShutdownReason reason)
37 {
38 SLOGI("OnSessionClosed sessionId[%{public}d], reason[%{public}d]", socket, reason);
39 SoftbusSessionManager::GetInstance().OnShutdown(socket, reason);
40 }
41
OnBytes(int socket,const void * data,unsigned int dataLen)42 static void OnBytes(int socket, const void *data, unsigned int dataLen)
43 {
44 SLOGI("OnBytesReceived sessionId[%{public}d], datalen[%{public}d]", socket, dataLen);
45 std::string msg = std::string(static_cast<const char*>(data), dataLen);
46 SoftbusSessionManager::GetInstance().OnBytes(socket, msg.c_str(), dataLen);
47 }
48
OnMessage(int socket,const void * data,unsigned int dataLen)49 static void OnMessage(int socket, const void *data, unsigned int dataLen)
50 {
51 SLOGI("OnMessageReceived sessionId[%{public}d], datalen[%{public}d]", socket, dataLen);
52 std::string msg = std::string(static_cast<const char*>(data), dataLen);
53 SoftbusSessionManager::GetInstance().OnMessage(socket, msg.c_str(), dataLen);
54 }
55
56 static ISocketListener iSessionListener = {
57 .OnBind = OnBind,
58 .OnShutdown = OnShutdown,
59 .OnBytes = OnBytes,
60 .OnMessage = OnMessage
61 };
62
Socket(const std::string & pkgName)63 int32_t SoftbusSessionManager::Socket(const std::string &pkgName)
64 {
65 if (pkgName.c_str() == nullptr) {
66 SLOGE("pkg name is null");
67 return AVSESSION_ERROR;
68 }
69 SocketInfo info = {
70 .name = const_cast<char *>(CONFIG_SOFTBUS_SESSION_TAG),
71 .pkgName = const_cast<char *>(pkgName.c_str()),
72 .dataType = DATA_TYPE_BYTES
73 };
74 int32_t socket = ::Socket(info);
75 QosTV serverQos[] = {
76 {.qos = QOS_TYPE_MIN_BW, .value = 64 * 1024 }, //最小带宽64k
77 {.qos = QOS_TYPE_MAX_LATENCY, .value = 19000 }, //最大建链时延19s
78 {.qos = QOS_TYPE_MIN_LATENCY, .value = 500 }, //最小建链时延0.5s
79 };
80 int32_t ret = ::Listen(socket, serverQos, QOS_COUNT, &iSessionListener);
81 if (ret == 0) {
82 SLOGI("service success ,socket[%{public}d]", socket);
83 //建立服务成功
84 } else {
85 SLOGI("service failed ,ret[%{public}d]", ret);
86 //建立服务失败,错误码
87 }
88 return socket;
89 }
90
Bind(const std::string & peerNetworkId,const std::string & pkgName)91 int32_t SoftbusSessionManager::Bind(const std::string &peerNetworkId, const std::string &pkgName)
92 {
93 if (peerNetworkId.c_str() == nullptr || peerNetworkId.length() <= 0 || pkgName.c_str() == nullptr) {
94 SLOGE("pkg or networkId name is empty");
95 return AVSESSION_ERROR;
96 }
97 SocketInfo info = {
98 .name = const_cast<char*>(CONFIG_SOFTBUS_SESSION_TAG),
99 .peerName = const_cast<char*>(CONFIG_SOFTBUS_SESSION_TAG),
100 .peerNetworkId = const_cast<char*>(peerNetworkId.c_str()),
101 .pkgName = const_cast<char*>(pkgName.c_str()),
102 .dataType = DATA_TYPE_BYTES
103 };
104 int32_t socket = ::Socket(info);
105 QosTV serverQos[] = {
106 {.qos = QOS_TYPE_MIN_BW, .value = 64 * 1024 }, //最小带宽64k
107 {.qos = QOS_TYPE_MAX_LATENCY, .value = 19000 }, //最大建链时延19s
108 {.qos = QOS_TYPE_MIN_LATENCY, .value = 500 }, //最小建链时延0.5s
109 };
110 int32_t ret = ::Bind(socket, serverQos, QOS_COUNT, &iSessionListener);
111 if (ret == 0) {
112 SLOGI("service success ,socket[%{public}d]", socket);
113 std::lock_guard lockGuard(socketLock_);
114 mMap_.insert({socket, peerNetworkId});
115 //建立服务成功
116 return socket;
117 } else {
118 SLOGI("service failed ,ret[%{public}d]", ret);
119 //建立服务失败,错误码
120 return AVSESSION_ERROR;
121 }
122 }
123
Shutdown(int32_t socket)124 void SoftbusSessionManager::Shutdown(int32_t socket)
125 {
126 SLOGI("socket Shutdown");
127 ::Shutdown(socket);
128 }
129
SendMessage(int32_t socket,const std::string & data)130 int32_t SoftbusSessionManager::SendMessage(int32_t socket, const std::string &data)
131 {
132 if (socket <= 0 || data == "") {
133 SLOGE("the params invalid, unable to send message by session.");
134 return AVSESSION_ERROR;
135 }
136 int ret = ::SendMessage(socket, data.c_str(), data.length());
137 if (ret != 0) {
138 SLOGE("SendMessage error, ret = %{public}d", ret);
139 return AVSESSION_ERROR;
140 }
141 return ret;
142 }
143
SendBytes(int32_t socket,const std::string & data)144 int32_t SoftbusSessionManager::SendBytes(int32_t socket, const std::string &data)
145 {
146 if (AudioDeviceManager::GetInstance().GetSessionInfoSyncState()) {
147 SLOGE("car a2dp online, dont send.");
148 return AVSESSION_ERROR;
149 }
150 if (socket <= 0 || data == "") {
151 SLOGE("the params invalid, unable to send sendBytes by session.");
152 return AVSESSION_ERROR;
153 }
154 int ret = ::SendBytes(socket, data.c_str(), data.length());
155 if (ret != 0) {
156 SLOGE("SendBytes error, ret = %{public}d", ret);
157 return AVSESSION_ERROR;
158 }
159 return ret;
160 }
161
ObtainPeerDeviceId(int32_t socket,std::string & deviceId)162 int32_t SoftbusSessionManager::ObtainPeerDeviceId(int32_t socket, std::string &deviceId)
163 {
164 CHECK_AND_RETURN_RET_LOG(
165 socket > 0, AVSESSION_ERROR, "the session is null, unable to obtain the peer device id.");
166 if (mMap_.find(socket) == mMap_.end()) {
167 SLOGE("no find deviceid.");
168 return AVSESSION_ERROR;
169 } else {
170 deviceId = mMap_[socket];
171 return AVSESSION_SUCCESS;
172 }
173 }
174
AddSessionListener(std::shared_ptr<SoftbusSessionListener> softbusSessionListener)175 void SoftbusSessionManager::AddSessionListener(std::shared_ptr<SoftbusSessionListener> softbusSessionListener)
176 {
177 if (softbusSessionListener == nullptr) {
178 SLOGE("the session listener is null, unable to add to session listener list.");
179 return;
180 }
181 std::lock_guard lockGuard(socketLock_);
182 sessionListeners_.clear();
183 sessionListeners_.emplace_back(softbusSessionListener);
184 }
185
OnBind(int32_t socket,PeerSocketInfo info)186 void SoftbusSessionManager::OnBind(int32_t socket, PeerSocketInfo info)
187 {
188 if (info.networkId == nullptr) {
189 SLOGE("PeerSocketInfo is nullptr");
190 return;
191 }
192 std::lock_guard lockGuard(socketLock_);
193 for (auto listener : sessionListeners_) {
194 listener->OnBind(socket, info);
195 mMap_.insert({socket, info.networkId});
196 listener->OnBind(socket, info);
197 }
198 }
199
OnShutdown(int32_t socket,ShutdownReason reason)200 void SoftbusSessionManager::OnShutdown(int32_t socket, ShutdownReason reason)
201 {
202 SLOGI("ShutdownReason = %{public}d", reason);
203 std::lock_guard lockGuard(socketLock_);
204 for (auto listener : sessionListeners_) {
205 listener->OnShutdown(socket, reason);
206 mMap_.erase(socket);
207 }
208 }
209
OnMessage(int32_t socket,const void * data,int32_t dataLen)210 void SoftbusSessionManager::OnMessage(int32_t socket, const void *data, int32_t dataLen)
211 {
212 if (data == nullptr) {
213 SLOGE("message data is nullptr");
214 return;
215 }
216 std::lock_guard lockGuard(socketLock_);
217 for (auto listener : sessionListeners_) {
218 listener->OnMessage(socket, data, dataLen);
219 }
220 }
221
OnBytes(int32_t socket,const void * data,int32_t dataLen)222 void SoftbusSessionManager::OnBytes(int32_t socket, const void *data, int32_t dataLen)
223 {
224 if (data == nullptr) {
225 SLOGE("bytes data is nullptr");
226 return;
227 }
228 std::lock_guard lockGuard(socketLock_);
229 for (auto listener : sessionListeners_) {
230 listener->OnBytes(socket, data, dataLen);
231 }
232 }
233 } // namespace OHOS::AVSession
234