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 */
163079100878a2595be644d866e67c12a9de620fd5Martijn Coenen#define LOG_TAG "HidlSupport"
177211016cd72b5fa9f61fb8cf77b62faa207362e4Martijn Coenen
187211016cd72b5fa9f61fb8cf77b62faa207362e4Martijn Coenen#include <hidl/HidlSupport.h>
197211016cd72b5fa9f61fb8cf77b62faa207362e4Martijn Coenen
2020273f9b308ec7df36dff6aa9f27d02a8d01cf79Yifan Hong#include <unordered_map>
2120273f9b308ec7df36dff6aa9f27d02a8d01cf79Yifan Hong
227e1286cc930917c54894219ee8fb4b226b7e2879Zhuoyao Zhang#include <android-base/logging.h>
2320273f9b308ec7df36dff6aa9f27d02a8d01cf79Yifan Hong#include <android-base/parseint.h>
243079100878a2595be644d866e67c12a9de620fd5Martijn Coenen
257211016cd72b5fa9f61fb8cf77b62faa207362e4Martijn Coenennamespace android {
267211016cd72b5fa9f61fb8cf77b62faa207362e4Martijn Coenennamespace hardware {
277211016cd72b5fa9f61fb8cf77b62faa207362e4Martijn Coenen
2824332ef104a44b4bfb28c56ac2aa44584190e337Yifan Hongnamespace details {
2924332ef104a44b4bfb28c56ac2aa44584190e337Yifan Hongbool debuggable() {
3024332ef104a44b4bfb28c56ac2aa44584190e337Yifan Hong#ifdef LIBHIDL_TARGET_DEBUGGABLE
3124332ef104a44b4bfb28c56ac2aa44584190e337Yifan Hong    return true;
3224332ef104a44b4bfb28c56ac2aa44584190e337Yifan Hong#else
3324332ef104a44b4bfb28c56ac2aa44584190e337Yifan Hong    return false;
3424332ef104a44b4bfb28c56ac2aa44584190e337Yifan Hong#endif
3524332ef104a44b4bfb28c56ac2aa44584190e337Yifan Hong}
3624332ef104a44b4bfb28c56ac2aa44584190e337Yifan Hong}  // namespace details
3724332ef104a44b4bfb28c56ac2aa44584190e337Yifan Hong
3804b91c0fa5d2ccfe92816791064c30a25cbef0beMartijn Coenenhidl_handle::hidl_handle() {
3904b91c0fa5d2ccfe92816791064c30a25cbef0beMartijn Coenen    mHandle = nullptr;
4004b91c0fa5d2ccfe92816791064c30a25cbef0beMartijn Coenen    mOwnsHandle = false;
4104b91c0fa5d2ccfe92816791064c30a25cbef0beMartijn Coenen}
4204b91c0fa5d2ccfe92816791064c30a25cbef0beMartijn Coenen
4304b91c0fa5d2ccfe92816791064c30a25cbef0beMartijn Coenenhidl_handle::~hidl_handle() {
4404b91c0fa5d2ccfe92816791064c30a25cbef0beMartijn Coenen    freeHandle();
4504b91c0fa5d2ccfe92816791064c30a25cbef0beMartijn Coenen}
4604b91c0fa5d2ccfe92816791064c30a25cbef0beMartijn Coenen
4704b91c0fa5d2ccfe92816791064c30a25cbef0beMartijn Coenenhidl_handle::hidl_handle(const native_handle_t *handle) {
4804b91c0fa5d2ccfe92816791064c30a25cbef0beMartijn Coenen    mHandle = handle;
4904b91c0fa5d2ccfe92816791064c30a25cbef0beMartijn Coenen    mOwnsHandle = false;
5004b91c0fa5d2ccfe92816791064c30a25cbef0beMartijn Coenen}
5104b91c0fa5d2ccfe92816791064c30a25cbef0beMartijn Coenen
5204b91c0fa5d2ccfe92816791064c30a25cbef0beMartijn Coenen// copy constructor.
5304b91c0fa5d2ccfe92816791064c30a25cbef0beMartijn Coenenhidl_handle::hidl_handle(const hidl_handle &other) {
5404b91c0fa5d2ccfe92816791064c30a25cbef0beMartijn Coenen    mOwnsHandle = false;
5504b91c0fa5d2ccfe92816791064c30a25cbef0beMartijn Coenen    *this = other;
5604b91c0fa5d2ccfe92816791064c30a25cbef0beMartijn Coenen}
5704b91c0fa5d2ccfe92816791064c30a25cbef0beMartijn Coenen
5804b91c0fa5d2ccfe92816791064c30a25cbef0beMartijn Coenen// move constructor.
5904b91c0fa5d2ccfe92816791064c30a25cbef0beMartijn Coenenhidl_handle::hidl_handle(hidl_handle &&other) {
6004b91c0fa5d2ccfe92816791064c30a25cbef0beMartijn Coenen    mOwnsHandle = false;
6104b91c0fa5d2ccfe92816791064c30a25cbef0beMartijn Coenen    *this = std::move(other);
6204b91c0fa5d2ccfe92816791064c30a25cbef0beMartijn Coenen}
6304b91c0fa5d2ccfe92816791064c30a25cbef0beMartijn Coenen
6404b91c0fa5d2ccfe92816791064c30a25cbef0beMartijn Coenen// assignment operators
6504b91c0fa5d2ccfe92816791064c30a25cbef0beMartijn Coenenhidl_handle &hidl_handle::operator=(const hidl_handle &other) {
6604b91c0fa5d2ccfe92816791064c30a25cbef0beMartijn Coenen    if (this == &other) {
6704b91c0fa5d2ccfe92816791064c30a25cbef0beMartijn Coenen        return *this;
6804b91c0fa5d2ccfe92816791064c30a25cbef0beMartijn Coenen    }
6904b91c0fa5d2ccfe92816791064c30a25cbef0beMartijn Coenen    freeHandle();
7004b91c0fa5d2ccfe92816791064c30a25cbef0beMartijn Coenen    if (other.mHandle != nullptr) {
7104b91c0fa5d2ccfe92816791064c30a25cbef0beMartijn Coenen        mHandle = native_handle_clone(other.mHandle);
7204b91c0fa5d2ccfe92816791064c30a25cbef0beMartijn Coenen        if (mHandle == nullptr) {
7304b91c0fa5d2ccfe92816791064c30a25cbef0beMartijn Coenen            LOG(FATAL) << "Failed to clone native_handle in hidl_handle.";
7404b91c0fa5d2ccfe92816791064c30a25cbef0beMartijn Coenen        }
7504b91c0fa5d2ccfe92816791064c30a25cbef0beMartijn Coenen        mOwnsHandle = true;
7604b91c0fa5d2ccfe92816791064c30a25cbef0beMartijn Coenen    } else {
7704b91c0fa5d2ccfe92816791064c30a25cbef0beMartijn Coenen        mHandle = nullptr;
7804b91c0fa5d2ccfe92816791064c30a25cbef0beMartijn Coenen        mOwnsHandle = false;
7904b91c0fa5d2ccfe92816791064c30a25cbef0beMartijn Coenen    }
8004b91c0fa5d2ccfe92816791064c30a25cbef0beMartijn Coenen    return *this;
8104b91c0fa5d2ccfe92816791064c30a25cbef0beMartijn Coenen}
8204b91c0fa5d2ccfe92816791064c30a25cbef0beMartijn Coenen
8304b91c0fa5d2ccfe92816791064c30a25cbef0beMartijn Coenenhidl_handle &hidl_handle::operator=(const native_handle_t *native_handle) {
8404b91c0fa5d2ccfe92816791064c30a25cbef0beMartijn Coenen    freeHandle();
8504b91c0fa5d2ccfe92816791064c30a25cbef0beMartijn Coenen    mHandle = native_handle;
8604b91c0fa5d2ccfe92816791064c30a25cbef0beMartijn Coenen    mOwnsHandle = false;
8704b91c0fa5d2ccfe92816791064c30a25cbef0beMartijn Coenen    return *this;
8804b91c0fa5d2ccfe92816791064c30a25cbef0beMartijn Coenen}
8904b91c0fa5d2ccfe92816791064c30a25cbef0beMartijn Coenen
9004b91c0fa5d2ccfe92816791064c30a25cbef0beMartijn Coenenhidl_handle &hidl_handle::operator=(hidl_handle &&other) {
9104b91c0fa5d2ccfe92816791064c30a25cbef0beMartijn Coenen    if (this != &other) {
9204b91c0fa5d2ccfe92816791064c30a25cbef0beMartijn Coenen        freeHandle();
9304b91c0fa5d2ccfe92816791064c30a25cbef0beMartijn Coenen        mHandle = other.mHandle;
9404b91c0fa5d2ccfe92816791064c30a25cbef0beMartijn Coenen        mOwnsHandle = other.mOwnsHandle;
9504b91c0fa5d2ccfe92816791064c30a25cbef0beMartijn Coenen        other.mHandle = nullptr;
9604b91c0fa5d2ccfe92816791064c30a25cbef0beMartijn Coenen        other.mOwnsHandle = false;
9704b91c0fa5d2ccfe92816791064c30a25cbef0beMartijn Coenen    }
9804b91c0fa5d2ccfe92816791064c30a25cbef0beMartijn Coenen    return *this;
9904b91c0fa5d2ccfe92816791064c30a25cbef0beMartijn Coenen}
10004b91c0fa5d2ccfe92816791064c30a25cbef0beMartijn Coenen
10104b91c0fa5d2ccfe92816791064c30a25cbef0beMartijn Coenenvoid hidl_handle::setTo(native_handle_t* handle, bool shouldOwn) {
102ca37c0effc558ffe93a3c66f0b6b2480ec7410d4Scott Randolph    freeHandle();
10304b91c0fa5d2ccfe92816791064c30a25cbef0beMartijn Coenen    mHandle = handle;
10404b91c0fa5d2ccfe92816791064c30a25cbef0beMartijn Coenen    mOwnsHandle = shouldOwn;
10504b91c0fa5d2ccfe92816791064c30a25cbef0beMartijn Coenen}
10604b91c0fa5d2ccfe92816791064c30a25cbef0beMartijn Coenen
10704b91c0fa5d2ccfe92816791064c30a25cbef0beMartijn Coenenconst native_handle_t* hidl_handle::operator->() const {
10804b91c0fa5d2ccfe92816791064c30a25cbef0beMartijn Coenen    return mHandle;
10904b91c0fa5d2ccfe92816791064c30a25cbef0beMartijn Coenen}
11004b91c0fa5d2ccfe92816791064c30a25cbef0beMartijn Coenen
11104b91c0fa5d2ccfe92816791064c30a25cbef0beMartijn Coenen// implicit conversion to const native_handle_t*
11204b91c0fa5d2ccfe92816791064c30a25cbef0beMartijn Coenenhidl_handle::operator const native_handle_t *() const {
11304b91c0fa5d2ccfe92816791064c30a25cbef0beMartijn Coenen    return mHandle;
11404b91c0fa5d2ccfe92816791064c30a25cbef0beMartijn Coenen}
11504b91c0fa5d2ccfe92816791064c30a25cbef0beMartijn Coenen
11604b91c0fa5d2ccfe92816791064c30a25cbef0beMartijn Coenen// explicit conversion
11704b91c0fa5d2ccfe92816791064c30a25cbef0beMartijn Coenenconst native_handle_t *hidl_handle::getNativeHandle() const {
11804b91c0fa5d2ccfe92816791064c30a25cbef0beMartijn Coenen    return mHandle;
11904b91c0fa5d2ccfe92816791064c30a25cbef0beMartijn Coenen}
12004b91c0fa5d2ccfe92816791064c30a25cbef0beMartijn Coenen
12104b91c0fa5d2ccfe92816791064c30a25cbef0beMartijn Coenenvoid hidl_handle::freeHandle() {
12204b91c0fa5d2ccfe92816791064c30a25cbef0beMartijn Coenen    if (mOwnsHandle && mHandle != nullptr) {
12304b91c0fa5d2ccfe92816791064c30a25cbef0beMartijn Coenen        // This can only be true if:
12404b91c0fa5d2ccfe92816791064c30a25cbef0beMartijn Coenen        // 1. Somebody called setTo() with shouldOwn=true, so we know the handle
12504b91c0fa5d2ccfe92816791064c30a25cbef0beMartijn Coenen        //    wasn't const to begin with.
12604b91c0fa5d2ccfe92816791064c30a25cbef0beMartijn Coenen        // 2. Copy/assignment from another hidl_handle, in which case we have
12704b91c0fa5d2ccfe92816791064c30a25cbef0beMartijn Coenen        //    cloned the handle.
12804b91c0fa5d2ccfe92816791064c30a25cbef0beMartijn Coenen        // 3. Move constructor from another hidl_handle, in which case the original
12904b91c0fa5d2ccfe92816791064c30a25cbef0beMartijn Coenen        //    hidl_handle must have been non-const as well.
13004b91c0fa5d2ccfe92816791064c30a25cbef0beMartijn Coenen        native_handle_t *handle = const_cast<native_handle_t*>(
13104b91c0fa5d2ccfe92816791064c30a25cbef0beMartijn Coenen                static_cast<const native_handle_t*>(mHandle));
13204b91c0fa5d2ccfe92816791064c30a25cbef0beMartijn Coenen        native_handle_close(handle);
13304b91c0fa5d2ccfe92816791064c30a25cbef0beMartijn Coenen        native_handle_delete(handle);
13404b91c0fa5d2ccfe92816791064c30a25cbef0beMartijn Coenen        mHandle = nullptr;
13504b91c0fa5d2ccfe92816791064c30a25cbef0beMartijn Coenen    }
13604b91c0fa5d2ccfe92816791064c30a25cbef0beMartijn Coenen}
13704b91c0fa5d2ccfe92816791064c30a25cbef0beMartijn Coenen
1387211016cd72b5fa9f61fb8cf77b62faa207362e4Martijn Coenenstatic const char *const kEmptyString = "";
1397211016cd72b5fa9f61fb8cf77b62faa207362e4Martijn Coenen
1407211016cd72b5fa9f61fb8cf77b62faa207362e4Martijn Coenenhidl_string::hidl_string()
141602b85a846834d466e1f545eace06df87cf94a1eYifan Hong    : mBuffer(kEmptyString),
1427211016cd72b5fa9f61fb8cf77b62faa207362e4Martijn Coenen      mSize(0),
143602b85a846834d466e1f545eace06df87cf94a1eYifan Hong      mOwnsBuffer(false) {
1447211016cd72b5fa9f61fb8cf77b62faa207362e4Martijn Coenen}
1457211016cd72b5fa9f61fb8cf77b62faa207362e4Martijn Coenen
1467211016cd72b5fa9f61fb8cf77b62faa207362e4Martijn Coenenhidl_string::~hidl_string() {
1477211016cd72b5fa9f61fb8cf77b62faa207362e4Martijn Coenen    clear();
1487211016cd72b5fa9f61fb8cf77b62faa207362e4Martijn Coenen}
1497211016cd72b5fa9f61fb8cf77b62faa207362e4Martijn Coenen
150e03c08722dc4602cb501cf54692f1fce2a6f4758Steven Morelandhidl_string::hidl_string(const char *s) : hidl_string() {
151a21d84f11f066315bd1476368d511286d129cb8aSteven Moreland    if (s == nullptr) {
152a21d84f11f066315bd1476368d511286d129cb8aSteven Moreland        return;
153a21d84f11f066315bd1476368d511286d129cb8aSteven Moreland    }
154a21d84f11f066315bd1476368d511286d129cb8aSteven Moreland
155602b85a846834d466e1f545eace06df87cf94a1eYifan Hong    copyFrom(s, strlen(s));
156e03c08722dc4602cb501cf54692f1fce2a6f4758Steven Moreland}
157e03c08722dc4602cb501cf54692f1fce2a6f4758Steven Moreland
15853120f70b7d429c81fe47718182e829660ed5ef9Steven Morelandhidl_string::hidl_string(const char *s, size_t length) : hidl_string() {
15953120f70b7d429c81fe47718182e829660ed5ef9Steven Moreland    copyFrom(s, length);
16053120f70b7d429c81fe47718182e829660ed5ef9Steven Moreland}
16153120f70b7d429c81fe47718182e829660ed5ef9Steven Moreland
162602b85a846834d466e1f545eace06df87cf94a1eYifan Honghidl_string::hidl_string(const hidl_string &other): hidl_string() {
163602b85a846834d466e1f545eace06df87cf94a1eYifan Hong    copyFrom(other.c_str(), other.size());
164602b85a846834d466e1f545eace06df87cf94a1eYifan Hong}
165602b85a846834d466e1f545eace06df87cf94a1eYifan Hong
166602b85a846834d466e1f545eace06df87cf94a1eYifan Honghidl_string::hidl_string(const std::string &s) : hidl_string() {
167602b85a846834d466e1f545eace06df87cf94a1eYifan Hong    copyFrom(s.c_str(), s.size());
168602b85a846834d466e1f545eace06df87cf94a1eYifan Hong}
169602b85a846834d466e1f545eace06df87cf94a1eYifan Hong
170602b85a846834d466e1f545eace06df87cf94a1eYifan Honghidl_string::hidl_string(hidl_string &&other): hidl_string() {
171602b85a846834d466e1f545eace06df87cf94a1eYifan Hong    moveFrom(std::forward<hidl_string>(other));
172602b85a846834d466e1f545eace06df87cf94a1eYifan Hong}
173602b85a846834d466e1f545eace06df87cf94a1eYifan Hong
174602b85a846834d466e1f545eace06df87cf94a1eYifan Honghidl_string &hidl_string::operator=(hidl_string &&other) {
175602b85a846834d466e1f545eace06df87cf94a1eYifan Hong    if (this != &other) {
176602b85a846834d466e1f545eace06df87cf94a1eYifan Hong        clear();
177602b85a846834d466e1f545eace06df87cf94a1eYifan Hong        moveFrom(std::forward<hidl_string>(other));
178602b85a846834d466e1f545eace06df87cf94a1eYifan Hong    }
179602b85a846834d466e1f545eace06df87cf94a1eYifan Hong    return *this;
1807211016cd72b5fa9f61fb8cf77b62faa207362e4Martijn Coenen}
1817211016cd72b5fa9f61fb8cf77b62faa207362e4Martijn Coenen
1827211016cd72b5fa9f61fb8cf77b62faa207362e4Martijn Coenenhidl_string &hidl_string::operator=(const hidl_string &other) {
1837211016cd72b5fa9f61fb8cf77b62faa207362e4Martijn Coenen    if (this != &other) {
184602b85a846834d466e1f545eace06df87cf94a1eYifan Hong        clear();
185602b85a846834d466e1f545eace06df87cf94a1eYifan Hong        copyFrom(other.c_str(), other.size());
1867211016cd72b5fa9f61fb8cf77b62faa207362e4Martijn Coenen    }
1877211016cd72b5fa9f61fb8cf77b62faa207362e4Martijn Coenen
1887211016cd72b5fa9f61fb8cf77b62faa207362e4Martijn Coenen    return *this;
1897211016cd72b5fa9f61fb8cf77b62faa207362e4Martijn Coenen}
1907211016cd72b5fa9f61fb8cf77b62faa207362e4Martijn Coenen
1917211016cd72b5fa9f61fb8cf77b62faa207362e4Martijn Coenenhidl_string &hidl_string::operator=(const char *s) {
192602b85a846834d466e1f545eace06df87cf94a1eYifan Hong    clear();
193153f87a2fd2972f862a88976bb884a90a1f9fd7dSteven Moreland
194153f87a2fd2972f862a88976bb884a90a1f9fd7dSteven Moreland    if (s == nullptr) {
195153f87a2fd2972f862a88976bb884a90a1f9fd7dSteven Moreland        return *this;
196153f87a2fd2972f862a88976bb884a90a1f9fd7dSteven Moreland    }
197153f87a2fd2972f862a88976bb884a90a1f9fd7dSteven Moreland
198602b85a846834d466e1f545eace06df87cf94a1eYifan Hong    copyFrom(s, strlen(s));
199602b85a846834d466e1f545eace06df87cf94a1eYifan Hong    return *this;
2007211016cd72b5fa9f61fb8cf77b62faa207362e4Martijn Coenen}
2017211016cd72b5fa9f61fb8cf77b62faa207362e4Martijn Coenen
202602b85a846834d466e1f545eace06df87cf94a1eYifan Honghidl_string &hidl_string::operator=(const std::string &s) {
2037211016cd72b5fa9f61fb8cf77b62faa207362e4Martijn Coenen    clear();
204602b85a846834d466e1f545eace06df87cf94a1eYifan Hong    copyFrom(s.c_str(), s.size());
205602b85a846834d466e1f545eace06df87cf94a1eYifan Hong    return *this;
206602b85a846834d466e1f545eace06df87cf94a1eYifan Hong}
207602b85a846834d466e1f545eace06df87cf94a1eYifan Hong
208602b85a846834d466e1f545eace06df87cf94a1eYifan Honghidl_string::operator std::string() const {
209602b85a846834d466e1f545eace06df87cf94a1eYifan Hong    return std::string(mBuffer, mSize);
210602b85a846834d466e1f545eace06df87cf94a1eYifan Hong}
211602b85a846834d466e1f545eace06df87cf94a1eYifan Hong
2120c84ab4192f9b0b03b9840b85fc430afa17f55f1Scott Randolphstd::ostream& operator<<(std::ostream& os, const hidl_string& str) {
2130c84ab4192f9b0b03b9840b85fc430afa17f55f1Scott Randolph    os << str.c_str();
2140c84ab4192f9b0b03b9840b85fc430afa17f55f1Scott Randolph    return os;
215602b85a846834d466e1f545eace06df87cf94a1eYifan Hong}
216602b85a846834d466e1f545eace06df87cf94a1eYifan Hong
217602b85a846834d466e1f545eace06df87cf94a1eYifan Hongvoid hidl_string::copyFrom(const char *data, size_t size) {
218602b85a846834d466e1f545eace06df87cf94a1eYifan Hong    // assume my resources are freed.
2197211016cd72b5fa9f61fb8cf77b62faa207362e4Martijn Coenen
2204ca39a01032d2ac2658335bb5e0d5196779d767bMartijn Coenen    if (size > UINT32_MAX) {
2214ca39a01032d2ac2658335bb5e0d5196779d767bMartijn Coenen        LOG(FATAL) << "string size can't exceed 2^32 bytes.";
2224ca39a01032d2ac2658335bb5e0d5196779d767bMartijn Coenen    }
223602b85a846834d466e1f545eace06df87cf94a1eYifan Hong    char *buf = (char *)malloc(size + 1);
224602b85a846834d466e1f545eace06df87cf94a1eYifan Hong    memcpy(buf, data, size);
225602b85a846834d466e1f545eace06df87cf94a1eYifan Hong    buf[size] = '\0';
226602b85a846834d466e1f545eace06df87cf94a1eYifan Hong    mBuffer = buf;
2277211016cd72b5fa9f61fb8cf77b62faa207362e4Martijn Coenen
2284ca39a01032d2ac2658335bb5e0d5196779d767bMartijn Coenen    mSize = static_cast<uint32_t>(size);
2297211016cd72b5fa9f61fb8cf77b62faa207362e4Martijn Coenen    mOwnsBuffer = true;
230602b85a846834d466e1f545eace06df87cf94a1eYifan Hong}
2317211016cd72b5fa9f61fb8cf77b62faa207362e4Martijn Coenen
232602b85a846834d466e1f545eace06df87cf94a1eYifan Hongvoid hidl_string::moveFrom(hidl_string &&other) {
233602b85a846834d466e1f545eace06df87cf94a1eYifan Hong    // assume my resources are freed.
234602b85a846834d466e1f545eace06df87cf94a1eYifan Hong
2350126889103d84c2078896688017d61d612a12c4fHridya Valsaraju    mBuffer = std::move(other.mBuffer);
236602b85a846834d466e1f545eace06df87cf94a1eYifan Hong    mSize = other.mSize;
237602b85a846834d466e1f545eace06df87cf94a1eYifan Hong    mOwnsBuffer = other.mOwnsBuffer;
238602b85a846834d466e1f545eace06df87cf94a1eYifan Hong
239602b85a846834d466e1f545eace06df87cf94a1eYifan Hong    other.mOwnsBuffer = false;
2400126889103d84c2078896688017d61d612a12c4fHridya Valsaraju    other.clear();
2417211016cd72b5fa9f61fb8cf77b62faa207362e4Martijn Coenen}
2427211016cd72b5fa9f61fb8cf77b62faa207362e4Martijn Coenen
2437211016cd72b5fa9f61fb8cf77b62faa207362e4Martijn Coenenvoid hidl_string::clear() {
2447211016cd72b5fa9f61fb8cf77b62faa207362e4Martijn Coenen    if (mOwnsBuffer && (mBuffer != kEmptyString)) {
2454ca39a01032d2ac2658335bb5e0d5196779d767bMartijn Coenen        free(const_cast<char *>(static_cast<const char *>(mBuffer)));
2467211016cd72b5fa9f61fb8cf77b62faa207362e4Martijn Coenen    }
2477211016cd72b5fa9f61fb8cf77b62faa207362e4Martijn Coenen
248602b85a846834d466e1f545eace06df87cf94a1eYifan Hong    mBuffer = kEmptyString;
2497211016cd72b5fa9f61fb8cf77b62faa207362e4Martijn Coenen    mSize = 0;
250602b85a846834d466e1f545eace06df87cf94a1eYifan Hong    mOwnsBuffer = false;
2517211016cd72b5fa9f61fb8cf77b62faa207362e4Martijn Coenen}
2527211016cd72b5fa9f61fb8cf77b62faa207362e4Martijn Coenen
2537211016cd72b5fa9f61fb8cf77b62faa207362e4Martijn Coenenvoid hidl_string::setToExternal(const char *data, size_t size) {
2544ca39a01032d2ac2658335bb5e0d5196779d767bMartijn Coenen    if (size > UINT32_MAX) {
2554ca39a01032d2ac2658335bb5e0d5196779d767bMartijn Coenen        LOG(FATAL) << "string size can't exceed 2^32 bytes.";
2564ca39a01032d2ac2658335bb5e0d5196779d767bMartijn Coenen    }
2577211016cd72b5fa9f61fb8cf77b62faa207362e4Martijn Coenen    clear();
2587211016cd72b5fa9f61fb8cf77b62faa207362e4Martijn Coenen
259602b85a846834d466e1f545eace06df87cf94a1eYifan Hong    mBuffer = data;
2604ca39a01032d2ac2658335bb5e0d5196779d767bMartijn Coenen    mSize = static_cast<uint32_t>(size);
2617211016cd72b5fa9f61fb8cf77b62faa207362e4Martijn Coenen    mOwnsBuffer = false;
2627211016cd72b5fa9f61fb8cf77b62faa207362e4Martijn Coenen}
2637211016cd72b5fa9f61fb8cf77b62faa207362e4Martijn Coenen
2647211016cd72b5fa9f61fb8cf77b62faa207362e4Martijn Coenenconst char *hidl_string::c_str() const {
265602b85a846834d466e1f545eace06df87cf94a1eYifan Hong    return mBuffer;
2667211016cd72b5fa9f61fb8cf77b62faa207362e4Martijn Coenen}
2677211016cd72b5fa9f61fb8cf77b62faa207362e4Martijn Coenen
2687211016cd72b5fa9f61fb8cf77b62faa207362e4Martijn Coenensize_t hidl_string::size() const {
2697211016cd72b5fa9f61fb8cf77b62faa207362e4Martijn Coenen    return mSize;
2707211016cd72b5fa9f61fb8cf77b62faa207362e4Martijn Coenen}
2717211016cd72b5fa9f61fb8cf77b62faa207362e4Martijn Coenen
2727211016cd72b5fa9f61fb8cf77b62faa207362e4Martijn Coenenbool hidl_string::empty() const {
2737211016cd72b5fa9f61fb8cf77b62faa207362e4Martijn Coenen    return mSize == 0;
2747211016cd72b5fa9f61fb8cf77b62faa207362e4Martijn Coenen}
2757211016cd72b5fa9f61fb8cf77b62faa207362e4Martijn Coenen
2767211016cd72b5fa9f61fb8cf77b62faa207362e4Martijn Coenen}  // namespace hardware
2777211016cd72b5fa9f61fb8cf77b62faa207362e4Martijn Coenen}  // namespace android
2787211016cd72b5fa9f61fb8cf77b62faa207362e4Martijn Coenen
2797211016cd72b5fa9f61fb8cf77b62faa207362e4Martijn Coenen
280