// Copyright 2015 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #include "parcel.h" #include "common.h" namespace minibind { Parcel::Parcel() : data_position_(0), data_(), objects_() {} Parcel::~Parcel() {} void Parcel::WriteInterfaceToken(const std::string& str) { WriteUTF8(str); } void Parcel::WriteUTF8(const std::string& str) { data_.insert(data_.end(), str.begin(), str.end()); } void Parcel::WriteUInt32(uint32_t ui32) { data_.push_back((ui32 >> 24) & 0xff); data_.push_back((ui32 >> 16) & 0xff); data_.push_back((ui32 >> 8) & 0xff); data_.push_back((ui32 >> 0) & 0xff); } bool Parcel::ReadUInt32(uint32_t* ui32) { return ReadBytes(sizeof(*ui32), ui32); } bool Parcel::ReadBytes(size_t count, void* buffer) { // TODO: overflow ALOG("count=%d, data_position_=%d, datasize=%d", count, data_position_, DataSize()); if (count + data_position_ >= DataSize()) return false; memcpy(buffer, &data_[data_position_], count); data_position_ += count; return true; } binder_uintptr_t Parcel::DataPointer() const { return reinterpret_cast(&data_[0]); } size_t Parcel::DataSize() const { return data_.size(); } void Parcel::SetDataSize(size_t size) { // TODO: handle object lifetimes CHECK(size % 4 == 0); data_.resize(size); } void Parcel::SetDataPosition(size_t pos) { CHECK(pos < DataSize()); data_position_ = pos; } size_t Parcel::DataPosition() const { return data_position_; } void Parcel::Print() const { for (size_t i = 0; i < data_.size(); i += 4) { ALOG("%0x %0x %0x %0x", data_[i], data_[i+1], data_[i+2], data_[i+3]); } } } // namespace minibind