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