diff -r 000000000000 -r e35f40988205 xml/legacyminidomparser/XMLParser/SRC/GMXMLFileDataSource.cpp --- /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 +#include +#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