xml/legacyminidomparser/XMLParser/SRC/GMXMLFileDataSource.cpp
changeset 0 e35f40988205
child 19 243519c5055f
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/xml/legacyminidomparser/XMLParser/SRC/GMXMLFileDataSource.cpp	Thu Dec 17 09:29:21 2009 +0200
@@ -0,0 +1,139 @@
+// Copyright (c) 2001-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:
+// @file
+// This file contains the definition of the CMDXMLParserFileDataSource class
+// which is responsible for feeding the data source interface from a given XML file.
+// The headers for this class exist in the XMLParser.h header file so that the old
+// file-based interface can be implemented using the data source API without removing
+// source compatibility for older code.
+// 
+//
+
+
+#include <f32file.h>
+#include <gmxmlparser.h>
+#include "GMXMLFileDataSource.h"
+
+CMDXMLParserFileDataSource *CMDXMLParserFileDataSource::NewLC(RFs aRFs, const TDesC& aFileToParse)
+	{
+	CMDXMLParserFileDataSource* self = new (ELeave) CMDXMLParserFileDataSource();
+	CleanupStack::PushL(self);
+	self->ConstructL(aRFs, aFileToParse);
+	return self;
+	}
+
+CMDXMLParserFileDataSource *CMDXMLParserFileDataSource::NewL(RFs aRFs, const TDesC& aFileToParse)
+	{
+	CMDXMLParserFileDataSource *self = NewLC(aRFs, aFileToParse);
+	CleanupStack::Pop();
+	return self;
+	}
+	
+CMDXMLParserFileDataSource* CMDXMLParserFileDataSource::NewL(RFile& aFileHandleToParse)
+	{
+	CMDXMLParserFileDataSource* me = new(ELeave) CMDXMLParserFileDataSource();
+	CleanupStack::PushL(me);
+	me->ConstructL(aFileHandleToParse);
+	CleanupStack::Pop(me);
+	return me;
+	}
+
+void CMDXMLParserFileDataSource::ConstructL(RFile& aFileHandleToParse)
+	{ 
+	// take ownership of file handle
+	iXMLFile = aFileHandleToParse;
+	
+	// Calculate size of file
+	TInt fileSize;
+	User::LeaveIfError(iXMLFile.Size(fileSize));
+
+	// make buffer
+	iXMLFileBuffer = HBufC8::NewL(fileSize);
+	TPtr8 tmpbuffer(iXMLFileBuffer->Des());
+
+	// read file into buffer
+	User::LeaveIfError(iXMLFile.Read(tmpbuffer, fileSize));
+	iState = KInit;
+
+	iXMLFile.Close();
+	}	
+
+
+CMDXMLParserFileDataSource::~CMDXMLParserFileDataSource()
+	{
+	iXMLFile.Close();
+	delete iXMLFileBuffer;
+	}
+
+CMDXMLParserFileDataSource::CMDXMLParserFileDataSource() : iState(KError), iXMLFileBuffer(0)
+	{
+	}
+
+void CMDXMLParserFileDataSource::ConstructL(RFs aRFs, const TDesC& aFileToParse)
+	{ 
+	User::LeaveIfError(iXMLFile.Open(aRFs, aFileToParse, EFileRead | EFileShareReadersOnly));
+	
+	// Calculate size of file
+	TInt fileSize;
+	User::LeaveIfError(iXMLFile.Size(fileSize));
+
+	// make buffer
+	iXMLFileBuffer = HBufC8::NewLC(fileSize);
+	TPtr8 tmpbuffer(iXMLFileBuffer->Des());
+
+	// read file into buffer
+	User::LeaveIfError(iXMLFile.Read(tmpbuffer, fileSize));
+	iState = KInit;
+
+	iXMLFile.Close();
+
+	CleanupStack::Pop();	// memory buffer
+	}
+
+void CMDXMLParserFileDataSource::GetData(TPtrC8 &aPtr, TRequestStatus &aStatus)
+	{
+	TRequestStatus *s = &aStatus;
+	switch(iState)
+		{
+	case KInit:
+		aPtr.Set(iXMLFileBuffer->Des());
+		iState = KDataSent;
+		User::RequestComplete(s, KMoreData);
+		break;
+
+	case KDataSent:
+		delete iXMLFileBuffer;
+		iXMLFileBuffer = 0;
+		iState = KDone;
+		User::RequestComplete(s, KDataStreamEnd);
+		break;
+
+	case KDone:
+		User::RequestComplete(s, KDataStreamEnd);
+		break;
+
+	default:
+		User::RequestComplete(s, KDataStreamError);
+		break;
+		};
+	}
+
+void CMDXMLParserFileDataSource::Disconnect()
+	{
+	delete iXMLFileBuffer;
+	iXMLFileBuffer = 0;
+	iState = KDone;
+	}
+
+// End of File