/*
* Copyright (c) 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 "wmdrmcontentparser.h"
#include <caf/caferr.h>

using namespace ReferenceTestAgent;
using namespace ContentAccess;

EXPORT_C CWmdrmContentParser* CWmdrmContentParser::NewL(const TDesC8& aHeaderData)
	{
	CWmdrmContentParser* self = new (ELeave) CWmdrmContentParser;
	CleanupStack::PushL(self);
	self->ConstructL(aHeaderData);
	CleanupStack::Pop(self);
	return self;
	}


CWmdrmContentParser::CWmdrmContentParser()
	{
	}


void CWmdrmContentParser::ConstructL(const TDesC8& aHeaderData)
	{
	iHeaderData = aHeaderData.AllocL();	
	
	// Initialise default attributes.
	CreateAttributeSetL();
	CreateStringAttributeSetL();
	}
	
void CWmdrmContentParser::CreateAttributeSetL()
	{
	// Initialise attributes
	SetAttributeL(EIsProtected, ETrue, KErrNone);
	SetAttributeL(EIsForwardable, EFalse, KErrNone);
	SetAttributeL(EIsModifyable, EFalse, KErrNone);
	SetAttributeL(EIsCopyable, EFalse, KErrNone);
	SetAttributeL(ECanPlay, EFalse, KErrNone);
	SetAttributeL(ECanPrint, EFalse, KErrNone);
	SetAttributeL(ECanExecute, EFalse, KErrNone);
	SetAttributeL(ECanView, EFalse, KErrNone);
	SetAttributeL(ERightsNone, ETrue, KErrNone);
	SetAttributeL(ERightsPending, EFalse, KErrNone);
	SetAttributeL(ERightsHaveExpired, EFalse, KErrNone);
	SetAttributeL(EPreviewAvailable, EFalse, KErrNone);
	SetAttributeL(ECanRewind, EFalse, KErrNone);
	SetAttributeL(ECopyPaste, EFalse, KErrNone);
	SetAttributeL(ERightsConsumable, EFalse, KErrNone);
	SetAttributeL(ERightsStateless, EFalse, KErrNone);
	SetAttributeL(ECanMove, ETrue, KErrNone);
	SetAttributeL(ECanRename, ETrue, KErrNone);
	SetAttributeL(ECanAutomaticConsume, EFalse, KErrNone);
	}
	
void CWmdrmContentParser::CreateStringAttributeSetL()
	{
	// Initialise string attributes.
	_LIT(KDescription, "WMDRM");
	SetStringAttributeL(EDescription , KDescription, KErrNone);
	
	_LIT(KMimeType, "application/vnd.drm.asf");

	SetStringAttributeL(EMimeType, KMimeType, KErrNone);
	}

void CWmdrmContentParser::SetAttributeL(TInt aAttribute, TInt aValue, TInt aErrorCode)	
	{
	iAttributeSet.AddL(aAttribute);
	User::LeaveIfError(iAttributeSet.SetValue(aAttribute, aValue, aErrorCode));
	}
	
void CWmdrmContentParser::SetStringAttributeL(TInt aAttribute, const TDesC& aValue, TInt aErrorCode)	
	{
	iStringAttributeSet.AddL(aAttribute);
	User::LeaveIfError(iStringAttributeSet.SetValue(aAttribute, aValue, aErrorCode));
	}
	
CWmdrmContentParser::~CWmdrmContentParser()
	{
	delete iHeaderData;
	
	iAttributeSet.Close();
	iStringAttributeSet.Close();
	}

EXPORT_C TInt CWmdrmContentParser::GetAttribute(TInt aAttribute, TInt& aValue) const
	{
	return iAttributeSet.GetValue(aAttribute, aValue);
	}
	
EXPORT_C TInt CWmdrmContentParser::GetStringAttribute(TInt aAttribute, TDes& aValue) const
	{
	return iStringAttributeSet.GetValue(aAttribute, aValue);
	}
	
EXPORT_C TInt CWmdrmContentParser::GetAttributeSet(RAttributeSet &aAttributeSet) const
	{
	TInt value = 0;
	TInt err = KErrNone;
	for(TInt i = 0; i < aAttributeSet.Count(); i++)
		{
		TInt attribute = aAttributeSet[i];
		err = GetAttribute(attribute, value);
		if(err != KErrNone)
			{
			break;
			}
	
		aAttributeSet.SetValue(attribute, value, err);
		}
	return err;
	}

EXPORT_C TInt CWmdrmContentParser::GetStringAttributeSet(RStringAttributeSet &aStringAttributeSet) const
	{
	TInt err = KErrNone;
	for(TInt i = 0; i < aStringAttributeSet.Count(); i++)
		{
		TInt attribute = aStringAttributeSet[i];
		HBufC* value = NULL;
		TRAP(err, value = HBufC::NewL(iStringAttributeSet.GetValueLength(attribute)));
		CleanupStack::PushL(value);

		TPtr valuePtr = value->Des();
		err = GetStringAttribute(attribute, valuePtr);
		if(err != KErrNone)
			{
			CleanupStack::PopAndDestroy(value);
			break;
			}

		aStringAttributeSet.SetValue(attribute, valuePtr, err);
		CleanupStack::PopAndDestroy(value);
		}
	return err;
	}
