119e95205Sopenharmony_ci/* 219e95205Sopenharmony_ci * Copyright (C) 2021-2022 Huawei Device Co., Ltd. 319e95205Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License"); 419e95205Sopenharmony_ci * you may not use this file except in compliance with the License. 519e95205Sopenharmony_ci * You may obtain a copy of the License at 619e95205Sopenharmony_ci * 719e95205Sopenharmony_ci * http://www.apache.org/licenses/LICENSE-2.0 819e95205Sopenharmony_ci * 919e95205Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software 1019e95205Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS, 1119e95205Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1219e95205Sopenharmony_ci * See the License for the specific language governing permissions and 1319e95205Sopenharmony_ci * limitations under the License. 1419e95205Sopenharmony_ci */ 1519e95205Sopenharmony_ci 1619e95205Sopenharmony_ci#include "socket.h" 1719e95205Sopenharmony_ci#include <sys/ioctl.h> 1819e95205Sopenharmony_ci#include <sys/socket.h> 1919e95205Sopenharmony_ci#include <unistd.h> 2019e95205Sopenharmony_ci 2119e95205Sopenharmony_ci#include "adapter_config.h" 2219e95205Sopenharmony_ci#include "log.h" 2319e95205Sopenharmony_ci#include "packet.h" 2419e95205Sopenharmony_ci#include "power_manager.h" 2519e95205Sopenharmony_ci#include "profile_service_manager.h" 2619e95205Sopenharmony_ci#include "securec.h" 2719e95205Sopenharmony_ci 2819e95205Sopenharmony_ci#include "socket_def.h" 2919e95205Sopenharmony_ci#include "socket_listener.h" 3019e95205Sopenharmony_ci#include "socket_service.h" 3119e95205Sopenharmony_ci#include "socket_util.h" 3219e95205Sopenharmony_ci 3319e95205Sopenharmony_cinamespace OHOS { 3419e95205Sopenharmony_cinamespace bluetooth { 3519e95205Sopenharmony_cistatic int g_arrayServiceId[SOCK_MAX_SERVICE_ID] = {0}; 3619e95205Sopenharmony_cistd::vector<Socket *> Socket::g_allServerSockets; 3719e95205Sopenharmony_cistd::recursive_mutex Socket::g_socketMutex; 3819e95205Sopenharmony_ci 3919e95205Sopenharmony_cistruct Socket::impl { 4019e95205Sopenharmony_ci class DataTransportObserverImplement; 4119e95205Sopenharmony_ci std::unique_ptr<DataTransportObserver> transportObserver_ {}; 4219e95205Sopenharmony_ci void OnConnectIncomingNative(Socket &socket, RawAddress addr, uint8_t port); 4319e95205Sopenharmony_ci void OnConnectedNative(Socket &socket, DataTransport *transport, uint16_t sendMTU, uint16_t recvMTU); 4419e95205Sopenharmony_ci void OnDisconnectedNative(Socket &socket, DataTransport *transport); 4519e95205Sopenharmony_ci void OnDisconnectSuccessNative(Socket &socket, DataTransport *transport); 4619e95205Sopenharmony_ci void OnDataAvailableNative(Socket &socket, DataTransport *transport); 4719e95205Sopenharmony_ci void OnTransportErrorNative(Socket &socket, DataTransport *transport, int errType); 4819e95205Sopenharmony_ci void SockRfcConnectFail(Socket &socket, DataTransport *transport); 4919e95205Sopenharmony_ci void SockRfcDisconnectFail(Socket &socket, DataTransport *transport); 5019e95205Sopenharmony_ci void SockRfcFcOn(Socket &socket, DataTransport *transport); 5119e95205Sopenharmony_ci static int GetMaxConnectionDevicesNum(); 5219e95205Sopenharmony_ci}; 5319e95205Sopenharmony_ci 5419e95205Sopenharmony_ciclass Socket::impl::DataTransportObserverImplement : public DataTransportObserver { 5519e95205Sopenharmony_cipublic: 5619e95205Sopenharmony_ci void OnConnectIncoming(const RawAddress &addr, uint16_t port) override 5719e95205Sopenharmony_ci { 5819e95205Sopenharmony_ci SocketService *socketService = 5919e95205Sopenharmony_ci static_cast<SocketService *>(IProfileManager::GetInstance()->GetProfileService(PROFILE_NAME_SPP)); 6019e95205Sopenharmony_ci if (socketService != nullptr) { 6119e95205Sopenharmony_ci socketService->GetDispatcher()->PostTask( 6219e95205Sopenharmony_ci std::bind(&impl::OnConnectIncomingNative, socket_.pimpl.get(), std::ref(socket_), addr, port)); 6319e95205Sopenharmony_ci } 6419e95205Sopenharmony_ci } 6519e95205Sopenharmony_ci 6619e95205Sopenharmony_ci void OnIncomingDisconnected(const RawAddress &addr) override 6719e95205Sopenharmony_ci { 6819e95205Sopenharmony_ci LOG_INFO("[sock]%{public}s", __func__); 6919e95205Sopenharmony_ci } 7019e95205Sopenharmony_ci 7119e95205Sopenharmony_ci void OnConnected(DataTransport *transport, uint16_t sendMTU, uint16_t recvMTU) override 7219e95205Sopenharmony_ci { 7319e95205Sopenharmony_ci LOG_INFO("[sock]%{public}s", __func__); 7419e95205Sopenharmony_ci 7519e95205Sopenharmony_ci SocketService *socketService = 7619e95205Sopenharmony_ci static_cast<SocketService *>(IProfileManager::GetInstance()->GetProfileService(PROFILE_NAME_SPP)); 7719e95205Sopenharmony_ci if (socketService != nullptr) { 7819e95205Sopenharmony_ci socketService->GetDispatcher()->PostTask(std::bind(&impl::OnConnectedNative, socket_.pimpl.get(), 7919e95205Sopenharmony_ci std::ref(socket_), transport, sendMTU, recvMTU)); 8019e95205Sopenharmony_ci } 8119e95205Sopenharmony_ci } 8219e95205Sopenharmony_ci 8319e95205Sopenharmony_ci void OnDisconnected(DataTransport *transport) override 8419e95205Sopenharmony_ci { 8519e95205Sopenharmony_ci LOG_INFO("[sock]%{public}s", __func__); 8619e95205Sopenharmony_ci 8719e95205Sopenharmony_ci SocketService *socketService = 8819e95205Sopenharmony_ci static_cast<SocketService *>(IProfileManager::GetInstance()->GetProfileService(PROFILE_NAME_SPP)); 8919e95205Sopenharmony_ci if (socketService != nullptr) { 9019e95205Sopenharmony_ci socketService->GetDispatcher()->PostTask( 9119e95205Sopenharmony_ci std::bind(&impl::OnDisconnectedNative, socket_.pimpl.get(), std::ref(socket_), transport)); 9219e95205Sopenharmony_ci } 9319e95205Sopenharmony_ci } 9419e95205Sopenharmony_ci 9519e95205Sopenharmony_ci void OnDisconnectSuccess(DataTransport *transport) override 9619e95205Sopenharmony_ci { 9719e95205Sopenharmony_ci LOG_INFO("[sock]%{public}s", __func__); 9819e95205Sopenharmony_ci 9919e95205Sopenharmony_ci SocketService *socketService = 10019e95205Sopenharmony_ci static_cast<SocketService *>(IProfileManager::GetInstance()->GetProfileService(PROFILE_NAME_SPP)); 10119e95205Sopenharmony_ci if (socketService != nullptr) { 10219e95205Sopenharmony_ci socketService->GetDispatcher()->PostTask( 10319e95205Sopenharmony_ci std::bind(&impl::OnDisconnectSuccessNative, socket_.pimpl.get(), std::ref(socket_), transport)); 10419e95205Sopenharmony_ci } 10519e95205Sopenharmony_ci } 10619e95205Sopenharmony_ci 10719e95205Sopenharmony_ci void OnDataAvailable(DataTransport *transport) override 10819e95205Sopenharmony_ci { 10919e95205Sopenharmony_ci LOG_INFO("[sock]%{public}s", __func__); 11019e95205Sopenharmony_ci 11119e95205Sopenharmony_ci SocketService *socketService = 11219e95205Sopenharmony_ci static_cast<SocketService *>(IProfileManager::GetInstance()->GetProfileService(PROFILE_NAME_SPP)); 11319e95205Sopenharmony_ci if (socketService != nullptr) { 11419e95205Sopenharmony_ci socketService->GetDispatcher()->PostTask( 11519e95205Sopenharmony_ci std::bind(&impl::OnDataAvailableNative, socket_.pimpl.get(), std::ref(socket_), transport)); 11619e95205Sopenharmony_ci } 11719e95205Sopenharmony_ci } 11819e95205Sopenharmony_ci 11919e95205Sopenharmony_ci void OnDataAvailable(DataTransport *transport, Packet *pkt) override 12019e95205Sopenharmony_ci { 12119e95205Sopenharmony_ci LOG_INFO("[sock]%{public}s", __func__); 12219e95205Sopenharmony_ci } 12319e95205Sopenharmony_ci 12419e95205Sopenharmony_ci void OnTransportError(DataTransport *transport, int errType) override 12519e95205Sopenharmony_ci { 12619e95205Sopenharmony_ci LOG_INFO("[sock]%{public}s", __func__); 12719e95205Sopenharmony_ci 12819e95205Sopenharmony_ci SocketService *socketService = 12919e95205Sopenharmony_ci static_cast<SocketService *>(IProfileManager::GetInstance()->GetProfileService(PROFILE_NAME_SPP)); 13019e95205Sopenharmony_ci if (socketService != nullptr) { 13119e95205Sopenharmony_ci socketService->GetDispatcher()->PostTask( 13219e95205Sopenharmony_ci std::bind(&impl::OnTransportErrorNative, socket_.pimpl.get(), std::ref(socket_), transport, errType)); 13319e95205Sopenharmony_ci } 13419e95205Sopenharmony_ci } 13519e95205Sopenharmony_ci 13619e95205Sopenharmony_ci DataTransportObserverImplement(Socket &socket) : socket_(socket) 13719e95205Sopenharmony_ci {} 13819e95205Sopenharmony_ci 13919e95205Sopenharmony_ci ~DataTransportObserverImplement() = default; 14019e95205Sopenharmony_ci 14119e95205Sopenharmony_ciprivate: 14219e95205Sopenharmony_ci Socket &socket_; 14319e95205Sopenharmony_ci}; 14419e95205Sopenharmony_ci 14519e95205Sopenharmony_civoid Socket::impl::OnConnectIncomingNative(Socket &socket, RawAddress addr, uint8_t port) 14619e95205Sopenharmony_ci{ 14719e95205Sopenharmony_ci LOG_INFO("[sock]%{public}s", __func__); 14819e95205Sopenharmony_ci 14919e95205Sopenharmony_ci socket.maxConnectedNum_ = GetMaxConnectionDevicesNum(); 15019e95205Sopenharmony_ci addr.ConvertToUint8(socket.remoteAddr_.addr); 15119e95205Sopenharmony_ci socket.remoteAddr_.type = BT_PUBLIC_DEVICE_ADDRESS; 15219e95205Sopenharmony_ci if (socket.clientNumber_ < socket.maxConnectedNum_) { 15319e95205Sopenharmony_ci socket.sockTransport_->AcceptConnection(addr, port); 15419e95205Sopenharmony_ci } else { 15519e95205Sopenharmony_ci socket.sockTransport_->RejectConnection(addr, port); 15619e95205Sopenharmony_ci } 15719e95205Sopenharmony_ci} 15819e95205Sopenharmony_ci 15919e95205Sopenharmony_civoid Socket::impl::OnConnectedNative(Socket &socket, DataTransport *transport, uint16_t sendMTU, uint16_t recvMTU) 16019e95205Sopenharmony_ci{ 16119e95205Sopenharmony_ci LOG_INFO("[sock]%{public}s", __func__); 16219e95205Sopenharmony_ci IPowerManager::GetInstance().StatusUpdate( 16319e95205Sopenharmony_ci RequestStatus::CONNECT_ON, PROFILE_NAME_SPP, RawAddress::ConvertToString(socket.remoteAddr_.addr)); 16419e95205Sopenharmony_ci SocketConnectInfo connectInfo; 16519e95205Sopenharmony_ci (void)memset_s(&connectInfo, sizeof(connectInfo), 0, sizeof(connectInfo)); 16619e95205Sopenharmony_ci (void)memcpy_s(connectInfo.addr, sizeof(connectInfo.addr), socket.remoteAddr_.addr, 16719e95205Sopenharmony_ci sizeof(socket.remoteAddr_.addr)); 16819e95205Sopenharmony_ci connectInfo.status = true; 16919e95205Sopenharmony_ci connectInfo.txMtu = sendMTU; 17019e95205Sopenharmony_ci connectInfo.rxMtu = recvMTU; 17119e95205Sopenharmony_ci if (socket.IsServer()) { 17219e95205Sopenharmony_ci socket.clientNumber_++; 17319e95205Sopenharmony_ci int newFd = socket.AddSocketInternal(socket.remoteAddr_, transport, sendMTU, recvMTU); 17419e95205Sopenharmony_ci Socket::SendAppConnectInfo(socket.transportFd_, newFd, connectInfo); 17519e95205Sopenharmony_ci } else { 17619e95205Sopenharmony_ci socket.state_ = CONNECTED; 17719e95205Sopenharmony_ci socket.sendMTU_ = sendMTU; 17819e95205Sopenharmony_ci socket.recvMTU_ = recvMTU; 17919e95205Sopenharmony_ci Socket::SendAppConnectInfo(socket.transportFd_, -1, connectInfo); 18019e95205Sopenharmony_ci LOG_INFO("[sock]%{public}s app fd:%{public}d client connect successfully", __func__, socket.upperlayerFd_); 18119e95205Sopenharmony_ci std::lock_guard<std::recursive_mutex> lck(Socket::g_socketMutex); 18219e95205Sopenharmony_ci g_allServerSockets.push_back(&socket); 18319e95205Sopenharmony_ci } 18419e95205Sopenharmony_ci} 18519e95205Sopenharmony_ci 18619e95205Sopenharmony_civoid Socket::impl::OnDisconnectedNative(Socket &socket, DataTransport *transport) 18719e95205Sopenharmony_ci{ 18819e95205Sopenharmony_ci LOG_INFO("[sock]%{public}s", __func__); 18919e95205Sopenharmony_ci 19019e95205Sopenharmony_ci socket.ProcessDisconnection(socket, transport); 19119e95205Sopenharmony_ci} 19219e95205Sopenharmony_ci 19319e95205Sopenharmony_civoid Socket::impl::OnDisconnectSuccessNative(Socket &socket, DataTransport *transport) 19419e95205Sopenharmony_ci{ 19519e95205Sopenharmony_ci LOG_INFO("[sock]%{public}s", __func__); 19619e95205Sopenharmony_ci 19719e95205Sopenharmony_ci socket.ProcessDisconnection(socket, transport); 19819e95205Sopenharmony_ci} 19919e95205Sopenharmony_ci 20019e95205Sopenharmony_civoid Socket::impl::OnDataAvailableNative(Socket &socket, DataTransport *transport) 20119e95205Sopenharmony_ci{ 20219e95205Sopenharmony_ci LOG_INFO("[sock]%{public}s", __func__); 20319e95205Sopenharmony_ci 20419e95205Sopenharmony_ci Packet *pkt = nullptr; 20519e95205Sopenharmony_ci uint8_t *pData = nullptr; 20619e95205Sopenharmony_ci Buffer *buf = nullptr; 20719e95205Sopenharmony_ci 20819e95205Sopenharmony_ci Socket *socketTmp = nullptr; 20919e95205Sopenharmony_ci if (socket.IsServer()) { 21019e95205Sopenharmony_ci if (socket.socketMap_.find(transport) != socket.socketMap_.end()) { 21119e95205Sopenharmony_ci socketTmp = socket.socketMap_.at(transport).get(); 21219e95205Sopenharmony_ci } else { 21319e95205Sopenharmony_ci LOG_ERROR("[sock]%{public}s socket does not exist", __func__); 21419e95205Sopenharmony_ci return; 21519e95205Sopenharmony_ci } 21619e95205Sopenharmony_ci } else { 21719e95205Sopenharmony_ci socketTmp = &socket; 21819e95205Sopenharmony_ci } 21919e95205Sopenharmony_ci 22019e95205Sopenharmony_ci if (!socketTmp->isCanRead_) { 22119e95205Sopenharmony_ci LOG_DEBUG("[sock]%{public}s app can not receive data", __func__); 22219e95205Sopenharmony_ci return; 22319e95205Sopenharmony_ci } 22419e95205Sopenharmony_ci 22519e95205Sopenharmony_ci if (socketTmp->isNewSocket_) { 22619e95205Sopenharmony_ci if (socketTmp->newSockTransport_ != nullptr) { 22719e95205Sopenharmony_ci socketTmp->newSockTransport_->Read(&pkt); 22819e95205Sopenharmony_ci } else { 22919e95205Sopenharmony_ci LOG_DEBUG("[sock]%{public}s newSockTransport is null", __func__); 23019e95205Sopenharmony_ci return; 23119e95205Sopenharmony_ci } 23219e95205Sopenharmony_ci } else { 23319e95205Sopenharmony_ci socketTmp->sockTransport_->Read(&pkt); 23419e95205Sopenharmony_ci } 23519e95205Sopenharmony_ci 23619e95205Sopenharmony_ci if (pkt == nullptr) { 23719e95205Sopenharmony_ci LOG_ERROR("[sock]%{public}s pkt is null", __func__); 23819e95205Sopenharmony_ci return; 23919e95205Sopenharmony_ci } 24019e95205Sopenharmony_ci 24119e95205Sopenharmony_ci size_t len = PacketPayloadSize(pkt); 24219e95205Sopenharmony_ci buf = PacketContinuousPayload(pkt); 24319e95205Sopenharmony_ci if (buf == nullptr) { 24419e95205Sopenharmony_ci LOG_ERROR("[sock]%{public}s pkt buf is null", __func__); 24519e95205Sopenharmony_ci return; 24619e95205Sopenharmony_ci } 24719e95205Sopenharmony_ci pData = (uint8_t *)BufferPtr(buf); 24819e95205Sopenharmony_ci 24919e95205Sopenharmony_ci socketTmp->WriteDataToAPP(pData, len); 25019e95205Sopenharmony_ci 25119e95205Sopenharmony_ci if (pkt != nullptr) { 25219e95205Sopenharmony_ci PacketFree(pkt); 25319e95205Sopenharmony_ci } 25419e95205Sopenharmony_ci} 25519e95205Sopenharmony_ci 25619e95205Sopenharmony_civoid Socket::impl::OnTransportErrorNative(Socket &socket, DataTransport *transport, int errType) 25719e95205Sopenharmony_ci{ 25819e95205Sopenharmony_ci LOG_INFO("[sock]%{public}s errType:%{public}d", __func__, errType); 25919e95205Sopenharmony_ci 26019e95205Sopenharmony_ci switch (errType) { 26119e95205Sopenharmony_ci case RFCOMM_CONNECT_FAIL: 26219e95205Sopenharmony_ci SockRfcConnectFail(socket, transport); 26319e95205Sopenharmony_ci break; 26419e95205Sopenharmony_ci case RFCOMM_DISCONNECT_FAIL: 26519e95205Sopenharmony_ci SockRfcDisconnectFail(socket, transport); 26619e95205Sopenharmony_ci break; 26719e95205Sopenharmony_ci case RFCOMM_EV_FC_ON: 26819e95205Sopenharmony_ci SockRfcFcOn(socket, transport); 26919e95205Sopenharmony_ci break; 27019e95205Sopenharmony_ci default: 27119e95205Sopenharmony_ci break; 27219e95205Sopenharmony_ci } 27319e95205Sopenharmony_ci} 27419e95205Sopenharmony_ci 27519e95205Sopenharmony_civoid Socket::impl::SockRfcConnectFail(Socket &socket, DataTransport *transport) 27619e95205Sopenharmony_ci{ 27719e95205Sopenharmony_ci LOG_INFO("[sock]%{public}s", __func__); 27819e95205Sopenharmony_ci SocketConnectInfo connectInfo; 27919e95205Sopenharmony_ci (void)memset_s(&connectInfo, sizeof(connectInfo), 0, sizeof(connectInfo)); 28019e95205Sopenharmony_ci (void)memcpy_s(connectInfo.addr, sizeof(connectInfo.addr), socket.remoteAddr_.addr, 28119e95205Sopenharmony_ci sizeof(socket.remoteAddr_.addr)); 28219e95205Sopenharmony_ci connectInfo.status = false; 28319e95205Sopenharmony_ci connectInfo.txMtu = 0; 28419e95205Sopenharmony_ci connectInfo.rxMtu = 0; 28519e95205Sopenharmony_ci if (socket.IsServer()) { 28619e95205Sopenharmony_ci if (socket.socketMap_.find(transport) != socket.socketMap_.end()) { 28719e95205Sopenharmony_ci Socket *serverSocket = nullptr; 28819e95205Sopenharmony_ci serverSocket = socket.socketMap_.at(transport).get(); 28919e95205Sopenharmony_ci Socket::SendAppConnectInfo(serverSocket->transportFd_, -1, connectInfo); 29019e95205Sopenharmony_ci } 29119e95205Sopenharmony_ci } else { 29219e95205Sopenharmony_ci Socket::SendAppConnectInfo(socket.transportFd_, -1, connectInfo); 29319e95205Sopenharmony_ci } 29419e95205Sopenharmony_ci socket.ProcessDisconnection(socket, transport); 29519e95205Sopenharmony_ci} 29619e95205Sopenharmony_ci 29719e95205Sopenharmony_civoid Socket::impl::SockRfcDisconnectFail(Socket &socket, DataTransport *transport) 29819e95205Sopenharmony_ci{ 29919e95205Sopenharmony_ci LOG_INFO("[sock]%{public}s", __func__); 30019e95205Sopenharmony_ci 30119e95205Sopenharmony_ci if (socket.IsServer()) { 30219e95205Sopenharmony_ci if (socket.socketMap_.find(transport) != socket.socketMap_.end()) { 30319e95205Sopenharmony_ci LOG_DEBUG("SockRfcDisconnectFail closefd : fd:%{public}d", 30419e95205Sopenharmony_ci socket.socketMap_.at(transport).get()->transportFd_); 30519e95205Sopenharmony_ci close(socket.socketMap_.at(transport).get()->transportFd_); 30619e95205Sopenharmony_ci } else { 30719e95205Sopenharmony_ci LOG_ERROR("[sock]socket does not exist"); 30819e95205Sopenharmony_ci } 30919e95205Sopenharmony_ci } else { 31019e95205Sopenharmony_ci LOG_DEBUG("SockRfcDisconnectFail closefd : fd:%{public}d", socket.transportFd_); 31119e95205Sopenharmony_ci close(socket.transportFd_); 31219e95205Sopenharmony_ci } 31319e95205Sopenharmony_ci} 31419e95205Sopenharmony_ci 31519e95205Sopenharmony_civoid Socket::impl::SockRfcFcOn(Socket &socket, DataTransport *transport) 31619e95205Sopenharmony_ci{ 31719e95205Sopenharmony_ci LOG_INFO("[sock]%{public}s", __func__); 31819e95205Sopenharmony_ci 31919e95205Sopenharmony_ci Socket *socketTmp = nullptr; 32019e95205Sopenharmony_ci if (socket.IsServer()) { 32119e95205Sopenharmony_ci if (socket.socketMap_.find(transport) != socket.socketMap_.end()) { 32219e95205Sopenharmony_ci socketTmp = socket.socketMap_.at(transport).get(); 32319e95205Sopenharmony_ci } else { 32419e95205Sopenharmony_ci LOG_ERROR("socket does not exist"); 32519e95205Sopenharmony_ci } 32619e95205Sopenharmony_ci } else { 32719e95205Sopenharmony_ci socketTmp = &socket; 32819e95205Sopenharmony_ci } 32919e95205Sopenharmony_ci if (socketTmp == nullptr) { 33019e95205Sopenharmony_ci return; 33119e95205Sopenharmony_ci } 33219e95205Sopenharmony_ci std::lock_guard<std::recursive_mutex> lk(socketTmp->writeMutex_); 33319e95205Sopenharmony_ci if (socketTmp->sendBufLen_ > 0) { 33419e95205Sopenharmony_ci Packet *wPkt = PacketMalloc(0, 0, socketTmp->sendBufLen_); 33519e95205Sopenharmony_ci Buffer *wPayloadBuf = PacketContinuousPayload(wPkt); 33619e95205Sopenharmony_ci void *buffer = BufferPtr(wPayloadBuf); 33719e95205Sopenharmony_ci (void)memcpy_s(buffer, socketTmp->sendBufLen_, socketTmp->sendDataBuf_, socketTmp->sendBufLen_); 33819e95205Sopenharmony_ci if (wPayloadBuf == nullptr) { 33919e95205Sopenharmony_ci if (wPkt != nullptr) { 34019e95205Sopenharmony_ci PacketFree(wPkt); 34119e95205Sopenharmony_ci } 34219e95205Sopenharmony_ci return; 34319e95205Sopenharmony_ci } 34419e95205Sopenharmony_ci int ret = socketTmp->TransportWrite(wPkt); 34519e95205Sopenharmony_ci if (ret < 0) { 34619e95205Sopenharmony_ci LOG_ERROR("%{public}s stack write failed", __func__); 34719e95205Sopenharmony_ci } else { 34819e95205Sopenharmony_ci (void)memset_s(socketTmp->sendDataBuf_, socketTmp->sendBufLen_, 0x00, socketTmp->sendBufLen_); 34919e95205Sopenharmony_ci socketTmp->sendBufLen_ = 0; 35019e95205Sopenharmony_ci socketTmp->isCanWrite_ = true; 35119e95205Sopenharmony_ci socketTmp->WriteData(); 35219e95205Sopenharmony_ci } 35319e95205Sopenharmony_ci if (wPkt != nullptr) { 35419e95205Sopenharmony_ci PacketFree(wPkt); 35519e95205Sopenharmony_ci } 35619e95205Sopenharmony_ci } else { 35719e95205Sopenharmony_ci socketTmp->isCanWrite_ = true; 35819e95205Sopenharmony_ci socketTmp->WriteData(); 35919e95205Sopenharmony_ci } 36019e95205Sopenharmony_ci} 36119e95205Sopenharmony_ci 36219e95205Sopenharmony_ciint Socket::impl::GetMaxConnectionDevicesNum() 36319e95205Sopenharmony_ci{ 36419e95205Sopenharmony_ci int number = SOCK_MAX_CLIENT; 36519e95205Sopenharmony_ci if (!AdapterConfig::GetInstance()->GetValue(SECTION_SOCKET_SERVICE, PROPERTY_MAX_CONNECTED_DEVICES, number)) { 36619e95205Sopenharmony_ci LOG_DEBUG("[sock]%{public}s: It's failed to get the max connection number", __FUNCTION__); 36719e95205Sopenharmony_ci } 36819e95205Sopenharmony_ci return number; 36919e95205Sopenharmony_ci} 37019e95205Sopenharmony_ci 37119e95205Sopenharmony_ciSocket::Socket() : pimpl(nullptr) 37219e95205Sopenharmony_ci{ 37319e95205Sopenharmony_ci state_ = SocketState::INIT; 37419e95205Sopenharmony_ci pimpl = std::make_unique<Socket::impl>(); 37519e95205Sopenharmony_ci this->pimpl->transportObserver_ = std::make_unique<Socket::impl::DataTransportObserverImplement>(*this); 37619e95205Sopenharmony_ci} 37719e95205Sopenharmony_ci 37819e95205Sopenharmony_ciSocket::~Socket() 37919e95205Sopenharmony_ci{} 38019e95205Sopenharmony_ci 38119e95205Sopenharmony_ciint Socket::Connect(const std::string &addr, const Uuid &uuid, int securityFlag, int &sockfd) 38219e95205Sopenharmony_ci{ 38319e95205Sopenharmony_ci LOG_INFO("[sock]%{public}s", __func__); 38419e95205Sopenharmony_ci 38519e95205Sopenharmony_ci sockfd = SOCK_INVALID_FD; 38619e95205Sopenharmony_ci int socketPair[2] = {SOCK_INVALID_FD, SOCK_INVALID_FD}; 38719e95205Sopenharmony_ci 38819e95205Sopenharmony_ci if (socketpair(AF_UNIX, SOCK_STREAM, 0, socketPair) == -1) { 38919e95205Sopenharmony_ci LOG_ERROR("[sock]%{public}s: create rfcomm socket pair failed", __FUNCTION__); 39019e95205Sopenharmony_ci return -1; 39119e95205Sopenharmony_ci } 39219e95205Sopenharmony_ci 39319e95205Sopenharmony_ci SetRemoteAddr(addr); 39419e95205Sopenharmony_ci 39519e95205Sopenharmony_ci sdpClient_ = std::make_unique<SocketSdpClient>(); 39619e95205Sopenharmony_ci int ret = sdpClient_->StartDiscovery(addr, uuid, this); 39719e95205Sopenharmony_ci if (ret != BT_SUCCESS) { 39819e95205Sopenharmony_ci LOG_ERROR("[sock]%{public}s: Discovery SPP Service Fail!", __FUNCTION__); 39919e95205Sopenharmony_ci } 40019e95205Sopenharmony_ci 40119e95205Sopenharmony_ci upperlayerFd_ = socketPair[0]; 40219e95205Sopenharmony_ci transportFd_ = socketPair[1]; 40319e95205Sopenharmony_ci 40419e95205Sopenharmony_ci LOG_INFO("[sock]%{public}s appFd:%{public}d fd:%{public}d", __func__, upperlayerFd_, transportFd_); 40519e95205Sopenharmony_ci 40619e95205Sopenharmony_ci sockfd = upperlayerFd_; 40719e95205Sopenharmony_ci upperlayerFd_ = SOCK_INVALID_FD; 40819e95205Sopenharmony_ci securityFlag_ = securityFlag; 40919e95205Sopenharmony_ci SocketThread::GetInstance().AddSocket(transportFd_, 0, *this); 41019e95205Sopenharmony_ci return ret; 41119e95205Sopenharmony_ci} 41219e95205Sopenharmony_ci 41319e95205Sopenharmony_ciint Socket::Listen(const std::string &name, const Uuid &uuid, int securityFlag, int &sockfd) 41419e95205Sopenharmony_ci{ 41519e95205Sopenharmony_ci LOG_INFO("[sock]%{public}s", __func__); 41619e95205Sopenharmony_ci 41719e95205Sopenharmony_ci isServer_ = true; 41819e95205Sopenharmony_ci sockfd = SOCK_INVALID_FD; 41919e95205Sopenharmony_ci int socketPair[2] = {SOCK_INVALID_FD, SOCK_INVALID_FD}; 42019e95205Sopenharmony_ci if (socketpair(AF_UNIX, SOCK_STREAM, 0, socketPair) == -1) { 42119e95205Sopenharmony_ci LOG_ERROR("[sock]%{public}s: create listen socket failed", __FUNCTION__); 42219e95205Sopenharmony_ci return -1; 42319e95205Sopenharmony_ci } 42419e95205Sopenharmony_ci upperlayerFd_ = socketPair[0]; 42519e95205Sopenharmony_ci transportFd_ = socketPair[1]; 42619e95205Sopenharmony_ci LOG_INFO("[sock]%{public}s appFd:%{public}d fd:%{public}d", __func__, upperlayerFd_, transportFd_); 42719e95205Sopenharmony_ci sockfd = upperlayerFd_; 42819e95205Sopenharmony_ci upperlayerFd_ = SOCK_INVALID_FD; 42919e95205Sopenharmony_ci securityFlag_ = securityFlag; 43019e95205Sopenharmony_ci state_ = LISTEN; 43119e95205Sopenharmony_ci 43219e95205Sopenharmony_ci SocketThread::GetInstance().AddSocket(transportFd_, 0, *this); 43319e95205Sopenharmony_ci 43419e95205Sopenharmony_ci scn_ = RFCOMM_AssignServerNum(); 43519e95205Sopenharmony_ci 43619e95205Sopenharmony_ci sdpServer_ = std::make_unique<SocketSdpServer>(); 43719e95205Sopenharmony_ci int ret = sdpServer_->RegisterSdpService(name, uuid, scn_); 43819e95205Sopenharmony_ci if (ret != BT_SUCCESS) { 43919e95205Sopenharmony_ci LOG_ERROR("[sock]%{public}s: Discovery SPP Service Fail!", __FUNCTION__); 44019e95205Sopenharmony_ci } 44119e95205Sopenharmony_ci 44219e95205Sopenharmony_ci if (!SendAppConnectScn(transportFd_, scn_)) { 44319e95205Sopenharmony_ci LOG_ERROR("send scn failed"); 44419e95205Sopenharmony_ci CloseSocketFd(); 44519e95205Sopenharmony_ci return -1; 44619e95205Sopenharmony_ci } 44719e95205Sopenharmony_ci 44819e95205Sopenharmony_ci serviceId_ = AssignServiceId(); 44919e95205Sopenharmony_ci LOG_INFO("[sock]%{public}s securityFlag:%{public}d serviceId_:%{public}d", __func__, securityFlag_, serviceId_); 45019e95205Sopenharmony_ci socketGapServer_ = std::make_unique<SocketGapServer>(); 45119e95205Sopenharmony_ci socketGapServer_->RegisterServiceSecurity(scn_, securityFlag_, serviceId_); 45219e95205Sopenharmony_ci 45319e95205Sopenharmony_ci sockTransport_ = std::move(transportFactory_->CreateRfcommTransport( 45419e95205Sopenharmony_ci nullptr, scn_, SOCK_DEF_RFC_MTU, *this->pimpl->transportObserver_.get(), *GetDispatchter())); 45519e95205Sopenharmony_ci sockTransport_->RegisterServer(); 45619e95205Sopenharmony_ci 45719e95205Sopenharmony_ci std::lock_guard<std::recursive_mutex> lk(Socket::g_socketMutex); 45819e95205Sopenharmony_ci g_allServerSockets.push_back(this); 45919e95205Sopenharmony_ci return ret; 46019e95205Sopenharmony_ci} 46119e95205Sopenharmony_ci 46219e95205Sopenharmony_ciint Socket::ReceiveSdpResult(uint8_t scn) 46319e95205Sopenharmony_ci{ 46419e95205Sopenharmony_ci LOG_INFO("[sock]%{public}s", __func__); 46519e95205Sopenharmony_ci 46619e95205Sopenharmony_ci serviceId_ = AssignServiceId(); 46719e95205Sopenharmony_ci scn_ = scn; 46819e95205Sopenharmony_ci LOG_INFO("[sock]%{public}s securityFlag:%{public}d serviceId_:%{public}d scn:%hhu", 46919e95205Sopenharmony_ci __func__, securityFlag_, serviceId_, scn_); 47019e95205Sopenharmony_ci if (scn_ > SOCK_MAX_SERVER) { 47119e95205Sopenharmony_ci LOG_INFO("[sock]%{public}s scn invalid", __func__); 47219e95205Sopenharmony_ci return -1; 47319e95205Sopenharmony_ci } 47419e95205Sopenharmony_ci 47519e95205Sopenharmony_ci socketGapClient_ = std::make_unique<SocketGapClient>(); 47619e95205Sopenharmony_ci socketGapClient_->RegisterServiceSecurity(remoteAddr_, scn_, securityFlag_, serviceId_); 47719e95205Sopenharmony_ci RawAddress rawAddr = RawAddress::ConvertToString(remoteAddr_.addr); 47819e95205Sopenharmony_ci sockTransport_ = std::move(transportFactory_->CreateRfcommTransport( 47919e95205Sopenharmony_ci &rawAddr, scn_, SOCK_DEF_RFC_MTU, *this->pimpl->transportObserver_.get(), *GetDispatchter())); 48019e95205Sopenharmony_ci 48119e95205Sopenharmony_ci if (!SendAppConnectScn(transportFd_, scn_)) { 48219e95205Sopenharmony_ci LOG_ERROR("send scn failed"); 48319e95205Sopenharmony_ci CloseSocketFd(); 48419e95205Sopenharmony_ci return -1; 48519e95205Sopenharmony_ci } 48619e95205Sopenharmony_ci 48719e95205Sopenharmony_ci switch (state_) { 48819e95205Sopenharmony_ci case INIT: 48919e95205Sopenharmony_ci if (sockTransport_->Connect() < 0) { 49019e95205Sopenharmony_ci LOG_ERROR("[sock]create rfcomm channel failed"); 49119e95205Sopenharmony_ci SocketThread::GetInstance().DeleteSocket(*this); 49219e95205Sopenharmony_ci CloseSocketFd(); 49319e95205Sopenharmony_ci return -1; 49419e95205Sopenharmony_ci } 49519e95205Sopenharmony_ci state_ = CONNECTING; 49619e95205Sopenharmony_ci break; 49719e95205Sopenharmony_ci default: 49819e95205Sopenharmony_ci LOG_ERROR("[sock]create rfcomm channel failed"); 49919e95205Sopenharmony_ci break; 50019e95205Sopenharmony_ci } 50119e95205Sopenharmony_ci return 0; 50219e95205Sopenharmony_ci} 50319e95205Sopenharmony_ci 50419e95205Sopenharmony_ciint Socket::AddSocketInternal(BtAddr addr, DataTransport *transport, uint16_t sendMTU, uint16_t recvMTU) 50519e95205Sopenharmony_ci{ 50619e95205Sopenharmony_ci LOG_INFO("[sock]%{public}s", __func__); 50719e95205Sopenharmony_ci 50819e95205Sopenharmony_ci std::unique_ptr<Socket> acceptSocket = std::make_unique<Socket>(); 50919e95205Sopenharmony_ci int socketPair[2] = {SOCK_INVALID_FD, SOCK_INVALID_FD}; 51019e95205Sopenharmony_ci if (socketpair(AF_UNIX, SOCK_STREAM, 0, socketPair) == -1) { 51119e95205Sopenharmony_ci LOG_ERROR("[sock]create accept socket failed"); 51219e95205Sopenharmony_ci } 51319e95205Sopenharmony_ci LOG_DEBUG("AddSocketInternal : fd:%{public}d, fd:%{public}d", socketPair[0], socketPair[1]); 51419e95205Sopenharmony_ci acceptSocket->upperlayerFd_ = socketPair[0]; 51519e95205Sopenharmony_ci acceptSocket->transportFd_ = socketPair[1]; 51619e95205Sopenharmony_ci acceptSocket->remoteAddr_ = addr; 51719e95205Sopenharmony_ci acceptSocket->isNewSocket_ = true; 51819e95205Sopenharmony_ci acceptSocket->isServer_ = true; 51919e95205Sopenharmony_ci acceptSocket->state_ = SocketState::CONNECTED; 52019e95205Sopenharmony_ci acceptSocket->sendMTU_ = sendMTU; 52119e95205Sopenharmony_ci acceptSocket->recvMTU_ = recvMTU; 52219e95205Sopenharmony_ci acceptSocket->newSockTransport_ = transport; 52319e95205Sopenharmony_ci mutex_.lock(); 52419e95205Sopenharmony_ci auto it = socketMap_.emplace(transport, std::move(acceptSocket)); 52519e95205Sopenharmony_ci mutex_.unlock(); 52619e95205Sopenharmony_ci 52719e95205Sopenharmony_ci SocketThread::GetInstance().AddSocket( 52819e95205Sopenharmony_ci it.first->second.get()->transportFd_, 0, *(it.first->second.get())); 52919e95205Sopenharmony_ci 53019e95205Sopenharmony_ci utility::Message msg(SOCKET_ACCEPT_NEW); 53119e95205Sopenharmony_ci msg.arg1_ = socketPair[0]; 53219e95205Sopenharmony_ci msg.arg2_ = it.first->second.get(); 53319e95205Sopenharmony_ci SocketService *socketService = 53419e95205Sopenharmony_ci static_cast<SocketService *>(IProfileManager::GetInstance()->GetProfileService(PROFILE_NAME_SPP)); 53519e95205Sopenharmony_ci if (socketService != nullptr) { 53619e95205Sopenharmony_ci socketService->ProcessMessage(msg); 53719e95205Sopenharmony_ci } 53819e95205Sopenharmony_ci 53919e95205Sopenharmony_ci std::lock_guard<std::recursive_mutex> lck(Socket::g_socketMutex); 54019e95205Sopenharmony_ci g_allServerSockets.push_back(it.first->second.get()); 54119e95205Sopenharmony_ci 54219e95205Sopenharmony_ci if (socketPair[0] < 0) { 54319e95205Sopenharmony_ci LOG_ERROR("[sock]create accept socket failed"); 54419e95205Sopenharmony_ci } 54519e95205Sopenharmony_ci return socketPair[0]; 54619e95205Sopenharmony_ci} 54719e95205Sopenharmony_ci 54819e95205Sopenharmony_cibool Socket::SendAppConnectScn(int fd, int scn) 54919e95205Sopenharmony_ci{ 55019e95205Sopenharmony_ci return SocketUtil::SocketSendData(fd, reinterpret_cast<const uint8_t *>(&scn), sizeof(scn)); 55119e95205Sopenharmony_ci} 55219e95205Sopenharmony_ci 55319e95205Sopenharmony_cibool Socket::SendAppConnectInfo(int fd, int acceptFd, const SocketConnectInfo &connectInfo) 55419e95205Sopenharmony_ci{ 55519e95205Sopenharmony_ci LOG_INFO("[sock]%{public}s", __func__); 55619e95205Sopenharmony_ci LOG_INFO("[sock]%{public}s size:%{public}zu", __func__, sizeof(connectInfo)); 55719e95205Sopenharmony_ci if (acceptFd == -1) { 55819e95205Sopenharmony_ci return SocketUtil::SocketSendData(fd, reinterpret_cast<const uint8_t *>(&connectInfo), sizeof(connectInfo)); 55919e95205Sopenharmony_ci } else { 56019e95205Sopenharmony_ci return SocketUtil::SocketSendFd(fd, reinterpret_cast<const uint8_t *>(&connectInfo), 56119e95205Sopenharmony_ci sizeof(connectInfo), acceptFd); 56219e95205Sopenharmony_ci } 56319e95205Sopenharmony_ci} 56419e95205Sopenharmony_ci 56519e95205Sopenharmony_civoid Socket::ProcessDisconnection(Socket &socket, DataTransport *transport) 56619e95205Sopenharmony_ci{ 56719e95205Sopenharmony_ci LOG_INFO("[sock]%{public}s", __func__); 56819e95205Sopenharmony_ci 56919e95205Sopenharmony_ci IPowerManager::GetInstance().StatusUpdate( 57019e95205Sopenharmony_ci RequestStatus::CONNECT_OFF, PROFILE_NAME_SPP, RawAddress::ConvertToString(socket.remoteAddr_.addr)); 57119e95205Sopenharmony_ci 57219e95205Sopenharmony_ci if (socket.IsServer()) { 57319e95205Sopenharmony_ci if (socket.socketMap_.find(transport) != socket.socketMap_.end()) { 57419e95205Sopenharmony_ci socket.clientNumber_--; 57519e95205Sopenharmony_ci Socket *serverSocket = nullptr; 57619e95205Sopenharmony_ci serverSocket = socket.socketMap_.at(transport).get(); 57719e95205Sopenharmony_ci serverSocket->state_ = DISCONNECTED; 57819e95205Sopenharmony_ci serverSocket->newSockTransport_ = nullptr; 57919e95205Sopenharmony_ci SocketThread::GetInstance().DeleteSocket(*serverSocket); 58019e95205Sopenharmony_ci serverSocket->CloseSocketFd(); 58119e95205Sopenharmony_ci std::lock_guard<std::recursive_mutex> lk(Socket::g_socketMutex); 58219e95205Sopenharmony_ci Socket::EraseSocket(*serverSocket); 58319e95205Sopenharmony_ci socket.socketMap_.erase(transport); 58419e95205Sopenharmony_ci socket.NotifyServiceDeleteSocket(*serverSocket); 58519e95205Sopenharmony_ci if (transport != nullptr) { 58619e95205Sopenharmony_ci delete transport; 58719e95205Sopenharmony_ci } 58819e95205Sopenharmony_ci } else { 58919e95205Sopenharmony_ci LOG_ERROR("[sock]socket does not exist"); 59019e95205Sopenharmony_ci } 59119e95205Sopenharmony_ci } else { 59219e95205Sopenharmony_ci socket.state_ = DISCONNECTED; 59319e95205Sopenharmony_ci socketGapClient_->UnregisterSecurity(remoteAddr_, scn_, serviceId_); 59419e95205Sopenharmony_ci FreeServiceId(serviceId_); 59519e95205Sopenharmony_ci SocketThread::GetInstance().DeleteSocket(*this); 59619e95205Sopenharmony_ci socket.CloseSocketFd(); 59719e95205Sopenharmony_ci std::lock_guard<std::recursive_mutex> lk(Socket::g_socketMutex); 59819e95205Sopenharmony_ci Socket::EraseSocket(socket); 59919e95205Sopenharmony_ci Socket::NotifyServiceDeleteSocket(socket); 60019e95205Sopenharmony_ci } 60119e95205Sopenharmony_ci} 60219e95205Sopenharmony_ci 60319e95205Sopenharmony_civoid Socket::SetRemoteAddr(std::string addr) 60419e95205Sopenharmony_ci{ 60519e95205Sopenharmony_ci LOG_INFO("[sock]%{public}s", __func__); 60619e95205Sopenharmony_ci 60719e95205Sopenharmony_ci RawAddress rawAddr(addr); 60819e95205Sopenharmony_ci rawAddr.ConvertToUint8(remoteAddr_.addr); 60919e95205Sopenharmony_ci remoteAddr_.type = BT_PUBLIC_DEVICE_ADDRESS; 61019e95205Sopenharmony_ci} 61119e95205Sopenharmony_ci 61219e95205Sopenharmony_civoid Socket::CloseSocket(bool isDisable) 61319e95205Sopenharmony_ci{ 61419e95205Sopenharmony_ci LOG_INFO("[sock]%{public}s", __func__); 61519e95205Sopenharmony_ci 61619e95205Sopenharmony_ci CloseSocketFd(); 61719e95205Sopenharmony_ci 61819e95205Sopenharmony_ci if (isServer_ && (!isNewSocket_)) { 61919e95205Sopenharmony_ci RFCOMM_FreeServerNum(scn_); 62019e95205Sopenharmony_ci sdpServer_->UnregisterSdpService(); 62119e95205Sopenharmony_ci socketGapServer_->UnregisterSecurity(remoteAddr_, scn_, serviceId_); 62219e95205Sopenharmony_ci FreeServiceId(serviceId_); 62319e95205Sopenharmony_ci if (isDisable) { 62419e95205Sopenharmony_ci sockTransport_->RemoveServer(true); 62519e95205Sopenharmony_ci } else { 62619e95205Sopenharmony_ci sockTransport_->RemoveServer(false); 62719e95205Sopenharmony_ci } 62819e95205Sopenharmony_ci state_ = CLOSED; 62919e95205Sopenharmony_ci NotifyServiceDeleteSocket(*this); 63019e95205Sopenharmony_ci std::lock_guard<std::recursive_mutex> lk(Socket::g_socketMutex); 63119e95205Sopenharmony_ci EraseSocket(*this); 63219e95205Sopenharmony_ci return; 63319e95205Sopenharmony_ci } 63419e95205Sopenharmony_ci 63519e95205Sopenharmony_ci if (state_ == CONNECTED || state_ == CONNECTING) { 63619e95205Sopenharmony_ci LOG_INFO("[sock]%{public}s close connection", __func__); 63719e95205Sopenharmony_ci if (isServer_) { 63819e95205Sopenharmony_ci socketGapServer_->UnregisterSecurity(remoteAddr_, scn_, serviceId_); 63919e95205Sopenharmony_ci } else { 64019e95205Sopenharmony_ci socketGapClient_->UnregisterSecurity(remoteAddr_, scn_, serviceId_); 64119e95205Sopenharmony_ci } 64219e95205Sopenharmony_ci FreeServiceId(serviceId_); 64319e95205Sopenharmony_ci 64419e95205Sopenharmony_ci if (isServer_) { 64519e95205Sopenharmony_ci if (newSockTransport_ != nullptr) { 64619e95205Sopenharmony_ci newSockTransport_->Disconnect(); 64719e95205Sopenharmony_ci } else { 64819e95205Sopenharmony_ci LOG_ERROR("[sock]%{public}s newSockTransport is null", __func__); 64919e95205Sopenharmony_ci } 65019e95205Sopenharmony_ci } else { 65119e95205Sopenharmony_ci if (sockTransport_ != nullptr) { 65219e95205Sopenharmony_ci sockTransport_->Disconnect(); 65319e95205Sopenharmony_ci } else { 65419e95205Sopenharmony_ci LOG_ERROR("[sock]%{public}s client sockTransport is null", __func__); 65519e95205Sopenharmony_ci } 65619e95205Sopenharmony_ci } 65719e95205Sopenharmony_ci } else if (state_ == INIT || state_ == DISCONNECTED) { 65819e95205Sopenharmony_ci LOG_INFO("[sock]%{public}s close no connection", __func__); 65919e95205Sopenharmony_ci NotifyServiceDeleteSocket(*this); 66019e95205Sopenharmony_ci } 66119e95205Sopenharmony_ci} 66219e95205Sopenharmony_ci 66319e95205Sopenharmony_civoid Socket::OnSocketReadReady(Socket &sock) 66419e95205Sopenharmony_ci{ 66519e95205Sopenharmony_ci std::lock_guard<std::recursive_mutex> lk(Socket::g_socketMutex); 66619e95205Sopenharmony_ci std::vector<Socket *>::iterator it = find(g_allServerSockets.begin(), g_allServerSockets.end(), &sock); 66719e95205Sopenharmony_ci if (it == g_allServerSockets.end()) { 66819e95205Sopenharmony_ci LOG_DEBUG("[sock]%{public}s socket does not exist", __func__); 66919e95205Sopenharmony_ci return; 67019e95205Sopenharmony_ci } 67119e95205Sopenharmony_ci 67219e95205Sopenharmony_ci std::lock_guard<std::recursive_mutex> lck(sock.writeMutex_); 67319e95205Sopenharmony_ci if (sock.isCanWrite_) { 67419e95205Sopenharmony_ci LOG_INFO("[sock]%{public}s socket write data", __func__); 67519e95205Sopenharmony_ci sock.WriteData(); 67619e95205Sopenharmony_ci } 67719e95205Sopenharmony_ci} 67819e95205Sopenharmony_ci 67919e95205Sopenharmony_civoid Socket::OnSocketWriteReady(Socket &sock) 68019e95205Sopenharmony_ci{ 68119e95205Sopenharmony_ci LOG_INFO("[sock]%{public}s", __func__); 68219e95205Sopenharmony_ci 68319e95205Sopenharmony_ci std::lock_guard<std::recursive_mutex> lk(Socket::g_socketMutex); 68419e95205Sopenharmony_ci std::vector<Socket *>::iterator it = find(g_allServerSockets.begin(), g_allServerSockets.end(), &sock); 68519e95205Sopenharmony_ci if (it == g_allServerSockets.end()) { 68619e95205Sopenharmony_ci LOG_DEBUG("[sock]%{public}s socket does not exist", __func__); 68719e95205Sopenharmony_ci return; 68819e95205Sopenharmony_ci } 68919e95205Sopenharmony_ci 69019e95205Sopenharmony_ci SocketService *socketService = 69119e95205Sopenharmony_ci static_cast<SocketService *>(IProfileManager::GetInstance()->GetProfileService(PROFILE_NAME_SPP)); 69219e95205Sopenharmony_ci if (socketService != nullptr) { 69319e95205Sopenharmony_ci socketService->GetDispatcher()->PostTask(std::bind(&Socket::OnSocketWriteReadyNative, &sock, std::ref(sock))); 69419e95205Sopenharmony_ci } 69519e95205Sopenharmony_ci} 69619e95205Sopenharmony_ci 69719e95205Sopenharmony_civoid Socket::OnSocketWriteReadyNative(Socket &sock) 69819e95205Sopenharmony_ci{ 69919e95205Sopenharmony_ci LOG_INFO("[sock]%{public}s", __func__); 70019e95205Sopenharmony_ci 70119e95205Sopenharmony_ci sock.isCanRead_ = true; 70219e95205Sopenharmony_ci 70319e95205Sopenharmony_ci if (sock.recvBufLen_ == 0) { 70419e95205Sopenharmony_ci LOG_INFO("[sock]%{public}s recvbuf has been send", __func__); 70519e95205Sopenharmony_ci sock.ReadData(); 70619e95205Sopenharmony_ci return; 70719e95205Sopenharmony_ci } 70819e95205Sopenharmony_ci 70919e95205Sopenharmony_ci SocketSendRet sendRet = SendDataToApp(sock.transportFd_, sock.recvDataBuf_, sock.recvBufLen_); 71019e95205Sopenharmony_ci switch (sendRet) { 71119e95205Sopenharmony_ci case SOCKET_SEND_NONE: 71219e95205Sopenharmony_ci case SOCKET_SEND_PARTIAL: 71319e95205Sopenharmony_ci sock.isCanRead_ = false; 71419e95205Sopenharmony_ci SocketThread::GetInstance().AddSocket( 71519e95205Sopenharmony_ci sock.transportFd_, 1, sock); 71619e95205Sopenharmony_ci break; 71719e95205Sopenharmony_ci case SOCKET_SEND_ERROR: 71819e95205Sopenharmony_ci sock.isCanRead_ = false; 71919e95205Sopenharmony_ci LOG_INFO("[sock]%{public}s close socket", __func__); 72019e95205Sopenharmony_ci SocketThread::GetInstance().DeleteSocket(sock); 72119e95205Sopenharmony_ci sock.CloseSocket(false); 72219e95205Sopenharmony_ci break; 72319e95205Sopenharmony_ci case SOCKET_SEND_ALL: 72419e95205Sopenharmony_ci sock.isCanRead_ = true; 72519e95205Sopenharmony_ci (void)memset_s(sock.recvDataBuf_, SOCK_DEF_RFC_MTU, 0, SOCK_DEF_RFC_MTU); 72619e95205Sopenharmony_ci sock.ReadData(); 72719e95205Sopenharmony_ci LOG_INFO("[sock]%{public}s send data success", __func__); 72819e95205Sopenharmony_ci break; 72919e95205Sopenharmony_ci default: 73019e95205Sopenharmony_ci break; 73119e95205Sopenharmony_ci } 73219e95205Sopenharmony_ci} 73319e95205Sopenharmony_ci 73419e95205Sopenharmony_civoid Socket::ReadData() 73519e95205Sopenharmony_ci{ 73619e95205Sopenharmony_ci Packet *pkt = nullptr; 73719e95205Sopenharmony_ci uint8_t *pData = nullptr; 73819e95205Sopenharmony_ci Buffer *buf = nullptr; 73919e95205Sopenharmony_ci 74019e95205Sopenharmony_ci while (true) { 74119e95205Sopenharmony_ci if (!this->isCanRead_) { 74219e95205Sopenharmony_ci LOG_DEBUG("[sock]%{public}s can not read.", __func__); 74319e95205Sopenharmony_ci return; 74419e95205Sopenharmony_ci } 74519e95205Sopenharmony_ci 74619e95205Sopenharmony_ci if (this->isNewSocket_) { 74719e95205Sopenharmony_ci if (this->newSockTransport_ == nullptr) { 74819e95205Sopenharmony_ci LOG_DEBUG("[sock]%{public}s newSockTransport is null", __func__); 74919e95205Sopenharmony_ci return; 75019e95205Sopenharmony_ci } 75119e95205Sopenharmony_ci if (this->newSockTransport_->Read(&pkt) != 0) { 75219e95205Sopenharmony_ci break; 75319e95205Sopenharmony_ci } 75419e95205Sopenharmony_ci } else { 75519e95205Sopenharmony_ci if (this->sockTransport_->Read(&pkt) != 0) { 75619e95205Sopenharmony_ci break; 75719e95205Sopenharmony_ci } 75819e95205Sopenharmony_ci } 75919e95205Sopenharmony_ci 76019e95205Sopenharmony_ci if (pkt == nullptr) { 76119e95205Sopenharmony_ci LOG_ERROR("[sock]%{public}s pkt is null", __func__); 76219e95205Sopenharmony_ci return; 76319e95205Sopenharmony_ci } 76419e95205Sopenharmony_ci 76519e95205Sopenharmony_ci size_t len = PacketPayloadSize(pkt); 76619e95205Sopenharmony_ci if (len == 0) { 76719e95205Sopenharmony_ci break; 76819e95205Sopenharmony_ci } 76919e95205Sopenharmony_ci buf = PacketContinuousPayload(pkt); 77019e95205Sopenharmony_ci if (buf != nullptr) { 77119e95205Sopenharmony_ci pData = (uint8_t *)BufferPtr(buf); 77219e95205Sopenharmony_ci } 77319e95205Sopenharmony_ci if (pData == nullptr) { 77419e95205Sopenharmony_ci return; 77519e95205Sopenharmony_ci } 77619e95205Sopenharmony_ci 77719e95205Sopenharmony_ci this->WriteDataToAPP(pData, len); 77819e95205Sopenharmony_ci 77919e95205Sopenharmony_ci if (pkt != nullptr) { 78019e95205Sopenharmony_ci PacketFree(pkt); 78119e95205Sopenharmony_ci pkt = nullptr; 78219e95205Sopenharmony_ci } 78319e95205Sopenharmony_ci } 78419e95205Sopenharmony_ci} 78519e95205Sopenharmony_ci 78619e95205Sopenharmony_civoid Socket::WriteDataToAPP(const uint8_t *buffer, size_t len) 78719e95205Sopenharmony_ci{ 78819e95205Sopenharmony_ci LOG_INFO("[sock]%{public}s", __func__); 78919e95205Sopenharmony_ci 79019e95205Sopenharmony_ci SocketSendRet sendRet = SendDataToApp(this->transportFd_, buffer, len); 79119e95205Sopenharmony_ci switch (sendRet) { 79219e95205Sopenharmony_ci case SOCKET_SEND_NONE: 79319e95205Sopenharmony_ci case SOCKET_SEND_PARTIAL: 79419e95205Sopenharmony_ci LOG_INFO("[sock]%{public}s SOCKET_SEND_PARTIAL", __func__); 79519e95205Sopenharmony_ci this->isCanRead_ = false; 79619e95205Sopenharmony_ci (void)memcpy_s(this->recvDataBuf_, SOCK_DEF_RFC_MTU, buffer, len); 79719e95205Sopenharmony_ci this->recvBufLen_ = len; 79819e95205Sopenharmony_ci SocketThread::GetInstance().AddSocket(this->transportFd_, 1, *this); 79919e95205Sopenharmony_ci break; 80019e95205Sopenharmony_ci case SOCKET_SEND_ERROR: 80119e95205Sopenharmony_ci this->isCanRead_ = false; 80219e95205Sopenharmony_ci LOG_INFO("[sock]%{public}s send data error", __func__); 80319e95205Sopenharmony_ci SocketThread::GetInstance().DeleteSocket(*this); 80419e95205Sopenharmony_ci this->CloseSocket(false); 80519e95205Sopenharmony_ci break; 80619e95205Sopenharmony_ci case SOCKET_SEND_ALL: 80719e95205Sopenharmony_ci this->isCanRead_ = true; 80819e95205Sopenharmony_ci LOG_INFO("[sock]%{public}s send data success", __func__); 80919e95205Sopenharmony_ci break; 81019e95205Sopenharmony_ci default: 81119e95205Sopenharmony_ci break; 81219e95205Sopenharmony_ci } 81319e95205Sopenharmony_ci} 81419e95205Sopenharmony_ci 81519e95205Sopenharmony_civoid Socket::WriteData() 81619e95205Sopenharmony_ci{ 81719e95205Sopenharmony_ci LOG_INFO("[sock]%{public}s", __func__); 81819e95205Sopenharmony_ci 81919e95205Sopenharmony_ci int totalSize = 0; 82019e95205Sopenharmony_ci 82119e95205Sopenharmony_ci { 82219e95205Sopenharmony_ci std::lock_guard<std::mutex> lock(fdMutex_); 82319e95205Sopenharmony_ci if (ioctl(this->transportFd_, FIONREAD, &totalSize) != 0) { 82419e95205Sopenharmony_ci LOG_ERROR("[sock]%{public}s ioctl read fd error", __func__); 82519e95205Sopenharmony_ci return; 82619e95205Sopenharmony_ci } 82719e95205Sopenharmony_ci } 82819e95205Sopenharmony_ci 82919e95205Sopenharmony_ci if (totalSize == 0) { 83019e95205Sopenharmony_ci LOG_DEBUG("[sock]%{public}s recv buffer has no data", __func__); 83119e95205Sopenharmony_ci return; 83219e95205Sopenharmony_ci } 83319e95205Sopenharmony_ci 83419e95205Sopenharmony_ci LOG_INFO("[sock]%{public}s totalSize:%{public}d", __func__, totalSize); 83519e95205Sopenharmony_ci 83619e95205Sopenharmony_ci while (totalSize > 0) { 83719e95205Sopenharmony_ci if (this->isCanWrite_) { 83819e95205Sopenharmony_ci int mallocSize = (totalSize > this->sendMTU_) ? this->sendMTU_ : totalSize; 83919e95205Sopenharmony_ci 84019e95205Sopenharmony_ci Packet *wPkt = PacketMalloc(0, 0, mallocSize); 84119e95205Sopenharmony_ci if (wPkt == nullptr) { 84219e95205Sopenharmony_ci LOG_INFO("[sock]pkt is null"); 84319e95205Sopenharmony_ci return; 84419e95205Sopenharmony_ci } 84519e95205Sopenharmony_ci Buffer *wPayloadBuf = PacketContinuousPayload(wPkt); 84619e95205Sopenharmony_ci void *buffer = BufferPtr(wPayloadBuf); 84719e95205Sopenharmony_ci 84819e95205Sopenharmony_ci int wbytes = read(this->transportFd_, buffer, mallocSize); 84919e95205Sopenharmony_ci LOG_INFO("[sock]%{public}s wbytes:%{public}d", __func__, wbytes); 85019e95205Sopenharmony_ci if (wbytes <= 0) { 85119e95205Sopenharmony_ci LOG_DEBUG("[sock]%{public}s socket fd exception", __func__); 85219e95205Sopenharmony_ci PacketFree(wPkt); 85319e95205Sopenharmony_ci return; 85419e95205Sopenharmony_ci } 85519e95205Sopenharmony_ci int ret = TransportWrite(wPkt); 85619e95205Sopenharmony_ci if (ret < 0) { 85719e95205Sopenharmony_ci LOG_DEBUG("[sock]%{public}s stack write failed", __func__); 85819e95205Sopenharmony_ci (void)memcpy_s(this->sendDataBuf_, wbytes, buffer, wbytes); 85919e95205Sopenharmony_ci this->sendBufLen_ = wbytes; 86019e95205Sopenharmony_ci this->isCanWrite_ = false; 86119e95205Sopenharmony_ci PacketFree(wPkt); 86219e95205Sopenharmony_ci return; 86319e95205Sopenharmony_ci } 86419e95205Sopenharmony_ci totalSize -= wbytes; 86519e95205Sopenharmony_ci PacketFree(wPkt); 86619e95205Sopenharmony_ci } else { 86719e95205Sopenharmony_ci return; 86819e95205Sopenharmony_ci } 86919e95205Sopenharmony_ci } 87019e95205Sopenharmony_ci} 87119e95205Sopenharmony_ci 87219e95205Sopenharmony_ciint Socket::TransportWrite(Packet *subPkt) 87319e95205Sopenharmony_ci{ 87419e95205Sopenharmony_ci LOG_INFO("[sock]%{public}s", __func__); 87519e95205Sopenharmony_ci 87619e95205Sopenharmony_ci RawAddress rawAddr = RawAddress::ConvertToString(this->remoteAddr_.addr); 87719e95205Sopenharmony_ci IPowerManager::GetInstance().StatusUpdate(RequestStatus::BUSY, PROFILE_NAME_SPP, rawAddr); 87819e95205Sopenharmony_ci 87919e95205Sopenharmony_ci int ret = 0; 88019e95205Sopenharmony_ci if (this->isNewSocket_) { 88119e95205Sopenharmony_ci if (this->newSockTransport_ == nullptr) { 88219e95205Sopenharmony_ci LOG_DEBUG("[sock]%{public}s newSockTransport is nullptr", __func__); 88319e95205Sopenharmony_ci } else { 88419e95205Sopenharmony_ci ret = this->newSockTransport_->Write(subPkt); 88519e95205Sopenharmony_ci } 88619e95205Sopenharmony_ci } else { 88719e95205Sopenharmony_ci ret = this->sockTransport_->Write(subPkt); 88819e95205Sopenharmony_ci } 88919e95205Sopenharmony_ci IPowerManager::GetInstance().StatusUpdate(RequestStatus::IDLE, PROFILE_NAME_SPP, rawAddr); 89019e95205Sopenharmony_ci return ret; 89119e95205Sopenharmony_ci} 89219e95205Sopenharmony_ci 89319e95205Sopenharmony_civoid Socket::OnSocketException(Socket &sock) 89419e95205Sopenharmony_ci{ 89519e95205Sopenharmony_ci LOG_INFO("[sock]%{public}s", __func__); 89619e95205Sopenharmony_ci 89719e95205Sopenharmony_ci SocketService *socketService = 89819e95205Sopenharmony_ci static_cast<SocketService *>(IProfileManager::GetInstance()->GetProfileService(PROFILE_NAME_SPP)); 89919e95205Sopenharmony_ci if (socketService != nullptr) { 90019e95205Sopenharmony_ci socketService->GetDispatcher()->PostTask(std::bind(&Socket::OnSocketExceptionNative, &sock, std::ref(sock))); 90119e95205Sopenharmony_ci } 90219e95205Sopenharmony_ci} 90319e95205Sopenharmony_ci 90419e95205Sopenharmony_civoid Socket::OnSocketExceptionNative(Socket &sock) 90519e95205Sopenharmony_ci{ 90619e95205Sopenharmony_ci LOG_INFO("[sock]%{public}s", __func__); 90719e95205Sopenharmony_ci 90819e95205Sopenharmony_ci std::lock_guard<std::recursive_mutex> lk(Socket::g_socketMutex); 90919e95205Sopenharmony_ci std::vector<Socket *>::iterator it; 91019e95205Sopenharmony_ci 91119e95205Sopenharmony_ci LOG_INFO("[sock]%{public}s size:%{public}zu", __func__, g_allServerSockets.size()); 91219e95205Sopenharmony_ci 91319e95205Sopenharmony_ci for (it = g_allServerSockets.begin(); it != g_allServerSockets.end(); ++it) { 91419e95205Sopenharmony_ci if (*it == &sock) { 91519e95205Sopenharmony_ci sock.CloseSocket(false); 91619e95205Sopenharmony_ci break; 91719e95205Sopenharmony_ci } 91819e95205Sopenharmony_ci } 91919e95205Sopenharmony_ci} 92019e95205Sopenharmony_ci 92119e95205Sopenharmony_ciGAP_Service Socket::AssignServiceId() 92219e95205Sopenharmony_ci{ 92319e95205Sopenharmony_ci int serviceId = 0; 92419e95205Sopenharmony_ci for (int i = 0; i < SOCK_MAX_SERVICE_ID; i++) { 92519e95205Sopenharmony_ci if (g_arrayServiceId[i] == 0) { 92619e95205Sopenharmony_ci g_arrayServiceId[i] = SPP_ID_START + i; 92719e95205Sopenharmony_ci serviceId = g_arrayServiceId[i]; 92819e95205Sopenharmony_ci break; 92919e95205Sopenharmony_ci } 93019e95205Sopenharmony_ci } 93119e95205Sopenharmony_ci return (GAP_Service)serviceId; 93219e95205Sopenharmony_ci} 93319e95205Sopenharmony_ci 93419e95205Sopenharmony_civoid Socket::FreeServiceId(GAP_Service serviceId) 93519e95205Sopenharmony_ci{ 93619e95205Sopenharmony_ci if (serviceId >= SPP_ID_START) { 93719e95205Sopenharmony_ci g_arrayServiceId[serviceId - SPP_ID_START] = 0; 93819e95205Sopenharmony_ci } 93919e95205Sopenharmony_ci} 94019e95205Sopenharmony_ci 94119e95205Sopenharmony_ciSocketSendRet Socket::SendDataToApp(int fd, const uint8_t *buf, size_t len) 94219e95205Sopenharmony_ci{ 94319e95205Sopenharmony_ci LOG_INFO("[sock]%{public}s", __func__); 94419e95205Sopenharmony_ci 94519e95205Sopenharmony_ci#ifdef DARWIN_PLATFORM 94619e95205Sopenharmony_ci auto sendRet = send(fd, buf, len, MSG_DONTWAIT); 94719e95205Sopenharmony_ci#else 94819e95205Sopenharmony_ci auto sendRet = send(fd, buf, len, MSG_NOSIGNAL); 94919e95205Sopenharmony_ci#endif 95019e95205Sopenharmony_ci if (sendRet < 0) { 95119e95205Sopenharmony_ci if ((errno == EAGAIN || errno == EWOULDBLOCK)) { 95219e95205Sopenharmony_ci return SOCKET_SEND_NONE; 95319e95205Sopenharmony_ci } 95419e95205Sopenharmony_ci return SOCKET_SEND_ERROR; 95519e95205Sopenharmony_ci } 95619e95205Sopenharmony_ci 95719e95205Sopenharmony_ci if (sendRet == 0) { 95819e95205Sopenharmony_ci return SOCKET_SEND_ERROR; 95919e95205Sopenharmony_ci } 96019e95205Sopenharmony_ci 96119e95205Sopenharmony_ci if (sendRet == ssize_t(len)) { 96219e95205Sopenharmony_ci return SOCKET_SEND_ALL; 96319e95205Sopenharmony_ci } 96419e95205Sopenharmony_ci 96519e95205Sopenharmony_ci return SOCKET_SEND_PARTIAL; 96619e95205Sopenharmony_ci} 96719e95205Sopenharmony_ci 96819e95205Sopenharmony_civoid Socket::NotifyServiceDeleteSocket(Socket &sock) 96919e95205Sopenharmony_ci{ 97019e95205Sopenharmony_ci LOG_INFO("[sock]%{public}s", __func__); 97119e95205Sopenharmony_ci 97219e95205Sopenharmony_ci utility::Message msg(SOCKET_CLOSE); 97319e95205Sopenharmony_ci msg.arg2_ = &sock; 97419e95205Sopenharmony_ci SocketService *socketService = 97519e95205Sopenharmony_ci static_cast<SocketService *>(IProfileManager::GetInstance()->GetProfileService(PROFILE_NAME_SPP)); 97619e95205Sopenharmony_ci if (socketService != nullptr) { 97719e95205Sopenharmony_ci socketService->ProcessMessage(msg); 97819e95205Sopenharmony_ci } 97919e95205Sopenharmony_ci} 98019e95205Sopenharmony_ci 98119e95205Sopenharmony_civoid Socket::EraseSocket(Socket &socket) 98219e95205Sopenharmony_ci{ 98319e95205Sopenharmony_ci LOG_INFO("[sock]%{public}s", __func__); 98419e95205Sopenharmony_ci 98519e95205Sopenharmony_ci std::vector<Socket *>::iterator it; 98619e95205Sopenharmony_ci LOG_INFO("[sock]%{public}s size:%{public}zu", __func__, g_allServerSockets.size()); 98719e95205Sopenharmony_ci 98819e95205Sopenharmony_ci for (it = g_allServerSockets.begin(); it != g_allServerSockets.end(); ++it) { 98919e95205Sopenharmony_ci if (*it == &socket) { 99019e95205Sopenharmony_ci g_allServerSockets.erase(it); 99119e95205Sopenharmony_ci break; 99219e95205Sopenharmony_ci } 99319e95205Sopenharmony_ci } 99419e95205Sopenharmony_ci} 99519e95205Sopenharmony_ci 99619e95205Sopenharmony_civoid Socket::RemoveServerSocket() 99719e95205Sopenharmony_ci{ 99819e95205Sopenharmony_ci LOG_INFO("[sock]%{public}s", __func__); 99919e95205Sopenharmony_ci 100019e95205Sopenharmony_ci CloseSocketFd(); 100119e95205Sopenharmony_ci EraseSocket(*this); 100219e95205Sopenharmony_ci sockTransport_->RemoveServer(true); 100319e95205Sopenharmony_ci} 100419e95205Sopenharmony_ci 100519e95205Sopenharmony_civoid Socket::CloseSocketFd() 100619e95205Sopenharmony_ci{ 100719e95205Sopenharmony_ci LOG_INFO("[sock]%{public}s", __func__); 100819e95205Sopenharmony_ci if (this->transportFd_ != SOCK_INVALID_FD) { 100919e95205Sopenharmony_ci LOG_DEBUG("closefd : transportFd_:%{public}d", this->transportFd_); 101019e95205Sopenharmony_ci shutdown(this->transportFd_, SHUT_RDWR); 101119e95205Sopenharmony_ci close(this->transportFd_); 101219e95205Sopenharmony_ci std::lock_guard<std::mutex> lock(this->fdMutex_); 101319e95205Sopenharmony_ci this->transportFd_ = SOCK_INVALID_FD; 101419e95205Sopenharmony_ci } 101519e95205Sopenharmony_ci 101619e95205Sopenharmony_ci if (this->upperlayerFd_ != SOCK_INVALID_FD) { 101719e95205Sopenharmony_ci LOG_DEBUG("closefd : upperlayerFd_:%{public}d", this->upperlayerFd_); 101819e95205Sopenharmony_ci shutdown(this->upperlayerFd_, SHUT_RDWR); 101919e95205Sopenharmony_ci close(this->upperlayerFd_); 102019e95205Sopenharmony_ci this->upperlayerFd_ = SOCK_INVALID_FD; 102119e95205Sopenharmony_ci } 102219e95205Sopenharmony_ci} 102319e95205Sopenharmony_ci 102419e95205Sopenharmony_ciutility::Dispatcher *Socket::GetDispatchter() 102519e95205Sopenharmony_ci{ 102619e95205Sopenharmony_ci LOG_INFO("[sock]%{public}s", __func__); 102719e95205Sopenharmony_ci SocketService *socketService = 102819e95205Sopenharmony_ci static_cast<SocketService *>(IProfileManager::GetInstance()->GetProfileService(PROFILE_NAME_SPP)); 102919e95205Sopenharmony_ci if (socketService == nullptr) { 103019e95205Sopenharmony_ci return nullptr; 103119e95205Sopenharmony_ci } 103219e95205Sopenharmony_ci return socketService->GetDispatcher(); 103319e95205Sopenharmony_ci} 103419e95205Sopenharmony_ci 103519e95205Sopenharmony_civoid Socket::ClearUpAllSocket() 103619e95205Sopenharmony_ci{ 103719e95205Sopenharmony_ci LOG_INFO("[sock]%{public}s", __func__); 103819e95205Sopenharmony_ci 103919e95205Sopenharmony_ci LOG_INFO("[sock]%{public}s size:%{public}zu", __func__, g_allServerSockets.size()); 104019e95205Sopenharmony_ci if (g_allServerSockets.size() > 0) { 104119e95205Sopenharmony_ci g_allServerSockets.clear(); 104219e95205Sopenharmony_ci } 104319e95205Sopenharmony_ci} 104419e95205Sopenharmony_ci} // namespace bluetooth 104519e95205Sopenharmony_ci} // namespace OHOS 1046