diff -r 000000000000 -r b8ed18f6c07b mmlibs/mmfw/Recogniser/src/readers.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mmlibs/mmfw/Recogniser/src/readers.h Thu Oct 07 22:34:12 2010 +0100 @@ -0,0 +1,176 @@ +// Copyright (c) 2006-2009 Nokia Corporation and/or its subsidiary(-ies). +// All rights reserved. +// This component and the accompanying materials are made available +// under the terms of "Eclipse Public License v1.0" +// which accompanies this distribution, and is available +// at the URL "http://www.eclipse.org/legal/epl-v10.html". +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// + +#ifndef READERS_H +#define READERS_H + +#include "constants.h" +#include "mmruf.h" + + +static const TInt KAACFrameHeaderSize = 7; +static const TInt KMP3FrameHeaderSize = 4; +static const TInt KBufSize = 64; + + +// +// This class provides a level of abstraction that allows +// for parsing data. It is necessary because AppArc may +// only provide a buffer that contains a limited snapshot +// of the beginning of a file, or a file handle that allows +// the whole file to be parsed. +// +class CReader : public CBase + { +public: + + // + // Enums used so that CParsers can determine + // the type of reader they've been given. + // + typedef enum + { + EUnknown = 0, + EBuffer = 1, + EFile = 2 + } + TReaderType; + + // + // This function resets the reader such that the next + // read operation will be performed from the start of + // the source. + // For a CFileReader the buffer is filled from the start + // of the file, for a CBufferReader the position in the + // buffer is set to zero. + // + virtual void Reset() { iBufPos = 0; } + + // + // Seeks within the source. + // This function tries to support 64-bit compatible file + // formats as much as possible, but there may be some + // instances when the operation cannot be performed due to + // limitations of the file server. + // + virtual void SeekL(TInt64 aOffset) = 0; + + // + // Seeks within the source. + // + virtual void SeekL(TInt aOffset) = 0; + + // + // Returns the current position in the buffer. + // + virtual TInt Position() { return iBufPos; } + + // + // Data reading routines. + // + TBool Match(const TDesC8& aPattern); + void Read64L(TInt64& aData, TBool aLittleEndian = EFalse); + void Read32L(TUint32& aData, TBool aLittleEndian = EFalse); + void Read16L(TUint16& aData, TBool aLittleEndian = EFalse); + void ReadByteL(TUint8& aData); + void ReadBytesL(TDes8& aData); + + // + // Gets the type of Reader being used. + // + inline TReaderType Type() { return iType; } + +protected: + CReader(const TDesC8& aBuffer, CReader::TReaderType aType); + + // + // Returns ETrue if there is aAmount of unread bytes available, + // EFalse otherwise. + // + virtual TBool CheckEnoughData(TInt aAmount); + + // + // Non-leaving Seek + // + TInt Seek(TInt aOffset); + TInt Seek(TInt64 aOffset); + +private: + const TDesC8& iBuffer; // The buffer that contains the source data. + TInt iBufPos; // The current position in the data source. + CReader::TReaderType iType; // The type of reader it is. + }; + + +// +// This class allows reading and seeking operations to be +// performed on a data buffer. This is used when no file +// handle is available to the recogniser. +// +class CBufferReader : public CReader + { +public: + static CBufferReader* NewLC(const TDesC8& aBuffer); + virtual ~CBufferReader(); + void Reset(); + void SeekL(TInt aOffset); // CReader + void SeekL(TInt64 aOffset); // CReader + +protected: + CBufferReader(const TDesC8& aBuffer); + CBufferReader(const TDesC8& aBuffer, TReaderType aType); + void ConstructL(); + }; + + +// +// This class allows reading and seeking operations to be +// performed on a file handle. This is used when a file +// handle is available to the recogniser. +// +class CFileReader : public CBufferReader + { +public: + static CFileReader* NewLC(RFile* aFile); + virtual ~CFileReader(); + void Reset(); + + // + // CReader::Position() override. + // + TInt Position() { return CBufferReader::Position() + iFilePos; } + + void SeekL(TInt aOffset); // CReader + void SeekL(TInt64 aOffset); // CReader + +protected: + CFileReader(RFile* aFile); + void ConstructL(); + TBool CheckEnoughData(TInt aAmount); // CReader + + // + // Seeks to a new file location and fills the buffer from there. + // + TInt PhysicallySeekAndRead(TInt aAmount); + TInt PhysicallySeekAndRead(TInt64 aOffset); +private: + RFile* iFile; + TInt64 iFilePos; + TBuf8 iFileBuffer; + }; + + +#endif +