Cleanup Return object.
- Expose isOk() instead of having to say getStatus().isOk()
- Add 'get' function which checks to make sure content is valid.
- Mark implicit cast operator as deprecated.
Bug: 32744406
Bug: 31348667
Test: hidl_test
Change-Id: I13bfe33b6c1f9b94a372161064a9e913825df959
diff --git a/base/include/hidl/Status.h b/base/include/hidl/Status.h
index 248d51c..1246ae0 100644
--- a/base/include/hidl/Status.h
+++ b/base/include/hidl/Status.h
@@ -20,8 +20,9 @@
#include <cstdint>
#include <sstream>
-#include <utils/String8.h>
#include <android-base/macros.h>
+#include <hidl/HidlInternal.h>
+#include <utils/String8.h>
namespace android {
namespace hardware {
@@ -140,28 +141,49 @@
// For gtest output logging
std::stringstream& operator<< (std::stringstream& stream, const Status& s);
-template<typename T> class Return {
+template<typename T> class Return : private details::hidl_log_base {
private:
- T val {};
- Status status {};
+ T mVal {};
+ Status mStatus {};
public:
- Return(T v) : val{v} {}
- Return(Status s) : status(s) {}
- operator T() const { return val; }
- const Status& getStatus() const {
- return status;
- }
+ Return(T v) : mVal{v} {}
+ Return(Status s) : mStatus(s) {}
+
+ T get() const {
+ if (!mStatus.isOk()) {
+ logAlwaysFatal("Attempted to retrieve value from hidl service, "
+ "but there was a transport error.");
+ }
+ return mVal;
+ }
+ bool isOk() const {
+ return mStatus.isOk();
+ }
+
+ // TODO(b/31348667) deprecate, remove all usage, remove function
+ // Can't mark as deprecated yet because of all the projects built with -Werror.
+ // [[deprecated("Replaced by get()")]]
+ operator T() const { return mVal; }
+
+ const Status& getStatus() const {
+ return mStatus;
+ }
};
template<> class Return<void> {
private:
- Status status {};
+ Status mStatus {};
public:
- Return() = default;
- Return(Status s) : status(s) {}
- const Status& getStatus() const {
- return status;
- }
+ Return() = default;
+ Return(Status s) : mStatus(s) {}
+
+ bool isOk() const {
+ return mStatus.isOk();
+ }
+
+ const Status& getStatus() const {
+ return mStatus;
+ }
};
static inline Return<void> Void() {