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