--- /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 <dcfcommon.h>
+#include <mode.h>
+#include <symmetric.h>
+#include <rijndael.h>
+
+// 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<TUint8> iPage;
+ RArray<TInt> iPageUsageCount;
+ RArray<TInt> iPagePosition;
+ TEncryptionMethod iEncryptionMethod;
+ TBuf8<KDCFKeySize> 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