• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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