williamr@2: // Copyright (c) 2001-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@4: // under the terms of "Eclipse Public License v1.0" williamr@2: // which accompanies this distribution, and is available williamr@4: // at the URL "http://www.eclipse.org/legal/epl-v10.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: #ifndef __MMFFILE_H_ williamr@2: #define __MMFFILE_H_ williamr@2: williamr@2: #include williamr@2: williamr@2: #include williamr@2: #include williamr@4: #include "mmf/common/mmcaf.h" williamr@2: williamr@2: class CReadWriteRequest; williamr@2: class CTransferBufferCopy; williamr@2: class MGenericFile; williamr@2: williamr@2: /** williamr@2: @publishedAll williamr@2: @released williamr@2: williamr@2: Provides the filename and path of file. williamr@2: williamr@2: Used by CMMFFile::ConstructL(). williamr@2: */ williamr@2: class TMMFFileParams williamr@2: { williamr@2: public: williamr@2: /** williamr@2: Filename and path of file. williamr@2: */ williamr@2: TFileName iPath ; // Filename and path of file. williamr@2: private: williamr@2: /** williamr@2: This member is internal and not intended for use. williamr@2: */ williamr@2: TInt iReserved1; williamr@2: }; williamr@2: williamr@2: /** williamr@4: @publishedAll williamr@2: */ williamr@2: const TUid KFileHandleUid = {0x101FFA19}; williamr@2: const TUid KMMFileSourceUid = {0x101F7DA9}; williamr@2: const TUid KMMFileHandleSourceUid = {0x101F7DAA}; williamr@2: williamr@2: /** williamr@2: @publishedAll williamr@2: @released williamr@2: williamr@2: Provides a pointer to the file handle williamr@2: williamr@2: Used by CMMFFile::ConstructL(). williamr@2: */ williamr@2: class TMMFFileHandleParams williamr@2: { williamr@2: public: williamr@2: TMMFFileHandleParams(RFile* aFile) : iUid(KFileHandleUid), iFile(aFile) {} williamr@2: TMMFFileHandleParams() : iUid(KFileHandleUid) {} williamr@2: williamr@2: TUid iUid; williamr@2: /** williamr@2: Handle of file williamr@2: */ williamr@2: RFile* iFile; williamr@2: private: williamr@2: /** williamr@2: This member is internal and not intended for use. williamr@2: */ williamr@2: TInt iReserved1; williamr@2: }; williamr@2: williamr@2: williamr@2: williamr@2: williamr@2: /** williamr@2: @publishedAll williamr@2: @released williamr@2: */ williamr@2: typedef TPckgBuf TMMFFileConfig ; williamr@2: williamr@2: /** williamr@2: @publishedAll williamr@2: @released williamr@2: */ williamr@2: typedef TPckgBuf TMMFFileHandleConfig ; williamr@2: williamr@2: williamr@2: /** williamr@2: @publishedAll williamr@2: @released williamr@2: williamr@2: This details how big the iTransferBufferCopies array of CMMFFile may williamr@2: become before we start looking to free entries. williamr@2: */ williamr@2: const TInt KAcceptableTransferBufferCopiesSize = 5; williamr@2: williamr@2: /** williamr@2: @publishedAll williamr@2: @released williamr@2: williamr@2: This details how big the iTransferBufferCopies array of CMMFFile may williamr@2: become before we start looking to free entries. williamr@2: */ williamr@2: const TInt KMaximumTransferBufferCopiesSize = 100; williamr@2: williamr@2: williamr@2: /** williamr@2: @publishedAll williamr@2: @released williamr@2: williamr@2: MultiMedia framework class. Represents a physical file. williamr@2: williamr@2: This may be source file from which data is read or destination to which data is written. williamr@2: williamr@2: Intended to be used by controller plugin developers for source and sink plugins. williamr@2: */ williamr@2: class CMMFFile : public CMMFClip williamr@2: { williamr@2: public: williamr@2: // From MDataSource williamr@2: virtual TFourCC SourceDataTypeCode(TMediaId aMediaId) ; williamr@2: virtual void FillBufferL( CMMFBuffer* aBuffer, MDataSink* aConsumer, TMediaId aMediaId ) ; williamr@2: virtual void BufferEmptiedL( CMMFBuffer* aBuffer ) ; williamr@2: virtual TBool CanCreateSourceBuffer() ; williamr@2: virtual CMMFBuffer* CreateSourceBufferL( TMediaId aMediaId, TBool &aReference ) ; williamr@2: virtual TInt SourceThreadLogon(MAsyncEventHandler& aEventHandler) ; williamr@2: virtual void SourceThreadLogoff(); williamr@2: virtual void SourcePrimeL(); williamr@2: virtual void SourceStopL(); williamr@2: williamr@2: // From MDataSink williamr@2: virtual TFourCC SinkDataTypeCode(TMediaId aMediaId) ; //used by data path MDataSource/Sink for codec matching williamr@2: virtual void EmptyBufferL( CMMFBuffer* aBuffer, MDataSource* aSupplier, TMediaId aMediaId ) ; williamr@2: virtual void BufferFilledL( CMMFBuffer* aBuffer ) ; williamr@2: virtual TBool CanCreateSinkBuffer() ; williamr@2: virtual CMMFBuffer* CreateSinkBufferL( TMediaId aMediaId , TBool &aReference) ; williamr@2: virtual TInt SinkThreadLogon(MAsyncEventHandler& aEventHandler) ; williamr@2: virtual void SinkThreadLogoff(); williamr@2: virtual void SinkPrimeL(); williamr@2: virtual void SinkStopL(); williamr@2: williamr@2: // From CMMFClip williamr@2: virtual void ReadBufferL( TInt aLength, CMMFBuffer* aBuffer, TInt aPosition, MDataSink* aConsumer); williamr@2: virtual void WriteBufferL( TInt aLength, CMMFBuffer* aBuffer, TInt aPosition, MDataSource* aSupplier); williamr@2: virtual void ReadBufferL( CMMFBuffer* aBuffer, TInt aPosition, MDataSink* aConsumer) ; williamr@2: virtual void WriteBufferL( CMMFBuffer* aBuffer, TInt aPosition, MDataSource* aSupplier) ; williamr@2: virtual void ReadBufferL( CMMFBuffer* aBuffer, TInt aPosition ) ; williamr@2: virtual void WriteBufferL( CMMFBuffer* aBuffer, TInt aPosition ) ; williamr@2: virtual TInt64 BytesFree() ; // amount of space available for the clip williamr@2: virtual TInt Size() ; williamr@2: virtual TInt Delete(); williamr@2: virtual TInt SetSize(TInt aSize); williamr@2: williamr@2: // New Functions williamr@2: virtual const TDesC& FileName() const ; williamr@2: virtual const TDesC& Extension() const ; williamr@2: virtual const TDesC& FilePath() const ; williamr@2: virtual const TDesC& FileDrive() const ; williamr@2: virtual const TFileName FullName() const; williamr@2: virtual RFile& FileL() ; williamr@2: williamr@2: public : williamr@2: virtual ~CMMFFile() ; williamr@2: static MDataSource* NewSourceL() ; williamr@2: static MDataSink* NewSinkL() ; williamr@2: williamr@2: void SetTransferBuffer (TBool aTBuffer) ; williamr@2: TBool CanUseTransferBuffer () ; williamr@2: virtual TBool SinkStopped(); williamr@2: williamr@2: protected: williamr@2: /** williamr@2: Indicates for which purpose the object instance is being created williamr@2: */ williamr@2: enum TMMFileMode williamr@2: { williamr@2: /** The object is created for being a source */ williamr@2: ESourceMode, williamr@2: /** The object is created for being a sink */ williamr@2: ESinkMode williamr@2: }; williamr@2: virtual void ConstructSourceL( const TDesC8& aInitData ) ; williamr@2: virtual void ConstructSinkL( const TDesC8& aInitData ) ; williamr@2: void ConstructL(const TDesC8& aInitData, TMMFileMode aFileMode) ; williamr@2: CMMFFile() ; williamr@2: williamr@2: void StoreRequestL( CReadWriteRequest* aRequest ) ; williamr@2: void CancelRequests(); williamr@2: williamr@2: williamr@2: CTransferBufferCopy* ObtainCopyOfTransferBufferL(TInt aMaxLength); williamr@2: williamr@2: public: williamr@2: // Additional virtuals for DRM Intent williamr@2: virtual TInt ExecuteIntent(ContentAccess::TIntent aIntent); williamr@2: virtual TInt EvaluateIntent(ContentAccess::TIntent aIntent) const; williamr@2: virtual TBool IsProtectedL() const; williamr@2: williamr@2: virtual TInt SetAgentProperty(ContentAccess::TAgentProperty aProperty, TInt aValue); williamr@2: virtual const TDesC& UniqueId() const; williamr@2: williamr@2: private: williamr@2: class CMMFFileAsyncEventHandler : public MAsyncEventHandler williamr@2: { williamr@2: public: williamr@2: CMMFFileAsyncEventHandler(CMMFFile* aParent); williamr@2: virtual ~CMMFFileAsyncEventHandler(); williamr@2: public: williamr@2: virtual TInt SendEventToClient(const TMMFEvent& aEvent); williamr@2: private: williamr@2: CMMFFile* iParent; williamr@2: }; williamr@2: williamr@2: class CCAFParameters : public CBase williamr@2: { williamr@2: public: williamr@2: CCAFParameters() : iUniqueId(NULL), iEnableUI(EFalse) {} williamr@2: ~CCAFParameters() { delete iUniqueId; } williamr@2: public: williamr@2: HBufC* iUniqueId; williamr@2: TBool iEnableUI; williamr@2: }; williamr@2: williamr@2: public: williamr@2: virtual TInt Data(ContentAccess::CData*& aData); williamr@2: virtual void SourcePauseL(); williamr@2: williamr@2: private: williamr@2: MGenericFile* iFile; williamr@2: RFs iFsSession; williamr@2: williamr@2: TBool iFileHandle; williamr@2: RFile iHandle; williamr@2: TBool iReserved; williamr@2: williamr@2: TBool iSinkNotStopped; williamr@2: williamr@2: TFileName iFullFileName ; williamr@2: HBufC* iFileName ; williamr@2: HBufC* iFileExt ; williamr@2: HBufC* iFilePath ; williamr@2: HBufC* iFileDrive ; williamr@2: CCAFParameters* iCAFParameters; williamr@2: TInt iFileSize; //holds the cached file size williamr@2: williamr@2: //Keeps track of the read position within the file. Needed in order to enable passing of the williamr@2: //read position to the CReadRequest to manage the LastBuffer flag. williamr@2: //NB: Continuous reads once EOF has been reached will result in iPosition going > iFileSize, williamr@2: //but this causes no ill effects williamr@2: TUint iPosition; williamr@2: williamr@2: TFourCC iSinkFourCC ; williamr@2: TFourCC iSourceFourCC ; williamr@2: williamr@2: williamr@2: RPointerArray iRequests; williamr@2: williamr@2: MAsyncEventHandler *iEventHandler; williamr@2: CMMFFileAsyncEventHandler* iMmfFileEventHandler; williamr@2: williamr@2: RPointerArray iTransferBufferCopies; williamr@2: friend class CMMFFileAsyncEventHandler; williamr@2: }; williamr@2: williamr@2: #endif