aidl plugin: add error details to return status

Merged from http://go/wvgerrit/163639

Bug: 253271674
Test: Google TV
Test: atest MediaDrmParameterizedTests
Test: atest DrmSessionManagerTest
Change-Id: I9f0e83774d405466a389d2fd90d693830682dde4
This commit is contained in:
Robert Shih
2022-11-30 18:39:52 -08:00
committed by Edwin Wong
parent 2384efde1e
commit 1fdbd3cd2c
15 changed files with 354 additions and 311 deletions

View File

@@ -7,12 +7,11 @@
#ifndef WV_UTILS_H_
#define WV_UTILS_H_
#include <aidl/android/hardware/drm/LogPriority.h>
#include <aidl/android/hardware/drm/Status.h>
#include <android/binder_auto_utils.h>
#include <string>
#include <vector>
#include "WVTypes.h"
#include "log.h"
namespace wvdrm {
@@ -35,19 +34,12 @@ inline ::aidl::android::hardware::drm::LogPriority toAidlLogPriority(
}
}
::ndk::ScopedAStatus toNdkScopedAStatus(::wvdrm::WvStatus status,
const char* msg = nullptr);
inline ::ndk::ScopedAStatus toNdkScopedAStatus(
::aidl::android::hardware::drm::Status status, const char* msg = nullptr) {
if (::aidl::android::hardware::drm::Status::OK == status)
return ::ndk::ScopedAStatus::ok();
else {
auto err = static_cast<int32_t>(status);
if (msg) {
return ::ndk::ScopedAStatus::fromServiceSpecificErrorWithMessage(err,
msg);
} else {
return ::ndk::ScopedAStatus::fromServiceSpecificError(err);
}
}
return toNdkScopedAStatus(::wvdrm::WvStatus(status), msg);
}
} // namespace wvdrm

View File

