williamr@2: // Copyright (c) 2002-2009 Nokia Corporation and/or its subsidiary(-ies). williamr@2: // All rights reserved. williamr@2: // This component and the accompanying materials are made available williamr@2: // under the terms of the License "Symbian Foundation License v1.0" to Symbian Foundation members and "Symbian Foundation End User License Agreement v1.0" to non-members williamr@2: // which accompanies this distribution, and is available williamr@2: // at the URL "http://www.symbianfoundation.org/legal/licencesv10.html". williamr@2: // williamr@2: // Initial Contributors: williamr@2: // Nokia Corporation - initial contribution. williamr@2: // williamr@2: // Contributors: williamr@2: // williamr@2: // Description: williamr@2: // williamr@2: williamr@2: williamr@2: #ifndef __MMFCONTROLLER_H__ williamr@2: #define __MMFCONTROLLER_H__ williamr@2: williamr@2: #include williamr@2: #include williamr@2: #include williamr@2: #include williamr@2: #include williamr@2: williamr@2: #include williamr@2: williamr@2: williamr@2: /** williamr@2: @publishedAll williamr@2: @released williamr@2: williamr@2: Error category denoting a general controller error. williamr@2: williamr@2: @see TMMFEvent williamr@2: @since 7.0s williamr@2: */ williamr@2: const TUid KMMFErrorCategoryControllerGeneralError = {0x101F76D3}; williamr@2: williamr@2: /** williamr@2: @publishedAll williamr@2: @released williamr@2: williamr@2: Error category denoting playback complete i.e. due to EOF or error condition williamr@2: williamr@2: @see TMMFEvent williamr@2: @since 7.0s williamr@2: */ williamr@2: const TUid KMMFEventCategoryPlaybackComplete = {0x101f7ea0}; williamr@2: williamr@2: /** williamr@2: @internalComponent williamr@2: */ williamr@2: const TUid KUidInterfaceMMFDataSinkHolder = {0x101F76D4}; williamr@2: /** williamr@2: @internalComponent williamr@2: */ williamr@2: const TUid KUidInterfaceMMFDataSourceHolder = {0x101F76D5}; williamr@2: /** williamr@2: @internalComponent williamr@2: */ williamr@2: const TUid KUidMMFControllerExtendedDataHolder = {0x102834AC}; williamr@2: williamr@2: /** williamr@2: @internalComponent williamr@2: williamr@2: Create a const TUid with the same values as the controller williamr@2: ECOM plugin interface UID williamr@2: */ williamr@2: const TUid KUidInterfaceMMFController = {KMmfUidPluginInterfaceController}; williamr@2: williamr@2: /** williamr@2: @internalComponent williamr@2: williamr@2: IPC messages for interface KUidInterfaceMMFController in the controller framework. williamr@2: */ williamr@2: enum TMMFControllerMessages williamr@2: { williamr@2: EMMFControllerAddDataSource, williamr@2: EMMFControllerAddDataSink, williamr@2: EMMFControllerRemoveDataSource, williamr@2: EMMFControllerRemoveDataSink, williamr@2: EMMFControllerReset, williamr@2: EMMFControllerPrime, williamr@2: EMMFControllerPlay, williamr@2: EMMFControllerPause, williamr@2: EMMFControllerStop, williamr@2: EMMFControllerGetPosition, williamr@2: EMMFControllerSetPosition, williamr@2: EMMFControllerGetDuration, williamr@2: EMMFControllerGetNumberOfMetaDataEntries, williamr@2: EMMFControllerGetSizeOfMetaDataEntry,//use internally williamr@2: EMMFControllerGetMetaDataEntry, williamr@2: EMMFControllerSetPrioritySettings, williamr@2: EMMFControllerCancelAddDataSource, williamr@2: EMMFControllerCancelAddDataSink, williamr@2: EMMFControllerAddFileHandleDataSource, williamr@2: EMMFControllerAddFileHandleDataSink, williamr@2: EMMFControllerSourceSinkInitDataPreload, williamr@2: EMMFControllerAddFileHandleDataSourceWithInitData, williamr@2: EMMFControllerAddFileHandleDataSinkWithInitData williamr@2: }; williamr@2: williamr@2: williamr@2: williamr@2: /** williamr@2: @publishedAll williamr@2: @released williamr@2: williamr@2: Client representation of a controller plugin for the Multimedia Framework. williamr@2: williamr@2: This class allows a client to load a controller plugin into a new thread and access the williamr@2: functionality provided by that plugin. williamr@2: williamr@2: @since 7.0s williamr@2: */ williamr@2: class RMMFController williamr@2: { williamr@2: public: williamr@2: williamr@2: IMPORT_C RMMFController(); williamr@2: williamr@2: IMPORT_C TInt Open(TUid aControllerUid, const TMMFPrioritySettings& aPrioritySettings); williamr@2: williamr@2: IMPORT_C TInt Open(const CMMFControllerImplementationInformation& aControllerInfo, const TMMFPrioritySettings& aPrioritySettings); williamr@2: williamr@2: IMPORT_C TInt Open(TUid aControllerUid, const TMMFPrioritySettings& aPrioritySettings, TBool aUseSharedHeap ); williamr@2: williamr@2: IMPORT_C TInt Open(const CMMFControllerImplementationInformation& aControllerInfo, const TMMFPrioritySettings& aPrioritySettings, TBool aUseSharedHeap ); williamr@2: williamr@2: IMPORT_C TInt OpenInSecureDRMProcess(TUid aControllerUid, const TMMFPrioritySettings& aPrioritySettings); williamr@2: williamr@2: IMPORT_C TInt OpenInSecureDRMProcess(const CMMFControllerImplementationInformation& aControllerInfo, const TMMFPrioritySettings& aPrioritySettings); williamr@2: williamr@2: IMPORT_C TInt OpenInSecureDRMProcess(TUid aControllerUid, const TMMFPrioritySettings& aPrioritySettings, TBool aUseSharedHeap ); williamr@2: williamr@2: IMPORT_C TInt OpenInSecureDRMProcess(const CMMFControllerImplementationInformation& aControllerInfo, const TMMFPrioritySettings& aPrioritySettings, TBool aUseSharedHeap ); williamr@2: williamr@2: IMPORT_C void Close(); williamr@2: williamr@2: IMPORT_C TInt SetPrioritySettings(const TMMFPrioritySettings& aPrioritySettings) const; williamr@2: williamr@2: IMPORT_C TInt AddDataSource(TUid aSourceUid, const TDesC8& aSourceInitData); williamr@2: williamr@2: IMPORT_C TInt AddDataSink(TUid aSinkUid, const TDesC8& aSinkInitData); williamr@2: williamr@2: IMPORT_C TInt AddDataSource(TUid aSourceUid, const TDesC8& aSourceInitData, TMMFMessageDestination& aHandleInfo); williamr@2: williamr@2: IMPORT_C TInt AddDataSink(TUid aSinkUid, const TDesC8& aSinkInitData, TMMFMessageDestination& aHandleInfo); williamr@2: williamr@2: IMPORT_C void AddDataSource(const TMMFUidPckg& aSourceUid, const TDesC8& aSourceInitData, TMMFMessageDestinationPckg& aHandleInfoPckg, TRequestStatus& aStatus); williamr@2: IMPORT_C void AddFileHandleDataSource(const RFile& aFile, const TDesC8& aSourceInitData, TMMFMessageDestinationPckg& aHandleInfoPckg, TRequestStatus& aStatus); williamr@2: IMPORT_C void AddFileHandleDataSource(const RFile& aFile, TMMFMessageDestinationPckg& aHandleInfoPckg, TRequestStatus& aStatus); williamr@2: williamr@2: IMPORT_C void CancelAddDataSource(); williamr@2: williamr@2: IMPORT_C void AddDataSink(const TMMFUidPckg& aSinkUid, const TDesC8& aSinkInitData, TMMFMessageDestinationPckg& aHandleInfoPckg, TRequestStatus& aStatus); williamr@2: IMPORT_C void AddFileHandleDataSink(const RFile& aFile, const TDesC8& aSinkInitData, TMMFMessageDestinationPckg& aHandleInfoPckg, TRequestStatus& aStatus); williamr@2: IMPORT_C void AddFileHandleDataSink(const RFile& aFile, TMMFMessageDestinationPckg& aHandleInfoPckg, TRequestStatus& aStatus); williamr@2: williamr@2: IMPORT_C void CancelAddDataSink(); williamr@2: williamr@2: IMPORT_C TInt RemoveDataSource(const TMMFMessageDestination& aSourceHandleInfo); williamr@2: williamr@2: IMPORT_C TInt RemoveDataSink(const TMMFMessageDestination& aSinkHandleInfo); williamr@2: williamr@2: IMPORT_C TInt Reset(); williamr@2: williamr@2: IMPORT_C TInt Prime(); williamr@2: williamr@2: IMPORT_C TInt Play(); williamr@2: williamr@2: IMPORT_C TInt Pause(); williamr@2: williamr@2: IMPORT_C TInt Stop(); williamr@2: williamr@2: IMPORT_C TInt GetPosition(TTimeIntervalMicroSeconds& aPosition) const; williamr@2: williamr@2: IMPORT_C TInt SetPosition(const TTimeIntervalMicroSeconds& aPosition) const; williamr@2: williamr@2: IMPORT_C TInt GetDuration(TTimeIntervalMicroSeconds& aDuration) const; williamr@2: williamr@2: IMPORT_C TInt GetNumberOfMetaDataEntries(TInt& aNumberOfEntries) const; williamr@2: williamr@2: IMPORT_C CMMFMetaDataEntry* GetMetaDataEntryL(TInt aIndex) const; williamr@2: williamr@2: IMPORT_C TInt CustomCommandSync(const TMMFMessageDestinationPckg& aDestination, TInt aFunction, const TDesC8& aDataTo1, const TDesC8& aDataTo2, TDes8& aDataFrom); williamr@2: williamr@2: IMPORT_C TInt CustomCommandSync(const TMMFMessageDestinationPckg& aDestination, TInt aFunction, const TDesC8& aDataTo1, const TDesC8& aDataTo2); williamr@2: williamr@2: IMPORT_C void CustomCommandAsync(const TMMFMessageDestinationPckg& aDestination, TInt aFunction, const TDesC8& aDataTo1, const TDesC8& aDataTo2, TDes8& aDataFrom, TRequestStatus& aStatus); williamr@2: williamr@2: IMPORT_C void CustomCommandAsync(const TMMFMessageDestinationPckg& aDestination, TInt aFunction, const TDesC8& aDataTo1, const TDesC8& aDataTo2, TRequestStatus& aStatus); williamr@2: williamr@2: IMPORT_C void ReceiveEvents(TMMFEventPckg& aEventPckg, TRequestStatus& aStatus); williamr@2: williamr@2: IMPORT_C TInt CancelReceiveEvents(); williamr@2: williamr@2: IMPORT_C TInt SetThreadPriority(const TThreadPriority& aPriority) const; williamr@2: williamr@2: private: williamr@2: /** williamr@2: The controller proxy. Used to pass messages to the controller thread. williamr@2: */ williamr@2: RMMFControllerProxy iControllerProxy; williamr@2: williamr@2: /** williamr@2: Used to hold the destination information for messages for the standard controller plugin interface. williamr@2: */ williamr@2: TMMFMessageDestinationPckg iDestinationPckg; williamr@2: }; williamr@2: williamr@2: williamr@2: /** williamr@2: @publishedAll williamr@2: @released williamr@2: williamr@2: Defines an object to which a client may have a direct handle. williamr@2: williamr@2: This class provides a way of identifying objects within the controller framework, and a means williamr@2: of passing commands to those objects. williamr@2: williamr@2: @since 7.0s williamr@2: */ williamr@2: class CMMFObject : public CBase williamr@2: { williamr@2: friend class CMMFObjectContainer;//to set the handle williamr@2: public: williamr@2: IMPORT_C ~CMMFObject(); williamr@2: williamr@2: IMPORT_C CMMFObject(TUid aInterfaceId); williamr@2: williamr@2: IMPORT_C const TMMFMessageDestination& Handle(); williamr@2: williamr@2: IMPORT_C TBool operator==(const CMMFObject& aOther); williamr@2: williamr@2: /** williamr@2: Passes a message to the object to handle. williamr@2: williamr@2: This is a pure virtual method to be implemented by concrete classes derived from this class. williamr@2: williamr@2: The message passed in MUST be completed by the object; however, it can be copied to be williamr@2: completed at a later time, should some other asynchronous action need to occur first. williamr@2: williamr@2: @param aMessage williamr@2: The message to be handled. This MUST be completed by the object. williamr@2: williamr@2: @since 7.0s williamr@2: */ williamr@2: virtual void HandleRequest(TMMFMessage& aMessage) = 0; williamr@2: private: williamr@2: void SetHandle(const TMMFMessageDestination& aNewHandle); williamr@2: private: williamr@2: TMMFMessageDestination iHandle; williamr@2: }; williamr@2: williamr@2: williamr@2: /** williamr@2: @publishedAll williamr@2: @released williamr@2: williamr@2: Container class to hold the CMMFObject-derived objects in the controller framework. williamr@2: williamr@2: @since 7.0s williamr@2: */ williamr@2: class CMMFObjectContainer : public CBase williamr@2: { williamr@2: public: williamr@2: williamr@2: IMPORT_C CMMFObjectContainer(); williamr@2: williamr@2: IMPORT_C ~CMMFObjectContainer(); williamr@2: williamr@2: IMPORT_C TInt AddMMFObject(CMMFObject& aObject); williamr@2: williamr@2: IMPORT_C void RemoveAndDestroyMMFObject(CMMFObject& aObject); williamr@2: williamr@2: IMPORT_C TInt FindMMFObject(const TMMFMessageDestination& aObjectHandle, CMMFObject*& aObjectFound); williamr@2: williamr@2: IMPORT_C void DeleteAllObjects(); williamr@2: williamr@2: const RPointerArray& MMFObjects(); williamr@2: williamr@2: private: williamr@2: /** williamr@2: Internal method to find an object in the array. williamr@2: */ williamr@2: TInt FindMMFObject(const CMMFObject& aObject, TInt& aPositionInArray); williamr@2: williamr@2: /** williamr@2: Internal method used to generate the object handle for a newly added object. williamr@2: */ williamr@2: TInt GenerateObjectHandle(); williamr@2: private: williamr@2: /** williamr@2: The array of objects. williamr@2: */ williamr@2: RPointerArray iObjects; williamr@2: williamr@2: /** williamr@2: The next available object handle. williamr@2: */ williamr@2: TInt iNextObjectHandle; williamr@2: }; williamr@2: williamr@2: williamr@2: /** williamr@2: @publishedAll williamr@2: @released williamr@2: williamr@2: CMMFObject-derived class to wrap a Data Source. williamr@2: williamr@2: Allows a handle to be attributed to a data source, so it can be removed from the controller and williamr@2: the client can send messages directly to it. williamr@2: williamr@2: @since 7.0s williamr@2: */ williamr@2: class CMMFDataSourceHolder : public CMMFObject williamr@2: { williamr@2: public: williamr@2: williamr@2: IMPORT_C CMMFDataSourceHolder(MDataSource& aDataSource); williamr@2: williamr@2: IMPORT_C ~CMMFDataSourceHolder(); williamr@2: williamr@2: IMPORT_C MDataSource& DataSource(); williamr@2: williamr@2: //from CMMFObject williamr@2: IMPORT_C void HandleRequest(TMMFMessage& aMessage); williamr@2: private: williamr@2: /** williamr@2: Pointer to the data source owned by this object. williamr@2: */ williamr@2: MDataSource* iDataSource; williamr@2: }; williamr@2: williamr@2: /** williamr@2: @publishedAll williamr@2: @released williamr@2: williamr@2: CMMFObject-derived class to wrap a Data Sink. williamr@2: williamr@2: Allows a handle to be attributed to a data sink, so it can be removed from the controller and williamr@2: the client can send messages directly to it. williamr@2: williamr@2: @since 7.0s williamr@2: */ williamr@2: class CMMFDataSinkHolder : public CMMFObject williamr@2: { williamr@2: public: williamr@2: IMPORT_C CMMFDataSinkHolder(MDataSink& aDataSink); williamr@2: williamr@2: IMPORT_C ~CMMFDataSinkHolder(); williamr@2: williamr@2: IMPORT_C MDataSink& DataSink(); williamr@2: williamr@2: //from CMMFObject williamr@2: IMPORT_C void HandleRequest(TMMFMessage& aMessage); williamr@2: williamr@2: private: williamr@2: /** williamr@2: Pointer to the data sink owned by this object. williamr@2: */ williamr@2: MDataSink* iDataSink; williamr@2: }; williamr@2: williamr@2: williamr@2: /** williamr@2: @publishedAll williamr@2: @released williamr@2: williamr@2: Base class for client-side custom command classes. williamr@2: williamr@2: In order facilitate the use of the more common custom commands, it is desirable to write williamr@2: a concrete API class for the client to use. This API class can then be use to wrap all the code williamr@2: involved to formulate the custom command messages. williamr@2: williamr@2: @since 7.0s williamr@2: */ williamr@2: class RMMFCustomCommandsBase williamr@2: { williamr@2: public: williamr@2: williamr@2: IMPORT_C RMMFCustomCommandsBase(RMMFController& aController, TUid aInterfaceId); williamr@2: protected: williamr@2: /** williamr@2: The controller. williamr@2: williamr@2: Derived classes should use iController.CustomCommandSync() and williamr@2: iController.CustomCommandAsync() to send the custom commands to the controller williamr@2: plugin. williamr@2: */ williamr@2: RMMFController& iController; williamr@2: williamr@2: /** williamr@2: The destination package. williamr@2: williamr@2: Derived classes must pass this into iController.CustomCommandSync() and williamr@2: iController.CustomCommandAsync() as the destination argument. williamr@2: */ williamr@2: TMMFMessageDestinationPckg iDestinationPckg; williamr@2: }; williamr@2: williamr@2: /** williamr@2: @publishedAll williamr@2: @released williamr@2: williamr@2: Base class to define the interface of a custom command parser. williamr@2: williamr@2: In order to facilitate the support of common custom commands by controller plugins, a williamr@2: custom command parser object can be used. A set of custom command parsers are created williamr@2: by the controller plugin (one for each interface supported), and added to the custom command williamr@2: parser manager in the controller framework. The controller plugin must also derive from a set of williamr@2: concrete interfaces (provided in the form of mixin classes). Then, a custom command supported by williamr@2: one of the custom command parsers will appear to the controller as a concrete API call, rather than williamr@2: a call to its own custom command API. williamr@2: williamr@2: @since 7.0s williamr@2: */ williamr@2: class CMMFCustomCommandParserBase : public CBase williamr@2: { williamr@2: public: williamr@2: williamr@2: /** williamr@2: Pure virtual method to be implemented by derived classes. williamr@2: williamr@2: Derived classes must implement the code to decode the message from the client. williamr@2: williamr@2: @param aMessage williamr@2: The message to be serviced. This message must be completed by the derived class. williamr@2: williamr@2: @since 7.0s williamr@2: */ williamr@2: virtual void HandleRequest(TMMFMessage& aMessage) = 0; williamr@2: williamr@2: /** williamr@2: Returns the UID of the custom command interface provided by this parser. williamr@2: williamr@2: @return The interface UID. williamr@2: williamr@2: @since 7.0s williamr@2: */ williamr@2: IMPORT_C TUid InterfaceId(); williamr@2: williamr@2: /** williamr@2: Destructor. williamr@2: williamr@2: @since 7.0s williamr@2: */ williamr@2: IMPORT_C ~CMMFCustomCommandParserBase(); williamr@2: protected: williamr@2: williamr@2: /** williamr@2: Constructor. williamr@2: williamr@2: @param aInterfaceId williamr@2: The uid of the custom command interface provided by this parser. williamr@2: This must be the same as the interface id of the corresponding client williamr@2: API class. See RMMFCustomCommandsBase. williamr@2: williamr@2: @since 7.0s williamr@2: */ williamr@2: IMPORT_C CMMFCustomCommandParserBase(TUid aInterfaceId); williamr@2: williamr@2: private: williamr@2: williamr@2: /** williamr@2: The uid of the custom command interface provided by this parser. williamr@2: */ williamr@2: TUid iInterfaceId; williamr@2: }; williamr@2: williamr@2: /** williamr@2: @publishedPartner williamr@2: @released williamr@2: williamr@2: Class to manage custom command parsers. williamr@2: williamr@2: An object of this type is owned by the controller framework to contain all the custom command williamr@2: parsers for the controller plugin. williamr@2: williamr@2: @since 7.0s williamr@2: */ williamr@2: class CMMFCustomCommandParserManager : public CBase williamr@2: { williamr@2: public: williamr@2: /** williamr@2: Factory constructor. williamr@2: williamr@2: @return A pointer to the newly created object. williamr@2: williamr@2: @since 7.0s williamr@2: */ williamr@2: IMPORT_C static CMMFCustomCommandParserManager* NewL(); williamr@2: williamr@2: /** williamr@2: Destructor. williamr@2: williamr@2: Deletes all custom command parsers added to the manager. williamr@2: williamr@2: @since 7.0s williamr@2: */ williamr@2: IMPORT_C ~CMMFCustomCommandParserManager(); williamr@2: williamr@2: /** williamr@2: Attempts to find a custom command parser capable of handling the message. williamr@2: williamr@2: @param aMessage williamr@2: The message to be handled. williamr@2: williamr@2: @return A boolean indicating in the message has been handled. ETrue if the message has been handled, EFalse williamr@2: if it has not. williamr@2: williamr@2: @since 7.0s williamr@2: */ williamr@2: IMPORT_C TBool HandleRequest(TMMFMessage& aMessage); williamr@2: williamr@2: /** williamr@2: Adds a custom command parser to the manager. The manager takes ownership of the parser. williamr@2: williamr@2: Note: williamr@2: This method will leave if it fails to add the parser. If it does leave, ownership williamr@2: of the parser will remain with the caller. williamr@2: williamr@2: @param aParser williamr@2: A reference to the parser to be added to the manager. williamr@2: williamr@2: @since 7.0s williamr@2: */ williamr@2: IMPORT_C void AddCustomCommandParserL(CMMFCustomCommandParserBase& aParser); williamr@2: private: williamr@2: CMMFCustomCommandParserManager(); williamr@2: private: williamr@2: /** williamr@2: The array of custom command parsers. williamr@2: */ williamr@2: RPointerArray iParsers; williamr@2: }; williamr@2: williamr@2: williamr@2: class CMMFControllerExtendedData; williamr@2: /** williamr@2: @publishedAll williamr@2: @released williamr@2: williamr@2: Base class for controller plugins. williamr@2: williamr@2: A controller plugin for the multimedia framework must derive from this class and implement williamr@2: all the pure virtual functions. williamr@2: williamr@2: Controller plugins control the flow of multimedia data from one or more sources to one or williamr@2: more sinks. For example, an audio controller plugin might take data from a file source and williamr@2: output it to a speaker sink, or take data from a microphone source and save it to a file williamr@2: sink. A controller plugin typically supports one or more multimedia formats, for example williamr@2: WAV or MPEG4. williamr@2: williamr@2: @since 7.0s williamr@2: */ williamr@2: class CMMFController : public CBase williamr@2: { williamr@2: public: williamr@2: williamr@2: /** williamr@2: Allocates and constructs a new controller plugin. williamr@2: williamr@2: Uses ECOM to instantiate a new controller plugin. Can leave with any of the system-wide error codes. williamr@2: williamr@2: @param aControllerUid williamr@2: The unique ID of the controller to be instantiated from ECOM. williamr@2: @param aEventHandler williamr@2: A reference to an event handling object that can be used by the williamr@2: controller to send events back to the client. williamr@2: @param aClientTid williamr@2: The thread Id of the client thread williamr@2: williamr@2: @return A pointer to the new controller plugin. williamr@2: williamr@2: @since 7.0s williamr@2: */ williamr@2: static CMMFController* NewL(TUid aControllerUid, MAsyncEventHandler& aEventHandler, TThreadId aClientTid); williamr@2: williamr@2: /** williamr@2: Handles a message from the client. williamr@2: williamr@2: Decodes the message and calls one of the private DoXxx methods to unpackaged the parameters. williamr@2: williamr@2: @param aMessage williamr@2: The message to be handled. williamr@2: williamr@2: @since 7.0s williamr@2: */ williamr@2: IMPORT_C virtual void HandleRequestL(TMMFMessage& aMessage); williamr@2: williamr@2: /** williamr@2: Default destructor. williamr@2: */ williamr@2: IMPORT_C virtual ~CMMFController(); williamr@2: protected: williamr@2: williamr@2: /** williamr@2: Constructor. williamr@2: */ williamr@2: CMMFController() {}; williamr@2: williamr@2: // virtual functions to be implemented by controller plugin williamr@2: williamr@2: /** williamr@2: Add a data source to the controller plugin. williamr@2: williamr@2: NOTE: The data source is owned by the controller framework, NOT by the controller plugin. williamr@2: Under no circumstances should the controller plugin delete the data source. williamr@2: williamr@2: @param aDataSource williamr@2: A reference to the data source to be added. The controller plugin williamr@2: may call aDataSource.DataSourceType() to find out williamr@2: exactly what type of source it is. williamr@2: williamr@2: @leave KErrNotSupported williamr@2: If the controller plugin does not support the data source, it should leave with this. williamr@2: williamr@2: @since 7.0s williamr@2: */ williamr@2: virtual void AddDataSourceL(MDataSource& aDataSource) = 0; williamr@2: williamr@2: /** williamr@2: Adds a data sink to the controller plugin. williamr@2: williamr@2: NOTE: The data sink is owned by the controller framework, NOT by the controller plugin. williamr@2: Under no circumstances should the controller plugin delete the data sink. williamr@2: williamr@2: @param aDataSink williamr@2: A reference to the data sink to be added. The controller plugin williamr@2: may call aDatasink.DatasinkType() to find out williamr@2: exactly what type of sink it is. williamr@2: williamr@2: @leave KErrNotSupported williamr@2: If the controller plugin does not support the data sink, it should leave with this. williamr@2: williamr@2: @since 7.0s williamr@2: */ williamr@2: virtual void AddDataSinkL(MDataSink& aDataSink) = 0; williamr@2: williamr@2: /** williamr@2: Removes a data source from the controller plugin. williamr@2: williamr@2: Note: williamr@2: The data source is owned by the controller framework, NOT by the controller plugin. williamr@2: Under no circumstances should the controller plugin delete the data source. williamr@2: williamr@2: @param aDataSource williamr@2: A reference to the data source to be removed. williamr@2: williamr@2: @leave KErrNotSupported williamr@2: The controller plugin may leave during this method. If the controller plugin does williamr@2: not support the removal of data sources, it should leave with williamr@2: KErrNotSupported. If the controller plugin leaves, the data source will williamr@2: not be destroyed by the controller framework. If it does not leave, the data source williamr@2: will be destroyed. williamr@2: williamr@2: @since 7.0s williamr@2: */ williamr@2: virtual void RemoveDataSourceL(MDataSource& aDataSource) = 0; williamr@2: williamr@2: /** williamr@2: Removes a data sink from the controller plugin. williamr@2: williamr@2: Note: williamr@2: The data sink is owned by the controller framework, NOT by the controller plugin. williamr@2: Under no circumstances should the controller plugin delete the data sink. williamr@2: williamr@2: @param aDataSink williamr@2: A reference to the data sink to be removed. williamr@2: williamr@2: @leave KErrNotSupported williamr@2: The controller plugin may leave during this method. If the controller plugin does williamr@2: not support the removal of data sinks, it should leave with williamr@2: KErrNotSupported. If the controller plugin leaves, the data sink will williamr@2: not be destroyed by the controller framework. If it does not leave, the data sink williamr@2: will be destroyed. williamr@2: williamr@2: @since 7.0s williamr@2: */ williamr@2: virtual void RemoveDataSinkL(MDataSink& aDataSink) = 0; williamr@2: williamr@2: /** williamr@2: Resets the controller plugin. williamr@2: williamr@2: The controller should revert back to its newly constructed state. If the Reset is successful williamr@2: (i.e. it doesn't leave), the controller framework will delete all objects added to the williamr@2: MMFObjectManager including any sources and sinks. williamr@2: williamr@2: @leave KErrNotSupported williamr@2: If the controller plugin does not support being reset, it should leave with KErrNotSupported. williamr@2: williamr@2: @since 7.0s williamr@2: */ williamr@2: virtual void ResetL() = 0; williamr@2: williamr@2: /** williamr@2: Primes the controller plugin. williamr@2: williamr@2: The controller must prepare to start playing, by initialising its sources, sinks and buffers. williamr@2: This moves the controller from the STOPPED to the PRIMED state. williamr@2: williamr@2: @since 7.0s williamr@2: */ williamr@2: virtual void PrimeL() = 0; williamr@2: williamr@2: /** williamr@2: A partner to the PrimeL() method that is overridable to allow Asynchronous williamr@2: completion in the controller whilst maintaining a Synchronous client API. williamr@2: williamr@2: The default implementation of this is to call PrimeL() and complete the message with KErrNone. williamr@2: williamr@2: @since 7.0s williamr@2: */ williamr@2: IMPORT_C virtual void PrimeL(TMMFMessage& aMessage); williamr@2: williamr@2: /** williamr@2: Commences playback. williamr@2: williamr@2: The controller must now begin transferring data from its source(s) to its sink(s). williamr@2: This moves the controller from the PRIMED to the PLAYING state. williamr@2: williamr@2: Note: williamr@2: This method must return once playing has commenced, and not wait until playing is complete. williamr@2: williamr@2: @since 7.0s williamr@2: */ williamr@2: virtual void PlayL()= 0; williamr@2: williamr@2: /** williamr@2: A partner to the PlayL() method that is overridable to allow Asynchronous williamr@2: completion in the controller whilst maintaining a Synchronous client API. williamr@2: williamr@2: The default implementation of this is to call PlayL() and complete the message with KErrNone. williamr@2: williamr@2: @since 7.0s williamr@2: */ williamr@2: IMPORT_C virtual void PlayL(TMMFMessage& aMessage); williamr@2: williamr@2: williamr@2: /** williamr@2: Pauses the controller plugin. williamr@2: williamr@2: The controller must now cease transferring data from its source(s) to its sink(s). williamr@2: This moves the controller from the PLAYING back to the PRIMED state. williamr@2: williamr@2: A subsequent call to Play() will cause the controller plugin to resume playback williamr@2: from the point it was paused (unless there has been a call to SetPosition() in williamr@2: the meantime. williamr@2: williamr@2: @since 7.0s williamr@2: */ williamr@2: virtual void PauseL()= 0; williamr@2: williamr@2: /** williamr@2: A partner to the PauseL() method that is overridable to allow Asynchronous williamr@2: completion in the controller whilst maintaining a Synchronous client API. williamr@2: williamr@2: The default implementation of this is to call PauseL() and complete the message with KErrNone. williamr@2: williamr@2: @since 7.0s williamr@2: */ williamr@2: IMPORT_C virtual void PauseL(TMMFMessage& aMessage); williamr@2: williamr@2: /** williamr@2: Stops the controller plugin. williamr@2: williamr@2: The controller must now undo anything that occurred during the call to Prime(). williamr@2: This moves the controller from the PRIMED back to the STOPPED state. williamr@2: williamr@2: @since 7.0s williamr@2: */ williamr@2: virtual void StopL()= 0; williamr@2: williamr@2: /** williamr@2: A partner to the StopL() method that is overridable to allow Asynchronous williamr@2: completion in the controller whilst maintaining a Synchronous client API. williamr@2: williamr@2: The default implementation of this is to call StopL() and complete the message with KErrNone. williamr@2: williamr@2: @since 7.0s williamr@2: */ williamr@2: IMPORT_C virtual void StopL(TMMFMessage& aMessage); williamr@2: williamr@2: /** williamr@2: Gets the current position. williamr@2: williamr@2: The controller plugin should calculate the current position in microseconds. williamr@2: williamr@2: @return The current position in microseconds. williamr@2: williamr@2: @since 7.0s williamr@2: */ williamr@2: virtual TTimeIntervalMicroSeconds PositionL() const = 0; williamr@2: williamr@2: /** williamr@2: Sets the current position. williamr@2: williamr@2: The controller plugin should reposition itself to the position provided. williamr@2: williamr@2: @param aPosition williamr@2: The desired position in microseconds. williamr@2: williamr@2: @since 7.0s williamr@2: */ williamr@2: virtual void SetPositionL(const TTimeIntervalMicroSeconds& aPosition) = 0; williamr@2: williamr@2: /** williamr@2: Gets the duration of the clip. williamr@2: williamr@2: The controller plugin should calculate the clip duration in microseconds. williamr@2: williamr@2: @return The clips duration in microseconds. williamr@2: williamr@2: @since 7.0s williamr@2: */ williamr@2: virtual TTimeIntervalMicroSeconds DurationL() const = 0; williamr@2: williamr@2: /** williamr@2: Sets the priority settings. williamr@2: williamr@2: The new priority settings must be applied to any resource being used by the controller williamr@2: plugin that requires priority settings (for example the sound device). williamr@2: williamr@2: @param aPrioritySettings williamr@2: The new priority settings williamr@2: williamr@2: @since 7.0s williamr@2: williamr@2: @capability MultimediaDD williamr@2: A process requesting or using this method that has MultimediaDD capability will williamr@2: always have precedence over a process that does not have MultimediaDD. williamr@2: */ williamr@2: virtual void SetPrioritySettings(const TMMFPrioritySettings& aPrioritySettings) = 0; williamr@2: williamr@2: /** williamr@2: Handles a custom command. williamr@2: williamr@2: Custom commands allow a controller plugin to define its own API. If the controller framework williamr@2: does not understand a message from the client, it is assumed this is a custom command for the williamr@2: plugin and passed into this interface. williamr@2: williamr@2: The more common custom commands can be handled by Custom Command Parsers on behalf of the williamr@2: controller plugin. This allows the controller plugin to implement a concrete interface williamr@2: (defined by mixin classes) rather than having to decode the command itself. For more williamr@2: information, see CMMFCustomCommandParserBase. williamr@2: williamr@2: The controller plugin must always complete the message passed into this method, williamr@2: even if it does not support the interface required by the message. williamr@2: williamr@2: @param aMessage williamr@2: The message to be handled by the controller plugin. williamr@2: williamr@2: @see CMMFCustomCommandParserBase. williamr@2: @since 7.0s williamr@2: */ williamr@2: virtual void CustomCommand(TMMFMessage& aMessage) williamr@2: {aMessage.Complete(KErrNotSupported);};//default implementation williamr@2: williamr@2: /** williamr@2: RetrieveS the number of meta data entries in the clip. williamr@2: williamr@2: @param aNumberOfEntries williamr@2: The controller plugin must set this to the number of meta data entries williamr@2: in the clip. williamr@2: williamr@2: @since 7.0s williamr@2: */ williamr@2: virtual void GetNumberOfMetaDataEntriesL(TInt& aNumberOfEntries) = 0; williamr@2: williamr@2: /** williamr@2: Retrieves a meta data entry from the clip. williamr@2: williamr@2: @param aIndex williamr@2: The index of the meta data entry to retrieve. williamr@2: williamr@2: @return A pointer to a newly created CMMFMetaDataEntry object containing the meta information. williamr@2: The controller framework will take ownership of the object when this method returns. williamr@2: williamr@2: @since 7.0s williamr@2: */ williamr@2: virtual CMMFMetaDataEntry* GetMetaDataEntryL(TInt aIndex) = 0; williamr@2: williamr@2: // Utility functions to be used by controller plugins williamr@2: williamr@2: /** williamr@2: Sends an event to the client. williamr@2: williamr@2: The controller plugin can use this method to send an event to the client. williamr@2: williamr@2: @param aEvent williamr@2: The event to be sent to the client. williamr@2: @return One of the system-wide error codes. williamr@2: williamr@2: @since 7.0s williamr@2: */ williamr@2: IMPORT_C TInt DoSendEventToClient(const TMMFEvent& aEvent); williamr@2: williamr@2: /** williamr@2: Gets a reference to the multimedia framework object container. williamr@2: williamr@2: The controller plugin may add CMMFObject-derived objects to the container to allow them williamr@2: to receive messages directly from the client. williamr@2: williamr@2: @return A reference to the MMFObjectContainer. williamr@2: williamr@2: @since 7.0s williamr@2: */ williamr@2: IMPORT_C CMMFObjectContainer& MMFObjectContainerL(); williamr@2: williamr@2: /** williamr@2: Adds a custom command parser to the controller framework. williamr@2: williamr@2: If the controller framework receives a request it does not understand, it will williamr@2: search through its list of custom command parsers before passing the request williamr@2: on to the controller plugin as a custom command. williamr@2: williamr@2: By using the custom command parsers, the controller plugin can implement a concrete williamr@2: API rather than having to decode the common custom commands itself. williamr@2: williamr@2: @param aParser williamr@2: The parser to be added to the controller framework. The controller framework williamr@2: takes ownership of the parser if the call does not leave. williamr@2: williamr@2: @since 7.0s williamr@2: */ williamr@2: IMPORT_C void AddCustomCommandParserL(CMMFCustomCommandParserBase& aParser); williamr@2: williamr@2: /** williamr@2: Retrieves the client thread Id of this controller. williamr@2: williamr@2: @return Thread Id of the controller's client williamr@2: */ williamr@2: IMPORT_C TThreadId ClientThreadIdL(); williamr@2: williamr@2: /** williamr@2: Check the Secure DRM Mode of current controller object williamr@2: williamr@2: @return ETrue if the controller is running under Secure DRM mode; otherwise EFalse. williamr@2: */ williamr@2: IMPORT_C TBool IsSecureDrmModeL(); williamr@2: williamr@2: private: williamr@2: /** williamr@2: This is internal and not intended for use. williamr@2: */ williamr@2: void ConstructL(MAsyncEventHandler& aEventHandler, TThreadId aClientTid); williamr@2: // IPC decode functions williamr@2: TBool DoAddDataSourceL(TMMFMessage& aMessage); williamr@2: TBool DoAddDataSinkL(TMMFMessage& aMessage); williamr@2: TBool DoAddFileHandleDataSourceL(TMMFMessage& aMessage); williamr@2: TBool DoAddFileHandleDataSinkL(TMMFMessage& aMessage); williamr@2: TBool DoRemoveDataSourceL(TMMFMessage& aMessage); williamr@2: TBool DoRemoveDataSinkL(TMMFMessage& aMessage); williamr@2: TBool DoResetL(TMMFMessage& aMessage); williamr@2: TBool DoPrimeL(TMMFMessage& aMessage); williamr@2: TBool DoPlayL(TMMFMessage& aMessage); williamr@2: TBool DoPauseL(TMMFMessage& aMessage); williamr@2: TBool DoStopL(TMMFMessage& aMessage); williamr@2: TBool DoGetPositionL(TMMFMessage& aMessage); williamr@2: TBool DoSetPositionL(TMMFMessage& aMessage); williamr@2: TBool DoGetDurationL(TMMFMessage& aMessage); williamr@2: TBool DoSetPrioritySettingsL(TMMFMessage& aMessage); williamr@2: void DoCustomCommand(TMMFMessage& aMessage); williamr@2: TBool DoGetNumberOfMetaDataEntriesL(TMMFMessage& aMessage); williamr@2: TBool DoGetSizeOfMetaDataEntryL(TMMFMessage& aMessage); williamr@2: TBool DoGetMetaDataEntryL(TMMFMessage& aMessage); williamr@2: TBool DoPreloadSourceSinkInitDataL(TMMFMessage& aMessage); williamr@2: TBool DoAddFileHandleDataSourceWithInitDataL(TMMFMessage& aMessage); williamr@2: TBool DoAddFileHandleDataSinkWithInitDataL(TMMFMessage& aMessage); williamr@2: void ReplaceFileHandleInInitDataL(RFile* aFile, TDes8& aInitData); williamr@2: // Ownership of aSource is taken into this function williamr@2: void AddMDataSourceAndRepondClientL(MDataSource* aSource, TMMFMessage& aMessage); williamr@2: // Ownership of aSink is taken into this function williamr@2: void AddMDataSinkAndRepondClientL(MDataSink* aSink, TMMFMessage& aMessage); williamr@2: CMMFControllerExtendedData* GetExtendedDataL(); williamr@2: static CMMFControllerExtendedData* CreateExtendedDataL(TThreadId aClientTid); williamr@2: williamr@2: private: williamr@2: /** williamr@2: Buffer to assist copy of meta data over the thread boundary. williamr@2: */ williamr@2: CBufFlat* iMetaDataBuffer; williamr@2: williamr@2: /** williamr@2: Required by ECOM. williamr@2: */ williamr@2: TUid iDtor_ID_Key; williamr@2: williamr@2: /** williamr@2: The event handler for the controller plugin. williamr@2: */ williamr@2: MAsyncEventHandler* iAsyncEventHandler; williamr@2: williamr@2: /** williamr@2: The MMF object container. williamr@2: */ williamr@2: CMMFObjectContainer* iMMFObjectContainer; williamr@2: williamr@2: /** williamr@2: The custom command parser manager. williamr@2: */ williamr@2: CMMFCustomCommandParserManager* iCustomCommandParserManager; williamr@2: }; williamr@2: williamr@2: williamr@2: williamr@2: /** williamr@2: @publishedAll williamr@2: @released williamr@2: williamr@2: Mixin class that the user of the class CMMFControllerEventMonitor must derive from. williamr@2: williamr@2: @since 7.0s williamr@2: */ williamr@2: class MMMFControllerEventMonitorObserver williamr@2: { williamr@2: public: williamr@2: williamr@2: /** williamr@2: Handles an event that has been generated. williamr@2: williamr@2: @param aEvent williamr@2: The event to be handled. williamr@2: williamr@2: @since 7.0s williamr@2: */ williamr@2: virtual void HandleEvent(const TMMFEvent& aEvent) = 0; williamr@2: }; williamr@2: williamr@2: /** williamr@2: @publishedAll williamr@2: @released williamr@2: williamr@2: Active object utility class that can be used to monitor a controller plugin for events. williamr@2: If an event occurs, the client will be notified via the MMMFControllerEventMonitorObserver interface. williamr@2: williamr@2: @since 7.0s williamr@2: */ williamr@2: class CMMFControllerEventMonitor : public CActive williamr@2: { williamr@2: public: williamr@2: williamr@2: /** williamr@2: Constructs a controller event monitor object. williamr@2: williamr@2: @param aObserver williamr@2: A reference to the observer of the active object. The observer will be williamr@2: notified when an event occurs. williamr@2: @param aMMFController williamr@2: A reference to the client controller interface class. williamr@2: williamr@2: @return A pointer to the new event monitor. williamr@2: williamr@2: @since 7.0s williamr@2: */ williamr@2: IMPORT_C static CMMFControllerEventMonitor* NewL(MMMFControllerEventMonitorObserver& aObserver, williamr@2: RMMFController& aMMFController); williamr@2: /** williamr@2: Destructor. williamr@2: */ williamr@2: ~CMMFControllerEventMonitor(); williamr@2: williamr@2: /** williamr@2: Tells the controller event monitor to start listening for events. williamr@2: williamr@2: The controller plugin must have been opened before this method is called. williamr@2: williamr@2: @since 7.0s williamr@2: */ williamr@2: IMPORT_C void Start(); williamr@2: williamr@2: private: williamr@2: /** williamr@2: Calls HandleEvent on iObserver. williamr@2: williamr@2: This will not leave. williamr@2: williamr@2: @since 7.0s williamr@2: */ williamr@2: void RunL(); williamr@2: williamr@2: /** williamr@2: Cancels the outstanding request on iMMFController. williamr@2: williamr@2: @since 7.0s williamr@2: */ williamr@2: void DoCancel(); williamr@2: williamr@2: /** williamr@2: Constructs a controller event monitor object. williamr@2: williamr@2: @param aObserver williamr@2: A reference to the observer of the active object. The observer will be williamr@2: notified when an event occurs. williamr@2: @param aMMFController williamr@2: A reference to the client controller interface class. williamr@2: williamr@2: @since 7.0s williamr@2: */ williamr@2: CMMFControllerEventMonitor(MMMFControllerEventMonitorObserver& aObserver, williamr@2: RMMFController& aMMFController); williamr@2: private: williamr@2: MMMFControllerEventMonitorObserver& iObserver; williamr@2: RMMFController& iMMFController; williamr@2: TMMFEventPckg iEventPckg; williamr@2: }; williamr@2: williamr@2: /** williamr@2: Mixin class that the user of the class CMMFAddDataSourceSinkAsync must derive from. williamr@2: @since 8.0 williamr@2: @publishedAll williamr@2: @released williamr@2: */ williamr@2: class MMMFAddDataSourceSinkAsyncObserver williamr@2: { williamr@2: public: williamr@2: /** williamr@2: The request to add a data source or sink has completed. williamr@2: @param "aError" "The error resulting from adding the source/sink." williamr@2: @param "aHandleInfo" "This object identifies the data source/sink inside the controller williamr@2: framework. This allows the client to send custom commands directly to williamr@2: the data source/sink, and to also remove the data sink from the controller. williamr@2: Note that not all data sinks support custom commands, and not all williamr@2: controller plugins support the removal of a data sink." williamr@2: */ williamr@2: virtual void MadssaoAddDataSourceSinkAsyncComplete(TInt aError, const TMMFMessageDestination& aHandle) = 0; williamr@2: }; williamr@2: williamr@2: williamr@2: /** williamr@2: Active object utility class that can be used to add a data source or data sink to a controller williamr@2: plugin asynchronously. Once the command has been completed, the caller will be notified via the williamr@2: MMMFAddDataSourceSinkAsyncObserver interface. williamr@2: @since 8.0 williamr@2: @publishedAll williamr@2: @released williamr@2: williamr@2: */ williamr@2: class CMMFAddDataSourceSinkAsync : public CActive williamr@2: { williamr@2: public: williamr@2: williamr@2: IMPORT_C static CMMFAddDataSourceSinkAsync* NewL(MMMFAddDataSourceSinkAsyncObserver& aObs); williamr@2: IMPORT_C void AddDataSource(RMMFController& aController, TUid aSourceUid, const TDesC8& aSourceInitData); williamr@2: IMPORT_C void AddFileHandleDataSource(RMMFController& aController, const RFile& aFile); williamr@2: IMPORT_C void AddFileHandleDataSource(RMMFController& aController, const RFile& aFile, const TDesC8& aSourceInitData); williamr@2: IMPORT_C void AddDataSink(RMMFController& aController, TUid aSinkUid, const TDesC8& aSinkInitData); williamr@2: IMPORT_C void AddFileHandleDataSink(RMMFController& aController, const RFile& aFile); williamr@2: IMPORT_C void AddFileHandleDataSink(RMMFController& aController, const RFile& aFile, const TDesC8& aSinkInitData); williamr@2: williamr@2: ~CMMFAddDataSourceSinkAsync(); williamr@2: williamr@2: private: williamr@2: void RunL(); williamr@2: void DoCancel(); williamr@2: CMMFAddDataSourceSinkAsync(MMMFAddDataSourceSinkAsyncObserver& aObserver); williamr@2: private: williamr@2: enum TCurrentAction {EIdle, EAddingDataSource, EAddingDataSink}; williamr@2: private: williamr@2: MMMFAddDataSourceSinkAsyncObserver& iObserver; williamr@2: TMMFMessageDestinationPckg iHandleInfoPckg; williamr@2: TCurrentAction iCurrentAction; williamr@2: RMMFController* iMMFController; williamr@2: HBufC8* iSourceSinkInitData; williamr@2: TMMFUidPckg iSourceSinkUidPckg; williamr@2: }; williamr@2: williamr@2: /** williamr@2: @internalComponent williamr@2: williamr@2: The controller proxy session. williamr@2: williamr@2: Only one session can be connected to a controller proxy server. williamr@2: williamr@2: */ williamr@2: NONSHARABLE_CLASS(CMMFControllerExtendedData) : public CMMFObject williamr@2: { williamr@2: public: williamr@2: CMMFControllerExtendedData(); williamr@2: williamr@2: ~CMMFControllerExtendedData(); williamr@2: williamr@2: // Set/Get the source/sink initialization data used by CMMFController williamr@2: // Ownership of aSourceSinkInitData is transferred (NULL pointer is allow) williamr@2: // If source/sink initialization data is already set, previous one will be destroyed williamr@2: void SetSourceSinkInitData(HBufC8* aSourceSinkInitData); williamr@2: HBufC8* SourceSinkInitData() const; williamr@2: void ResetSourceSinkInitData(); williamr@2: williamr@2: // Set/Get the client thread ID used by CMMFController williamr@2: void SetClientThreadId(TThreadId aClientThreadId); williamr@2: TThreadId ClientThreadId() const; williamr@2: williamr@2: // Set/Get the Secure DRM mode of CMMFController williamr@2: void SetSecureDrmMode(TBool aSecureDrmMode); williamr@2: TBool SecureDrmMode() const; williamr@2: williamr@2: //from CMMFObject williamr@2: void HandleRequest(TMMFMessage& aMessage); williamr@2: private: williamr@2: /** williamr@2: Extended data uses by CMMFController: Source/Sink initialization data williamr@2: It serves as a temporary storage for Source/Sink initialization williamr@2: Client should request the server to use and cleanup this variable ASAP williamr@2: once it is being loaded williamr@2: */ williamr@2: HBufC8* iSourceSinkInitData; williamr@2: williamr@2: /** williamr@2: Extended data uses by CMMFController: The client thread Id williamr@2: */ williamr@2: TThreadId iClientThreadId; williamr@2: williamr@2: /** williamr@2: Extended data uses by CMMFController: Controller Scecure DRM Mode williamr@2: */ williamr@2: TBool iSecureDrmMode; williamr@2: }; williamr@2: williamr@2: #endif