Merge "libhidl: remove libvintf dependency"
diff --git a/base/include/hidl/Status.h b/base/include/hidl/Status.h
index a4a83f4..a04cf77 100644
--- a/base/include/hidl/Status.h
+++ b/base/include/hidl/Status.h
@@ -21,6 +21,7 @@
#include <sstream>
#include <android-base/macros.h>
+#include <hidl/HidlInternal.h>
#include <utils/Errors.h>
#include <utils/StrongPointer.h>
@@ -129,11 +130,16 @@
// For gtest output logging
std::ostream& operator<< (std::ostream& stream, const Status& s);
+template<typename T> class Return;
+
namespace details {
class return_status {
private:
Status mStatus {};
mutable bool mCheckedStatus = false;
+
+ template <typename T, typename U>
+ friend Return<U> StatusOf(const Return<T> &other);
protected:
void assertOk() const;
public:
@@ -155,6 +161,12 @@
return mStatus.isOk();
}
+ // Check if underlying error is DEAD_OBJECT.
+ // Does not set mCheckedStatus.
+ bool isDeadObject() const {
+ return mStatus.transactionError() == DEAD_OBJECT;
+ }
+
// For debugging purposes only
std::string description() const {
// Doesn't consider checked.
@@ -229,6 +241,18 @@
return Return<void>();
}
+namespace details {
+// Create a Return<U> from the Status of Return<T>. The provided
+// Return<T> must have an error status and have it checked.
+template <typename T, typename U>
+Return<U> StatusOf(const Return<T> &other) {
+ if (other.mStatus.isOk() || !other.mCheckedStatus) {
+ details::logAlwaysFatal("cannot call statusOf on an OK Status or an unchecked status");
+ }
+ return Return<U>{other.mStatus};
+}
+} // namespace details
+
} // namespace hardware
} // namespace android
diff --git a/manifest.xml b/manifest.xml
index 3fe38e7..c258bce 100644
--- a/manifest.xml
+++ b/manifest.xml
@@ -1,4 +1,4 @@
-<manifest version="1.0">
+<manifest version="1.0" type="framework">
<hal>
<name>android.hidl.manager</name>
<transport>hwbinder</transport>
diff --git a/transport/include/hidl/HidlTransportSupport.h b/transport/include/hidl/HidlTransportSupport.h
index 8a2a70a..3cac1e9 100644
--- a/transport/include/hidl/HidlTransportSupport.h
+++ b/transport/include/hidl/HidlTransportSupport.h
@@ -50,16 +50,28 @@
namespace details {
// cast the interface IParent to IChild.
-// Return nullptr if parent is null or any failure.
+// Return nonnull if cast successful.
+// Return nullptr if:
+// 1. parent is null
+// 2. cast failed because IChild is not a child type of IParent.
+// 3. !emitError, calling into parent fails.
+// Return an error Return object if:
+// 1. emitError, calling into parent fails.
template<typename IChild, typename IParent, typename BpChild, typename BpParent>
-sp<IChild> castInterface(sp<IParent> parent, const char *childIndicator) {
+Return<sp<IChild>> castInterface(sp<IParent> parent, const char *childIndicator, bool emitError) {
if (parent.get() == nullptr) {
// casts always succeed with nullptrs.
return nullptr;
}
- bool canCast = details::canCastInterface(parent.get(), childIndicator);
+ Return<bool> canCastRet = details::canCastInterface(parent.get(), childIndicator, emitError);
+ if (!canCastRet.isOk()) {
+ // call fails, propagate the error if emitError
+ return emitError
+ ? details::StatusOf<bool, sp<IChild>>(canCastRet)
+ : Return<sp<IChild>>(sp<IChild>(nullptr));
+ }
- if (!canCast) {
+ if (!canCastRet) {
return sp<IChild>(nullptr); // cast failed.
}
// TODO b/32001926 Needs to be fixed for socket mode.
diff --git a/transport/include/hidl/HidlTransportUtils.h b/transport/include/hidl/HidlTransportUtils.h
index 0fe70c4..fbd6516 100644
--- a/transport/include/hidl/HidlTransportUtils.h
+++ b/transport/include/hidl/HidlTransportUtils.h
@@ -25,14 +25,17 @@
/*
* Verifies the interface chain of 'interface' contains 'castTo'
+ * @param emitError if emitError is false, return Return<bool>{false} on error; if emitError
+ * is true, the Return<bool> object contains the actual error.
*/
-inline bool canCastInterface(::android::hidl::base::V1_0::IBase* interface, const char* castTo) {
+inline Return<bool> canCastInterface(::android::hidl::base::V1_0::IBase* interface,
+ const char* castTo, bool emitError = false) {
if (interface == nullptr) {
return false;
}
bool canCast = false;
- auto ret = interface->interfaceChain([&](const hidl_vec<hidl_string> &types) {
+ auto chainRet = interface->interfaceChain([&](const hidl_vec<hidl_string> &types) {
for (size_t i = 0; i < types.size(); i++) {
if (types[i] == castTo) {
canCast = true;
@@ -40,7 +43,15 @@
}
}
});
- return ret.isOk() && canCast;
+
+ if (!chainRet.isOk()) {
+ // call fails, propagate the error if emitError
+ return emitError
+ ? details::StatusOf<void, bool>(chainRet)
+ : Return<bool>(false);
+ }
+
+ return canCast;
}
inline std::string getDescriptor(::android::hidl::base::V1_0::IBase* interface) {
diff --git a/transport/token/1.0/ITokenManager.hal b/transport/token/1.0/ITokenManager.hal
index b1bb735..23a44bd 100644
--- a/transport/token/1.0/ITokenManager.hal
+++ b/transport/token/1.0/ITokenManager.hal
@@ -26,10 +26,12 @@
* Register an interface. The server must keep a strong reference
* to the interface until the token is destroyed by calling unregister.
*
+ * Must return empty token on failure.
+ *
* @param store Interface which can later be fetched with the returned token.
* @return token Opaque value which may be used as inputs to other functions.
*/
- createToken(interface store) generates (uint64_t token);
+ createToken(interface store) generates (vec<uint8_t>token);
/**
* Destory a token and the strong reference to the associated interface.
@@ -37,7 +39,7 @@
* @param token Token received from createToken
* @return success Whether or not the token was successfully unregistered.
*/
- unregister(uint64_t token) generates (bool success);
+ unregister(vec<uint8_t> token) generates (bool success);
/**
* Fetch an interface from a provided token.
@@ -46,5 +48,5 @@
* @return store Interface registered with createToken and the corresponding
* token or nullptr.
*/
- get(uint64_t token) generates (interface store);
+ get(vec<uint8_t> token) generates (interface store);
};
diff --git a/transport/token/1.0/utils/HybridInterface.cpp b/transport/token/1.0/utils/HybridInterface.cpp
index f28446e..106ad4e 100644
--- a/transport/token/1.0/utils/HybridInterface.cpp
+++ b/transport/token/1.0/utils/HybridInterface.cpp
@@ -89,19 +89,17 @@
}
bool createHalToken(const sp<HInterface>& interface, HalToken* token) {
- hardware::Return<HalToken> transaction(false);
+ hardware::Return<void> transaction;
{
std::lock_guard<std::mutex> lock(gTokenManagerLock);
if (isBadTokenManager()) {
return false;
}
- transaction = gTokenManager->createToken(interface);
- if (isBadTransaction(transaction)) {
- return false;
- }
+ transaction = gTokenManager->createToken(interface, [&](const HalToken &newToken) {
+ *token = newToken;
+ });
}
- *token = static_cast<HalToken>(transaction);
- return true;
+ return !isBadTransaction(transaction);
}
bool deleteHalToken(const HalToken& token) {
diff --git a/transport/token/1.0/utils/include/hidl/HybridInterface.h b/transport/token/1.0/utils/include/hidl/HybridInterface.h
index 42d3734..8c3e742 100644
--- a/transport/token/1.0/utils/include/hidl/HybridInterface.h
+++ b/transport/token/1.0/utils/include/hidl/HybridInterface.h
@@ -96,7 +96,7 @@
namespace android {
-typedef uint64_t HalToken;
+typedef ::android::hardware::hidl_vec<uint8_t> HalToken;
typedef ::android::hidl::base::V1_0::IBase HInterface;
constexpr uint32_t DEFAULT_GET_HAL_TOKEN_TRANSACTION_CODE =
@@ -247,7 +247,7 @@
ALOGE("H2BConverter: Failed to create HAL token.");
}
reply->writeBool(result);
- reply->writeUint64(token);
+ reply->writeByteArray(token.size(), token.data());
return NO_ERROR;
}
return BNINTERFACE::onTransact(code, data, reply, flags);
@@ -313,7 +313,11 @@
data.writeInterfaceToken(BaseInterface::getInterfaceDescriptor());
if (mImpl->transact(GET_HAL_TOKEN, data, &reply) == NO_ERROR) {
bool tokenCreated = reply.readBool();
- HalToken token = reply.readUint64();
+
+ std::vector<uint8_t> tokenVector;
+ reply.readByteVector(&tokenVector);
+ HalToken token = HalToken(tokenVector);
+
if (tokenCreated) {
sp<HInterface> hBase = retrieveHalInterface(token);
if (hBase != nullptr) {