diff -r 159fc2f68139 -r d59c248c9d36 ImagePrint/ImagePrintEngine/DeviceProtocols/btprotocol/src/cxmlhandler.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/ImagePrint/ImagePrintEngine/DeviceProtocols/btprotocol/src/cxmlhandler.cpp Wed Sep 01 12:30:38 2010 +0100 @@ -0,0 +1,361 @@ +/* +* Copyright (c) 2004-2007 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: Handler for XML file modify. Defines the class to store and modify XML data. +* +*/ + + +#ifdef _DEBUG +#include +#include +#endif + +#include "cxmlhandler.h" +#include "clog.h" + +//-------------------------------------------------------------------------------------------- +// +// CXmlHandler::NewL +// +//-------------------------------------------------------------------------------------------- +CXmlHandler* CXmlHandler::NewL() + { + CXmlHandler *self = NewLC(); + CleanupStack::Pop(); // self + + return self; + } + +//-------------------------------------------------------------------------------------------- +// +// CXmlHandler::NewLC +// +//-------------------------------------------------------------------------------------------- +CXmlHandler* CXmlHandler::NewLC() + { + CXmlHandler *self = new (ELeave) CXmlHandler(); + CleanupStack::PushL(self); + self->ConstructL(); + return self; + } + +//-------------------------------------------------------------------------------------------- +// +// CXmlHandler::~CXmlHandler +// +//-------------------------------------------------------------------------------------------- +CXmlHandler::~CXmlHandler() +{ + if(iDataBuf) + delete iDataBuf; + iDataBuf = NULL; + + Reset(); + + iFs.Close(); +} + +//-------------------------------------------------------------------------------------------- +// +// CXmlHandler::ConstructL +// +//-------------------------------------------------------------------------------------------- +void CXmlHandler::ConstructL() +{ + LOG("[CXmlHandler::ConstructL]\t"); + User::LeaveIfError( iFs.Connect() ); + Reset(); +} + +//-------------------------------------------------------------------------------------------- +// +// CXmlHandler::InitFromFileL +// +//-------------------------------------------------------------------------------------------- +void CXmlHandler::InitFromFileL(const TDesC& aFile, const TInt aId) +{ + LOG("[CXmlHandler::InitFromFileL]\t"); + Reset(); + + ReadFileL(aFile); + iBufferId = aId; + + LOG("[CXmlHandler::InitFromFileL]\t Done."); +} + +//-------------------------------------------------------------------------------------------- +// +// CXmlHandler::InitFromBufferL +// +//-------------------------------------------------------------------------------------------- +void CXmlHandler::InitFromBufferL(const TDesC8& aBuffer, const TInt aId) +{ + LOG("[CXmlHandler::InitFromBufferL]\t"); + + Reset(); + + if(0 >= aBuffer.Length()) + { + User::Leave(KErrArgument); + } + + iDataBuf = static_cast(User::LeaveIfNull(aBuffer.AllocL())); + iBufferId = aId; + + LOG("[CXmlHandler::InitFromBufferL]\t Done."); +} + +//-------------------------------------------------------------------------------------------- +// +// CXmlHandler::Reset +// +//-------------------------------------------------------------------------------------------- +void CXmlHandler::Reset() +{ + LOG("[CXmlHandler::Reset]\t"); + + if(iDataBuf) + delete iDataBuf; + iDataBuf = NULL; + + iBufferId = KErrNotFound; +} + +//-------------------------------------------------------------------------------------------- +// +// CXmlHandler::Reset +// +//-------------------------------------------------------------------------------------------- +TInt CXmlHandler::BufferId() +{ + return iBufferId; +} + +//-------------------------------------------------------------------------------------------- +// +// CXmlHandler::Reset +// +//-------------------------------------------------------------------------------------------- +TPtrC8 CXmlHandler::Buffer() +{ + if(iDataBuf) + return iDataBuf->Des(); + + return KNullDesC8(); +} + +// PRIVATE + +//-------------------------------------------------------------------------------------------- +// +// CXmlHandler::CXmlHandler +// +//-------------------------------------------------------------------------------------------- +CXmlHandler::CXmlHandler() +{ +} + +//-------------------------------------------------------------------------------------------- +// +// CXmlHandler::FinalizeBufferL +// +//-------------------------------------------------------------------------------------------- +TPtrC8 CXmlHandler::FinalizeBufferL(const TDesC8& aTag) +{ + LOG("[CXmlHandler]\t FinalizeBufferL"); + + User::LeaveIfNull(iDataBuf); + + // Cut the template to the end tag + TInt pos = iDataBuf->Find(aTag); + if(KErrNotFound == pos) + User::Leave(KErrCorrupt); + + TInt dataLen = pos + aTag.Length(); + TPtrC8 tail = iDataBuf->Left(dataLen); + + return tail; +} + +//-------------------------------------------------------------------------------------------- +// +// CXmlHandler::DeleteBufferData +// +//-------------------------------------------------------------------------------------------- +void CXmlHandler::DeleteBufferData(TInt aOffset, TInt aLength) +{ + iDataBuf->Des().Delete(aOffset, aLength); + +} +//-------------------------------------------------------------------------------------------- +// +// CXmlHandler::ReadL +// +//-------------------------------------------------------------------------------------------- +void CXmlHandler::ReadFileL(const TDesC& aFileName) +{ + LOG("[CXmlHandler]\t ReadFileL"); + // Open the template file and read it into buffer + RFile templateFile; + CleanupClosePushL(templateFile); + + User::LeaveIfError( templateFile.Open( iFs, aFileName, EFileRead) ); + + TInt fileSize = 0; + TInt err = templateFile.Size(fileSize); + if(KErrNone != err) + fileSize = KBtMaxFileSize; + + iDataBuf = HBufC8::NewL(fileSize); + TPtr8 bufferPtr( iDataBuf->Des() ); + + bufferPtr.Zero(); + templateFile.Read(bufferPtr); + + CleanupStack::PopAndDestroy(&templateFile); +} + +//-------------------------------------------------------------------------------------------- +// +// CXmlHandler::GetDataL +// +//-------------------------------------------------------------------------------------------- +TPtrC8 CXmlHandler::GetDataL(const TDesC8 &aStart, const TDesC8 &aEnd, TInt& aOffset) +{ + User::LeaveIfNull(iDataBuf); + return ParseValue(iDataBuf->Des(), aStart, aEnd, aOffset); +} + +//-------------------------------------------------------------------------------------------- +// +// CXmlHandler::GetDataListL +// +//-------------------------------------------------------------------------------------------- +void CXmlHandler::GetDataListL(const TDesC8 &aStart, const TDesC8 &aEnd, CDesC8ArrayFlat& aList) +{ + User::LeaveIfNull(iDataBuf); + ParseValueListL(iDataBuf->Des(), aStart, aEnd, aList); +} + +//-------------------------------------------------------------------------------------------- +// +// CXmlHandler::ParseValue +// +//-------------------------------------------------------------------------------------------- +TPtrC8 CXmlHandler::ParseValue(const TDesC8 &aData, const TDesC8 &aStart, const TDesC8 &aEnd, TInt& aOffset) +{ +// LOG82("[CXmlHandler::ParseValue]\t s: %S, e: %S", &aStart, &aEnd); + aOffset = aData.Find(aStart); + if(0 > aOffset) + { + return KNullDesC8(); + } + + TInt end = aData.Find(aEnd); + TInt len = end-aOffset-aStart.Length(); + if(0 >= len) + { + aOffset = end; + return KNullDesC8(); + } + + return aData.Mid(aOffset+aStart.Length(), len); +} + + +//-------------------------------------------------------------------------------------------- +// +// CXmlHandler::ParseValueList +// +//-------------------------------------------------------------------------------------------- +void CXmlHandler::ParseValueListL(const TDesC8 &aData, const TDesC8 &aStart, const TDesC8 &aEnd, CDesC8ArrayFlat& aList) +{ + LOG("[CXmlHandler::ParseValueListL]\t "); + TPtrC8 tmpPtr = aData; + + TInt offset = tmpPtr.Find(aStart); + while(offset != KErrNotFound) + { + TInt end = tmpPtr.Find(aEnd); + if(0 > end) + { + return; + } + TPtrC8 valuePtr = tmpPtr.Mid(offset+aStart.Length(), end-offset-aStart.Length()); + + HBufC8* listEntry = valuePtr.AllocLC(); + aList.AppendL(listEntry->Des()); + CleanupStack::PopAndDestroy(); // listEntry + + tmpPtr.Set( tmpPtr.Right(tmpPtr.Length()-(end+aEnd.Length()) ) ); + offset = tmpPtr.Find(aStart); + + } +} + + +//-------------------------------------------------------------------------------------------- +// +// CXmlHandler::ComposeDataL +// +//-------------------------------------------------------------------------------------------- +void CXmlHandler::ComposeDataL(const TInt aValue, const TDesC8 &aTag) +{ + TBuf8 valueStr; + valueStr.Zero(); + valueStr.AppendNum(aValue); + + ComposeDataL(valueStr, aTag); +} +//-------------------------------------------------------------------------------------------- +// +// CXmlHandler::ComposeDataL +// +//-------------------------------------------------------------------------------------------- +void CXmlHandler::ComposeDataL(const TDesC8 &aData, const TDesC8 &aTag) +{ + User::LeaveIfNull(iDataBuf); + + TInt pos = iDataBuf->Find(aTag); + if(KErrNotFound == pos) + User::Leave(KErrCorrupt); + + while(KErrNotFound != pos) + { + TInt requiredSize = iDataBuf->Des().Length() + aData.Length(); + if(iDataBuf->Des().MaxLength() < requiredSize) + { + iDataBuf = iDataBuf->ReAllocL(requiredSize); + } + iDataBuf->Des().Replace(pos, aTag.Length(), aData); + pos = iDataBuf->Find(aTag); + } +} + +//-------------------------------------------------------------------------------------------- +// +// CXmlHandler::InsertDataL +// +//-------------------------------------------------------------------------------------------- +void CXmlHandler::InsertDataL(const TDesC8 &aData, const TInt aOffset) +{ + TInt requiredSize = iDataBuf->Des().Length() + aData.Length(); + if(iDataBuf->Des().MaxLength() < requiredSize) + { + iDataBuf = iDataBuf->ReAllocL(requiredSize); + } + iDataBuf->Des().Insert(aOffset, aData); +} + +// End of file