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