contentmgmt/referencedrmagent/RefTestAgent/RTAServer/Server/rtadatahandler.cpp
changeset 8 35751d3474b7
child 15 da2ae96f639b
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/contentmgmt/referencedrmagent/RefTestAgent/RTAServer/Server/rtadatahandler.cpp	Thu Sep 10 14:01:51 2009 +0300
@@ -0,0 +1,329 @@
+/*
+* 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: 
+*
+*/
+
+
+/**
+ @file
+ @test
+ @internalComponent
+*/
+#include <s32mem.h>
+#include <f32file.h>
+#include <s32file.h>
+
+#include "rtadatahandler.h"
+#include "RTAsession.h"
+#include "RTAserver.h"
+#include "rightsobject.h"
+#include "rtaArchive.h"
+#include "drmfilecontent.h"
+#include "drmfiles.h"
+
+using namespace ReferenceTestAgent;
+using namespace ContentAccess;
+
+CRtaDataHandler* CRtaDataHandler::NewL(const CSession2& aSession)
+	{
+	return new (ELeave) CRtaDataHandler(aSession);
+	}
+
+CRtaDataHandler::CRtaDataHandler(const CSession2& aSession) : CRtaMessageHandler(aSession)
+	{
+	}
+	
+CRtaDataHandler::~CRtaDataHandler()
+	{
+	delete iArchive;
+	iFile.Close();
+	}
+
+void CRtaDataHandler::ServiceL(const RMessage2& aMessage)
+//
+// Handle a client request.
+	{
+	switch (aMessage.Function())
+		{	
+	// RRtaData functions
+	case EOpenFile:
+	case ENoEnforceOpenFile:
+		OpenFileL(aMessage);
+		break;
+	case EOpenFileHandle:
+	case ENoEnforceOpenFileHandle:
+		OpenFileHandleL(aMessage);
+		break;
+	case EEvaluateIntent:
+	case ENoEnforceEvaluateIntent:
+		EvaluateIntentL(aMessage);
+		break;
+	case EExecuteIntent:
+	case ENoEnforceExecuteIntent:
+		ExecuteIntentL(aMessage);
+		break;
+	case EReadData:
+	case ENoEnforceReadData:
+		ReadDataL(aMessage);
+		break;
+	case EReadOffsetData:
+	case ENoEnforceReadOffsetData:
+		ReadOffsetDataL(aMessage);
+		break;
+	case ESeek:
+	case ENoEnforceSeek:
+		SeekL(aMessage);
+		break;
+	case EDataSize:
+	case ENoEnforceDataSize:
+		DataSizeL(aMessage);
+		break;
+	case EGetAttribute:
+		GetAttributeL(aMessage);
+		break;
+	case EGetAttributeSet:
+		GetAttributeSetL(aMessage);
+		break;
+	case EGetStringAttribute:
+		GetStringAttributeL(aMessage);
+		break;
+	case EGetStringAttributeSet:
+		GetStringAttributeSetL(aMessage);
+		break;
+	case EDataSetProperty:
+	case ENoEnforceDataSetProperty:
+		SetPropertyL(aMessage);
+		break;		
+	default:
+		CRtaSession::PanicClient(aMessage,EPanicIllegalFunction);
+		break;
+		}
+	}
+
+
+void CRtaDataHandler::OpenFileL(const RMessage2& aMessage)
+	{
+	TUint mode;
+	TPckg <TUint> fileModePckg(mode);
+	
+	HBufC* fileName = ReadDesC16LC(aMessage, 0);
+	HBufC* uniqueId= ReadDesC16LC(aMessage, 1);
+	aMessage.ReadL(2, fileModePckg);
+
+	User::LeaveIfError(Server().CheckPermittedFileName(*fileName));
+	User::LeaveIfError(iFile.Open(Server().Fs(), *fileName, mode));
+	
+	// create a DRM archive based upon the file handle 
+	iArchive = CRefTestAgentArchive::NewL(iFile);
+	iContentObject = &iArchive->DrmFilesL().FindL(*uniqueId);
+	
+	CleanupStack::PopAndDestroy(2, fileName); // fileName, UniqueId
+	}
+	
+void CRtaDataHandler::OpenFileHandleL(const RMessage2& aMessage)
+	{
+	User::LeaveIfError(iFile.AdoptFromClient(aMessage, 0, 1));
+	HBufC* uniqueId = ReadDesC16LC(aMessage, 2);	
+	
+	// create a DRM archive based upon the file handle 
+	iArchive = CRefTestAgentArchive::NewL(iFile);
+	iContentObject = &iArchive->DrmFilesL().FindL(*uniqueId);
+	
+	CleanupStack::PopAndDestroy(uniqueId); // file, UniqueId
+	}
+
+void CRtaDataHandler::EvaluateIntentL(const RMessage2& aMessage)
+	{
+	TIntent intent;
+	TPckg <TIntent> intentPckg(intent);
+	aMessage.ReadL(0, intentPckg);
+	
+	Server().EvaluateIntentL(iContentObject->Cid(), intent);	
+	}
+
+void CRtaDataHandler::ExecuteIntentL(const RMessage2& aMessage)
+	{
+	TIntent intent;
+	TPckg <TIntent> intentPckg(intent);
+	aMessage.ReadL(0, intentPckg);
+
+	Server().ExecuteIntentL(iContentObject->Cid(), intent);
+	}
+
+void CRtaDataHandler::ReadDataL(const RMessage2& aMessage)
+	{
+	TInt length = 0;
+	TPckg <TInt> lengthPckg(length);
+	
+	HBufC8* buffer = ReadDes8LC(aMessage, 0);
+	aMessage.ReadL(1, lengthPckg);
+
+	TPtr8 bufPtr = buffer->Des();	
+	User::LeaveIfError(iContentObject->Read(bufPtr, length));
+	
+	WriteL(aMessage, 0, *buffer);
+	
+	CleanupStack::PopAndDestroy(buffer);
+	}
+
+void CRtaDataHandler::ReadOffsetDataL(const RMessage2& aMessage)
+	{
+	TInt length = 0;
+#ifdef SYMBIAN_ENABLE_64_BIT_FILE_SERVER_API
+	TInt64 pos = 0;
+	TPckg <TInt64> posPckg(pos);
+#else
+	TInt pos = 0;
+	TPckg <TInt> posPckg(pos);
+#endif // SYMBIAN_ENABLE_64_BIT_FILE_SERVER_API
+	TPckg <TInt> lengthPckg(length);
+	
+	aMessage.ReadL(0, posPckg);
+	HBufC8* buffer = ReadDes8LC(aMessage, 1);
+	aMessage.ReadL(2, lengthPckg);
+
+	TPtr8 bufPtr = buffer->Des();	
+	User::LeaveIfError(iContentObject->Read(pos, bufPtr, length));
+	
+	WriteL(aMessage, 1, *buffer);
+	
+	CleanupStack::PopAndDestroy(buffer);
+	}
+
+	
+void CRtaDataHandler::SeekL(const RMessage2& aMessage)
+	{
+	TSeek mode;
+	TPckg <TSeek> modePckg(mode);
+	aMessage.ReadL(0, modePckg);
+	
+#ifdef SYMBIAN_ENABLE_64_BIT_FILE_SERVER_API
+	TInt64 pos = 0;
+	TPckg <TInt64> posPckg(pos);
+#else
+	TInt pos = 0;
+	TPckg <TInt> posPckg(pos);
+#endif // SYMBIAN_ENABLE_64_BIT_FILE_SERVER_API	
+	aMessage.ReadL(1, posPckg);
+	
+	User::LeaveIfError(iContentObject->Seek(mode, pos));
+	
+	WriteL(aMessage, 1, posPckg);
+	}
+
+void CRtaDataHandler::DataSizeL(const RMessage2& aMessage)
+	{
+#ifdef SYMBIAN_ENABLE_64_BIT_FILE_SERVER_API
+	TInt64 size = 0;
+	TPckg <TInt64> sizePckg(size);
+#else
+	TInt size = 0;
+	TPckg <TInt> sizePckg(size);
+#endif // SYMBIAN_ENABLE_64_BIT_FILE_SERVER_API
+
+	aMessage.ReadL(0, sizePckg);
+	
+	User::LeaveIfError(iContentObject->Size(size));
+	
+	WriteL(aMessage, 0, sizePckg);
+	}
+
+void CRtaDataHandler::GetAttributeL(const RMessage2& aMessage)
+	{
+	TInt attribute;
+	TPckg <TInt> attributePckg(attribute);
+
+	TInt value;
+	TPckg <TInt> valuePckg(value);			
+
+	aMessage.ReadL(0, attributePckg);
+	
+	iContentObject->GetAttribute(attribute, value);
+	
+	WriteL(aMessage, 1, valuePckg);
+	}
+	
+void CRtaDataHandler::GetAttributeSetL(const RMessage2& aMessage)
+	{
+	RAttributeSet attributeSet;
+	CleanupClosePushL(attributeSet);
+	
+	HBufC8* value = ReadDes8LC(aMessage, 0);
+	TPtr8 valuePtr = value->Des();
+	RDesReadStream readStream(valuePtr);
+	attributeSet.InternalizeL(readStream);
+	CleanupStack::PopAndDestroy(value);
+	
+	iContentObject->GetAttributeSet(attributeSet);
+
+	// Write the object out to a buffer, send to client
+	CBufFlat* buf = CBufFlat::NewL(50);
+	CleanupStack::PushL(buf);
+	// create write stream
+	RBufWriteStream writeStream(*buf);
+	// write the directory to the stream
+	attributeSet.ExternalizeL(writeStream);
+	TPtr8 bufPtr = buf->Ptr(0);
+	WriteL(aMessage, 0, bufPtr);
+		
+	CleanupStack::PopAndDestroy(2, &attributeSet); // buf, attributeSet
+	}
+	
+void CRtaDataHandler::GetStringAttributeL(const RMessage2& aMessage)
+	{
+	TInt attribute;
+	TPckg <TInt> attributePckg(attribute);
+	aMessage.ReadL(0, attributePckg);
+	
+	HBufC* value = ReadDes16LC(aMessage, 1);
+	TPtr valuePtr = value->Des();
+	
+	User::LeaveIfError(iContentObject->GetStringAttribute(attribute, valuePtr));
+	
+	WriteL(aMessage, 1, valuePtr);
+	
+	CleanupStack::PopAndDestroy(value);
+	}
+	
+void CRtaDataHandler::GetStringAttributeSetL(const RMessage2& aMessage)
+	{
+	RStringAttributeSet attributeSet;
+	CleanupClosePushL(attributeSet);
+	
+	HBufC8* value = ReadDes8LC(aMessage, 0);
+	TPtr8 valuePtr = value->Des();
+	RDesReadStream readStream(valuePtr);
+	attributeSet.InternalizeL(readStream);
+	CleanupStack::PopAndDestroy(value);
+	
+	iContentObject->GetStringAttributeSet(attributeSet);
+
+	// Write the object out to a buffer, send to client
+	CBufFlat* buf = CBufFlat::NewL(50);
+	CleanupStack::PushL(buf);
+	// create write stream
+	RBufWriteStream writeStream(*buf);
+	// write the directory to the stream
+	attributeSet.ExternalizeL(writeStream);
+	TPtr8 bufPtr = buf->Ptr(0);
+	WriteL(aMessage, 0, bufPtr);
+		
+	CleanupStack::PopAndDestroy(2, &attributeSet); // buf, attributeSet
+	}
+
+void CRtaDataHandler::SetPropertyL(const RMessage2& /*aMessage*/)
+	{	
+	User::Leave(KErrCANotSupported);
+	}