--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/contentmgmt/referencedrmagent/TestAgent/TestAgentDrmContent.cpp Mon Oct 12 10:17:04 2009 +0300
@@ -0,0 +1,266 @@
+/*
+* Copyright (c) 2004-2009 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "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:
+*
+*/
+
+
+#include <caf/caf.h>
+#include "TestAgentDrmContent.h"
+
+using namespace ContentAccess;
+
+CTestAgentDrmContent* CTestAgentDrmContent::NewL(RFile& aFile)
+ {
+ CTestAgentDrmContent *self = new (ELeave) CTestAgentDrmContent(aFile);
+ CleanupStack::PushL(self);
+ self->ConstructL();
+ CleanupStack::Pop(self);
+ return self;
+ }
+
+CTestAgentDrmContent::CTestAgentDrmContent(RFile& aFile) : iFile(aFile)
+ {
+ }
+
+CTestAgentDrmContent::~CTestAgentDrmContent()
+ {
+ delete iContentMimeType;
+ }
+
+void CTestAgentDrmContent::ConstructL()
+ {
+ // buffer for reading field sizes from the file
+ TBuf8 <4> buf;
+
+ // Get size of mime type field
+ User::LeaveIfError(iFile.Read(buf,1));
+ TUint8 contentTypeLength = buf[0];
+
+ // Read mime type field
+ iContentMimeType = HBufC8::NewL((TInt) contentTypeLength);
+ TPtr8 mimePtr = iContentMimeType->Des();
+ User::LeaveIfError(iFile.Read(mimePtr, (TInt) contentTypeLength));
+
+ // Read whether or not file has been imported yet
+ User::LeaveIfError(iFile.Read(buf,1));
+
+ // Get size of data
+ User::LeaveIfError(iFile.Read(buf,4));
+ iDataSize = buf[0];
+ iDataSize <<= 8;
+ iDataSize += buf[1];
+ iDataSize <<= 8;
+ iDataSize += buf[2];
+ iDataSize <<= 8;
+ iDataSize += buf[3];
+
+ // Calculate offset of data
+ iDataOffset = 1 + 1 + 4 + contentTypeLength;
+
+ // Go to the start of the DRM file
+ TInt pos = 0;
+ Seek(ESeekStart, pos);
+ }
+
+TInt CTestAgentDrmContent::ReadTUintvarL(TDes8& aBuffer, TInt Offset, TInt& aNumBytes) const
+ {
+ TUint8 byte;
+ TInt Value=0;
+ TBool Continue = ETrue;
+
+ for(aNumBytes = 0; Continue ; aNumBytes++)
+ {
+ Value <<= 7;
+ if(Offset + aNumBytes == aBuffer.Length())
+ User::Leave(KErrOverflow);
+
+ byte = aBuffer[Offset + aNumBytes];
+ if((byte & 0x80) == 0)
+ {
+ Continue=EFalse;
+ }
+ else
+ {
+ byte &= 0x7F;
+ }
+
+ Value+=byte;
+ }
+ return Value;
+ }
+
+
+TInt CTestAgentDrmContent::Read(TDes8& aDes,TInt aLength)
+ {
+ return iFile.Read(aDes, aLength);
+ }
+
+void CTestAgentDrmContent::Read(TDes8& aDes, TInt aLength, TRequestStatus& aStatus)
+ {
+ iFile.Read(aDes, aLength, aStatus);
+ }
+
+void CTestAgentDrmContent::ReadCancel(TRequestStatus& aStatus)
+{
+ iFile.ReadCancel(aStatus);
+}
+
+TInt CTestAgentDrmContent::Seek(TSeek aMode, TInt& aPos)
+ {
+ TInt rval;
+ // Don't allow the user to seek into the OMA header, only around the data itself
+ TInt Offset;
+
+ switch(aMode)
+ {
+ case ESeekAddress:
+ // Unlikely for this case to be used
+ if(aPos > iDataSize || aPos < 0)
+ return KErrArgument;
+
+ Offset = iDataOffset + aPos;
+ rval = iFile.Seek(aMode, Offset);
+ // Offset is populated with the ROM address, fill in aPos for the caller
+ aPos=Offset;
+ break;
+
+ case ESeekStart:
+ if(aPos > iDataSize)
+ aPos = iDataSize;
+ if(aPos < 0)
+ return KErrArgument;
+ Offset = iDataOffset + aPos;
+ rval = iFile.Seek(aMode, Offset);
+ break;
+ case ESeekCurrent:
+ Offset = aPos;
+ rval = iFile.Seek(aMode, Offset);
+ // if we have done a seek before the start of the data
+ // do another seek to get back to the start of the data
+ if(Offset < iDataOffset)
+ {
+ Offset = iDataOffset;
+ rval = iFile.Seek(ESeekStart, Offset);
+ aPos = 0;
+ }
+ else
+ {
+ aPos = Offset - iDataOffset;
+ }
+ break;
+ case ESeekEnd:
+ // offsets are negative for ESeekEnd
+ Offset = aPos;
+ if(Offset < - iDataSize)
+ Offset = - iDataSize;
+ rval = iFile.Seek(aMode, Offset);
+ aPos = Offset - iDataOffset;
+ break;
+ default:
+ return KErrNotSupported;
+ }
+ return rval;
+ }
+
+TPtrC8 CTestAgentDrmContent::ContentMimeType()
+ {
+ return *iContentMimeType;
+ }
+
+TInt CTestAgentDrmContent::GetAttribute(TInt aAttribute, TInt& aValue)
+ {
+ TInt err = KErrNone;
+
+ switch(aAttribute)
+ {
+ case EIsProtected:
+ aValue = ETrue;
+ break;
+ case EIsForwardable:
+ aValue = EFalse;
+ break;
+ case EIsModifyable:
+ aValue = EFalse;
+ break;
+ case EIsCopyable:
+ aValue = EFalse;
+ break;
+ case ECanPlay:
+ aValue = ETrue;
+ break;
+ case ECanPrint:
+ aValue = ETrue;
+ break;
+ case ECanExecute:
+ aValue = ETrue;
+ break;
+ case ECanView:
+ aValue = ETrue;
+ break;
+ case EPreviewAvailable:
+ aValue = EFalse;
+ break;
+ case EContentCDataInUse:
+ aValue = KErrCANotSupported;
+ break;
+ case ECanRewind:
+ aValue = ETrue;
+ break;
+ case ECopyPaste:
+ aValue = ETrue;
+ break;
+ case ECanMove:
+ aValue = ETrue;
+ break;
+ case ECanRename:
+ aValue = ETrue;
+ break;
+ case ECanAutomaticConsume:
+ aValue = ETrue;
+ break;
+ case EContentVersion:
+ default:
+ err = KErrCANotSupported;
+ break;
+ };
+ return err;
+ }
+
+TInt CTestAgentDrmContent::GetStringAttribute(TInt aAttribute, TDes& aValue)
+ {
+ TInt err = KErrNone;
+ switch(aAttribute)
+ {
+ // the content object
+ case EMimeType:
+ aValue.Copy(*iContentMimeType);
+ break;
+ default:
+ err = KErrCANotSupported;
+ break;
+ };
+ return err;
+ }
+
+void CTestAgentDrmContent::DataSizeL(TInt &aSize)
+ {
+ aSize = iDataSize;
+ }
+
+void CTestAgentDrmContent::Read(TInt aPos, TDes8& aDes, TInt aLength, TRequestStatus& aStatus)
+ {
+ TInt offset = aPos + iDataOffset;
+ iFile.Read(offset, aDes, aLength, aStatus);
+ }