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