contentmgmt/referencedrmagent/RefTestAgent/RTAParser/drmfilesparser.cpp
changeset 8 35751d3474b7
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/contentmgmt/referencedrmagent/RefTestAgent/RTAParser/drmfilesparser.cpp	Thu Sep 10 14:01:51 2009 +0300
@@ -0,0 +1,215 @@
+/*
+* 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: 
+* drmfileparser.cpp
+*
+*/
+
+
+#include "drmfilesparser.h"
+#include "drmfilecontainer.h"
+#include "containerparser.h"
+#include "contentparser.h"
+#include "drmfiles.h"
+#include "virtualFile.h"
+#include "tags.h"
+
+using namespace ReferenceTestAgent;
+using namespace Xml;
+
+_LIT8(KXmlMimeType, "text/xml");
+
+EXPORT_C CDrmFilesParser* CDrmFilesParser::NewL(CVirtualFile& aVirtualFile)
+	{
+	CDrmFilesParser* self = new (ELeave) CDrmFilesParser;
+	CleanupStack::PushL(self);
+	self->ConstructL(aVirtualFile);
+	CleanupStack::Pop(self);
+	return self;
+	}
+
+CDrmFilesParser* CDrmFilesParser::NewL()
+	{
+	CDrmFilesParser* self = new (ELeave) CDrmFilesParser;
+	CleanupStack::PushL(self);
+	self->ConstructL();
+	CleanupStack::Pop(self);
+	return self;
+	}
+
+		
+CDrmFilesParser::CDrmFilesParser() : iParseComplete(EFalse)
+	{
+	}
+
+void CDrmFilesParser::ConstructL(CVirtualFile& aVirtualFile)	
+	{
+	iDrmFiles = CDrmFiles::NewL();
+	CParser* xmlParser = CParser::NewLC(KXmlMimeType(), *this);
+	xmlParser->ParseBeginL();
+	
+	// Parse the file in chunks
+	TBuf8 <1024> buffer;
+	TInt length = buffer.MaxLength();
+	while(length > 0)
+		{
+		User::LeaveIfError(aVirtualFile.Read(buffer,length));
+		length = buffer.Length();
+		xmlParser->ParseL(buffer);
+		}
+
+	// Finished parsing
+	xmlParser->ParseEndL();
+	CleanupStack::PopAndDestroy(xmlParser); 
+	if(!iParseComplete)
+		{
+		#ifdef _DEBUG
+		LogL(_L("Not a complete XML file"));
+		#endif
+
+		User::Leave(KErrCorrupt);
+		}
+	}
+
+void CDrmFilesParser::ConstructL()	
+	{
+	_LIT8(KXmlMimeType, "text/xml");
+	iDrmFiles = CDrmFiles::NewL();
+	iXmlParser = CParser::NewL(KXmlMimeType(), *this);
+	iXmlParser->ParseBeginL();
+	}
+
+CDrmFilesParser::~CDrmFilesParser()
+	{
+	delete iDrmFiles;
+	delete iXmlParser;
+	}
+
+void CDrmFilesParser::ParseL(const TDesC8& aFragment)
+	{
+	iXmlParser->ParseL(aFragment);
+	}
+
+EXPORT_C CDrmFiles& CDrmFilesParser::DrmFilesL()
+	{
+	if(!iParseComplete && iXmlParser)
+		{
+		iXmlParser->ParseEndL();
+
+		// If parsing is still not complete must be something wrong with the file	
+		if(!iParseComplete)
+			{
+			#ifdef _DEBUG
+			LogL(_L("Not a complete XML file"));
+			#endif
+
+			User::Leave(KErrCorrupt);
+			}
+		}
+	return *iDrmFiles;
+	}
+
+void CDrmFilesParser::OnStartDocumentL(const RDocumentParameters& /*aDocParam*/, TInt aErrorCode)
+	{
+	User::LeaveIfError(aErrorCode);
+
+	#ifdef _DEBUG
+	LogL(_L("Start of content files XML document"));
+	#endif
+	}
+
+void CDrmFilesParser::OnEndDocumentL(TInt aErrorCode)
+	{
+	User::LeaveIfError(aErrorCode);
+
+	#ifdef _DEBUG
+	LogL(_L("End of content files XML document"));
+	#endif
+	}
+
+void CDrmFilesParser::ParseStartElementL(const RTagInfo& aElement, const RAttributeArray& aAttributes)
+	{
+	TPtrC8 tag(aElement.LocalName().DesC());
+	if(KDrmFileTag().CompareF(tag) == 0)
+		{
+		if(iFoundStartTag)
+			{
+			#ifdef _DEBUG
+			LogL(_L("ERROR: <drmfiles> tag found inside <drmfiles> tag"));
+			#endif
+
+			// We have already found the <DRMFiles> tag, there shouldn't be two of them
+			User::Leave(KErrCorrupt);
+			}
+		iFoundStartTag = ETrue;
+
+		#ifdef _DEBUG
+		LogL(_L("Start element <drmfiles>"));
+		#endif
+		}
+	else if(KContainerTag().CompareF(tag) == 0)
+		{
+		// <container>
+
+		// add a new container to the root container
+		CDrmFileContainer& newContainer = iDrmFiles->RootContainer().AddContainerL();
+				
+		// create a parser for the new container
+		StartChildParserL(CContainerParser::NewL(newContainer), aElement, aAttributes);
+		}
+	else if(KContentTag().CompareF(tag) == 0)
+		{
+		// <content cid = "...."> 
+		// Create a parser for the content object
+		StartChildParserL(CContentParser::NewL(iDrmFiles->RootContainer()), aElement, aAttributes);
+		}
+	else if (KStringAttributeTag().Compare(tag) == 0)
+		{
+		// <stringattribute name = "...."> 
+		// Create a parser for the string attribute
+		StartChildParserL(CContentParser::NewL(iDrmFiles->RootContainer()), aElement, aAttributes);	
+		}
+	else
+		{
+		#ifdef _DEBUG
+		LogL(_L("ERROR: Unexpected start element <%S>"), tag);
+		#endif
+
+		// unexpected start tag
+		User::Leave(KErrCorrupt);	
+		}
+	}
+		
+
+void CDrmFilesParser::ParseEndElementL(const RTagInfo& aElement)
+	{
+	TPtrC8 tag(aElement.LocalName().DesC());	
+	
+	// Check the end tag is </drmfiles>
+	if(KDrmFileTag().CompareF(tag) != 0)
+		{
+		#ifdef _DEBUG
+		LogL(_L("ERROR: Unexpected End element <%S>, expected </drmfiles>"), tag);
+		#endif
+
+		User::Leave(KErrCorrupt);
+		}
+
+	#ifdef _DEBUG
+	LogL(_L("  End element </drmfiles>"));
+	#endif
+
+	iParseComplete = ETrue;
+	iDrmFiles->UpdateContentL();
+	}