diff options
25 files changed, 373 insertions, 550 deletions
diff --git a/api/current.xml b/api/current.xml index 7309429..fba69cf 100644 --- a/api/current.xml +++ b/api/current.xml @@ -68739,29 +68739,7 @@ type="int" transient="false" volatile="false" - value="2012" - static="true" - final="true" - deprecated="not deprecated" - visibility="public" -> -</field> -<field name="TYPE_FINALIZE_FAILED" - type="int" - transient="false" - volatile="false" - value="2010" - static="true" - final="true" - deprecated="not deprecated" - visibility="public" -> -</field> -<field name="TYPE_INITIALIZE_FAILED" - type="int" - transient="false" - volatile="false" - value="2009" + value="2008" static="true" final="true" deprecated="not deprecated" @@ -68801,7 +68779,7 @@ visibility="public" > </field> -<field name="TYPE_REGISTRATION_FAILED" +<field name="TYPE_PROCESS_DRM_INFO_FAILED" type="int" transient="false" volatile="false" @@ -68816,18 +68794,7 @@ type="int" transient="false" volatile="false" - value="2011" - static="true" - final="true" - deprecated="not deprecated" - visibility="public" -> -</field> -<field name="TYPE_RIGHTS_ACQUISITION_FAILED" - type="int" - transient="false" - volatile="false" - value="2008" + value="2007" static="true" final="true" deprecated="not deprecated" @@ -68856,17 +68823,6 @@ visibility="public" > </field> -<field name="TYPE_UNREGISTRATION_FAILED" - type="int" - transient="false" - volatile="false" - value="2007" - static="true" - final="true" - deprecated="not deprecated" - visibility="public" -> -</field> </class> <class name="DrmEvent" extends="java.lang.Object" @@ -68949,28 +68905,6 @@ type="int" transient="false" volatile="false" - value="1006" - static="true" - final="true" - deprecated="not deprecated" - visibility="public" -> -</field> -<field name="TYPE_DRM_INFO_ACQUIRED" - type="int" - transient="false" - volatile="false" - value="1007" - static="true" - final="true" - deprecated="not deprecated" - visibility="public" -> -</field> -<field name="TYPE_FINALIZED" - type="int" - transient="false" - volatile="false" value="1001" static="true" final="true" @@ -68978,7 +68912,7 @@ visibility="public" > </field> -<field name="TYPE_INITIALIZED" +<field name="TYPE_DRM_INFO_ACQUIRED" type="int" transient="false" volatile="false" @@ -68989,7 +68923,7 @@ visibility="public" > </field> -<field name="TYPE_REGISTERED" +<field name="TYPE_DRM_INFO_PROCESSED" type="int" transient="false" volatile="false" @@ -69000,28 +68934,6 @@ visibility="public" > </field> -<field name="TYPE_RIGHTS_ACQUIRED" - type="int" - transient="false" - volatile="false" - value="1005" - static="true" - final="true" - deprecated="not deprecated" - visibility="public" -> -</field> -<field name="TYPE_UNREGISTERED" - type="int" - transient="false" - volatile="false" - value="1004" - static="true" - final="true" - deprecated="not deprecated" - visibility="public" -> -</field> </class> <class name="DrmInfo" extends="java.lang.Object" @@ -69397,6 +69309,8 @@ > <parameter name="_statusCode" type="int"> </parameter> +<parameter name="_infoType" type="int"> +</parameter> <parameter name="_data" type="android.drm.ProcessedData"> </parameter> <parameter name="_mimeType" type="java.lang.String"> @@ -69434,6 +69348,16 @@ visibility="public" > </field> +<field name="infoType" + type="int" + transient="false" + volatile="false" + static="false" + final="true" + deprecated="not deprecated" + visibility="public" +> +</field> <field name="mimeType" type="java.lang.String" transient="false" @@ -69697,17 +69621,6 @@ <parameter name="uri" type="android.net.Uri"> </parameter> </method> -<method name="loadPlugIns" - return="int" - abstract="false" - native="false" - synchronized="false" - static="false" - final="false" - deprecated="not deprecated" - visibility="public" -> -</method> <method name="openConvertSession" return="int" abstract="false" @@ -69829,17 +69742,6 @@ <parameter name="infoListener" type="android.drm.DrmManagerClient.OnInfoListener"> </parameter> </method> -<method name="unloadPlugIns" - return="int" - abstract="false" - native="false" - synchronized="false" - static="false" - final="false" - deprecated="not deprecated" - visibility="public" -> -</method> <field name="ERROR_NONE" type="int" transient="false" diff --git a/drm/common/DrmEngineBase.cpp b/drm/common/DrmEngineBase.cpp index 17cdf54..10c64ee 100644 --- a/drm/common/DrmEngineBase.cpp +++ b/drm/common/DrmEngineBase.cpp @@ -120,6 +120,11 @@ status_t DrmEngineBase::openDecryptSession( return onOpenDecryptSession(uniqueId, decryptHandle, fd, offset, length); } +status_t DrmEngineBase::openDecryptSession( + int uniqueId, DecryptHandle* decryptHandle, const char* uri) { + return onOpenDecryptSession(uniqueId, decryptHandle, uri); +} + status_t DrmEngineBase::closeDecryptSession(int uniqueId, DecryptHandle* decryptHandle) { return onCloseDecryptSession(uniqueId, decryptHandle); } diff --git a/drm/common/DrmInfoStatus.cpp b/drm/common/DrmInfoStatus.cpp index f3a1516..8ec7311 100644 --- a/drm/common/DrmInfoStatus.cpp +++ b/drm/common/DrmInfoStatus.cpp @@ -19,8 +19,9 @@ using namespace android; DrmInfoStatus::DrmInfoStatus( - int _statusCode, const DrmBuffer* _drmBuffer, const String8& _mimeType) : + int _statusCode, int _infoType, const DrmBuffer* _drmBuffer, const String8& _mimeType) : statusCode(_statusCode), + infoType(_infoType), drmBuffer(_drmBuffer), mimeType(_mimeType) { diff --git a/drm/common/IDrmManagerService.cpp b/drm/common/IDrmManagerService.cpp index e46451d..c3d12f0 100644 --- a/drm/common/IDrmManagerService.cpp +++ b/drm/common/IDrmManagerService.cpp @@ -53,27 +53,18 @@ void BpDrmManagerService::removeUniqueId(int uniqueId) { remote()->transact(REMOVE_UNIQUEID, data, &reply); } -status_t BpDrmManagerService::loadPlugIns(int uniqueId) { - LOGV("load plugins"); +void BpDrmManagerService::addClient(int uniqueId) { Parcel data, reply; - data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor()); data.writeInt32(uniqueId); - - remote()->transact(LOAD_PLUGINS, data, &reply); - return reply.readInt32(); + remote()->transact(ADD_CLIENT, data, &reply); } -status_t BpDrmManagerService::loadPlugIns(int uniqueId, const String8& plugInDirPath) { - LOGV("load plugins from path"); +void BpDrmManagerService::removeClient(int uniqueId) { Parcel data, reply; - data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor()); data.writeInt32(uniqueId); - data.writeString8(plugInDirPath); - - remote()->transact(LOAD_PLUGINS_FROM_PATH, data, &reply); - return reply.readInt32(); + remote()->transact(REMOVE_CLIENT, data, &reply); } status_t BpDrmManagerService::setDrmServiceListener( @@ -88,17 +79,6 @@ status_t BpDrmManagerService::setDrmServiceListener( return reply.readInt32(); } -status_t BpDrmManagerService::unloadPlugIns(int uniqueId) { - LOGV("unload plugins"); - Parcel data, reply; - - data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor()); - data.writeInt32(uniqueId); - - remote()->transact(UNLOAD_PLUGINS, data, &reply); - return reply.readInt32(); -} - status_t BpDrmManagerService::installDrmEngine(int uniqueId, const String8& drmEngineFile) { LOGV("Install DRM Engine"); Parcel data, reply; @@ -191,6 +171,7 @@ DrmInfoStatus* BpDrmManagerService::processDrmInfo(int uniqueId, const DrmInfo* if (0 != reply.dataAvail()) { //Filling DRM Info Status const int statusCode = reply.readInt32(); + const int infoType = reply.readInt32(); const String8 mimeType = reply.readString8(); DrmBuffer* drmBuffer = NULL; @@ -203,7 +184,7 @@ DrmInfoStatus* BpDrmManagerService::processDrmInfo(int uniqueId, const DrmInfo* } drmBuffer = new DrmBuffer(data, bufferSize); } - drmInfoStatus = new DrmInfoStatus(statusCode, drmBuffer, mimeType); + drmInfoStatus = new DrmInfoStatus(statusCode, infoType, drmBuffer, mimeType); } return drmInfoStatus; } @@ -538,8 +519,7 @@ DecryptHandle* BpDrmManagerService::openDecryptSession( LOGV("Entering BpDrmManagerService::openDecryptSession"); Parcel data, reply; - const String16 interfaceDescriptor = IDrmManagerService::getInterfaceDescriptor(); - data.writeInterfaceToken(interfaceDescriptor); + data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor()); data.writeInt32(uniqueId); data.writeFileDescriptor(fd); data.writeInt32(offset); @@ -563,6 +543,34 @@ DecryptHandle* BpDrmManagerService::openDecryptSession( return handle; } +DecryptHandle* BpDrmManagerService::openDecryptSession(int uniqueId, const char* uri) { + LOGV("Entering BpDrmManagerService::openDecryptSession"); + Parcel data, reply; + + data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor()); + data.writeInt32(uniqueId); + data.writeString8(String8(uri)); + + remote()->transact(OPEN_DECRYPT_SESSION_FROM_URI, data, &reply); + + DecryptHandle* handle = NULL; + if (0 != reply.dataAvail()) { + handle = new DecryptHandle(); + handle->decryptId = reply.readInt32(); + handle->mimeType = reply.readString8(); + handle->decryptApiType = reply.readInt32(); + handle->status = reply.readInt32(); + handle->decryptInfo = NULL; + if (0 != reply.dataAvail()) { + handle->decryptInfo = new DecryptInfo(); + handle->decryptInfo->decryptBufferLength = reply.readInt32(); + } + } else { + LOGE("no decryptHandle is generated in service side"); + } + return handle; +} + status_t BpDrmManagerService::closeDecryptSession(int uniqueId, DecryptHandle* decryptHandle) { LOGV("closeDecryptSession"); Parcel data, reply; @@ -744,25 +752,19 @@ status_t BnDrmManagerService::onTransact( return DRM_NO_ERROR; } - case LOAD_PLUGINS: + case ADD_CLIENT: { - LOGV("BnDrmManagerService::onTransact :LOAD_PLUGINS"); + LOGV("BnDrmManagerService::onTransact :ADD_CLIENT"); CHECK_INTERFACE(IDrmManagerService, data, reply); - - status_t status = loadPlugIns(data.readInt32()); - - reply->writeInt32(status); + addClient(data.readInt32()); return DRM_NO_ERROR; } - case LOAD_PLUGINS_FROM_PATH: + case REMOVE_CLIENT: { - LOGV("BnDrmManagerService::onTransact :LOAD_PLUGINS_FROM_PATH"); + LOGV("BnDrmManagerService::onTransact :REMOVE_CLIENT"); CHECK_INTERFACE(IDrmManagerService, data, reply); - - status_t status = loadPlugIns(data.readInt32(), data.readString8()); - - reply->writeInt32(status); + removeClient(data.readInt32()); return DRM_NO_ERROR; } @@ -781,18 +783,6 @@ status_t BnDrmManagerService::onTransact( return DRM_NO_ERROR; } - case UNLOAD_PLUGINS: - { - LOGV("BnDrmManagerService::onTransact :UNLOAD_PLUGINS"); - CHECK_INTERFACE(IDrmManagerService, data, reply); - - const int uniqueId = data.readInt32(); - status_t status = unloadPlugIns(uniqueId); - - reply->writeInt32(status); - return DRM_NO_ERROR; - } - case INSTALL_DRM_ENGINE: { LOGV("BnDrmManagerService::onTransact :INSTALL_DRM_ENGINE"); @@ -879,6 +869,7 @@ status_t BnDrmManagerService::onTransact( if (NULL != drmInfoStatus) { //Filling DRM Info Status contents reply->writeInt32(drmInfoStatus->statusCode); + reply->writeInt32(drmInfoStatus->infoType); reply->writeString8(drmInfoStatus->mimeType); if (NULL != drmInfoStatus->drmBuffer) { @@ -1235,6 +1226,32 @@ status_t BnDrmManagerService::onTransact( return DRM_NO_ERROR; } + case OPEN_DECRYPT_SESSION_FROM_URI: + { + LOGV("BnDrmManagerService::onTransact :OPEN_DECRYPT_SESSION_FROM_URI"); + CHECK_INTERFACE(IDrmManagerService, data, reply); + + const int uniqueId = data.readInt32(); + const String8 uri = data.readString8(); + + DecryptHandle* handle = openDecryptSession(uniqueId, uri.string()); + + if (NULL != handle) { + reply->writeInt32(handle->decryptId); + reply->writeString8(handle->mimeType); + reply->writeInt32(handle->decryptApiType); + reply->writeInt32(handle->status); + if (NULL != handle->decryptInfo) { + reply->writeInt32(handle->decryptInfo->decryptBufferLength); + delete handle->decryptInfo; handle->decryptInfo = NULL; + } + } else { + LOGE("NULL decryptHandle is returned"); + } + delete handle; handle = NULL; + return DRM_NO_ERROR; + } + case CLOSE_DECRYPT_SESSION: { LOGV("BnDrmManagerService::onTransact :CLOSE_DECRYPT_SESSION"); diff --git a/drm/drmserver/DrmManager.cpp b/drm/drmserver/DrmManager.cpp index 645d2c6..35e62f3 100644 --- a/drm/drmserver/DrmManager.cpp +++ b/drm/drmserver/DrmManager.cpp @@ -85,22 +85,31 @@ void DrmManager::removeUniqueId(int uniqueId) { } } -status_t DrmManager::loadPlugIns(int uniqueId) { +status_t DrmManager::loadPlugIns() { String8 pluginDirPath("/system/lib/drm/plugins/native"); - return loadPlugIns(uniqueId, pluginDirPath); + return loadPlugIns(pluginDirPath); } -status_t DrmManager::loadPlugIns(int uniqueId, const String8& plugInDirPath) { +status_t DrmManager::loadPlugIns(const String8& plugInDirPath) { if (mSupportInfoToPlugInIdMap.isEmpty()) { mPlugInManager.loadPlugIns(plugInDirPath); - - initializePlugIns(uniqueId); - - populate(uniqueId); - } else { - initializePlugIns(uniqueId); + Vector<String8> plugInPathList = mPlugInManager.getPlugInIdList(); + for (unsigned int i = 0; i < plugInPathList.size(); ++i) { + String8 plugInPath = plugInPathList[i]; + DrmSupportInfo* info = mPlugInManager.getPlugIn(plugInPath).getSupportInfo(0); + if (NULL != info) { + mSupportInfoToPlugInIdMap.add(*info, plugInPath); + } + } } + return DRM_NO_ERROR; +} +status_t DrmManager::unloadPlugIns() { + mConvertSessionMap.clear(); + mDecryptSessionMap.clear(); + mPlugInManager.unloadPlugIns(); + mSupportInfoToPlugInIdMap.clear(); return DRM_NO_ERROR; } @@ -111,21 +120,23 @@ status_t DrmManager::setDrmServiceListener( return DRM_NO_ERROR; } -status_t DrmManager::unloadPlugIns(int uniqueId) { - Vector<String8> plugInIdList = mPlugInManager.getPlugInIdList(); +void DrmManager::addClient(int uniqueId) { + if (!mSupportInfoToPlugInIdMap.isEmpty()) { + Vector<String8> plugInIdList = mPlugInManager.getPlugInIdList(); + for (unsigned int index = 0; index < plugInIdList.size(); index++) { + IDrmEngine& rDrmEngine = mPlugInManager.getPlugIn(plugInIdList.itemAt(index)); + rDrmEngine.initialize(uniqueId); + rDrmEngine.setOnInfoListener(uniqueId, this); + } + } +} +void DrmManager::removeClient(int uniqueId) { + Vector<String8> plugInIdList = mPlugInManager.getPlugInIdList(); for (unsigned int index = 0; index < plugInIdList.size(); index++) { IDrmEngine& rDrmEngine = mPlugInManager.getPlugIn(plugInIdList.itemAt(index)); rDrmEngine.terminate(uniqueId); } - - if (0 >= mUniqueIdVector.size()) { - mConvertSessionMap.clear(); - mDecryptSessionMap.clear(); - mSupportInfoToPlugInIdMap.clear(); - mPlugInManager.unloadPlugIns(); - } - return DRM_NO_ERROR; } DrmConstraints* DrmManager::getConstraints(int uniqueId, const String8* path, const int action) { @@ -144,7 +155,7 @@ status_t DrmManager::installDrmEngine(int uniqueId, const String8& absolutePath) rDrmEngine.initialize(uniqueId); rDrmEngine.setOnInfoListener(uniqueId, this); - DrmSupportInfo* info = rDrmEngine.getSupportInfo(uniqueId); + DrmSupportInfo* info = rDrmEngine.getSupportInfo(0); mSupportInfoToPlugInIdMap.add(*info, absolutePath); return DRM_NO_ERROR; @@ -154,7 +165,7 @@ bool DrmManager::canHandle(int uniqueId, const String8& path, const String8& mim const String8 plugInId = getSupportedPlugInId(mimeType); bool result = (EMPTY_STRING != plugInId) ? true : false; - if (NULL != path) { + if (0 < path.length()) { if (result) { IDrmEngine& rDrmEngine = mPlugInManager.getPlugIn(plugInId); result = rDrmEngine.canHandle(uniqueId, path); @@ -340,7 +351,7 @@ status_t DrmManager::getAllSupportInfo( for (int i = 0; i < size; ++i) { String8 plugInPath = plugInPathList[i]; DrmSupportInfo* drmSupportInfo - = mPlugInManager.getPlugIn(plugInPath).getSupportInfo(uniqueId); + = mPlugInManager.getPlugIn(plugInPath).getSupportInfo(0); if (NULL != drmSupportInfo) { drmSupportInfoList.add(*drmSupportInfo); delete drmSupportInfo; drmSupportInfo = NULL; @@ -360,12 +371,12 @@ status_t DrmManager::getAllSupportInfo( } DecryptHandle* DrmManager::openDecryptSession(int uniqueId, int fd, int offset, int length) { + Mutex::Autolock _l(mDecryptLock); status_t result = DRM_ERROR_CANNOT_HANDLE; Vector<String8> plugInIdList = mPlugInManager.getPlugInIdList(); DecryptHandle* handle = new DecryptHandle(); if (NULL != handle) { - Mutex::Autolock _l(mDecryptLock); handle->decryptId = mDecryptSessionId + 1; for (unsigned int index = 0; index < plugInIdList.size(); index++) { @@ -380,15 +391,42 @@ DecryptHandle* DrmManager::openDecryptSession(int uniqueId, int fd, int offset, } } } - if (DRM_NO_ERROR != result) { delete handle; handle = NULL; } + return handle; +} + +DecryptHandle* DrmManager::openDecryptSession(int uniqueId, const char* uri) { + Mutex::Autolock _l(mDecryptLock); + status_t result = DRM_ERROR_CANNOT_HANDLE; + Vector<String8> plugInIdList = mPlugInManager.getPlugInIdList(); + DecryptHandle* handle = new DecryptHandle(); + if (NULL != handle) { + handle->decryptId = mDecryptSessionId + 1; + + for (unsigned int index = 0; index < plugInIdList.size(); index++) { + String8 plugInId = plugInIdList.itemAt(index); + IDrmEngine& rDrmEngine = mPlugInManager.getPlugIn(plugInId); + result = rDrmEngine.openDecryptSession(uniqueId, handle, uri); + + if (DRM_NO_ERROR == result) { + ++mDecryptSessionId; + mDecryptSessionMap.add(mDecryptSessionId, &rDrmEngine); + break; + } + } + } + if (DRM_NO_ERROR != result) { + delete handle; handle = NULL; + LOGE("DrmManager::openDecryptSession: no capable plug-in found"); + } return handle; } status_t DrmManager::closeDecryptSession(int uniqueId, DecryptHandle* decryptHandle) { + Mutex::Autolock _l(mDecryptLock); status_t result = DRM_ERROR_UNKNOWN; if (mDecryptSessionMap.indexOfKey(decryptHandle->decryptId) != NAME_NOT_FOUND) { IDrmEngine* drmEngine = mDecryptSessionMap.valueFor(decryptHandle->decryptId); @@ -442,28 +480,6 @@ ssize_t DrmManager::pread(int uniqueId, DecryptHandle* decryptHandle, return result; } -void DrmManager::initializePlugIns(int uniqueId) { - Vector<String8> plugInIdList = mPlugInManager.getPlugInIdList(); - - for (unsigned int index = 0; index < plugInIdList.size(); index++) { - IDrmEngine& rDrmEngine = mPlugInManager.getPlugIn(plugInIdList.itemAt(index)); - rDrmEngine.initialize(uniqueId); - rDrmEngine.setOnInfoListener(uniqueId, this); - } -} - -void DrmManager::populate(int uniqueId) { - Vector<String8> plugInPathList = mPlugInManager.getPlugInIdList(); - - for (unsigned int i = 0; i < plugInPathList.size(); ++i) { - String8 plugInPath = plugInPathList[i]; - DrmSupportInfo* info = mPlugInManager.getPlugIn(plugInPath).getSupportInfo(uniqueId); - if (NULL != info) { - mSupportInfoToPlugInIdMap.add(*info, plugInPath); - } - } -} - String8 DrmManager::getSupportedPlugInId( int uniqueId, const String8& path, const String8& mimeType) { String8 plugInId(""); diff --git a/drm/drmserver/DrmManagerService.cpp b/drm/drmserver/DrmManagerService.cpp index cf9bab1..8cf510d 100644 --- a/drm/drmserver/DrmManagerService.cpp +++ b/drm/drmserver/DrmManagerService.cpp @@ -27,21 +27,21 @@ using namespace android; -#define SUCCESS 0 - void DrmManagerService::instantiate() { LOGV("instantiate"); defaultServiceManager()->addService(String16("drm.drmManager"), new DrmManagerService()); } -DrmManagerService::DrmManagerService() { +DrmManagerService::DrmManagerService() : + mDrmManager(NULL) { LOGV("created"); - mDrmManager = NULL; mDrmManager = new DrmManager(); + mDrmManager->loadPlugIns(); } DrmManagerService::~DrmManagerService() { LOGV("Destroyed"); + mDrmManager->unloadPlugIns(); delete mDrmManager; mDrmManager = NULL; } @@ -53,14 +53,12 @@ void DrmManagerService::removeUniqueId(int uniqueId) { mDrmManager->removeUniqueId(uniqueId); } -status_t DrmManagerService::loadPlugIns(int uniqueId) { - LOGV("Entering load plugins"); - return mDrmManager->loadPlugIns(uniqueId); +void DrmManagerService::addClient(int uniqueId) { + mDrmManager->addClient(uniqueId); } -status_t DrmManagerService::loadPlugIns(int uniqueId, const String8& plugInDirPath) { - LOGV("Entering load plugins from path"); - return mDrmManager->loadPlugIns(uniqueId, plugInDirPath); +void DrmManagerService::removeClient(int uniqueId) { + mDrmManager->removeClient(uniqueId); } status_t DrmManagerService::setDrmServiceListener( @@ -70,11 +68,6 @@ status_t DrmManagerService::setDrmServiceListener( return DRM_NO_ERROR; } -status_t DrmManagerService::unloadPlugIns(int uniqueId) { - LOGV("Entering unload plugins"); - return mDrmManager->unloadPlugIns(uniqueId); -} - status_t DrmManagerService::installDrmEngine(int uniqueId, const String8& drmEngineFile) { LOGV("Entering installDrmEngine"); return mDrmManager->installDrmEngine(uniqueId, drmEngineFile); @@ -182,6 +175,12 @@ DecryptHandle* DrmManagerService::openDecryptSession( return mDrmManager->openDecryptSession(uniqueId, fd, offset, length); } +DecryptHandle* DrmManagerService::openDecryptSession( + int uniqueId, const char* uri) { + LOGV("Entering DrmManagerService::openDecryptSession with uri"); + return mDrmManager->openDecryptSession(uniqueId, uri); +} + status_t DrmManagerService::closeDecryptSession(int uniqueId, DecryptHandle* decryptHandle) { LOGV("Entering closeDecryptSession"); return mDrmManager->closeDecryptSession(uniqueId, decryptHandle); diff --git a/drm/java/android/drm/DrmErrorEvent.java b/drm/java/android/drm/DrmErrorEvent.java index 8e71634..9294884 100644 --- a/drm/java/android/drm/DrmErrorEvent.java +++ b/drm/java/android/drm/DrmErrorEvent.java @@ -45,35 +45,19 @@ public class DrmErrorEvent extends DrmEvent { */ public static final int TYPE_NO_INTERNET_CONNECTION = 2005; /** - * TYPE_REGISTRATION_FAILED, when failed to register with the service. + * TYPE_PROCESS_DRM_INFO_FAILED, when failed to process DrmInfo. */ - public static final int TYPE_REGISTRATION_FAILED = 2006; - /** - * TYPE_UNREGISTRATION_FAILED, when failed to unregister with the service. - */ - public static final int TYPE_UNREGISTRATION_FAILED = 2007; - /** - * TYPE_RIGHTS_ACQUISITION_FAILED, when failed to acquire the rights information required. - */ - public static final int TYPE_RIGHTS_ACQUISITION_FAILED = 2008; - /** - * TYPE_INITIALIZE_FAILED, when failed to load and initialize the available plugins. - */ - public static final int TYPE_INITIALIZE_FAILED = 2009; - /** - * TYPE_FINALIZE_FAILED, when failed to unload and finalize the loaded plugins. - */ - public static final int TYPE_FINALIZE_FAILED = 2010; + public static final int TYPE_PROCESS_DRM_INFO_FAILED = 2006; /** * TYPE_REMOVE_ALL_RIGHTS_FAILED, when failed to remove all the rights objects * associated with all DRM schemes. */ - public static final int TYPE_REMOVE_ALL_RIGHTS_FAILED = 2011; + public static final int TYPE_REMOVE_ALL_RIGHTS_FAILED = 2007; /** * TYPE_DRM_INFO_ACQUISITION_FAILED, when failed to get the required information to * communicate with the service. */ - public static final int TYPE_DRM_INFO_ACQUISITION_FAILED = 2012; + public static final int TYPE_DRM_INFO_ACQUISITION_FAILED = 2008; /** * constructor to create DrmErrorEvent object with given parameters diff --git a/drm/java/android/drm/DrmEvent.java b/drm/java/android/drm/DrmEvent.java index d6e0c3a..583337f 100644 --- a/drm/java/android/drm/DrmEvent.java +++ b/drm/java/android/drm/DrmEvent.java @@ -23,35 +23,19 @@ package android.drm; */ public class DrmEvent { /** - * Constant field signifies that unload and finalize the loaded plugins successfully - */ - public static final int TYPE_FINALIZED = 1001; - /** - * Constant field signifies that register with the service successfully - */ - public static final int TYPE_REGISTERED = 1002; - /** - * Constant field signifies that load and initialized the available plugins successfully - */ - public static final int TYPE_INITIALIZED = 1003; - /** - * Constant field signifies that unregister with the service successfully - */ - public static final int TYPE_UNREGISTERED = 1004; - /** - * Constant field signifies that rights information is acquired successfully - */ - public static final int TYPE_RIGHTS_ACQUIRED = 1005; - /** * Constant field signifies that all the rights information associated with * all DRM schemes are removed successfully */ - public static final int TYPE_ALL_RIGHTS_REMOVED = 1006; + public static final int TYPE_ALL_RIGHTS_REMOVED = 1001; + /** + * Constant field signifies that given information is processed successfully + */ + public static final int TYPE_DRM_INFO_PROCESSED = 1002; /** * Constant field signifies that the required information to communicate with * the service is acquired sucessfully */ - public static final int TYPE_DRM_INFO_ACQUIRED = 1007; + public static final int TYPE_DRM_INFO_ACQUIRED = 1003; public static final String DRM_INFO_STATUS_OBJECT = "drm_info_status_object"; public static final String DRM_INFO_OBJECT = "drm_info_object"; diff --git a/drm/java/android/drm/DrmInfoStatus.java b/drm/java/android/drm/DrmInfoStatus.java index 7e9ca3e..b37ea51 100644 --- a/drm/java/android/drm/DrmInfoStatus.java +++ b/drm/java/android/drm/DrmInfoStatus.java @@ -31,6 +31,7 @@ public class DrmInfoStatus { public static final int STATUS_ERROR = 2; public final int statusCode; + public final int infoType; public final String mimeType; public final ProcessedData data; @@ -38,11 +39,13 @@ public class DrmInfoStatus { * constructor to create DrmInfoStatus object with given parameters * * @param _statusCode Status of the communication + * @param _infoType Type of the DRM information processed * @param _data The processed data * @param _mimeType MIME type */ - public DrmInfoStatus(int _statusCode, ProcessedData _data, String _mimeType) { + public DrmInfoStatus(int _statusCode, int _infoType, ProcessedData _data, String _mimeType) { statusCode = _statusCode; + infoType = _infoType; data = _data; mimeType = _mimeType; } diff --git a/drm/java/android/drm/DrmManagerClient.java b/drm/java/android/drm/DrmManagerClient.java index 147c530..5044d36 100644 --- a/drm/java/android/drm/DrmManagerClient.java +++ b/drm/java/android/drm/DrmManagerClient.java @@ -16,9 +16,11 @@ package android.drm; +import android.content.ContentResolver; import android.content.ContentValues; import android.content.Context; import android.database.Cursor; +import android.database.sqlite.SQLiteException; import android.net.Uri; import android.os.Handler; import android.os.HandlerThread; @@ -99,14 +101,9 @@ public class DrmManagerClient { public void onError(DrmManagerClient client, DrmErrorEvent event); } - private static final int STATE_UNINITIALIZED = 0; - private static final int STATE_INITIALIZED = 1; - - private static final int ACTION_INITIALIZE = 1000; - private static final int ACTION_FINALIZE = 1001; - private static final int ACTION_REMOVE_ALL_RIGHTS = 1002; - private static final int ACTION_ACQUIRE_DRM_INFO = 1003; - private static final int ACTION_PROCESS_DRM_INFO = 1004; + private static final int ACTION_REMOVE_ALL_RIGHTS = 1001; + private static final int ACTION_ACQUIRE_DRM_INFO = 1002; + private static final int ACTION_PROCESS_DRM_INFO = 1003; private int mUniqueId; private int mNativeContext; @@ -116,7 +113,6 @@ public class DrmManagerClient { private OnInfoListener mOnInfoListener; private OnEventListener mOnEventListener; private OnErrorListener mOnErrorListener; - private int mCurrentState = STATE_UNINITIALIZED; private class EventHandler extends Handler { @@ -130,16 +126,6 @@ public class DrmManagerClient { HashMap<String, Object> attributes = new HashMap<String, Object>(); switch(msg.what) { - case ACTION_INITIALIZE: { - if (ERROR_NONE == _loadPlugIns(mUniqueId, msg.obj)) { - mCurrentState = STATE_INITIALIZED; - event = new DrmEvent(mUniqueId, DrmEvent.TYPE_INITIALIZED, null); - } else { - error = new DrmErrorEvent(mUniqueId, - DrmErrorEvent.TYPE_INITIALIZE_FAILED, null); - } - break; - } case ACTION_ACQUIRE_DRM_INFO: { final DrmInfoRequest request = (DrmInfoRequest) msg.obj; DrmInfo drmInfo = _acquireDrmInfo(mUniqueId, request); @@ -157,10 +143,10 @@ public class DrmManagerClient { DrmInfoStatus status = _processDrmInfo(mUniqueId, drmInfo); if (null != status && DrmInfoStatus.STATUS_OK == status.statusCode) { attributes.put(DrmEvent.DRM_INFO_STATUS_OBJECT, status); - event = new DrmEvent(mUniqueId, getEventType(drmInfo.getInfoType()), null); + event = new DrmEvent(mUniqueId, getEventType(status.infoType), null); } else { - error = new DrmErrorEvent(mUniqueId, - getErrorType(drmInfo.getInfoType()), null); + int infoType = (null != status) ? status.infoType : drmInfo.getInfoType(); + error = new DrmErrorEvent(mUniqueId, getErrorType(infoType), null); } break; } @@ -173,16 +159,6 @@ public class DrmManagerClient { } break; } - case ACTION_FINALIZE: { - if (ERROR_NONE == _unloadPlugIns(mUniqueId)) { - mCurrentState = STATE_UNINITIALIZED; - event = new DrmEvent(mUniqueId, DrmEvent.TYPE_FINALIZED, null); - } else { - error = new DrmErrorEvent(mUniqueId, - DrmErrorEvent.TYPE_FINALIZE_FAILED, null); - } - break; - } default: Log.e(TAG, "Unknown message type " + msg.what); return; @@ -283,6 +259,12 @@ public class DrmManagerClient { // save the unique id mUniqueId = hashCode(); + + _initialize(mUniqueId, new WeakReference<DrmManagerClient>(this)); + } + + protected void finalize() { + _finalize(mUniqueId); } /** @@ -322,58 +304,11 @@ public class DrmManagerClient { } /** - * Initializes DrmFramework, which loads all available plug-ins - * in the default plug-in directory path - * - * @return - * ERROR_NONE for success - * ERROR_UNKNOWN for failure - */ - public int loadPlugIns() { - int result = ERROR_UNKNOWN; - if (STATE_UNINITIALIZED == getState()) { - if (null != mEventHandler) { - Message msg = mEventHandler.obtainMessage( - ACTION_INITIALIZE, new WeakReference<DrmManagerClient>(this)); - result = (mEventHandler.sendMessage(msg)) ? ERROR_NONE : result; - } - } else { - result = ERROR_NONE; - } - return result; - } - - /** - * Finalize DrmFramework, which release resources associated with each plug-in - * and unload all plug-ins. - * - * @return - * ERROR_NONE for success - * ERROR_UNKNOWN for failure - */ - public int unloadPlugIns() { - int result = ERROR_UNKNOWN; - if (STATE_INITIALIZED == getState()) { - if (null != mEventHandler) { - Message msg = mEventHandler.obtainMessage(ACTION_FINALIZE); - result = (mEventHandler.sendMessage(msg)) ? ERROR_NONE : result; - } - } else { - result = ERROR_NONE; - } - return result; - } - - /** * Retrieves informations about all the plug-ins registered with DrmFramework. * * @return Array of DrmEngine plug-in strings */ public String[] getAvailableDrmEngines() { - if (STATE_UNINITIALIZED == getState()) { - throw new IllegalStateException("Not Initialized yet"); - } - DrmSupportInfo[] supportInfos = _getAllSupportInfo(mUniqueId); ArrayList<String> descriptions = new ArrayList<String>(); @@ -396,8 +331,6 @@ public class DrmManagerClient { public ContentValues getConstraints(String path, int action) { if (null == path || path.equals("") || !DrmStore.Action.isValid(action)) { throw new IllegalArgumentException("Given usage or path is invalid/null"); - } else if (STATE_UNINITIALIZED == getState()) { - throw new IllegalStateException("Not Initialized yet"); } return _getConstraints(mUniqueId, path, action); } @@ -411,6 +344,9 @@ public class DrmManagerClient { * or null in case of failure */ public ContentValues getConstraints(Uri uri, int action) { + if (null == uri || Uri.EMPTY == uri) { + throw new IllegalArgumentException("Uri should be non null"); + } return getConstraints(convertUriToPath(uri), action); } @@ -432,8 +368,6 @@ public class DrmManagerClient { DrmRights drmRights, String rightsPath, String contentPath) throws IOException { if (null == drmRights || !drmRights.isValid()) { throw new IllegalArgumentException("Given drmRights or contentPath is not valid"); - } else if (STATE_UNINITIALIZED == getState()) { - throw new IllegalStateException("Not Initialized yet"); } if (null != rightsPath && !rightsPath.equals("")) { DrmUtils.writeToFile(rightsPath, drmRights.getData()); @@ -451,8 +385,6 @@ public class DrmManagerClient { if (null == engineFilePath || engineFilePath.equals("")) { throw new IllegalArgumentException( "Given engineFilePath: "+ engineFilePath + "is not valid"); - } else if (STATE_UNINITIALIZED == getState()) { - throw new IllegalStateException("Not Initialized yet"); } _installDrmEngine(mUniqueId, engineFilePath); } @@ -464,14 +396,11 @@ public class DrmManagerClient { * @param mimeType Mimetype of the object to be handled * @return * true - if the given mimeType or path can be handled - * false - cannot be handled. false will be return in case - * the state is uninitialized + * false - cannot be handled. */ public boolean canHandle(String path, String mimeType) { if ((null == path || path.equals("")) && (null == mimeType || mimeType.equals(""))) { throw new IllegalArgumentException("Path or the mimetype should be non null"); - } else if (STATE_UNINITIALIZED == getState()) { - throw new IllegalStateException("Not Initialized yet"); } return _canHandle(mUniqueId, path, mimeType); } @@ -483,8 +412,7 @@ public class DrmManagerClient { * @param mimeType Mimetype of the object to be handled * @return * true - if the given mimeType or path can be handled - * false - cannot be handled. false will be return in case - * the state is uninitialized + * false - cannot be handled. */ public boolean canHandle(Uri uri, String mimeType) { if ((null == uri || Uri.EMPTY == uri) && (null == mimeType || mimeType.equals(""))) { @@ -504,8 +432,6 @@ public class DrmManagerClient { public int processDrmInfo(DrmInfo drmInfo) { if (null == drmInfo || !drmInfo.isValid()) { throw new IllegalArgumentException("Given drmInfo is invalid/null"); - } else if (STATE_UNINITIALIZED == getState()) { - throw new IllegalStateException("Not Initialized yet"); } int result = ERROR_UNKNOWN; if (null != mEventHandler) { @@ -526,8 +452,6 @@ public class DrmManagerClient { public int acquireDrmInfo(DrmInfoRequest drmInfoRequest) { if (null == drmInfoRequest || !drmInfoRequest.isValid()) { throw new IllegalArgumentException("Given drmInfoRequest is invalid/null"); - } else if (STATE_UNINITIALIZED == getState()) { - throw new IllegalStateException("Not Initialized yet"); } int result = ERROR_UNKNOWN; if (null != mEventHandler) { @@ -550,8 +474,6 @@ public class DrmManagerClient { public int getDrmObjectType(String path, String mimeType) { if ((null == path || path.equals("")) && (null == mimeType || mimeType.equals(""))) { throw new IllegalArgumentException("Path or the mimetype should be non null"); - } else if (STATE_UNINITIALIZED == getState()) { - throw new IllegalStateException("Not Initialized yet"); } return _getDrmObjectType(mUniqueId, path, mimeType); } @@ -589,8 +511,6 @@ public class DrmManagerClient { public String getOriginalMimeType(String path) { if (null == path || path.equals("")) { throw new IllegalArgumentException("Given path should be non null"); - } else if (STATE_UNINITIALIZED == getState()) { - throw new IllegalStateException("Not Initialized yet"); } return _getOriginalMimeType(mUniqueId, path); } @@ -644,8 +564,6 @@ public class DrmManagerClient { public int checkRightsStatus(String path, int action) { if (null == path || path.equals("") || !DrmStore.Action.isValid(action)) { throw new IllegalArgumentException("Given path or action is not valid"); - } else if (STATE_UNINITIALIZED == getState()) { - throw new IllegalStateException("Not Initialized yet"); } return _checkRightsStatus(mUniqueId, path, action); } @@ -676,8 +594,6 @@ public class DrmManagerClient { public int removeRights(String path) { if (null == path || path.equals("")) { throw new IllegalArgumentException("Given path should be non null"); - } else if (STATE_UNINITIALIZED == getState()) { - throw new IllegalStateException("Not Initialized yet"); } return _removeRights(mUniqueId, path); } @@ -706,9 +622,6 @@ public class DrmManagerClient { * ERROR_UNKNOWN for failure */ public int removeAllRights() { - if (STATE_UNINITIALIZED == getState()) { - throw new IllegalStateException("Not Initialized yet"); - } int result = ERROR_UNKNOWN; if (null != mEventHandler) { Message msg = mEventHandler.obtainMessage(ACTION_REMOVE_ALL_RIGHTS); @@ -729,8 +642,6 @@ public class DrmManagerClient { public int openConvertSession(String mimeType) { if (null == mimeType || mimeType.equals("")) { throw new IllegalArgumentException("Path or the mimeType should be non null"); - } else if (STATE_UNINITIALIZED == getState()) { - throw new IllegalStateException("Not Initialized yet"); } return _openConvertSession(mUniqueId, mimeType); } @@ -750,8 +661,6 @@ public class DrmManagerClient { public DrmConvertedStatus convertData(int convertId, byte[] inputData) { if (null == inputData || 0 >= inputData.length) { throw new IllegalArgumentException("Given inputData should be non null"); - } else if (STATE_UNINITIALIZED == getState()) { - throw new IllegalStateException("Not Initialized yet"); } return _convertData(mUniqueId, convertId, inputData); } @@ -769,28 +678,17 @@ public class DrmManagerClient { * the application on which offset these signature data should be appended. */ public DrmConvertedStatus closeConvertSession(int convertId) { - if (STATE_UNINITIALIZED == getState()) { - throw new IllegalStateException("Not Initialized yet"); - } return _closeConvertSession(mUniqueId, convertId); } - private int getState() { - return mCurrentState; - } - private int getEventType(int infoType) { int eventType = -1; switch (infoType) { case DrmInfoRequest.TYPE_REGISTRATION_INFO: - eventType = DrmEvent.TYPE_REGISTERED; - break; case DrmInfoRequest.TYPE_UNREGISTRATION_INFO: - eventType = DrmEvent.TYPE_UNREGISTERED; - break; case DrmInfoRequest.TYPE_RIGHTS_ACQUISITION_INFO: - eventType = DrmEvent.TYPE_RIGHTS_ACQUIRED; + eventType = DrmEvent.TYPE_DRM_INFO_PROCESSED; break; } return eventType; @@ -801,13 +699,9 @@ public class DrmManagerClient { switch (infoType) { case DrmInfoRequest.TYPE_REGISTRATION_INFO: - error = DrmErrorEvent.TYPE_REGISTRATION_FAILED; - break; case DrmInfoRequest.TYPE_UNREGISTRATION_INFO: - error = DrmErrorEvent.TYPE_UNREGISTRATION_FAILED; - break; case DrmInfoRequest.TYPE_RIGHTS_ACQUISITION_INFO: - error = DrmErrorEvent.TYPE_RIGHTS_ACQUISITION_FAILED; + error = DrmErrorEvent.TYPE_PROCESS_DRM_INFO_FAILED; break; } return error; @@ -822,25 +716,35 @@ public class DrmManagerClient { * <row_index> the index of the content in given table */ private String convertUriToPath(Uri uri) { + String path = null; String scheme = uri.getScheme(); - if (null == scheme || scheme.equals("file")) { - return uri.getPath(); - } - String[] projection = new String[] {MediaStore.MediaColumns.DATA}; - Cursor cursor = mContext.getContentResolver().query(uri, projection, null, null, null); - if (null == cursor || 0 == cursor.getCount() || !cursor.moveToFirst()) { - throw new IllegalArgumentException("Given Uri could not be found in media store"); + if (null == scheme || scheme.equals("") || scheme.equals(ContentResolver.SCHEME_FILE)) { + path = uri.getPath(); + } else if (scheme.equals(ContentResolver.SCHEME_CONTENT)) { + String[] projection = new String[] {MediaStore.MediaColumns.DATA}; + Cursor cursor = null; + try { + cursor = mContext.getContentResolver().query(uri, projection, null, null, null); + } catch (SQLiteException e) { + throw new IllegalArgumentException("Given Uri is not formatted in a way " + + "so that it can be found in media store."); + } + if (null == cursor || 0 == cursor.getCount() || !cursor.moveToFirst()) { + throw new IllegalArgumentException("Given Uri could not be found in media store"); + } + int pathIndex = cursor.getColumnIndexOrThrow(MediaStore.MediaColumns.DATA); + path = cursor.getString(pathIndex); + cursor.close(); + } else { + throw new IllegalArgumentException("Given Uri scheme is not supported"); } - int pathIndex = cursor.getColumnIndexOrThrow(MediaStore.MediaColumns.DATA); - String path = cursor.getString(pathIndex); - cursor.close(); return path; } // private native interfaces - private native int _loadPlugIns(int uniqueId, Object weak_this); + private native void _initialize(int uniqueId, Object weak_this); - private native int _unloadPlugIns(int uniqueId); + private native void _finalize(int uniqueId); private native void _installDrmEngine(int uniqueId, String engineFilepath); diff --git a/drm/java/android/drm/DrmUtils.java b/drm/java/android/drm/DrmUtils.java index 5e5397c..8903485 100644 --- a/drm/java/android/drm/DrmUtils.java +++ b/drm/java/android/drm/DrmUtils.java @@ -167,6 +167,9 @@ public class DrmUtils { //Fetch Value String strValue = readMultipleBytes(constraintData, valueLength, index); + if (strValue.equals(" ")) { + strValue = ""; + } index += valueLength; mMap.put(strKey, strValue); } diff --git a/drm/jni/android_drm_DrmManagerClient.cpp b/drm/jni/android_drm_DrmManagerClient.cpp index 6158b66..e5e4547 100644 --- a/drm/jni/android_drm_DrmManagerClient.cpp +++ b/drm/jni/android_drm_DrmManagerClient.cpp @@ -15,7 +15,7 @@ */ //#define LOG_NDEBUG 0 -#define LOG_TAG "DrmManager-JNI" +#define LOG_TAG "android_drm_DrmManagerClient" #include <utils/Log.h> #include <jni.h> @@ -223,38 +223,32 @@ static sp<DrmManagerClientImpl> getDrmManagerClientImpl(JNIEnv* env, jobject thi return sp<DrmManagerClientImpl>(client); } -static jint android_drm_DrmManagerClient_loadPlugIns( +static void android_drm_DrmManagerClient_initialize( JNIEnv* env, jobject thiz, jint uniqueId, jobject weak_thiz) { - LOGV("load plugins - Enter"); + LOGV("initialize - Enter"); sp<DrmManagerClientImpl> drmManager = DrmManagerClientImpl::create(&uniqueId); + drmManager->addClient(uniqueId); // Set the listener to DrmManager sp<DrmManagerClient::OnInfoListener> listener = new JNIOnInfoListener(env, thiz, weak_thiz); drmManager->setOnInfoListener(uniqueId, listener); setDrmManagerClientImpl(env, thiz, drmManager); - - LOGV("load plugins - Exit"); - return getDrmManagerClientImpl(env, thiz)->loadPlugIns(uniqueId); + LOGV("initialize - Exit"); } -static jint android_drm_DrmManagerClient_unloadPlugIns(JNIEnv* env, jobject thiz, jint uniqueId) { - LOGV("unload plugins - Enter"); - sp<DrmManagerClientImpl> client = getDrmManagerClientImpl(env, thiz); - +static void android_drm_DrmManagerClient_finalize(JNIEnv* env, jobject thiz, jint uniqueId) { + LOGV("finalize - Enter"); DrmManagerClientImpl::remove(uniqueId); - int result = client->unloadPlugIns(uniqueId); - if (DRM_NO_ERROR == result) { - client->setOnInfoListener(uniqueId, NULL); + getDrmManagerClientImpl(env, thiz)->setOnInfoListener(uniqueId, NULL); - sp<DrmManagerClientImpl> oldClient = setDrmManagerClientImpl(env, thiz, NULL); - if (oldClient != NULL) { - oldClient->setOnInfoListener(uniqueId, NULL); - } + sp<DrmManagerClientImpl> oldClient = setDrmManagerClientImpl(env, thiz, NULL); + if (oldClient != NULL) { + oldClient->setOnInfoListener(uniqueId, NULL); + oldClient->removeClient(uniqueId); } - LOGV("unload plugins - Exit"); - return result; + LOGV("finalize - Exit"); } static jobject android_drm_DrmManagerClient_getConstraintsFromContent( @@ -441,6 +435,7 @@ static jobject android_drm_DrmManagerClient_processDrmInfo( if (NULL != localRef && NULL != pDrmInfoStatus) { int statusCode = pDrmInfoStatus->statusCode; + int infoType = pDrmInfoStatus->infoType; jbyteArray dataArray = NULL; if (NULL != pDrmInfoStatus->drmBuffer) { @@ -461,10 +456,10 @@ static jobject android_drm_DrmManagerClient_processDrmInfo( constructorId = env->GetMethodID(localRef, - "<init>", "(ILandroid/drm/ProcessedData;Ljava/lang/String;)V"); + "<init>", "(IILandroid/drm/ProcessedData;Ljava/lang/String;)V"); - drmInfoStatus = env->NewObject(localRef, constructorId, statusCode, processedData, - env->NewStringUTF(pDrmInfoStatus->mimeType.string())); + drmInfoStatus = env->NewObject(localRef, constructorId, statusCode, infoType, + processedData, env->NewStringUTF(pDrmInfoStatus->mimeType.string())); } delete mData; mData = NULL; @@ -678,11 +673,11 @@ static jobject android_drm_DrmManagerClient_closeConvertSession( static JNINativeMethod nativeMethods[] = { - {"_loadPlugIns", "(ILjava/lang/Object;)I", - (void*)android_drm_DrmManagerClient_loadPlugIns}, + {"_initialize", "(ILjava/lang/Object;)V", + (void*)android_drm_DrmManagerClient_initialize}, - {"_unloadPlugIns", "(I)I", - (void*)android_drm_DrmManagerClient_unloadPlugIns}, + {"_finalize", "(I)V", + (void*)android_drm_DrmManagerClient_finalize}, {"_getConstraints", "(ILjava/lang/String;I)Landroid/content/ContentValues;", (void*)android_drm_DrmManagerClient_getConstraintsFromContent}, diff --git a/drm/libdrmframework/DrmManagerClient.cpp b/drm/libdrmframework/DrmManagerClient.cpp index c996994..f0439eb 100644 --- a/drm/libdrmframework/DrmManagerClient.cpp +++ b/drm/libdrmframework/DrmManagerClient.cpp @@ -22,36 +22,23 @@ using namespace android; -DrmManagerClient::DrmManagerClient() { - int uniqueId = 0; - mDrmManagerClientImpl = NULL; - - mDrmManagerClientImpl = DrmManagerClientImpl::create(&uniqueId); - mUniqueId = uniqueId; - - loadPlugIns(); +DrmManagerClient::DrmManagerClient(): + mUniqueId(0), mDrmManagerClientImpl(NULL) { + mDrmManagerClientImpl = DrmManagerClientImpl::create(&mUniqueId); + mDrmManagerClientImpl->addClient(mUniqueId); } DrmManagerClient::~DrmManagerClient() { DrmManagerClientImpl::remove(mUniqueId); - unloadPlugIns(); - + mDrmManagerClientImpl->removeClient(mUniqueId); delete mDrmManagerClientImpl; mDrmManagerClientImpl = NULL; } -status_t DrmManagerClient::loadPlugIns() { - return mDrmManagerClientImpl->loadPlugIns(mUniqueId); -} - status_t DrmManagerClient::setOnInfoListener( const sp<DrmManagerClient::OnInfoListener>& infoListener) { return mDrmManagerClientImpl->setOnInfoListener(mUniqueId, infoListener); } -status_t DrmManagerClient::unloadPlugIns() { - return mDrmManagerClientImpl->unloadPlugIns(mUniqueId); -} - DrmConstraints* DrmManagerClient::getConstraints(const String8* path, const int action) { return mDrmManagerClientImpl->getConstraints(mUniqueId, path, action); } @@ -86,6 +73,7 @@ int DrmManagerClient::checkRightsStatus(const String8& path, int action) { } status_t DrmManagerClient::consumeRights(DecryptHandle* decryptHandle, int action, bool reserve) { + Mutex::Autolock _l(mDecryptLock); return mDrmManagerClientImpl->consumeRights(mUniqueId, decryptHandle, action, reserve); } @@ -128,12 +116,17 @@ DecryptHandle* DrmManagerClient::openDecryptSession(int fd, int offset, int leng return mDrmManagerClientImpl->openDecryptSession(mUniqueId, fd, offset, length); } +DecryptHandle* DrmManagerClient::openDecryptSession(const char* uri) { + return mDrmManagerClientImpl->openDecryptSession(mUniqueId, uri); +} + status_t DrmManagerClient::closeDecryptSession(DecryptHandle* decryptHandle) { return mDrmManagerClientImpl->closeDecryptSession(mUniqueId, decryptHandle); } status_t DrmManagerClient::initializeDecryptUnit( DecryptHandle* decryptHandle, int decryptUnitId, const DrmBuffer* headerInfo) { + Mutex::Autolock _l(mDecryptLock); return mDrmManagerClientImpl->initializeDecryptUnit( mUniqueId, decryptHandle, decryptUnitId, headerInfo); } @@ -141,16 +134,19 @@ status_t DrmManagerClient::initializeDecryptUnit( status_t DrmManagerClient::decrypt( DecryptHandle* decryptHandle, int decryptUnitId, const DrmBuffer* encBuffer, DrmBuffer** decBuffer, DrmBuffer* IV) { + Mutex::Autolock _l(mDecryptLock); return mDrmManagerClientImpl->decrypt( mUniqueId, decryptHandle, decryptUnitId, encBuffer, decBuffer, IV); } status_t DrmManagerClient::finalizeDecryptUnit(DecryptHandle* decryptHandle, int decryptUnitId) { + Mutex::Autolock _l(mDecryptLock); return mDrmManagerClientImpl->finalizeDecryptUnit(mUniqueId, decryptHandle, decryptUnitId); } ssize_t DrmManagerClient::pread( DecryptHandle* decryptHandle, void* buffer, ssize_t numBytes, off_t offset) { + Mutex::Autolock _l(mDecryptLock); return mDrmManagerClientImpl->pread(mUniqueId, decryptHandle, buffer, numBytes, offset); } diff --git a/drm/libdrmframework/DrmManagerClientImpl.cpp b/drm/libdrmframework/DrmManagerClientImpl.cpp index 272adcd..b3ae9a7 100644 --- a/drm/libdrmframework/DrmManagerClientImpl.cpp +++ b/drm/libdrmframework/DrmManagerClientImpl.cpp @@ -46,14 +46,6 @@ void DrmManagerClientImpl::remove(int uniqueId) { getDrmManagerService()->removeUniqueId(uniqueId); } -DrmManagerClientImpl::DrmManagerClientImpl() { - -} - -DrmManagerClientImpl::~DrmManagerClientImpl() { - -} - const sp<IDrmManagerService>& DrmManagerClientImpl::getDrmManagerService() { mMutex.lock(); if (NULL == mDrmManagerService.get()) { @@ -77,16 +69,12 @@ const sp<IDrmManagerService>& DrmManagerClientImpl::getDrmManagerService() { return mDrmManagerService; } -status_t DrmManagerClientImpl::loadPlugIns(int uniqueId) { - return getDrmManagerService()->loadPlugIns(uniqueId); +void DrmManagerClientImpl::addClient(int uniqueId) { + getDrmManagerService()->addClient(uniqueId); } -status_t DrmManagerClientImpl::loadPlugIns(int uniqueId, const String8& plugInDirPath) { - status_t status = DRM_ERROR_UNKNOWN; - if (EMPTY_STRING != plugInDirPath) { - status = getDrmManagerService()->loadPlugIns(uniqueId, plugInDirPath); - } - return status; +void DrmManagerClientImpl::removeClient(int uniqueId) { + getDrmManagerService()->removeClient(uniqueId); } status_t DrmManagerClientImpl::setOnInfoListener( @@ -96,10 +84,6 @@ status_t DrmManagerClientImpl::setOnInfoListener( return getDrmManagerService()->setDrmServiceListener(uniqueId, this); } -status_t DrmManagerClientImpl::unloadPlugIns(int uniqueId) { - return getDrmManagerService()->unloadPlugIns(uniqueId); -} - status_t DrmManagerClientImpl::installDrmEngine(int uniqueId, const String8& drmEngineFile) { status_t status = DRM_ERROR_UNKNOWN; if (EMPTY_STRING != drmEngineFile) { @@ -251,6 +235,14 @@ DecryptHandle* DrmManagerClientImpl::openDecryptSession( return getDrmManagerService()->openDecryptSession(uniqueId, fd, offset, length); } +DecryptHandle* DrmManagerClientImpl::openDecryptSession(int uniqueId, const char* uri) { + DecryptHandle* handle = NULL; + if (NULL != uri) { + handle = getDrmManagerService()->openDecryptSession(uniqueId, uri); + } + return handle; +} + status_t DrmManagerClientImpl::closeDecryptSession(int uniqueId, DecryptHandle* decryptHandle) { status_t status = DRM_ERROR_UNKNOWN; if (NULL != decryptHandle) { diff --git a/drm/libdrmframework/include/DrmManager.h b/drm/libdrmframework/include/DrmManager.h index dc3e460..d782f5b 100644 --- a/drm/libdrmframework/include/DrmManager.h +++ b/drm/libdrmframework/include/DrmManager.h @@ -57,15 +57,19 @@ public: void removeUniqueId(int uniqueId); - status_t loadPlugIns(int uniqueId); + void addClient(int uniqueId); - status_t loadPlugIns(int uniqueId, const String8& plugInDirPath); + void removeClient(int uniqueId); + + status_t loadPlugIns(); + + status_t loadPlugIns(const String8& plugInDirPath); + + status_t unloadPlugIns(); status_t setDrmServiceListener( int uniqueId, const sp<IDrmServiceListener>& drmServiceListener); - status_t unloadPlugIns(int uniqueId); - status_t installDrmEngine(int uniqueId, const String8& drmEngineFile); DrmConstraints* getConstraints(int uniqueId, const String8* path, const int action); @@ -107,6 +111,8 @@ public: DecryptHandle* openDecryptSession(int uniqueId, int fd, int offset, int length); + DecryptHandle* openDecryptSession(int uniqueId, const char* uri); + status_t closeDecryptSession(int uniqueId, DecryptHandle* decryptHandle); status_t initializeDecryptUnit(int uniqueId, DecryptHandle* decryptHandle, @@ -129,12 +135,8 @@ private: String8 getSupportedPlugInIdFromPath(int uniqueId, const String8& path); - void populate(int uniqueId); - bool canHandle(int uniqueId, const String8& path); - void initializePlugIns(int uniqueId); - private: static Vector<int> mUniqueIdVector; static const String8 EMPTY_STRING; diff --git a/drm/libdrmframework/include/DrmManagerClientImpl.h b/drm/libdrmframework/include/DrmManagerClientImpl.h index 492c7f5..1c6be46 100644 --- a/drm/libdrmframework/include/DrmManagerClientImpl.h +++ b/drm/libdrmframework/include/DrmManagerClientImpl.h @@ -35,36 +35,29 @@ class DrmInfoEvent; */ class DrmManagerClientImpl : public BnDrmServiceListener { private: - DrmManagerClientImpl(); + DrmManagerClientImpl() { } public: static DrmManagerClientImpl* create(int* pUniqueId); static void remove(int uniqueId); - virtual ~DrmManagerClientImpl(); + virtual ~DrmManagerClientImpl() { } public: /** - * Initialize DRM Manager - * load available plug-ins from default plugInDirPath + * Adds the client respective to given unique id. * * @param[in] uniqueId Unique identifier for a session - * @return status_t - * Returns DRM_NO_ERROR for success, DRM_ERROR_UNKNOWN for failure */ - status_t loadPlugIns(int uniqueId); + void addClient(int uniqueId); /** - * Finalize DRM Manager - * release resources associated with each plug-in - * unload all plug-ins and etc. + * Removes the client respective to given unique id. * * @param[in] uniqueId Unique identifier for a session - * @return status_t - * Returns DRM_NO_ERROR for success, DRM_ERROR_UNKNOWN for failure */ - status_t unloadPlugIns(int uniqueId); + void removeClient(int uniqueId); /** * Register a callback to be invoked when the caller required to @@ -301,6 +294,16 @@ public: DecryptHandle* openDecryptSession(int uniqueId, int fd, int offset, int length); /** + * Open the decrypt session to decrypt the given protected content + * + * @param[in] uniqueId Unique identifier for a session + * @param[in] uri Path of the protected content to be decrypted + * @return + * Handle for the decryption session + */ + DecryptHandle* openDecryptSession(int uniqueId, const char* uri); + + /** * Close the decrypt session for the given handle * * @param[in] uniqueId Unique identifier for a session @@ -379,17 +382,6 @@ public: private: /** - * Initialize DRM Manager - * load available plug-ins from plugInDirPath - * - * @param[in] uniqueId Unique identifier for a session - * @param[in] plugInDirPath Directory from where to load plug-ins - * @return status_t - * Returns DRM_NO_ERROR for success, DRM_ERROR_UNKNOWN for failure - */ - status_t loadPlugIns(int uniqueId, const String8& plugInDirPath); - - /** * Install new DRM Engine Plug-in at the runtime * * @param[in] uniqueId Unique identifier for a session diff --git a/drm/libdrmframework/include/DrmManagerService.h b/drm/libdrmframework/include/DrmManagerService.h index f455e15..4a3aeae 100644 --- a/drm/libdrmframework/include/DrmManagerService.h +++ b/drm/libdrmframework/include/DrmManagerService.h @@ -50,15 +50,13 @@ public: void removeUniqueId(int uniqueId); - status_t loadPlugIns(int uniqueId); + void addClient(int uniqueId); - status_t loadPlugIns(int uniqueId, const String8& plugInDirPath); + void removeClient(int uniqueId); status_t setDrmServiceListener( int uniqueId, const sp<IDrmServiceListener>& drmServiceListener); - status_t unloadPlugIns(int uniqueId); - status_t installDrmEngine(int uniqueId, const String8& drmEngineFile); DrmConstraints* getConstraints(int uniqueId, const String8* path, const int action); @@ -100,6 +98,8 @@ public: DecryptHandle* openDecryptSession(int uniqueId, int fd, int offset, int length); + DecryptHandle* openDecryptSession(int uniqueId, const char* uri); + status_t closeDecryptSession(int uniqueId, DecryptHandle* decryptHandle); status_t initializeDecryptUnit(int uniqueId, DecryptHandle* decryptHandle, diff --git a/drm/libdrmframework/include/IDrmManagerService.h b/drm/libdrmframework/include/IDrmManagerService.h index 5c668ed..1275488 100644 --- a/drm/libdrmframework/include/IDrmManagerService.h +++ b/drm/libdrmframework/include/IDrmManagerService.h @@ -46,10 +46,9 @@ public: enum { ADD_UNIQUEID = IBinder::FIRST_CALL_TRANSACTION, REMOVE_UNIQUEID, - LOAD_PLUGINS, - LOAD_PLUGINS_FROM_PATH, + ADD_CLIENT, + REMOVE_CLIENT, SET_DRM_SERVICE_LISTENER, - UNLOAD_PLUGINS, INSTALL_DRM_ENGINE, GET_CONSTRAINTS_FROM_CONTENT, CAN_HANDLE, @@ -69,6 +68,7 @@ public: CLOSE_CONVERT_SESSION, GET_ALL_SUPPORT_INFO, OPEN_DECRYPT_SESSION, + OPEN_DECRYPT_SESSION_FROM_URI, CLOSE_DECRYPT_SESSION, INITIALIZE_DECRYPT_UNIT, DECRYPT, @@ -84,15 +84,13 @@ public: virtual void removeUniqueId(int uniqueId) = 0; - virtual status_t loadPlugIns(int uniqueId) = 0; + virtual void addClient(int uniqueId) = 0; - virtual status_t loadPlugIns(int uniqueId, const String8& plugInDirPath) = 0; + virtual void removeClient(int uniqueId) = 0; virtual status_t setDrmServiceListener( int uniqueId, const sp<IDrmServiceListener>& infoListener) = 0; - virtual status_t unloadPlugIns(int uniqueId) = 0; - virtual status_t installDrmEngine(int uniqueId, const String8& drmEngineFile) = 0; virtual DrmConstraints* getConstraints( @@ -140,6 +138,8 @@ public: virtual DecryptHandle* openDecryptSession(int uniqueId, int fd, int offset, int length) = 0; + virtual DecryptHandle* openDecryptSession(int uniqueId, const char* uri) = 0; + virtual status_t closeDecryptSession(int uniqueId, DecryptHandle* decryptHandle) = 0; virtual status_t initializeDecryptUnit(int uniqueId, DecryptHandle* decryptHandle, @@ -168,15 +168,13 @@ public: virtual void removeUniqueId(int uniqueId); - virtual status_t loadPlugIns(int uniqueId); + virtual void addClient(int uniqueId); - virtual status_t loadPlugIns(int uniqueId, const String8& plugInDirPath); + virtual void removeClient(int uniqueId); virtual status_t setDrmServiceListener( int uniqueId, const sp<IDrmServiceListener>& infoListener); - virtual status_t unloadPlugIns(int uniqueId); - virtual status_t installDrmEngine(int uniqueId, const String8& drmEngineFile); virtual DrmConstraints* getConstraints(int uniqueId, const String8* path, const int action); @@ -221,6 +219,8 @@ public: virtual DecryptHandle* openDecryptSession(int uniqueId, int fd, int offset, int length); + virtual DecryptHandle* openDecryptSession(int uniqueId, const char* uri); + virtual status_t closeDecryptSession(int uniqueId, DecryptHandle* decryptHandle); virtual status_t initializeDecryptUnit(int uniqueId, DecryptHandle* decryptHandle, diff --git a/drm/libdrmframework/plugins/common/include/DrmEngineBase.h b/drm/libdrmframework/plugins/common/include/DrmEngineBase.h index b355534..5851af5 100644 --- a/drm/libdrmframework/plugins/common/include/DrmEngineBase.h +++ b/drm/libdrmframework/plugins/common/include/DrmEngineBase.h @@ -80,6 +80,9 @@ public: status_t openDecryptSession( int uniqueId, DecryptHandle* decryptHandle, int fd, int offset, int length); + status_t openDecryptSession( + int uniqueId, DecryptHandle* decryptHandle, const char* uri); + status_t closeDecryptSession(int uniqueId, DecryptHandle* decryptHandle); status_t initializeDecryptUnit(int uniqueId, DecryptHandle* decryptHandle, @@ -355,6 +358,18 @@ protected: int uniqueId, DecryptHandle* decryptHandle, int fd, int offset, int length) = 0; /** + * Open the decrypt session to decrypt the given protected content + * + * @param[in] uniqueId Unique identifier for a session + * @param[in] decryptHandle Handle for the current decryption session + * @param[in] uri Path of the protected content to be decrypted + * @return + * DRM_ERROR_CANNOT_HANDLE for failure and DRM_NO_ERROR for success + */ + virtual status_t onOpenDecryptSession( + int uniqueId, DecryptHandle* decryptHandle, const char* uri) = 0; + + /** * Close the decrypt session for the given handle * * @param[in] uniqueId Unique identifier for a session diff --git a/drm/libdrmframework/plugins/common/include/IDrmEngine.h b/drm/libdrmframework/plugins/common/include/IDrmEngine.h index b711500..cc03ef2 100644 --- a/drm/libdrmframework/plugins/common/include/IDrmEngine.h +++ b/drm/libdrmframework/plugins/common/include/IDrmEngine.h @@ -315,6 +315,18 @@ public: int uniqueId, DecryptHandle* decryptHandle, int fd, int offset, int length) = 0; /** + * Open the decrypt session to decrypt the given protected content + * + * @param[in] uniqueId Unique identifier for a session + * @param[in] decryptHandle Handle for the current decryption session + * @param[in] uri Path of the protected content to be decrypted + * @return + * DRM_ERROR_CANNOT_HANDLE for failure and DRM_NO_ERROR for success + */ + virtual status_t openDecryptSession( + int uniqueId, DecryptHandle* decryptHandle, const char* uri) = 0; + + /** * Close the decrypt session for the given handle * * @param[in] uniqueId Unique identifier for a session diff --git a/drm/libdrmframework/plugins/passthru/include/DrmPassthruPlugIn.h b/drm/libdrmframework/plugins/passthru/include/DrmPassthruPlugIn.h index eed1628..ddb7fd3 100644 --- a/drm/libdrmframework/plugins/passthru/include/DrmPassthruPlugIn.h +++ b/drm/libdrmframework/plugins/passthru/include/DrmPassthruPlugIn.h @@ -74,6 +74,9 @@ protected: status_t onOpenDecryptSession( int uniqueId, DecryptHandle* decryptHandle, int fd, int offset, int length); + status_t onOpenDecryptSession( + int uniqueId, DecryptHandle* decryptHandle, const char* uri); + status_t onCloseDecryptSession(int uniqueId, DecryptHandle* decryptHandle); status_t onInitializeDecryptUnit(int uniqueId, DecryptHandle* decryptHandle, diff --git a/drm/libdrmframework/plugins/passthru/src/DrmPassthruPlugIn.cpp b/drm/libdrmframework/plugins/passthru/src/DrmPassthruPlugIn.cpp index 4c7714d..41f8e91 100644 --- a/drm/libdrmframework/plugins/passthru/src/DrmPassthruPlugIn.cpp +++ b/drm/libdrmframework/plugins/passthru/src/DrmPassthruPlugIn.cpp @@ -74,14 +74,14 @@ DrmInfoStatus* DrmPassthruPlugIn::onProcessDrmInfo(int uniqueId, const DrmInfo* switch (drmInfo->getInfoType()) { case DrmInfoRequest::TYPE_REGISTRATION_INFO: { const DrmBuffer* emptyBuffer = new DrmBuffer(); - drmInfoStatus - = new DrmInfoStatus(DrmInfoStatus::STATUS_OK, emptyBuffer, drmInfo->getMimeType()); + drmInfoStatus = new DrmInfoStatus(DrmInfoStatus::STATUS_OK, + DrmInfoRequest::TYPE_REGISTRATION_INFO, emptyBuffer, drmInfo->getMimeType()); break; } case DrmInfoRequest::TYPE_UNREGISTRATION_INFO: { const DrmBuffer* emptyBuffer = new DrmBuffer(); - drmInfoStatus - = new DrmInfoStatus(DrmInfoStatus::STATUS_OK, emptyBuffer, drmInfo->getMimeType()); + drmInfoStatus = new DrmInfoStatus(DrmInfoStatus::STATUS_OK, + DrmInfoRequest::TYPE_UNREGISTRATION_INFO, emptyBuffer, drmInfo->getMimeType()); break; } case DrmInfoRequest::TYPE_RIGHTS_ACQUISITION_INFO: { @@ -91,8 +91,8 @@ DrmInfoStatus* DrmPassthruPlugIn::onProcessDrmInfo(int uniqueId, const DrmInfo* data = new char[bufferSize]; memcpy(data, licenseString.string(), bufferSize); const DrmBuffer* buffer = new DrmBuffer(data, bufferSize); - drmInfoStatus - = new DrmInfoStatus(DrmInfoStatus::STATUS_OK, buffer, drmInfo->getMimeType()); + drmInfoStatus = new DrmInfoStatus(DrmInfoStatus::STATUS_OK, + DrmInfoRequest::TYPE_RIGHTS_ACQUISITION_INFO, buffer, drmInfo->getMimeType()); break; } } @@ -243,6 +243,11 @@ status_t DrmPassthruPlugIn::onOpenDecryptSession( return DRM_ERROR_CANNOT_HANDLE; } +status_t DrmPassthruPlugIn::onOpenDecryptSession( + int uniqueId, DecryptHandle* decryptHandle, const char* uri) { + return DRM_ERROR_CANNOT_HANDLE; +} + status_t DrmPassthruPlugIn::onCloseDecryptSession(int uniqueId, DecryptHandle* decryptHandle) { LOGD("DrmPassthruPlugIn::onCloseDecryptSession() : %d", uniqueId); if (NULL != decryptHandle) { diff --git a/include/drm/DrmInfoEvent.h b/include/drm/DrmInfoEvent.h index c722bd3..7b409ff 100644 --- a/include/drm/DrmInfoEvent.h +++ b/include/drm/DrmInfoEvent.h @@ -59,8 +59,8 @@ public: //! TYPE_NO_INTERNET_CONNECTION, when the Internet connection is missing and no attempt //! can be made to renew rights static const int TYPE_NO_INTERNET_CONNECTION = 2005; - //! TYPE_REGISTRATION_FAILED, when registration with server failed. - static const int TYPE_REGISTRATION_FAILED = 2006; + //! TYPE_PROCESS_DRM_INFO_FAILED, when failed to process DrmInfo. + static const int TYPE_PROCESS_DRM_INFO_FAILED = 2006; public: /** diff --git a/include/drm/DrmInfoStatus.h b/include/drm/DrmInfoStatus.h index 806aea1..88c0f40 100644 --- a/include/drm/DrmInfoStatus.h +++ b/include/drm/DrmInfoStatus.h @@ -41,10 +41,11 @@ public: * Constructor for DrmInfoStatus * * @param[in] _statusCode Status of the communication + * @param[in] _infoType Type of the DRM information processed * @param[in] _drmBuffer Rights information * @param[in] _mimeType MIME type */ - DrmInfoStatus(int _statusCode, const DrmBuffer* _drmBuffer, const String8& _mimeType); + DrmInfoStatus(int _statusCode, int _infoType, const DrmBuffer* _drmBuffer, const String8& _mimeType); /** * Destructor for DrmInfoStatus @@ -55,6 +56,7 @@ public: public: int statusCode; + int infoType; const DrmBuffer* drmBuffer; String8 mimeType; }; diff --git a/include/drm/DrmManagerClient.h b/include/drm/DrmManagerClient.h index c2ad084..5963c42 100644 --- a/include/drm/DrmManagerClient.h +++ b/include/drm/DrmManagerClient.h @@ -17,6 +17,7 @@ #ifndef __DRM_MANAGER_CLIENT_H__ #define __DRM_MANAGER_CLIENT_H__ +#include <utils/threads.h> #include <binder/IInterface.h> #include "drm_framework_common.h" @@ -67,6 +68,15 @@ public: DecryptHandle* openDecryptSession(int fd, int offset, int length); /** + * Open the decrypt session to decrypt the given protected content + * + * @param[in] uri Path of the protected content to be decrypted + * @return + * Handle for the decryption session + */ + DecryptHandle* openDecryptSession(const char* uri); + + /** * Close the decrypt session for the given handle * * @param[in] decryptHandle Handle for the decryption session @@ -339,27 +349,8 @@ public: status_t getAllSupportInfo(int* length, DrmSupportInfo** drmSupportInfoArray); private: - /** - * Initialize DRM Manager - * load available plug-ins from default plugInDirPath - * - * @return status_t - * Returns DRM_NO_ERROR for success, DRM_ERROR_UNKNOWN for failure - */ - status_t loadPlugIns(); - - /** - * Finalize DRM Manager - * release resources associated with each plug-in - * unload all plug-ins and etc. - * - * @return status_t - * Returns DRM_NO_ERROR for success, DRM_ERROR_UNKNOWN for failure - */ - status_t unloadPlugIns(); - -private: int mUniqueId; + Mutex mDecryptLock; DrmManagerClientImpl* mDrmManagerClientImpl; }; |