2 * Copyright (c) 2020 Samsung Electronics Co., Ltd. All rights reserved.
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
8 * http://www.apache.org/licenses/LICENSE-2.0
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
17 #include "include/bundle_cpp.h"
18 #include "parcel/common.hh"
19 #include "parcel/log_private.hh"
20 #include "parcel/parcel.hh"
21 #include "parcel/parcel_implementation.hh"
22 #include "parcel/parcelable.hh"
24 namespace tizen_base {
26 Parcel::Impl::Impl(Parcel* parent) : parent_(parent) {
29 Parcel::Impl::~Impl() = default;
31 void Parcel::Impl::Write(const void* buf, uint32_t size) {
32 auto* p = reinterpret_cast<const uint8_t*>(buf);
33 std::copy(p, p + size, std::back_inserter(data_));
36 int Parcel::Impl::Read(void* buf, uint32_t size) {
37 if (data_.size() == 0)
38 return TIZEN_ERROR_NO_DATA;
40 if (reader_ + size > data_.size())
41 return TIZEN_ERROR_ILLEGAL_BYTE_SEQ;
43 auto* p = reinterpret_cast<uint8_t*>(buf);
44 std::copy(&data_[reader_], &data_[reader_] + size, p);
46 set_last_result(TIZEN_ERROR_NONE);
47 return TIZEN_ERROR_NONE;
50 const std::vector<uint8_t>& Parcel::Impl::GetRaw() {
54 void Parcel::Impl::ResetReader() {
58 void Parcel::Impl::Clear() {
63 void Parcel::Impl::Reset(const void* buf, uint32_t size) {
68 bool Parcel::Impl::IsEmpty() {
69 return data_.size() == 0;
72 void Parcel::Impl::WriteSize(uint32_t size) {
73 auto* p = reinterpret_cast<uint8_t*>(&size);
74 std::copy(p, p + sizeof(size), std::back_inserter(data_));
78 void Parcel::Impl::Write(T d) {
79 auto* p = reinterpret_cast<uint8_t*>(&d);
80 std::copy(p, p + sizeof(T), std::back_inserter(data_));
83 int Parcel::Impl::ReadSize(uint32_t* size) {
84 if (data_.size() == 0)
85 return TIZEN_ERROR_NO_DATA;
87 if (reader_ + sizeof(uint32_t) > data_.size())
88 return TIZEN_ERROR_ILLEGAL_BYTE_SEQ;
90 auto* p = reinterpret_cast<uint8_t*>(size);
91 std::copy(&data_[reader_], &data_[reader_] + sizeof(uint32_t), p);
92 reader_ += sizeof(uint32_t);
93 return TIZEN_ERROR_NONE;
97 int Parcel::Impl::Read(T* d) {
98 uint32_t size = sizeof(T);
99 if (reader_ + size > data_.size())
100 return TIZEN_ERROR_ILLEGAL_BYTE_SEQ;
102 auto* p = reinterpret_cast<uint8_t*>(d);
103 std::copy(&data_[reader_], &data_[reader_] + size, p);
105 return TIZEN_ERROR_NONE;
108 Parcel::Parcel() : impl_(new Impl(this)) {
111 Parcel::Parcel(const void* buf, uint32_t size) : impl_(new Impl(this)) {
112 impl_->Write(buf, size);
115 Parcel::~Parcel() = default;
117 Parcel::Parcel(const Parcel& p)
118 : impl_(new Impl(this)) {
119 std::copy(p.impl_->data_.begin(), p.impl_->data_.end(),
120 std::back_inserter(impl_->data_));
121 impl_->reader_ = p.impl_->reader_;
124 Parcel& Parcel::operator = (const Parcel& p) {
126 std::copy(p.impl_->data_.begin(), p.impl_->data_.end(),
127 std::back_inserter(impl_->data_));
128 impl_->reader_ = p.impl_->reader_;
133 Parcel::Parcel(Parcel&& p) noexcept {
134 impl_ = std::move(p.impl_);
135 impl_->parent_ = this;
138 Parcel& Parcel::operator = (Parcel&& p) noexcept {
140 impl_->data_ = std::move(p.impl_->data_);
141 impl_->reader_ = p.impl_->reader_;
142 p.impl_->reader_ = 0;
147 bool Parcel::IsEmpty() const noexcept {
148 return impl_->IsEmpty();
151 void Parcel::Write(const void* buf, uint32_t size) {
152 impl_->Write(buf, size);
155 int Parcel::Read(void* buf, uint32_t size) {
156 return impl_->Read(buf, size);
159 void Parcel::WriteBool(bool val) {
160 impl_->Write<bool>(val);
163 void Parcel::WriteByte(char val) {
164 impl_->Write<char>(val);
167 void Parcel::WriteUInt16(uint16_t val) {
168 impl_->Write<uint16_t>(val);
171 void Parcel::WriteUInt32(uint32_t val) {
172 impl_->Write<uint32_t>(val);
175 void Parcel::WriteUInt64(uint64_t val) {
176 impl_->Write<uint64_t>(val);
179 void Parcel::WriteInt16(int16_t val) {
180 impl_->Write<int16_t>(val);
183 void Parcel::WriteInt32(int32_t val) {
184 impl_->Write<int32_t>(val);
187 void Parcel::WriteInt64(int64_t val) {
188 impl_->Write<int64_t>(val);
191 void Parcel::WriteFloat(float val) {
192 impl_->Write<float>(val);
195 void Parcel::WriteDouble(double val) {
196 impl_->Write<double>(val);
199 void Parcel::WriteString(const std::string& str) {
200 impl_->WriteSize(str.length() + 1);
201 impl_->Write(str.c_str(), str.length() + 1);
204 void Parcel::WriteCString(const char* str) {
205 impl_->WriteSize(strlen(str) + 1);
206 impl_->Write(str, strlen(str) + 1);
209 int Parcel::ReadBool(bool* val) {
210 return impl_->Read<bool>(val);
213 int Parcel::ReadByte(char* val) {
214 return impl_->Read<char>(val);
217 int Parcel::ReadUInt16(uint16_t* val) {
218 return impl_->Read<uint16_t>(val);
221 int Parcel::ReadUInt32(uint32_t* val) {
222 return impl_->Read<uint32_t>(val);
225 int Parcel::ReadUInt64(uint64_t* val) {
226 return impl_->Read<uint64_t>(val);
229 int Parcel::ReadInt16(int16_t* val) {
230 return impl_->Read<int16_t>(val);
233 int Parcel::ReadInt32(int32_t* val) {
234 return impl_->Read<int32_t>(val);
237 int Parcel::ReadInt64(int64_t* val) {
238 return impl_->Read<int64_t>(val);
241 int Parcel::ReadFloat(float* val) {
242 return impl_->Read<float>(val);
245 int Parcel::ReadDouble(double* val) {
246 return impl_->Read<double>(val);
249 std::string Parcel::ReadString() {
251 int ret = impl_->ReadSize(&len);
252 if (ret != TIZEN_ERROR_NONE) {
253 set_last_result(ret);
257 char* str = new (std::nothrow) char [len];
258 if (str == nullptr) {
259 set_last_result(TIZEN_ERROR_OUT_OF_MEMORY);
263 auto ptr = std::unique_ptr<char[]>(str);
264 ret = impl_->Read(str, len);
265 if (ret != TIZEN_ERROR_NONE) {
266 set_last_result(ret);
270 set_last_result(TIZEN_ERROR_NONE);
271 return std::string(str);
274 int Parcel::ReadCString(char** str) {
276 int ret = impl_->ReadSize(&len);
277 if (ret != TIZEN_ERROR_NONE)
280 char* val = static_cast<char*>(calloc(len, sizeof(char)));
282 return TIZEN_ERROR_OUT_OF_MEMORY;
284 ret = impl_->Read(val, len);
285 if (ret != TIZEN_ERROR_NONE) {
291 return TIZEN_ERROR_NONE;
294 const std::vector<uint8_t>& Parcel::GetRaw() {
295 return impl_->GetRaw();
298 void Parcel::ResetReader() {
299 impl_->ResetReader();
302 void Parcel::Clear() {
306 void Parcel::Reset(const void* buf, uint32_t size) {
307 impl_->Reset(buf, size);
310 void Parcel::WriteParcelable(const Parcelable& parcelable) {
311 parcelable.WriteToParcel(this);
314 int Parcel::ReadParcelable(Parcelable* parcelable) {
315 parcelable->ReadFromParcel(this);
316 return TIZEN_ERROR_NONE;
319 } // naemspace tizen_base