1/*
2 * Copyright (c) 2021-2024 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 OHOS_DCAMERA_SOFTBUS_SESSION_H
17#define OHOS_DCAMERA_SOFTBUS_SESSION_H
18
19#include "event_handler.h"
20#include <string>
21
22#include "icamera_channel.h"
23#include "icamera_channel_listener.h"
24#include "transport/trans_type.h"
25
26namespace OHOS {
27namespace DistributedHardware {
28typedef enum {
29    DCAMERA_SOFTBUS_STATE_CLOSED = 0,
30    DCAMERA_SOFTBUS_STATE_OPENED = 1,
31} DCameraSofbutState;
32
33class DCameraSoftbusSession {
34public:
35    DCameraSoftbusSession();
36    DCameraSoftbusSession(std::string myDevId, std::string mySessionName, std::string peerDevId,
37        std::string peerSessionName, std::shared_ptr<ICameraChannelListener> listener, DCameraSessionMode mode);
38    ~DCameraSoftbusSession();
39    int32_t CloseSession();
40    int32_t OnSessionOpened(int32_t socket, std::string networkId);
41    int32_t OnSessionClose(int32_t sessionId);
42    int32_t OnDataReceived(std::shared_ptr<DataBuffer>& buffer);
43    int32_t SendData(DCameraSessionMode mode, std::shared_ptr<DataBuffer>& buffer);
44    std::string GetPeerDevId();
45    std::string GetPeerSessionName();
46    std::string GetMySessionName();
47    int32_t GetSessionId();
48    int32_t CreateSocketServer();
49    int32_t BindSocketServer();
50    void ReleaseSession();
51
52private:
53    struct SessionDataHeader {
54        uint16_t version;
55        uint8_t fragFlag;
56        uint32_t dataType;
57        uint32_t seqNum;
58        uint32_t totalLen;
59        uint16_t subSeq;
60        uint32_t dataLen;
61    };
62
63    using DCameraSendFuc = int32_t (DCameraSoftbusSession::*)(std::shared_ptr<DataBuffer>& buffer);
64    int32_t SendBytes(std::shared_ptr<DataBuffer>& buffer);
65    int32_t SendStream(std::shared_ptr<DataBuffer>& buffer);
66    void DealRecvData(std::shared_ptr<DataBuffer>& buffer);
67    void PackRecvData(std::shared_ptr<DataBuffer>& buffer);
68    void AssembleNoFrag(std::shared_ptr<DataBuffer>& buffer, SessionDataHeader& headerPara);
69    void AssembleFrag(std::shared_ptr<DataBuffer>& buffer, SessionDataHeader& headerPara);
70    int32_t CheckUnPackBuffer(SessionDataHeader& headerPara);
71    void GetFragDataLen(uint8_t *ptrPacket, SessionDataHeader& headerPara);
72    int32_t UnPackSendData(std::shared_ptr<DataBuffer>& buffer, DCameraSendFuc memberFunc);
73    void MakeFragDataHeader(const SessionDataHeader& headPara, uint8_t *header, uint32_t len);
74    void PostData(std::shared_ptr<DataBuffer>& buffer);
75    uint16_t U16Get(const uint8_t *ptr);
76    uint32_t U32Get(const uint8_t *ptr);
77    void ResetAssembleFrag();
78    void SetHeadParaDataLen(SessionDataHeader& headPara, const uint32_t totalLen, const uint32_t offset);
79
80    enum {
81        FRAG_NULL = 0,
82        FRAG_START,
83        FRAG_MID,
84        FRAG_END,
85        FRAG_START_END,
86    };
87
88    static const uint32_t BINARY_DATA_MAX_TOTAL_LEN = 100 * 1024 * 1024;
89    static const uint32_t BINARY_DATA_MAX_LEN = 4 * 1024 * 1024;
90    static const uint32_t BINARY_DATA_PACKET_MAX_LEN = 4 * 1024 * 1024;
91    static const uint32_t BINARY_DATA_PACKET_RESERVED_BUFFER = 512;
92    static const uint16_t PROTOCOL_VERSION = 1;
93    static const uint16_t HEADER_UINT8_NUM = 1;
94    static const uint16_t HEADER_UINT16_NUM = 2;
95    static const uint16_t HEADER_UINT32_NUM = 4;
96    static const uint16_t BINARY_HEADER_FRAG_LEN = 21;
97
98    static const uint32_t BINARY_HEADER_FRAG_OFFSET = 2;
99    static const uint32_t BINARY_HEADER_DATATYPE_OFFSET = 3;
100    static const uint32_t BINARY_HEADER_SEQNUM_OFFSET = 7;
101    static const uint32_t BINARY_HEADER_TOTALLEN_OFFSET = 11;
102    static const uint32_t BINARY_HEADER_SUBSEQ_OFFSET = 15;
103    static const uint32_t BINARY_HEADER_DATALEN_OFFSET = 17;
104
105    std::shared_ptr<DataBuffer> packBuffer_;
106    bool isWaiting_;
107    uint32_t nowSeq_;
108    uint32_t nowSubSeq_;
109    uint32_t offset_;
110    uint32_t totalLen_;
111
112private:
113    std::string myDevId_;
114    std::string mySessionName_;
115    std::string peerDevId_;
116    std::string peerSessionName_;
117    std::shared_ptr<ICameraChannelListener> listener_;
118    int32_t sessionId_;
119    DCameraSofbutState state_;
120    DCameraSessionMode mode_;
121    std::map<DCameraSessionMode, DCameraSendFuc> sendFuncMap_;
122    std::shared_ptr<AppExecFwk::EventHandler> eventHandler_;
123};
124} // namespace DistributedHardware
125} // namespace OHOS
126#endif // OHOS_DCAMERA_SOFTBUS_SESSION_H
127