HidlSupport.cpp revision 7211016cd72b5fa9f61fb8cf77b62faa207362e4
17211016cd72b5fa9f61fb8cf77b62faa207362e4Martijn Coenen/* 27211016cd72b5fa9f61fb8cf77b62faa207362e4Martijn Coenen * Copyright (C) 2016 The Android Open Source Project 37211016cd72b5fa9f61fb8cf77b62faa207362e4Martijn Coenen * 47211016cd72b5fa9f61fb8cf77b62faa207362e4Martijn Coenen * Licensed under the Apache License, Version 2.0 (the "License"); 57211016cd72b5fa9f61fb8cf77b62faa207362e4Martijn Coenen * you may not use this file except in compliance with the License. 67211016cd72b5fa9f61fb8cf77b62faa207362e4Martijn Coenen * You may obtain a copy of the License at 77211016cd72b5fa9f61fb8cf77b62faa207362e4Martijn Coenen * 87211016cd72b5fa9f61fb8cf77b62faa207362e4Martijn Coenen * http://www.apache.org/licenses/LICENSE-2.0 97211016cd72b5fa9f61fb8cf77b62faa207362e4Martijn Coenen * 107211016cd72b5fa9f61fb8cf77b62faa207362e4Martijn Coenen * Unless required by applicable law or agreed to in writing, software 117211016cd72b5fa9f61fb8cf77b62faa207362e4Martijn Coenen * distributed under the License is distributed on an "AS IS" BASIS, 127211016cd72b5fa9f61fb8cf77b62faa207362e4Martijn Coenen * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 137211016cd72b5fa9f61fb8cf77b62faa207362e4Martijn Coenen * See the License for the specific language governing permissions and 147211016cd72b5fa9f61fb8cf77b62faa207362e4Martijn Coenen * limitations under the License. 157211016cd72b5fa9f61fb8cf77b62faa207362e4Martijn Coenen */ 167211016cd72b5fa9f61fb8cf77b62faa207362e4Martijn Coenen 177211016cd72b5fa9f61fb8cf77b62faa207362e4Martijn Coenen#include <hidl/HidlSupport.h> 187211016cd72b5fa9f61fb8cf77b62faa207362e4Martijn Coenen 197211016cd72b5fa9f61fb8cf77b62faa207362e4Martijn Coenennamespace android { 207211016cd72b5fa9f61fb8cf77b62faa207362e4Martijn Coenennamespace hardware { 217211016cd72b5fa9f61fb8cf77b62faa207362e4Martijn Coenen 227211016cd72b5fa9f61fb8cf77b62faa207362e4Martijn Coenenstatic const char *const kEmptyString = ""; 237211016cd72b5fa9f61fb8cf77b62faa207362e4Martijn Coenen 247211016cd72b5fa9f61fb8cf77b62faa207362e4Martijn Coenenhidl_string::hidl_string() 257211016cd72b5fa9f61fb8cf77b62faa207362e4Martijn Coenen : mBuffer(const_cast<char *>(kEmptyString)), 267211016cd72b5fa9f61fb8cf77b62faa207362e4Martijn Coenen mSize(0), 277211016cd72b5fa9f61fb8cf77b62faa207362e4Martijn Coenen mOwnsBuffer(true) { 287211016cd72b5fa9f61fb8cf77b62faa207362e4Martijn Coenen} 297211016cd72b5fa9f61fb8cf77b62faa207362e4Martijn Coenen 307211016cd72b5fa9f61fb8cf77b62faa207362e4Martijn Coenenhidl_string::~hidl_string() { 317211016cd72b5fa9f61fb8cf77b62faa207362e4Martijn Coenen clear(); 327211016cd72b5fa9f61fb8cf77b62faa207362e4Martijn Coenen} 337211016cd72b5fa9f61fb8cf77b62faa207362e4Martijn Coenen 347211016cd72b5fa9f61fb8cf77b62faa207362e4Martijn Coenenhidl_string::hidl_string(const hidl_string &other) 357211016cd72b5fa9f61fb8cf77b62faa207362e4Martijn Coenen : mBuffer(const_cast<char *>(kEmptyString)), 367211016cd72b5fa9f61fb8cf77b62faa207362e4Martijn Coenen mSize(0), 377211016cd72b5fa9f61fb8cf77b62faa207362e4Martijn Coenen mOwnsBuffer(true) { 387211016cd72b5fa9f61fb8cf77b62faa207362e4Martijn Coenen setTo(other.c_str(), other.size()); 397211016cd72b5fa9f61fb8cf77b62faa207362e4Martijn Coenen} 407211016cd72b5fa9f61fb8cf77b62faa207362e4Martijn Coenen 417211016cd72b5fa9f61fb8cf77b62faa207362e4Martijn Coenenhidl_string &hidl_string::operator=(const hidl_string &other) { 427211016cd72b5fa9f61fb8cf77b62faa207362e4Martijn Coenen if (this != &other) { 437211016cd72b5fa9f61fb8cf77b62faa207362e4Martijn Coenen setTo(other.c_str(), other.size()); 447211016cd72b5fa9f61fb8cf77b62faa207362e4Martijn Coenen } 457211016cd72b5fa9f61fb8cf77b62faa207362e4Martijn Coenen 467211016cd72b5fa9f61fb8cf77b62faa207362e4Martijn Coenen return *this; 477211016cd72b5fa9f61fb8cf77b62faa207362e4Martijn Coenen} 487211016cd72b5fa9f61fb8cf77b62faa207362e4Martijn Coenen 497211016cd72b5fa9f61fb8cf77b62faa207362e4Martijn Coenenhidl_string &hidl_string::operator=(const char *s) { 507211016cd72b5fa9f61fb8cf77b62faa207362e4Martijn Coenen return setTo(s, strlen(s)); 517211016cd72b5fa9f61fb8cf77b62faa207362e4Martijn Coenen} 527211016cd72b5fa9f61fb8cf77b62faa207362e4Martijn Coenen 537211016cd72b5fa9f61fb8cf77b62faa207362e4Martijn Coenenhidl_string &hidl_string::setTo(const char *data, size_t size) { 547211016cd72b5fa9f61fb8cf77b62faa207362e4Martijn Coenen clear(); 557211016cd72b5fa9f61fb8cf77b62faa207362e4Martijn Coenen 567211016cd72b5fa9f61fb8cf77b62faa207362e4Martijn Coenen mBuffer = (char *)malloc(size + 1); 577211016cd72b5fa9f61fb8cf77b62faa207362e4Martijn Coenen memcpy(mBuffer, data, size); 587211016cd72b5fa9f61fb8cf77b62faa207362e4Martijn Coenen mBuffer[size] = '\0'; 597211016cd72b5fa9f61fb8cf77b62faa207362e4Martijn Coenen 607211016cd72b5fa9f61fb8cf77b62faa207362e4Martijn Coenen mSize = size; 617211016cd72b5fa9f61fb8cf77b62faa207362e4Martijn Coenen mOwnsBuffer = true; 627211016cd72b5fa9f61fb8cf77b62faa207362e4Martijn Coenen 637211016cd72b5fa9f61fb8cf77b62faa207362e4Martijn Coenen return *this; 647211016cd72b5fa9f61fb8cf77b62faa207362e4Martijn Coenen} 657211016cd72b5fa9f61fb8cf77b62faa207362e4Martijn Coenen 667211016cd72b5fa9f61fb8cf77b62faa207362e4Martijn Coenenvoid hidl_string::clear() { 677211016cd72b5fa9f61fb8cf77b62faa207362e4Martijn Coenen if (mOwnsBuffer && (mBuffer != kEmptyString)) { 687211016cd72b5fa9f61fb8cf77b62faa207362e4Martijn Coenen free(mBuffer); 697211016cd72b5fa9f61fb8cf77b62faa207362e4Martijn Coenen } 707211016cd72b5fa9f61fb8cf77b62faa207362e4Martijn Coenen 717211016cd72b5fa9f61fb8cf77b62faa207362e4Martijn Coenen mBuffer = const_cast<char *>(kEmptyString); 727211016cd72b5fa9f61fb8cf77b62faa207362e4Martijn Coenen mSize = 0; 737211016cd72b5fa9f61fb8cf77b62faa207362e4Martijn Coenen mOwnsBuffer = true; 747211016cd72b5fa9f61fb8cf77b62faa207362e4Martijn Coenen} 757211016cd72b5fa9f61fb8cf77b62faa207362e4Martijn Coenen 767211016cd72b5fa9f61fb8cf77b62faa207362e4Martijn Coenenvoid hidl_string::setToExternal(const char *data, size_t size) { 777211016cd72b5fa9f61fb8cf77b62faa207362e4Martijn Coenen clear(); 787211016cd72b5fa9f61fb8cf77b62faa207362e4Martijn Coenen 797211016cd72b5fa9f61fb8cf77b62faa207362e4Martijn Coenen mBuffer = const_cast<char *>(data); 807211016cd72b5fa9f61fb8cf77b62faa207362e4Martijn Coenen mSize = size; 817211016cd72b5fa9f61fb8cf77b62faa207362e4Martijn Coenen mOwnsBuffer = false; 827211016cd72b5fa9f61fb8cf77b62faa207362e4Martijn Coenen} 837211016cd72b5fa9f61fb8cf77b62faa207362e4Martijn Coenen 847211016cd72b5fa9f61fb8cf77b62faa207362e4Martijn Coenenconst char *hidl_string::c_str() const { 857211016cd72b5fa9f61fb8cf77b62faa207362e4Martijn Coenen return mBuffer ? mBuffer : ""; 867211016cd72b5fa9f61fb8cf77b62faa207362e4Martijn Coenen} 877211016cd72b5fa9f61fb8cf77b62faa207362e4Martijn Coenen 887211016cd72b5fa9f61fb8cf77b62faa207362e4Martijn Coenensize_t hidl_string::size() const { 897211016cd72b5fa9f61fb8cf77b62faa207362e4Martijn Coenen return mSize; 907211016cd72b5fa9f61fb8cf77b62faa207362e4Martijn Coenen} 917211016cd72b5fa9f61fb8cf77b62faa207362e4Martijn Coenen 927211016cd72b5fa9f61fb8cf77b62faa207362e4Martijn Coenenbool hidl_string::empty() const { 937211016cd72b5fa9f61fb8cf77b62faa207362e4Martijn Coenen return mSize == 0; 947211016cd72b5fa9f61fb8cf77b62faa207362e4Martijn Coenen} 957211016cd72b5fa9f61fb8cf77b62faa207362e4Martijn Coenen 967211016cd72b5fa9f61fb8cf77b62faa207362e4Martijn Coenenstatus_t hidl_string::readEmbeddedFromParcel( 977211016cd72b5fa9f61fb8cf77b62faa207362e4Martijn Coenen const Parcel &parcel, size_t parentHandle, size_t parentOffset) { 987211016cd72b5fa9f61fb8cf77b62faa207362e4Martijn Coenen const void *ptr = parcel.readEmbeddedBuffer( 997211016cd72b5fa9f61fb8cf77b62faa207362e4Martijn Coenen nullptr /* buffer_handle */, 1007211016cd72b5fa9f61fb8cf77b62faa207362e4Martijn Coenen parentHandle, 1017211016cd72b5fa9f61fb8cf77b62faa207362e4Martijn Coenen parentOffset + offsetof(hidl_string, mBuffer)); 1027211016cd72b5fa9f61fb8cf77b62faa207362e4Martijn Coenen 1037211016cd72b5fa9f61fb8cf77b62faa207362e4Martijn Coenen return ptr != NULL ? OK : UNKNOWN_ERROR; 1047211016cd72b5fa9f61fb8cf77b62faa207362e4Martijn Coenen} 1057211016cd72b5fa9f61fb8cf77b62faa207362e4Martijn Coenen 1067211016cd72b5fa9f61fb8cf77b62faa207362e4Martijn Coenenstatus_t hidl_string::writeEmbeddedToParcel( 1077211016cd72b5fa9f61fb8cf77b62faa207362e4Martijn Coenen Parcel *parcel, size_t parentHandle, size_t parentOffset) const { 1087211016cd72b5fa9f61fb8cf77b62faa207362e4Martijn Coenen return parcel->writeEmbeddedBuffer( 1097211016cd72b5fa9f61fb8cf77b62faa207362e4Martijn Coenen mBuffer, 1107211016cd72b5fa9f61fb8cf77b62faa207362e4Martijn Coenen mSize + 1, 1117211016cd72b5fa9f61fb8cf77b62faa207362e4Martijn Coenen nullptr /* handle */, 1127211016cd72b5fa9f61fb8cf77b62faa207362e4Martijn Coenen parentHandle, 1137211016cd72b5fa9f61fb8cf77b62faa207362e4Martijn Coenen parentOffset + offsetof(hidl_string, mBuffer)); 1147211016cd72b5fa9f61fb8cf77b62faa207362e4Martijn Coenen} 1157211016cd72b5fa9f61fb8cf77b62faa207362e4Martijn Coenen 1167211016cd72b5fa9f61fb8cf77b62faa207362e4Martijn Coenen} // namespace hardware 1177211016cd72b5fa9f61fb8cf77b62faa207362e4Martijn Coenen} // namespace android 1187211016cd72b5fa9f61fb8cf77b62faa207362e4Martijn Coenen 1197211016cd72b5fa9f61fb8cf77b62faa207362e4Martijn Coenen 120