1 /*
2  * Copyright (c) 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 #include "rs_profiler_packet.h"
17 #include <set>
18 namespace OHOS::Rosen {
19 
Packet(PacketType type,uint32_t reserve)20 Packet::Packet(PacketType type, uint32_t reserve)
21 {
22     data_.reserve(reserve);
23     InitData(type);
24 }
25 
IsBinary() const26 bool Packet::IsBinary() const
27 {
28     return (GetType() == BINARY);
29 }
30 
IsCommand() const31 bool Packet::IsCommand() const
32 {
33     return GetType() == COMMAND;
34 }
35 
Begin()36 char* Packet::Begin()
37 {
38     return data_.data();
39 }
40 
End()41 char* Packet::End()
42 {
43     return data_.data() + data_.size();
44 }
45 
GetType() const46 Packet::PacketType Packet::GetType() const
47 {
48     return static_cast<PacketType>(*reinterpret_cast<const uint8_t*>(data_.data() + HEADER_TYPE_OFFSET));
49 }
50 
SetType(Packet::PacketType type)51 void Packet::SetType(Packet::PacketType type)
52 {
53     *reinterpret_cast<uint8_t*>(data_.data() + HEADER_TYPE_OFFSET) = static_cast<uint8_t>(type);
54 }
55 
GetLength() const56 uint32_t Packet::GetLength() const
57 {
58     uint32_t length = 0;
59     Utils::Move(&length, sizeof(length), data_.data() + HEADER_LENGTH_OFFSET, sizeof(length));
60     return length;
61 }
62 
GetPayloadLength() const63 uint32_t Packet::GetPayloadLength() const
64 {
65     return GetLength() - Packet::HEADER_SIZE;
66 }
67 
Release()68 std::vector<char> Packet::Release()
69 {
70     auto res = std::move(data_);
71     InitData(UNKNOWN);
72     return res;
73 }
74 
SetLength(uint32_t length)75 void Packet::SetLength(uint32_t length)
76 {
77     Utils::Move(data_.data() + HEADER_LENGTH_OFFSET, sizeof(length), &length, sizeof(length));
78 }
79 
InitData(PacketType type)80 void Packet::InitData(PacketType type)
81 {
82     data_.resize(HEADER_SIZE);
83     SetType(type);
84     SetLength(HEADER_SIZE);
85     readPointer_ = HEADER_SIZE;
86     writePointer_ = HEADER_SIZE;
87 }
88 
Read(void * value,size_t size)89 [[maybe_unused]] bool Packet::Read(void* value, size_t size)
90 {
91     if (!size) {
92         return false;
93     }
94     if (readPointer_ + size > data_.size()) {
95         return false;
96     }
97     if (!Utils::Move(value, size, data_.data() + readPointer_, size) != 0) {
98         return false;
99     }
100     readPointer_ += size;
101     return true;
102 }
103 
Write(const void * value,size_t size)104 [[maybe_unused]] bool Packet::Write(const void* value, size_t size)
105 {
106     if (!size) {
107         return false;
108     }
109     const size_t growSize = size - (data_.size() - writePointer_);
110     if (writePointer_ + size > data_.size()) {
111         data_.resize(data_.size() + growSize);
112     }
113     if (!Utils::Move(data_.data() + writePointer_, data_.size() - writePointer_, value, size)) {
114         data_.resize(data_.size() - growSize);
115         return false;
116     }
117     writePointer_ += size;
118     SetLength(data_.size());
119     return true;
120 }
121 
122 } // namespace OHOS::Rosen