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