diff -r 000000000000 -r 95b198f216e5 omadrm/drmengine/agentv2/inc/DcfCache.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/omadrm/drmengine/agentv2/inc/DcfCache.h Thu Dec 17 08:52:27 2009 +0200 @@ -0,0 +1,266 @@ +/* +* Copyright (c) 2002-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: Declaration of the DCF cache class +* +*/ + + + +#ifndef DCFCACHE_H +#define DCFCACHE_H + +// INCLUDES +#include +#include +#include +#include + +// enables async reading +#define ASYNC_READ + +// FORWARD DECLARATIONS + +class RFile; +class RDRMRightsClient; +class CDcfCommon; + +// CLASS DECLARATION + +/** + * Cache for reading decrypted or plain data from a DCF file + * + * @lib OmaDrmAgent.dll + * @since Series 60 3.0 + */ + +class CDcfCache : public +#ifdef ASYNC_READ + CActive +#else + CBase +#endif + { + +public: + // Constructors and destructor + + /** + * Two-phased constructor. + */ + static CDcfCache* NewL( + RDRMRightsClient& aRightsClient, + RFile& aFile, + CDcfCommon& aDcf, + TInt aPageSize = 2048, + TInt aPageCount = 32 ); + + /** + * Destructor. + */ + virtual ~CDcfCache(); + +public: + // New functions + + /** + * Read data from the file via the cache. Depending on the decryption + * mode, the data is decrypted in the RightsServer or in the cache + * @since Series 60 3.0 + * @param aPos Position from the start of the file where to read from + * @param aDes Descriptor holding the read data + * @param aLength Amount of data to read + * @return KErrNone if the data is read successfully + */ + TInt Read( + TInt& aPos, + TDes8& aDes, + TInt aLength ); + + /** + * Set the decryption key to be used if decryption shall happen in the + * cache itself. + * @since Series 60 3.0 + * @param aKey AES128 decryption key + * @return ?description + */ + void SetKey( + const TDesC8& aKey ); + +#ifdef ASYNC_READ + + TInt Read( + TInt aPos, + TDes8& aDes, + TInt aLength, + TRequestStatus& aStatus ); + + void ReadCancel( TRequestStatus& aStatus ); +#endif + +protected: + // New functions + + void CachedReadL( + TInt& aPos, + TDes8& aDes, + TInt aLength ); + + void UncachedReadL( + TInt& aPos, + TDes8& aDes, + TInt aLength ); + + /** + * Check if a file position is in the give cache page + * @since Series 60 3.0 + * @param aPage Page to check + * @param aPosition Position to check + * @return ETrue if the position is in the cache page + */ + TBool InPage( TInt aPage, TInt aPosition ); + + /** + * Return the index of a free cache page + * @since Series 60 3.0 + * @return Index of a free cache page + */ + TInt GetFreePage(); + + /** + * Read a page of plain data for a given file position into the cache + * @since Series 60 3.0 + * @param aPage Page to read + * @param aPosition Position to read + */ + void ReadPageL( TInt aPage, TInt aPosition ); + + /** + * Read a page of data for a given file position into the cache and + * decrypt it + * @since Series 60 3.0 + * @param aPage Page to read + * @param aPosition Position to read + */ + void ReadAndDecryptPageL( TInt aPage, TInt aPosition ); + + /** + * Copy data from a cache page into a descriptor + * @since Series 60 3.0 + * @param aPage Page from which to read + * @param aDes Decscriptor where the data is stored + * @param aPosition Position in the file, updated with the new + * position after the data has been read + * @param aLength Amount of data to be read, updated with the actual + * amount that was read + */ + void CopyOut( TInt aPage, TDes8& aDes, TInt& aPosition, TInt& aLength ); + + /** + * Decrypt a memory buffer using either the stored key or the + * RightsServer. + * @since Series 60 3.0 + * @param aIv AES CBC initialization vector + * @param aPtr Data to be decrypted + */ + void DecryptL( const TDesC8& aIv, TPtr8& aPtr ); + +#ifdef ASYNC_READ + void ReadAsyncL(); +#endif + +protected: + // Functions from base classes + +#ifdef ASYNC_READ + + /** + * From CActive + * @since Series60 3.0 + */ + void RunL(); + + /** + * From CActive + * @since Series60 3.0 + */ + void DoCancel(); + + /** + * From CActive + */ + TInt RunError( TInt aError ); +#endif + +private: + + /** + * C++ default constructor. + */ + CDcfCache( + RDRMRightsClient& aRightsClient, + RFile& aFile, + CDcfCommon& aDcf, + TInt aPageSize, + TInt aPageCount ); + + /** + * By default Symbian 2nd phase constructor is private. + */ + void ConstructL(); + +protected: + // Types and enumerations + + enum TDecryptionMode + { + EServerSide, + EClientSide, + }; + +#ifdef ASYNC_READ + + enum TReadMode + { + ENonPosRead, + EPosRead, + }; + +#endif +protected: + // Data + RFile& iFile; + RDRMRightsClient& iRightsClient; + CDcfCommon& iDcf; + TInt iPageSize; + TInt iPageCount; + RPointerArray iPage; + RArray iPageUsageCount; + RArray iPagePosition; + TEncryptionMethod iEncryptionMethod; + TBuf8 iKey; + TDecryptionMode iDecryptionMode; + +#ifdef ASYNC_READ + TRequestStatus* iAsyncStatus; + TInt iPos; + TDes8* iDes; + TInt iLength; + TReadMode iOperation; + TBool iAsyncReadingOngoing; + TInt iError; +#endif + }; + +#endif // DCFCACHE_H +// End of File