blob: e74ef710707331d4022b8a2272c51187a7d92405 [file] [log] [blame]
/* ------------------------------------------------------------------
* Copyright (C) 2008 PacketVideo
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
* express or implied.
* See the License for the specific language governing permissions
* and limitations under the License.
* -------------------------------------------------------------------
*/
#ifndef PVMF_CPMPLUGIN_PASSTHRU_OMA1_H_INCLUDED
#define PVMF_CPMPLUGIN_PASSTHRU_OMA1_H_INCLUDED
#ifndef OSCL_BASE_H_INCLUDED
#include "oscl_base.h"
#endif
#ifndef OSCL_TYPES_H_INCLUDED
#include "oscl_types.h"
#endif
#ifndef PVLOGGER_H_INCLUDED
#include "pvlogger.h"
#endif
#ifndef PVMF_NODE_INTERFACE_H_INCLUDED
#include "pvmf_node_interface.h"
#endif
#ifndef PVMF_NODE_UTILS_H_INCLUDED
#include "pvmf_node_utils.h"
#endif
#ifndef OSCL_SCHEDULER_AO_H_INCLUDED
#include "oscl_scheduler_ao.h"
#endif
#ifndef PVMF_CPMPLUGIN_INTERFACE_H_INCLUDED
#include "pvmf_cpmplugin_interface.h"
#endif
#ifndef PVMF_CPMPLUGIN_AUTHORIZATION_INTERFACE_H_INCLUDED
#include "pvmf_cpmplugin_authorization_interface.h"
#endif
#ifndef PVMF_CPMPLUGIN_AUTHENTICATION_INTERFACE_H_INCLUDED
#include "pvmf_cpmplugin_authentication_interface.h"
#endif
#ifndef PVMF_CPMPLUGIN_ACCESS_INTERFACE_FACTORY_H_INCLUDED
#include "pvmf_cpmplugin_access_interface_factory.h"
#endif
#ifndef PVMF_CPMPLUGIN_ACCESS_INTERFACE_H_INCLUDED
#include "pvmf_cpmplugin_access_interface.h"
#endif
#ifndef PVMF_CPMPLUGIN_LICENSE_INTERFACE_H_INCLUDED
#include "pvmf_cpmplugin_license_interface.h"
#endif
#ifndef PVMF_META_DATA_EXTENSION_H_INCLUDED
#include "pvmf_meta_data_extension.h"
#endif
/**
* Macros for calling PVLogger
*/
#define PVMF_CPMPLUGIN_PASSTHRUOMA1_LOGERROR(m) PVLOGGER_LOGMSG(PVLOGMSG_INST_REL,iLogger,PVLOGMSG_ERR,m);
#define PVMF_CPMPLUGIN_PASSTHRUOMA1_LOGWARNING(m) PVLOGGER_LOGMSG(PVLOGMSG_INST_REL,iLogger,PVLOGMSG_WARNING,m);
#define PVMF_CPMPLUGIN_PASSTHRUOMA1_LOGINFOHI(m) PVLOGGER_LOGMSG(PVLOGMSG_INST_HLDBG,iLogger,PVLOGMSG_INFO,m);
#define PVMF_CPMPLUGIN_PASSTHRUOMA1_LOGINFOMED(m) PVLOGGER_LOGMSG(PVLOGMSG_INST_MLDBG,iLogger,PVLOGMSG_INFO,m);
#define PVMF_CPMPLUGIN_PASSTHRUOMA1_LOGINFOLOW(m) PVLOGGER_LOGMSG(PVLOGMSG_INST_LLDBG,iLogger,PVLOGMSG_INFO,m);
#define PVMF_CPMPLUGIN_PASSTHRUOMA1_LOGINFO(m) PVMF_CPMPLUGIN_PASSTHRUOMA1_LOGINFOMED(m)
#define PVMF_CPMPLUGIN_PASSTHRUOMA1_LOGDEBUG(m) PVLOGGER_LOGMSG(PVLOGMSG_INST_LLDBG,iLogger,PVLOGMSG_DEBUG,m);
#define PVMF_CPM_PASSTHRU_PLUGIN_OMA1_INTERNAL_CMDQ_SIZE 10
//use a #define instead of a typedef here to avoid warnings on some compilers.
#define PVMFCPMPassThruPlugInOMA1CommandBase PVMFGenericNodeCommand<OsclMemAllocator>
class PVMFCPMPassThruPlugInOMA1Command : public PVMFCPMPassThruPlugInOMA1CommandBase
{
public:
void Construct(PVMFSessionId s,
int32 cmd,
OsclAny* aArg1,
OsclAny* aArg2,
const OsclAny* aContext)
{
PVMFCPMPassThruPlugInOMA1CommandBase::Construct(s, cmd, aContext);
iParam1 = aArg1;
iParam2 = aArg2;
};
void Parse(OsclAny*&arg1, OsclAny*&arg2)
{
arg1 = iParam1;
arg2 = iParam2;
};
void Construct(PVMFSessionId s,
int32 cmd,
OsclAny* aArg1,
OsclAny* aArg2,
OsclAny* aArg3,
const OsclAny* aContext)
{
PVMFCPMPassThruPlugInOMA1CommandBase::Construct(s, cmd, aContext);
iParam1 = aArg1;
iParam2 = aArg2;
iParam3 = aArg3;
};
void Parse(OsclAny*&arg1, OsclAny*&arg2, OsclAny*&arg3)
{
arg1 = iParam1;
arg2 = iParam2;
arg3 = iParam3;
};
void Construct(PVMFSessionId s,
int32 cmd,
OsclAny* aArg1,
OsclAny* aArg2,
OsclAny* aArg3,
OsclAny* aArg4,
const OsclAny* aContext)
{
PVMFCPMPassThruPlugInOMA1CommandBase::Construct(s, cmd, aContext);
iParam1 = aArg1;
iParam2 = aArg2;
iParam3 = aArg3;
iParam4 = aArg4;
};
void Parse(OsclAny*&arg1, OsclAny*&arg2, OsclAny*&arg3, OsclAny*&arg4)
{
arg1 = iParam1;
arg2 = iParam2;
arg3 = iParam3;
arg4 = iParam4;
};
};
typedef PVMFNodeCommandQueue<PVMFCPMPassThruPlugInOMA1Command, OsclMemAllocator> PVMFCPMPassThruPlugInOMA1CmdQ;
/* Start range for command IDs */
#define PVMF_CPM_PASSTHRU_PLUGIN_OMA1_COMMAND_ID_START 50000
/*
* IDs for all of the asynchronous plugin commands.
*/
enum TPVMFCPMPassThruPlugInOMA1Command
{
PVMF_CPM_PASSTHRU_PLUGIN_OMA1_QUERYUUID = PVMF_GENERIC_NODE_QUERYUUID
, PVMF_CPM_PASSTHRU_PLUGIN_OMA1_QUERYINTERFACE = PVMF_GENERIC_NODE_QUERYINTERFACE
, PVMF_CPM_PASSTHRU_PLUGIN_OMA1_INIT = PVMF_GENERIC_NODE_COMMAND_LAST
, PVMF_CPM_PASSTHRU_PLUGIN_OMA1_RESET
, PVMF_CPM_PASSTHRU_PLUGIN_OMA1_AUTHENTICATE
, PVMF_CPM_PASSTHRU_PLUGIN_OMA1_AUTHORIZE_USAGE
, PVMF_CPM_PASSTHRU_PLUGIN_OMA1_USAGE_COMPLETE
, PVMF_CPM_PASSTHRU_PLUGIN_OMA1_GET_LICENSE
, PVMF_CPM_PASSTHRU_PLUGIN_OMA1_CANCEL_GET_LICENSE
, PVMF_CPM_PASSTHRU_PLUGIN_OMA1_METADATA_KEYS
, PVMF_CPM_PASSTHRU_PLUGIN_OMA1_METADATA_VALUES
};
class OsclFileHandle;
/*
* CPM OMA1.0 Plugin
*/
class PVMFCPMPassThruPlugInOMA1 : public OsclActiveObject,
public PVMFCPMPluginInterface,
public PVMFCPMPluginAuthenticationInterface,
public PVMFCPMPluginAuthorizationInterface,
public PVMFCPMPluginAccessInterfaceFactory,
public PVMFCPMPluginLicenseInterface,
public PVMFMetadataExtensionInterface
{
public:
static PVMFCPMPluginInterface* CreatePlugIn(bool aFailAuthorizeUsage = false, bool aCancelAcquireLicense = false,
bool aSourceInitDataNotSupported = false,
PVMFCPMContentType aCPMContentType = PVMF_CPM_FORMAT_AUTHORIZE_BEFORE_ACCESS);
static void DestroyPlugIn(PVMFCPMPluginInterface*);
public:
/* From PVInterface */
void addRef()
{
++iExtensionRefCount;
}
void removeRef()
{
--iExtensionRefCount;
}
bool queryInterface(const PVUuid& uuid, PVInterface*& iface);
/* From PVMFCPMPluginInterface */
OSCL_IMPORT_REF PVMFCommandId QueryUUID(PVMFSessionId aSession,
const PvmfMimeString& aMimeType,
Oscl_Vector<PVUuid, OsclMemAllocator>& aUuids,
bool aExactUuidsOnly = false,
const OsclAny* aContext = NULL);
OSCL_IMPORT_REF PVMFCommandId QueryInterface(PVMFSessionId aSession,
const PVUuid& aUuid,
PVInterface*& aInterfacePtr,
const OsclAny* aContext = NULL);
OSCL_IMPORT_REF PVMFCommandId Init(PVMFSessionId aSession,
const OsclAny* aContext = NULL);
OSCL_IMPORT_REF PVMFCommandId Reset(PVMFSessionId aSession,
const OsclAny* aContext = NULL);
OSCL_IMPORT_REF PVMFStatus SetSourceInitializationData(OSCL_wString& aSourceURL,
PVMFFormatType& aSourceFormat,
OsclAny* aSourceData);
OSCL_IMPORT_REF PVMFCPMContentType GetCPMContentType();
/* From PVMFCPMPluginAuthenticationInterface */
OSCL_IMPORT_REF PVMFCommandId AuthenticateUser(PVMFSessionId aSessionId,
OsclAny* aAuthenticationData,
OsclAny* aContext = NULL);
/* From PVMFCPMPluginAuthorizationInterface */
OSCL_IMPORT_REF PVMFCommandId AuthorizeUsage(PVMFSessionId aSessionId,
PvmiKvp& aRequestedUsage,
PvmiKvp& aApprovedUsage,
PvmiKvp& aAuthorizationData,
uint32& aRequestTimeOutInMS,
OsclAny* aContext = NULL);
OSCL_IMPORT_REF PVMFCommandId UsageComplete(PVMFSessionId aSessionId,
const OsclAny* aContext = NULL);
/* From PVMFCPMPluginAccessInterfaceFactory */
OSCL_IMPORT_REF PVMFStatus QueryAccessInterfaceUUIDs(Oscl_Vector<PVUuid, OsclMemAllocator>& aUuids);
OSCL_IMPORT_REF PVInterface* CreatePVMFCPMPluginAccessInterface(PVUuid& aUuid);
OSCL_IMPORT_REF void DestroyPVMFCPMPluginAccessInterface(PVUuid& aUuid,
PVInterface* aPtr);
OSCL_IMPORT_REF void SetStreamReadCapacityObserver(PVMFDataStreamReadCapacityObserver* aObs);
/* From PVMFCPMPluginAccessInterfaceFactory */
OSCL_IMPORT_REF PVMFStatus GetLicenseURL(PVMFSessionId aSessionId,
OSCL_wString& aContentName,
OSCL_wString& aLicenseURL);
OSCL_IMPORT_REF PVMFStatus GetLicenseURL(PVMFSessionId aSessionId,
OSCL_String& aContentName,
OSCL_String& aLicenseURL);
OSCL_IMPORT_REF PVMFCommandId GetLicense(PVMFSessionId aSessionId
, OSCL_wString& aContentName
, OsclAny* aLicenseData = NULL
, uint32 aDataSize = 0
, int32 aTimeoutMsec = (-1)
, OsclAny* aContext = NULL);
OSCL_IMPORT_REF PVMFCommandId GetLicense(PVMFSessionId aSessionId
, OSCL_String& aContentName
, OsclAny* aLicenseData = NULL
, uint32 aDataSize = 0
, int32 aTimeoutMsec = (-1)
, OsclAny* aContext = NULL);
OSCL_IMPORT_REF PVMFCommandId CancelGetLicense(PVMFSessionId aSessionId
, PVMFCommandId aCmdId
, OsclAny* aContext = NULL);
//From PVMFMetadataExtensionInterface
OSCL_IMPORT_REF uint32 GetNumMetadataKeys(char* aQueryKeyString = NULL) ;
OSCL_IMPORT_REF uint32 GetNumMetadataValues(PVMFMetadataList& aKeyList) ;
OSCL_IMPORT_REF PVMFCommandId GetNodeMetadataKeys(PVMFSessionId aSessionId,
PVMFMetadataList& aKeyList,
uint32 aStartingKeyIndex,
int32 aMaxKeyEntries = -1,
char* aQueryKeyString = NULL,
const OsclAny* aContextData = NULL) ;
OSCL_IMPORT_REF PVMFCommandId GetNodeMetadataValues(PVMFSessionId aSessionId,
PVMFMetadataList& aKeyList,
Oscl_Vector<PvmiKvp, OsclMemAllocator>& aValueList,
uint32 aStartingValueIndex,
int32 aMaxValueEntries = -1,
const OsclAny* aContextData = NULL) ;
OSCL_IMPORT_REF PVMFStatus ReleaseNodeMetadataKeys(PVMFMetadataList& aKeyList,
uint32 aStartingKeyIndex,
uint32 aEndKeyIndex) ;
OSCL_IMPORT_REF PVMFStatus ReleaseNodeMetadataValues(Oscl_Vector<PvmiKvp, OsclMemAllocator>& aValueList,
uint32 aStartingValueIndex,
uint32 aEndValueIndex) ;
private:
/* From PVMFCPMPluginInterface */
void ThreadLogon();
void ThreadLogoff();
OSCL_IMPORT_REF PVMFCPMPassThruPlugInOMA1(bool aFailAuthorizeUsage = false,
bool aCancelAcquireLicense = false,
bool aSourceInitDataNotSupported = false,
PVMFCPMContentType aCPMContentType = PVMF_CPM_FORMAT_AUTHORIZE_BEFORE_ACCESS,
int32 aPriority = OsclActiveObject::EPriorityNominal);
virtual ~PVMFCPMPassThruPlugInOMA1();
void Run();
PVMFCPMPassThruPlugInOMA1CmdQ iInputCommands;
PVMFCPMPassThruPlugInOMA1CmdQ iCurrentCommand;
PVMFCommandId QueueCommandL(PVMFCPMPassThruPlugInOMA1Command&);
void MoveCmdToCurrentQueue(PVMFCPMPassThruPlugInOMA1Command& aCmd);
bool ProcessCommand(PVMFCPMPassThruPlugInOMA1Command&);
void CommandComplete(PVMFCPMPassThruPlugInOMA1CmdQ&,
PVMFCPMPassThruPlugInOMA1Command&,
PVMFStatus,
OsclAny* aData = NULL,
PVUuid* aEventUUID = NULL,
int32* aEventCode = NULL);
void DoQueryUuid(PVMFCPMPassThruPlugInOMA1Command&);
void DoQueryInterface(PVMFCPMPassThruPlugInOMA1Command&);
void DoInit(PVMFCPMPassThruPlugInOMA1Command&);
void DoReset(PVMFCPMPassThruPlugInOMA1Command&);
void DoAuthenticate(PVMFCPMPassThruPlugInOMA1Command&);
void DoAuthorizeUsage(PVMFCPMPassThruPlugInOMA1Command&);
void DoUsageComplete(PVMFCPMPassThruPlugInOMA1Command& aCmd);
PVMFStatus DoGetLicense(PVMFCPMPassThruPlugInOMA1Command& aCmd);
void DoCancelGetLicense(PVMFCPMPassThruPlugInOMA1Command& aCmd);
void DoMetadataKeys(PVMFCPMPassThruPlugInOMA1Command& aCmd);
void DoMetadataValues(PVMFCPMPassThruPlugInOMA1Command& aCmd);
PVLogger* iLogger;
uint32 iExtensionRefCount;
OSCL_wHeapString<OsclMemAllocator> iFilename;
PVMFFormatType iSourceFormatType;
bool oSourceSet;
OsclFileHandle* iFileHandle;
friend class PVMFCPMPassThruPlugInOMA1DataStreamSyncInterfaceImpl;
bool iFailAuthorizeUsage;
bool iCancelAcquireLicense;
bool iSourceInitDataNotSupported;
PVMFCPMContentType iCPMContentType;
PVMFDataStreamReadCapacityObserver* iDataStreamReadCapacityObserver;
//metadata related
enum TOMA1Metadata
{
EIsProtectedOMA1
, ELicAvailableOMA1
, ELicTypeOMA1
, EForwardLockOMA1
, ELicLastOMA1 //placeholder.
};
class TOMA1MetadataEntry
{
public:
TOMA1MetadataEntry(): iValid(false) {}
bool iValid;
OSCL_HeapString<OsclMemAllocator> iQuery;//query key string.
OSCL_HeapString<OsclMemAllocator> iValue;//value string.
PvmiKvp iKvp;//value kvp.
};
//metadata array.
TOMA1MetadataEntry iMetaData[ELicLastOMA1];
OSCL_HeapString<OsclMemAllocator> iLicType;
void MakeMetadata();
};
/*!
** PVMFCPMPassThruPlugInOMA1DataStreamSyncInterfaceImpl
*/
class PVMFCPMPassThruPlugInOMA1DataStreamSyncInterfaceImpl : public PVMIDataStreamSyncInterface
{
public:
// From PVInterface
void addRef() {};
void removeRef() {};
OSCL_IMPORT_REF bool queryInterface(const PVUuid& uuid,
PVInterface*& iface);
OSCL_IMPORT_REF
PvmiDataStreamStatus OpenSession(PvmiDataStreamSession& aSessionID,
PvmiDataStreamMode aMode,
bool nonblocking = false);
OSCL_IMPORT_REF
PvmiDataStreamStatus CloseSession(PvmiDataStreamSession aSessionID);
OSCL_IMPORT_REF
PvmiDataStreamRandomAccessType QueryRandomAccessCapability();
OSCL_IMPORT_REF
PvmiDataStreamStatus QueryReadCapacity(PvmiDataStreamSession aSessionID,
uint32& capacity);
OSCL_IMPORT_REF
PvmiDataStreamCommandId RequestReadCapacityNotification(PvmiDataStreamSession aSessionID,
PvmiDataStreamObserver& observer,
uint32 capacity,
OsclAny* aContextData = NULL);
OSCL_IMPORT_REF
PvmiDataStreamStatus QueryWriteCapacity(PvmiDataStreamSession aSessionID,
uint32& capacity);
OSCL_IMPORT_REF
PvmiDataStreamCommandId RequestWriteCapacityNotification(PvmiDataStreamSession aSessionID,
PvmiDataStreamObserver& observer,
uint32 capacity,
OsclAny* aContextData = NULL);
OSCL_IMPORT_REF
PvmiDataStreamCommandId CancelNotification(PvmiDataStreamSession aSessionID,
PvmiDataStreamObserver& observer,
PvmiDataStreamCommandId aID,
OsclAny* aContextData = NULL);
OSCL_IMPORT_REF
PvmiDataStreamStatus Read(PvmiDataStreamSession aSessionID,
uint8* buffer,
uint32 size,
uint32& numelements);
OSCL_IMPORT_REF
PvmiDataStreamStatus Write(PvmiDataStreamSession aSessionID,
uint8* buffer,
uint32 size,
uint32& numelements);
OSCL_IMPORT_REF
PvmiDataStreamStatus Seek(PvmiDataStreamSession aSessionID,
int32 offset,
PvmiDataStreamSeekType origin);
OSCL_IMPORT_REF
uint32 GetCurrentPointerPosition(PvmiDataStreamSession aSessionID) ;
OSCL_IMPORT_REF
PvmiDataStreamStatus Flush(PvmiDataStreamSession aSessionID);
private:
friend class PVMFCPMPassThruPlugInOMA1;
PVMFCPMPassThruPlugInOMA1DataStreamSyncInterfaceImpl(PVMFCPMPassThruPlugInOMA1&);
~PVMFCPMPassThruPlugInOMA1DataStreamSyncInterfaceImpl();
Oscl_File *iFileObject;
int32 iFileNumBytes;
Oscl_FileServer iFs;
PVMFCPMPassThruPlugInOMA1& iContainer;
PVLogger* iLogger;
PVMFDataStreamReadCapacityObserver* iDataStreamReadCapacityObserver;
};
#endif //PVMF_CPMPLUGIN_OMA1_H_INCLUDED