blob: 5a07554b7d2677f33ec6039616816063fc7f1f1d [file] [log] [blame]
Martijn Coenen72110162016-08-19 14:28:25 +02001/*
2 * Copyright (C) 2016 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
Martijn Coenen30791002016-12-01 15:40:46 +010016#define LOG_TAG "HidlSupport"
Martijn Coenen72110162016-08-19 14:28:25 +020017
18#include <hidl/HidlSupport.h>
19
Yifan Hong20273f92017-01-30 14:13:19 -080020#include <unordered_map>
21
Zhuoyao Zhang7e1286c2016-09-12 17:28:48 -070022#include <android-base/logging.h>
Yifan Hong20273f92017-01-30 14:13:19 -080023#include <android-base/parseint.h>
24#include <hidl-util/FQName.h>
Yifan Hong64a41d52017-02-27 18:52:44 -080025#include <vintf/VintfObject.h>
Yifan Hong44c0e572017-01-20 15:41:52 -080026#include <vintf/parse_string.h>
Martijn Coenen30791002016-12-01 15:40:46 +010027
Martijn Coenen72110162016-08-19 14:28:25 +020028namespace android {
29namespace hardware {
30
Yifan Hong64a41d52017-02-27 18:52:44 -080031vintf::Transport getTransportFromManifest(
Yifan Hong37b36202017-02-28 16:04:22 -080032 const FQName &fqName, const std::string &instanceName,
Yifan Hong64a41d52017-02-27 18:52:44 -080033 const vintf::HalManifest *vm) {
Yifan Hong44c0e572017-01-20 15:41:52 -080034 if (vm == nullptr) {
Yifan Hong20273f92017-01-30 14:13:19 -080035 return vintf::Transport::EMPTY;
36 }
Yifan Hong1152a2a2017-03-13 15:26:01 -070037 return vm->getTransport(fqName.package(),
Yifan Hong37b36202017-02-28 16:04:22 -080038 vintf::Version{fqName.getPackageMajorVersion(), fqName.getPackageMinorVersion()},
39 fqName.name(), instanceName);
Yifan Hong44c0e572017-01-20 15:41:52 -080040}
41
Yifan Hong37b36202017-02-28 16:04:22 -080042vintf::Transport getTransport(const std::string &interfaceName, const std::string &instanceName) {
43 FQName fqName(interfaceName);
Yifan Hong20273f92017-01-30 14:13:19 -080044 if (!fqName.isValid()) {
Yifan Hong37b36202017-02-28 16:04:22 -080045 LOG(ERROR) << "getTransport: " << interfaceName << " is not a valid fully-qualified name.";
Steven Moreland6d8960d2017-02-23 13:19:32 -080046 return vintf::Transport::EMPTY;
47 }
48 if (!fqName.hasVersion()) {
49 LOG(ERROR) << "getTransport: " << fqName.string()
50 << " does not specify a version. Using default transport.";
Yifan Hong20273f92017-01-30 14:13:19 -080051 return vintf::Transport::EMPTY;
52 }
Yifan Hong37b36202017-02-28 16:04:22 -080053 if (fqName.name().empty()) {
54 LOG(ERROR) << "getTransport: " << fqName.string()
55 << " does not specify an interface name. Using default transport.";
56 return vintf::Transport::EMPTY;
57 }
Yifan Hong1152a2a2017-03-13 15:26:01 -070058
59 vintf::Transport tr = getTransportFromManifest(fqName, instanceName,
60 vintf::VintfObject::GetFrameworkHalManifest());
61 if (tr != vintf::Transport::EMPTY) {
62 return tr;
Yifan Hong20273f92017-01-30 14:13:19 -080063 }
Yifan Hong1152a2a2017-03-13 15:26:01 -070064 tr = getTransportFromManifest(fqName, instanceName,
Yifan Hong64a41d52017-02-27 18:52:44 -080065 vintf::VintfObject::GetDeviceHalManifest());
Yifan Hong1152a2a2017-03-13 15:26:01 -070066 if (tr != vintf::Transport::EMPTY) {
67 return tr;
68 }
69
70 LOG(WARNING) << "getTransportFromManifest: Cannot find entry "
71 << fqName.string()
72 << " in either framework or device manifest, using default transport.";
73 return vintf::Transport::EMPTY;
Yifan Hong20273f92017-01-30 14:13:19 -080074}
75
Yifan Hong24332ef2017-03-07 16:22:19 -080076namespace details {
77bool debuggable() {
78#ifdef LIBHIDL_TARGET_DEBUGGABLE
79 return true;
80#else
81 return false;
82#endif
83}
84} // namespace details
85
Martijn Coenen04b91c02017-01-19 14:14:21 +010086hidl_handle::hidl_handle() {
87 mHandle = nullptr;
88 mOwnsHandle = false;
89}
90
91hidl_handle::~hidl_handle() {
92 freeHandle();
93}
94
95hidl_handle::hidl_handle(const native_handle_t *handle) {
96 mHandle = handle;
97 mOwnsHandle = false;
98}
99
100// copy constructor.
101hidl_handle::hidl_handle(const hidl_handle &other) {
102 mOwnsHandle = false;
103 *this = other;
104}
105
106// move constructor.
107hidl_handle::hidl_handle(hidl_handle &&other) {
108 mOwnsHandle = false;
109 *this = std::move(other);
110}
111
112// assignment operators
113hidl_handle &hidl_handle::operator=(const hidl_handle &other) {
114 if (this == &other) {
115 return *this;
116 }
117 freeHandle();
118 if (other.mHandle != nullptr) {
119 mHandle = native_handle_clone(other.mHandle);
120 if (mHandle == nullptr) {
121 LOG(FATAL) << "Failed to clone native_handle in hidl_handle.";
122 }
123 mOwnsHandle = true;
124 } else {
125 mHandle = nullptr;
126 mOwnsHandle = false;
127 }
128 return *this;
129}
130
131hidl_handle &hidl_handle::operator=(const native_handle_t *native_handle) {
132 freeHandle();
133 mHandle = native_handle;
134 mOwnsHandle = false;
135 return *this;
136}
137
138hidl_handle &hidl_handle::operator=(hidl_handle &&other) {
139 if (this != &other) {
140 freeHandle();
141 mHandle = other.mHandle;
142 mOwnsHandle = other.mOwnsHandle;
143 other.mHandle = nullptr;
144 other.mOwnsHandle = false;
145 }
146 return *this;
147}
148
149void hidl_handle::setTo(native_handle_t* handle, bool shouldOwn) {
Scott Randolphca37c0e2017-02-15 16:38:46 -0800150 freeHandle();
Martijn Coenen04b91c02017-01-19 14:14:21 +0100151 mHandle = handle;
152 mOwnsHandle = shouldOwn;
153}
154
155const native_handle_t* hidl_handle::operator->() const {
156 return mHandle;
157}
158
159// implicit conversion to const native_handle_t*
160hidl_handle::operator const native_handle_t *() const {
161 return mHandle;
162}
163
164// explicit conversion
165const native_handle_t *hidl_handle::getNativeHandle() const {
166 return mHandle;
167}
168
169void hidl_handle::freeHandle() {
170 if (mOwnsHandle && mHandle != nullptr) {
171 // This can only be true if:
172 // 1. Somebody called setTo() with shouldOwn=true, so we know the handle
173 // wasn't const to begin with.
174 // 2. Copy/assignment from another hidl_handle, in which case we have
175 // cloned the handle.
176 // 3. Move constructor from another hidl_handle, in which case the original
177 // hidl_handle must have been non-const as well.
178 native_handle_t *handle = const_cast<native_handle_t*>(
179 static_cast<const native_handle_t*>(mHandle));
180 native_handle_close(handle);
181 native_handle_delete(handle);
182 mHandle = nullptr;
183 }
184}
185
Martijn Coenen72110162016-08-19 14:28:25 +0200186static const char *const kEmptyString = "";
187
188hidl_string::hidl_string()
Yifan Hong602b85a2016-10-24 13:40:01 -0700189 : mBuffer(kEmptyString),
Martijn Coenen72110162016-08-19 14:28:25 +0200190 mSize(0),
Yifan Hong602b85a2016-10-24 13:40:01 -0700191 mOwnsBuffer(false) {
Martijn Coenen72110162016-08-19 14:28:25 +0200192}
193
194hidl_string::~hidl_string() {
195 clear();
196}
197
Steven Morelande03c0872016-10-24 10:43:50 -0700198hidl_string::hidl_string(const char *s) : hidl_string() {
Steven Morelanda21d84f2017-02-16 09:23:45 -0800199 if (s == nullptr) {
200 return;
201 }
202
Yifan Hong602b85a2016-10-24 13:40:01 -0700203 copyFrom(s, strlen(s));
Steven Morelande03c0872016-10-24 10:43:50 -0700204}
205
Steven Moreland53120f72017-01-12 09:39:26 -0800206hidl_string::hidl_string(const char *s, size_t length) : hidl_string() {
207 copyFrom(s, length);
208}
209
Yifan Hong602b85a2016-10-24 13:40:01 -0700210hidl_string::hidl_string(const hidl_string &other): hidl_string() {
211 copyFrom(other.c_str(), other.size());
212}
213
214hidl_string::hidl_string(const std::string &s) : hidl_string() {
215 copyFrom(s.c_str(), s.size());
216}
217
218hidl_string::hidl_string(hidl_string &&other): hidl_string() {
219 moveFrom(std::forward<hidl_string>(other));
220}
221
222hidl_string &hidl_string::operator=(hidl_string &&other) {
223 if (this != &other) {
224 clear();
225 moveFrom(std::forward<hidl_string>(other));
226 }
227 return *this;
Martijn Coenen72110162016-08-19 14:28:25 +0200228}
229
230hidl_string &hidl_string::operator=(const hidl_string &other) {
231 if (this != &other) {
Yifan Hong602b85a2016-10-24 13:40:01 -0700232 clear();
233 copyFrom(other.c_str(), other.size());
Martijn Coenen72110162016-08-19 14:28:25 +0200234 }
235
236 return *this;
237}
238
239hidl_string &hidl_string::operator=(const char *s) {
Yifan Hong602b85a2016-10-24 13:40:01 -0700240 clear();
Steven Moreland153f87a2017-02-28 09:42:26 -0800241
242 if (s == nullptr) {
243 return *this;
244 }
245
Yifan Hong602b85a2016-10-24 13:40:01 -0700246 copyFrom(s, strlen(s));
247 return *this;
Martijn Coenen72110162016-08-19 14:28:25 +0200248}
249
Yifan Hong602b85a2016-10-24 13:40:01 -0700250hidl_string &hidl_string::operator=(const std::string &s) {
Martijn Coenen72110162016-08-19 14:28:25 +0200251 clear();
Yifan Hong602b85a2016-10-24 13:40:01 -0700252 copyFrom(s.c_str(), s.size());
253 return *this;
254}
Martijn Coenen72110162016-08-19 14:28:25 +0200255
Yifan Hong602b85a2016-10-24 13:40:01 -0700256hidl_string::operator std::string() const {
257 return std::string(mBuffer, mSize);
258}
259
Scott Randolph0c84ab42017-04-03 14:07:14 -0700260std::ostream& operator<<(std::ostream& os, const hidl_string& str) {
261 os << str.c_str();
262 return os;
Yifan Hong602b85a2016-10-24 13:40:01 -0700263}
264
265void hidl_string::copyFrom(const char *data, size_t size) {
266 // assume my resources are freed.
267
Martijn Coenen4ca39a02016-11-11 15:58:51 +0100268 if (size > UINT32_MAX) {
269 LOG(FATAL) << "string size can't exceed 2^32 bytes.";
270 }
Yifan Hong602b85a2016-10-24 13:40:01 -0700271 char *buf = (char *)malloc(size + 1);
272 memcpy(buf, data, size);
273 buf[size] = '\0';
274 mBuffer = buf;
Martijn Coenen72110162016-08-19 14:28:25 +0200275
Martijn Coenen4ca39a02016-11-11 15:58:51 +0100276 mSize = static_cast<uint32_t>(size);
Martijn Coenen72110162016-08-19 14:28:25 +0200277 mOwnsBuffer = true;
Yifan Hong602b85a2016-10-24 13:40:01 -0700278}
Martijn Coenen72110162016-08-19 14:28:25 +0200279
Yifan Hong602b85a2016-10-24 13:40:01 -0700280void hidl_string::moveFrom(hidl_string &&other) {
281 // assume my resources are freed.
282
Hridya Valsaraju01268892017-02-27 08:48:38 -0800283 mBuffer = std::move(other.mBuffer);
Yifan Hong602b85a2016-10-24 13:40:01 -0700284 mSize = other.mSize;
285 mOwnsBuffer = other.mOwnsBuffer;
286
287 other.mOwnsBuffer = false;
Hridya Valsaraju01268892017-02-27 08:48:38 -0800288 other.clear();
Martijn Coenen72110162016-08-19 14:28:25 +0200289}
290
291void hidl_string::clear() {
292 if (mOwnsBuffer && (mBuffer != kEmptyString)) {
Martijn Coenen4ca39a02016-11-11 15:58:51 +0100293 free(const_cast<char *>(static_cast<const char *>(mBuffer)));
Martijn Coenen72110162016-08-19 14:28:25 +0200294 }
295
Yifan Hong602b85a2016-10-24 13:40:01 -0700296 mBuffer = kEmptyString;
Martijn Coenen72110162016-08-19 14:28:25 +0200297 mSize = 0;
Yifan Hong602b85a2016-10-24 13:40:01 -0700298 mOwnsBuffer = false;
Martijn Coenen72110162016-08-19 14:28:25 +0200299}
300
301void hidl_string::setToExternal(const char *data, size_t size) {
Martijn Coenen4ca39a02016-11-11 15:58:51 +0100302 if (size > UINT32_MAX) {
303 LOG(FATAL) << "string size can't exceed 2^32 bytes.";
304 }
Martijn Coenen72110162016-08-19 14:28:25 +0200305 clear();
306
Yifan Hong602b85a2016-10-24 13:40:01 -0700307 mBuffer = data;
Martijn Coenen4ca39a02016-11-11 15:58:51 +0100308 mSize = static_cast<uint32_t>(size);
Martijn Coenen72110162016-08-19 14:28:25 +0200309 mOwnsBuffer = false;
310}
311
312const char *hidl_string::c_str() const {
Yifan Hong602b85a2016-10-24 13:40:01 -0700313 return mBuffer;
Martijn Coenen72110162016-08-19 14:28:25 +0200314}
315
316size_t hidl_string::size() const {
317 return mSize;
318}
319
320bool hidl_string::empty() const {
321 return mSize == 0;
322}
323
Martijn Coenen72110162016-08-19 14:28:25 +0200324} // namespace hardware
325} // namespace android
326
327