• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2023 Shenzhen Kaihong Digital Industry Development Co., Ltd.
3  * Licensed under the Apache License, Version 2.0 (the "License");
4  * you may not use this file except in compliance with the License.
5  * You may obtain a copy of the License at
6  *
7  *     http://www.apache.org/licenses/LICENSE-2.0
8  *
9  * Unless required by applicable law or agreed to in writing, software
10  * distributed under the License is distributed on an "AS IS" BASIS,
11  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12  * See the License for the specific language governing permissions and
13  * limitations under the License.
14  */
15 
16 #include "tcp_session.h"
17 #include "common/common_macro.h"
18 #include "common/media_log.h"
19 #include "network/socket/socket_utils.h"
20 #include "utils/utils.h"
21 
22 namespace OHOS {
23 namespace Sharing {
TcpSession(SocketInfo::Ptr socket)24 TcpSession::TcpSession(SocketInfo::Ptr socket) : BaseNetworkSession(socket)
25 {
26     SHARING_LOGD("trace.");
27 }
28 
~TcpSession()29 TcpSession::~TcpSession()
30 {
31     SHARING_LOGD("trace.");
32     Shutdown();
33 }
34 
Start()35 bool TcpSession::Start()
36 {
37     SHARING_LOGD("trace.");
38     if (socket_) {
39         SHARING_LOGD("tcpSession AddFdListener.");
40         auto eventRunner = OHOS::AppExecFwk::EventRunner::Create(true);
41         eventHandler_ = std::make_shared<TcpSessionEventHandler>();
42         eventHandler_->SetSession(shared_from_this());
43         eventHandler_->SetEventRunner(eventRunner);
44         eventRunner->Run();
45 
46         eventListener_ = std::make_shared<TcpSessionEventListener>();
47         eventListener_->SetSession(shared_from_this());
48 
49         return eventListener_->AddFdListener(socket_->GetPeerFd(), eventListener_, eventHandler_);
50     }
51 
52     return false;
53 }
54 
Send(const DataBuffer::Ptr & buf,int32_t nSize)55 bool TcpSession::Send(const DataBuffer::Ptr &buf, int32_t nSize)
56 {
57     SHARING_LOGD("trace.");
58     RETURN_FALSE_IF_NULL(buf);
59     return TcpSession::Send(buf->Peek(), nSize);
60 }
61 
Send(const char * buf,int32_t nSize)62 bool TcpSession::Send(const char *buf, int32_t nSize)
63 {
64     SHARING_LOGD("trace.");
65     RETURN_FALSE_IF_NULL(buf);
66     if (socket_) {
67         int32_t ret = SocketUtils::SendSocket(socket_->GetPeerFd(), buf, nSize);
68         if ((ret != 0)) {
69             return true;
70         } else {
71             SHARING_LOGE("send Failed, Shutdown!");
72             if (callback_) {
73                 callback_->OnSessionClose(socket_->GetPeerFd());
74             }
75 
76             return false;
77         }
78     } else {
79         return false;
80     }
81 }
82 
Shutdown()83 void TcpSession::Shutdown()
84 {
85     SHARING_LOGD("trace.");
86     if (socket_) {
87         if (eventListener_) {
88             eventListener_->RemoveFdListener(socket_->GetPeerFd());
89         }
90         SocketUtils::ShutDownSocket(socket_->GetPeerFd());
91         SocketUtils::CloseSocket(socket_->GetPeerFd());
92         socket_.reset();
93     }
94 }
95 
OnSessionReadble(int32_t fd)96 void TcpSession::OnSessionReadble(int32_t fd)
97 {
98     MEDIA_LOGD("fd: %{public}d, thread_id: %{public}llu.", fd, GetThreadId());
99     if (socket_ == nullptr) {
100         SHARING_LOGE("onReadable nullptr!");
101         return;
102     }
103     if (fd == socket_->GetPeerFd()) {
104         int32_t retCode = 0;
105         int32_t error = 0;
106         DataBuffer::Ptr buf = std::make_shared<DataBuffer>(DEAFULT_READ_BUFFER_SIZE);
107         retCode = SocketUtils::RecvSocket(fd, (char *)buf->Data(), DEAFULT_READ_BUFFER_SIZE, 0, error);
108         if (retCode > 0) {
109             buf->UpdateSize(retCode);
110             if (callback_) {
111                 callback_->OnSessionReadData(fd, std::move(buf));
112             }
113         } else if (retCode == 0) {
114             if (callback_) {
115                 callback_->OnSessionClose(fd);
116             }
117             MEDIA_LOGW("recvSocket Shutdown!");
118         } else {
119             MEDIA_LOGE("recvSocket error!");
120         }
121     } else {
122         MEDIA_LOGD("onReadable receive msg.");
123     }
124 }
125 } // namespace Sharing
126 } // namespace OHOS