diff options
| author | Jeff Tinker <jtinker@google.com> | 2019-01-25 22:56:56 -0800 |
|---|---|---|
| committer | Jeff Tinker <jtinker@google.com> | 2019-01-30 07:09:41 +0000 |
| commit | db3fa5f9ff069697b70f2a702177f1db83a6d5b7 (patch) | |
| tree | 5ac815ae62bcb6e6fea949385afe2c53508db0f7 /drm | |
| parent | 8ce16d8609ee14dfbfafeecfb3cb5d1ebb94f1f2 (diff) | |
| download | frameworks_av-db3fa5f9ff069697b70f2a702177f1db83a6d5b7.tar.gz frameworks_av-db3fa5f9ff069697b70f2a702177f1db83a6d5b7.tar.bz2 frameworks_av-db3fa5f9ff069697b70f2a702177f1db83a6d5b7.zip | |
Throw exception on mismatched system vs vendor
When the system partition is a later version than vendor,
new MediaDrm APIs will not have HAL implementations. In
this case throw java.lang.UnsupportedOperationException.
bug:110701831
bug:123375769
test: cts media test cases, gts media tests
Change-Id: Ib631bf4d4d245d857e61bd3fe0e5808e430a034d
Diffstat (limited to 'drm')
| -rw-r--r-- | drm/libmediadrm/DrmHal.cpp | 72 | ||||
| -rw-r--r-- | drm/libmediadrm/IDrm.cpp | 14 |
2 files changed, 48 insertions, 38 deletions
diff --git a/drm/libmediadrm/DrmHal.cpp b/drm/libmediadrm/DrmHal.cpp index 480c7cda0a..84713c1509 100644 --- a/drm/libmediadrm/DrmHal.cpp +++ b/drm/libmediadrm/DrmHal.cpp @@ -586,51 +586,57 @@ Return<void> DrmHal::sendSessionLostState( return Void(); } -bool DrmHal::matchMimeTypeAndSecurityLevel(sp<IDrmFactory> &factory, - const uint8_t uuid[16], - const String8 &mimeType, - DrmPlugin::SecurityLevel level) { - if (mimeType == "") { - return true; - } else if (!factory->isContentTypeSupported(mimeType.string())) { - return false; +status_t DrmHal::matchMimeTypeAndSecurityLevel(const sp<IDrmFactory> &factory, + const uint8_t uuid[16], + const String8 &mimeType, + DrmPlugin::SecurityLevel level, + bool *isSupported) { + *isSupported = false; + + // handle default value cases + if (level == DrmPlugin::kSecurityLevelUnknown) { + if (mimeType == "") { + // isCryptoSchemeSupported(uuid) + *isSupported = true; + } else { + // isCryptoSchemeSupported(uuid, mimeType) + *isSupported = factory->isContentTypeSupported(mimeType.string()); + } + return OK; + } else if (mimeType == "") { + return BAD_VALUE; } - if (level == DrmPlugin::kSecurityLevelUnknown) { - return true; + sp<drm::V1_2::IDrmFactory> factoryV1_2 = drm::V1_2::IDrmFactory::castFrom(factory); + if (factoryV1_2 == NULL) { + return ERROR_UNSUPPORTED; } else { - sp<drm::V1_2::IDrmFactory> factoryV1_2 = drm::V1_2::IDrmFactory::castFrom(factory); - if (factoryV1_2 == NULL) { - return true; - } else if (factoryV1_2->isCryptoSchemeSupported_1_2(uuid, - mimeType.string(), toHidlSecurityLevel(level))) { - return true; - } + *isSupported = factoryV1_2->isCryptoSchemeSupported_1_2(uuid, + mimeType.string(), toHidlSecurityLevel(level)); + return OK; } - return false; } -bool DrmHal::isCryptoSchemeSupported(const uint8_t uuid[16], - const String8 &mimeType, - DrmPlugin::SecurityLevel level) { +status_t DrmHal::isCryptoSchemeSupported(const uint8_t uuid[16], + const String8 &mimeType, + DrmPlugin::SecurityLevel level, + bool *isSupported) { Mutex::Autolock autoLock(mLock); - - for (size_t i = 0; i < mFactories.size(); i++) { - sp<IDrmFactory> factory = mFactories[i]; - if (factory->isCryptoSchemeSupported(uuid)) { - if (matchMimeTypeAndSecurityLevel(factory, uuid, mimeType, level)) { - return true; - } + *isSupported = false; + for (ssize_t i = mFactories.size() - 1; i >= 0; i--) { + if (mFactories[i]->isCryptoSchemeSupported(uuid)) { + return matchMimeTypeAndSecurityLevel(mFactories[i], + uuid, mimeType, level, isSupported); } } - return false; + return OK; } status_t DrmHal::createPlugin(const uint8_t uuid[16], const String8& appPackageName) { Mutex::Autolock autoLock(mLock); - for (size_t i = mFactories.size() - 1; i >= 0; i--) { + for (ssize_t i = mFactories.size() - 1; i >= 0; i--) { if (mFactories[i]->isCryptoSchemeSupported(uuid)) { auto plugin = makeDrmPlugin(mFactories[i], uuid, appPackageName); if (plugin != NULL) { @@ -1213,7 +1219,7 @@ status_t DrmHal::getOfflineLicenseKeySetIds(List<Vector<uint8_t>> &keySetIds) co } if (mPluginV1_2 == NULL) { - return ERROR_DRM_CANNOT_HANDLE; + return ERROR_UNSUPPORTED; } status_t err = UNKNOWN_ERROR; @@ -1238,7 +1244,7 @@ status_t DrmHal::removeOfflineLicense(Vector<uint8_t> const &keySetId) { } if (mPluginV1_2 == NULL) { - return ERROR_DRM_CANNOT_HANDLE; + return ERROR_UNSUPPORTED; } Return<Status> status = mPluginV1_2->removeOfflineLicense(toHidlVec(keySetId)); @@ -1254,7 +1260,7 @@ status_t DrmHal::getOfflineLicenseState(Vector<uint8_t> const &keySetId, } if (mPluginV1_2 == NULL) { - return ERROR_DRM_CANNOT_HANDLE; + return ERROR_UNSUPPORTED; } *licenseState = DrmPlugin::kOfflineLicenseStateUnknown; diff --git a/drm/libmediadrm/IDrm.cpp b/drm/libmediadrm/IDrm.cpp index 0f343151c8..51274d16c1 100644 --- a/drm/libmediadrm/IDrm.cpp +++ b/drm/libmediadrm/IDrm.cpp @@ -83,8 +83,8 @@ struct BpDrm : public BpInterface<IDrm> { return reply.readInt32(); } - virtual bool isCryptoSchemeSupported(const uint8_t uuid[16], const String8 &mimeType, - DrmPlugin::SecurityLevel level) { + virtual status_t isCryptoSchemeSupported(const uint8_t uuid[16], const String8 &mimeType, + DrmPlugin::SecurityLevel level, bool *isSupported) { Parcel data, reply; data.writeInterfaceToken(IDrm::getInterfaceDescriptor()); data.write(uuid, 16); @@ -94,10 +94,11 @@ struct BpDrm : public BpInterface<IDrm> { status_t status = remote()->transact(IS_CRYPTO_SUPPORTED, data, &reply); if (status != OK) { ALOGE("isCryptoSchemeSupported: binder call failed: %d", status); - return false; + return status; } + *isSupported = static_cast<bool>(reply.readInt32()); - return reply.readInt32() != 0; + return reply.readInt32(); } virtual status_t createPlugin(const uint8_t uuid[16], @@ -773,7 +774,10 @@ status_t BnDrm::onTransact( String8 mimeType = data.readString8(); DrmPlugin::SecurityLevel level = static_cast<DrmPlugin::SecurityLevel>(data.readInt32()); - reply->writeInt32(isCryptoSchemeSupported(uuid, mimeType, level)); + bool isSupported = false; + status_t result = isCryptoSchemeSupported(uuid, mimeType, level, &isSupported); + reply->writeInt32(isSupported); + reply->writeInt32(result); return OK; } |
