• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2021-2022 Huawei Device Co., Ltd.
3  * Licensed under the Apache License, Version 2.0 (the "License");
4  * you may not use this file except in compliance with the License.
5  * You may obtain a copy of the License at
6  *
7  *     http://www.apache.org/licenses/LICENSE-2.0
8  *
9  * Unless required by applicable law or agreed to in writing, software
10  * distributed under the License is distributed on an "AS IS" BASIS,
11  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12  * See the License for the specific language governing permissions and
13  * limitations under the License.
14  */
15 
16 #ifndef CLIENT_TRANS_UDP_STREAM_ADAPTOR_LISTENER_H_
17 #define CLIENT_TRANS_UDP_STREAM_ADAPTOR_LISTENER_H_
18 
19 #include "i_stream.h"
20 #include "i_stream_manager.h"
21 #include "softbus_def.h"
22 #include "softbus_log.h"
23 
24 using Communication::SoftBus::IStreamManagerListener;
25 using Communication::SoftBus::IStream;
26 
27 namespace OHOS {
28 class StreamAdaptorListener : public IStreamManagerListener {
29 public:
30     StreamAdaptorListener() = default;
StreamAdaptorListener(std::shared_ptr<StreamAdaptor> adaptor)31     explicit StreamAdaptorListener(std::shared_ptr<StreamAdaptor> adaptor) : adaptor_(adaptor) {}
32     virtual ~StreamAdaptorListener() override = default;
ConvertStreamFrameInfo(StreamFrameInfo * outFrameInfo,const Communication::SoftBus::StreamFrameInfo * inFrameInfo)33     void ConvertStreamFrameInfo(StreamFrameInfo *outFrameInfo,
34         const Communication::SoftBus::StreamFrameInfo *inFrameInfo)
35     {
36         outFrameInfo->frameType = inFrameInfo->frameType;
37         outFrameInfo->timeStamp = (int64_t)inFrameInfo->timeStamp;
38         outFrameInfo->seqNum = (int)inFrameInfo->seqNum;
39         outFrameInfo->seqSubNum = (int)inFrameInfo->seqSubNum;
40         outFrameInfo->level = (int)inFrameInfo->level;
41         outFrameInfo->bitMap = (int)inFrameInfo->bitMap;
42         outFrameInfo->tvCount = 0;
43         outFrameInfo->tvList = nullptr;
44     }
OnStreamReceived(std::unique_ptr<IStream> stream)45     void OnStreamReceived(std::unique_ptr<IStream> stream) override
46     {
47         if (adaptor_ == nullptr || adaptor_->GetListenerCallback() == nullptr ||
48             adaptor_->GetListenerCallback()->OnStreamReceived == nullptr) {
49             return;
50         }
51         StreamFrameInfo tmpf = {0};
52         auto uniptr = stream->GetBuffer();
53         char *retbuf = uniptr.get();
54         int32_t buflen = stream->GetBufferLen();
55         auto extUniptr = stream->GetExtBuffer();
56         char *extRetBuf = extUniptr.get();
57         int32_t extRetBuflen = stream->GetExtBufferLen();
58         StreamData retStreamData = {0};
59         int32_t streamType = adaptor_->GetStreamType();
60         std::unique_ptr<char[]> plainData = nullptr;
61         if (streamType == StreamType::COMMON_VIDEO_STREAM || streamType == StreamType::COMMON_AUDIO_STREAM) {
62             retStreamData.buf = retbuf;
63             retStreamData.bufLen = buflen;
64             ConvertStreamFrameInfo(&tmpf, stream->GetStreamFrameInfo());
65         } else if (streamType == StreamType::RAW_STREAM) {
66             int32_t plainDataLength = buflen - adaptor_->GetEncryptOverhead();
67             if (plainDataLength < 0) {
68                 SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_ERROR,
69                     "StreamAdaptorListener:OnStreamReceived:buflen:%d < GetEncryptOverhead:%zd",
70                     buflen, adaptor_->GetEncryptOverhead());
71                 return;
72             }
73             plainData = std::make_unique<char[]>(plainDataLength);
74             ssize_t decLen = adaptor_->Decrypt(retbuf, buflen, plainData.get(),
75                 plainDataLength, adaptor_->GetSessionKey());
76             if (decLen != plainDataLength) {
77                 SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_ERROR,
78                     "Decrypt failed, dataLength = %d, decryptedLen = %zd", plainDataLength, decLen);
79                 return;
80             }
81             retStreamData.buf = plainData.get();
82             retStreamData.bufLen = plainDataLength;
83         } else {
84             SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_ERROR, "Do not support, streamType = %d", streamType);
85             return;
86         }
87         StreamData extStreamData = {
88             extRetBuf,
89             extRetBuflen,
90         };
91         adaptor_->GetListenerCallback()->OnStreamReceived(adaptor_->GetChannelId(),
92             &retStreamData, &extStreamData, &tmpf);
93     }
94 
OnStreamStatus(int status)95     NO_SANITIZE("cfi") void OnStreamStatus(int status) override
96     {
97         SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_INFO, "StreamAdaptorListener: OnStreamStatus(%d) in.", status);
98 
99         if (adaptor_->GetListenerCallback() != nullptr && adaptor_->GetListenerCallback()->OnStatusChange != nullptr) {
100             SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_DBG, "OnStreamStatus OnStatusChange :%d", status);
101             adaptor_->GetListenerCallback()->OnStatusChange(adaptor_->GetChannelId(), status);
102         }
103     }
104 
OnQosEvent(int32_t eventId,int32_t tvCount,const QosTv * tvList)105     NO_SANITIZE("cfi") void OnQosEvent(int32_t eventId, int32_t tvCount, const QosTv *tvList) override
106     {
107         if (adaptor_->GetListenerCallback() != nullptr && adaptor_->GetListenerCallback()->OnQosEvent != nullptr) {
108             SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_INFO, "StreamAdaptorListener: OnQosEvent for channelId = %" PRId64,
109                 adaptor_->GetChannelId());
110             adaptor_->GetListenerCallback()->OnQosEvent(adaptor_->GetChannelId(), eventId, tvCount, tvList);
111         } else {
112             SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_ERROR,
113                 "Get ListenerCallback by StreamAdaptor is failed, channelId = %" PRId64, adaptor_->GetChannelId());
114         }
115     }
116 
OnFrameStats(const StreamSendStats * data)117     void OnFrameStats(const StreamSendStats *data) override
118     {
119         if (adaptor_->GetListenerCallback() != nullptr && adaptor_->GetListenerCallback()->OnFrameStats != nullptr) {
120             SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_INFO,
121                 "StreamAdaptorListener: OnFrameStats for channelId = %" PRId64, adaptor_->GetChannelId());
122             adaptor_->GetListenerCallback()->OnFrameStats(adaptor_->GetChannelId(), data);
123         } else {
124             SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_ERROR,
125                 "Get ListenerCallback by StreamAdaptor is failed, channelId = %" PRId64, adaptor_->GetChannelId());
126         }
127     }
128 
OnRippleStats(const TrafficStats * data)129     void OnRippleStats(const TrafficStats *data) override
130     {
131         if (adaptor_->GetListenerCallback() != nullptr && adaptor_->GetListenerCallback()->OnRippleStats != nullptr) {
132             SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_INFO,
133                 "StreamAdaptorListener: OnRippleStats for channelId = %" PRId64, adaptor_->GetChannelId());
134             adaptor_->GetListenerCallback()->OnRippleStats(adaptor_->GetChannelId(), data);
135         } else {
136             SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_ERROR,
137                 "Get ListenerCallback by StreamAdaptor is failed, channelId = %" PRId64, adaptor_->GetChannelId());
138         }
139     }
140 
141 private:
142     std::shared_ptr<StreamAdaptor> adaptor_ = nullptr;
143 };
144 } // namespace OHOS
145 
146 #endif // !defined(CLIENT_TRANS_UDP_STREAM_ADAPTOR_LISTENER_H_)
147