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