@@ -7,8 +7,14 @@
#ifndef WV_TYPES_H_
#define WV_TYPES_H_
#include <aidl/android/hardware/drm/Status.h>
#include "wv_cdm_types.h"
namespace wvdrm {
using AidlDrmStatus = ::aidl::android::hardware::drm::Status;
#define WVDRM_DISALLOW_COPY_AND_ASSIGN(TypeName) \
TypeName(const TypeName&) = delete; \
void operator=(const TypeName&) = delete;
@@ -18,6 +24,33 @@ namespace wvdrm {
TypeName(const TypeName&) = delete; \
void operator=(const TypeName&) = delete;
struct WvStatus {
public:
explicit WvStatus(AidlDrmStatus status) : mStatus(status) {}
WvStatus() : mStatus(AidlDrmStatus::OK) {}
WvStatus(AidlDrmStatus status, wvcdm::CdmResponseType cdmErr)
: mStatus(status), mCdmErr(cdmErr) {}
explicit operator AidlDrmStatus() const { return mStatus; }
explicit operator int32_t() const { return static_cast<int32_t>(mStatus); }
AidlDrmStatus get() const { return mStatus; }
bool operator==(const AidlDrmStatus other) const { return mStatus == other; }
bool operator!=(const AidlDrmStatus other) const { return mStatus != other; }
WvStatus &setCdmErr(wvcdm::CdmResponseType cdmErr) {
mCdmErr = cdmErr;
return *this;
}
wvcdm::CdmResponseType getCdmErr() const { return mCdmErr; }
private:
AidlDrmStatus mStatus{};
wvcdm::CdmResponseType mCdmErr{};
// WVDRM_DISALLOW_COPY_AND_ASSIGN_AND_NEW(WvStatus);
};
} // namespace wvdrm
#endif // WV_TYPES_H_

View File

@@ -8,6 +8,7 @@
#define WV_MAP_ERRORS_INL_H_
#include "WVErrors.h"
#include "WVTypes.h"
#include "media/stagefright/MediaErrors.h"
#include "utils/Errors.h"
#include "wv_cdm_types.h"
@@ -16,10 +17,9 @@ namespace wvdrm {
using ::aidl::android::hardware::drm::Status;
template <typename S = Status>
static S mapCdmResponseType(wvcdm::CdmResponseEnum res) {
static inline WvStatus mapCdmResponseType(wvcdm::CdmResponseType res) {
Status err = Status::ERROR_DRM_UNKNOWN;
switch (res) {
switch (res.Enum()) {
case wvcdm::KEY_ADDED:
case wvcdm::KEY_MESSAGE:
case wvcdm::KEY_CANCELED:
@@ -37,21 +37,26 @@ static S mapCdmResponseType(wvcdm::CdmResponseEnum res) {
// that should probably all turn into NO_LICENSE. Here, and below, and
// everywhere.
case wvcdm::NO_CONTENT_KEY_3:
return Status::ERROR_DRM_NO_LICENSE;
err = Status::ERROR_DRM_NO_LICENSE;
break;
case wvcdm::NEED_PROVISIONING:
return Status::ERROR_DRM_NOT_PROVISIONED;
err = Status::ERROR_DRM_NOT_PROVISIONED;
break;
case wvcdm::DEVICE_REVOKED:
return Status::ERROR_DRM_DEVICE_REVOKED;
err = Status::ERROR_DRM_DEVICE_REVOKED;
break;
case wvcdm::INSUFFICIENT_CRYPTO_RESOURCES:
return Status::ERROR_DRM_RESOURCE_BUSY;
err = Status::ERROR_DRM_RESOURCE_BUSY;
break;
case wvcdm::RELEASE_USAGE_INFO_ERROR:
case wvcdm::RELEASE_USAGE_INFO_FAILED:
case wvcdm::SYSTEM_INVALIDATED_ERROR:
return Status::ERROR_DRM_INVALID_STATE;
err = Status::ERROR_DRM_INVALID_STATE;
break;
case wvcdm::SESSION_NOT_FOUND_FOR_DECRYPT:
case wvcdm::SESSION_NOT_FOUND_1:
@@ -70,18 +75,22 @@ static S mapCdmResponseType(wvcdm::CdmResponseEnum res) {
case wvcdm::SESSION_NOT_FOUND_21:
case wvcdm::SESSION_NOT_FOUND_22:
case wvcdm::SESSION_NOT_FOUND_23:
return Status::ERROR_DRM_SESSION_NOT_OPENED;
err = Status::ERROR_DRM_SESSION_NOT_OPENED;
break;
case wvcdm::DECRYPT_ERROR:
case wvcdm::SECURE_BUFFER_REQUIRED:
return Status::ERROR_DRM_CANNOT_HANDLE;
err = Status::ERROR_DRM_CANNOT_HANDLE;
break;
case wvcdm::ANALOG_OUTPUT_ERROR:
case wvcdm::INSUFFICIENT_OUTPUT_PROTECTION:
return Status::ERROR_DRM_INSUFFICIENT_OUTPUT_PROTECTION;
err = Status::ERROR_DRM_INSUFFICIENT_OUTPUT_PROTECTION;
break;
case wvcdm::KEYSET_ID_NOT_FOUND_4:
return Status::BAD_VALUE;
err = Status::BAD_VALUE;
break;
// The following cases follow the order in wv_cdm_types.h
// to make it easier to keep track of newly defined errors.
@@ -108,20 +117,25 @@ static S mapCdmResponseType(wvcdm::CdmResponseEnum res) {
case wvcdm::PARSE_OKP_RESPONSE_ERROR:
case wvcdm::OKP_ALREADY_PROVISIONED:
ALOGW("Returns UNKNOWN error for legacy status: %d", res);
return Status::ERROR_DRM_UNKNOWN;
err = Status::ERROR_DRM_UNKNOWN;
break;
case wvcdm::KEY_PROHIBITED_FOR_SECURITY_LEVEL:
return Status::ERROR_DRM_INSUFFICIENT_SECURITY;
err = Status::ERROR_DRM_INSUFFICIENT_SECURITY;
break;
case wvcdm::OUTPUT_TOO_LARGE_ERROR:
return Status::ERROR_DRM_FRAME_TOO_LARGE;
err = Status::ERROR_DRM_FRAME_TOO_LARGE;
break;
case wvcdm::SESSION_LOST_STATE_ERROR:
return Status::ERROR_DRM_SESSION_LOST_STATE;
err = Status::ERROR_DRM_SESSION_LOST_STATE;
break;
case wvcdm::LICENSE_REQUEST_NONCE_GENERATION_ERROR:
case wvcdm::LICENSE_RENEWAL_NONCE_GENERATION_ERROR:
case wvcdm::CERT_PROVISIONING_NONCE_GENERATION_ERROR:
case wvcdm::NONCE_GENERATION_ERROR:
// These are likely nonce flood errors
return Status::ERROR_DRM_RESOURCE_CONTENTION;
err = Status::ERROR_DRM_RESOURCE_CONTENTION;
break;
case wvcdm::CANNOT_DECRYPT_ZERO_SUBSAMPLES:
err = Status::CANNOT_DECRYPT_ZERO_SUBSAMPLES;
@@ -429,14 +443,13 @@ static S mapCdmResponseType(wvcdm::CdmResponseEnum res) {
err = Status::STORAGE_WRITE_FAILURE;
break;
default:
return Status::ERROR_DRM_UNKNOWN;
err = Status::ERROR_DRM_UNKNOWN;
}
return static_cast<S>(err);
return WvStatus(err, res);
}
template <typename S = Status>
static S mapCdmResponseType(wvcdm::CdmResponseType res) {
return mapCdmResponseType(static_cast<wvcdm::CdmResponseEnum>(res));
static inline WvStatus mapCdmResponseType(wvcdm::CdmResponseEnum res) {
return mapCdmResponseType(wvcdm::CdmResponseType(res));
}
static inline bool isCdmResponseTypeSuccess(wvcdm::CdmResponseType res) {