diff -r 000000000000 -r e686773b3f54 pimprotocols/pbap/server/pbapxml.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/pimprotocols/pbap/server/pbapxml.cpp Tue Feb 02 10:12:17 2010 +0200 @@ -0,0 +1,128 @@ +// Copyright (c) 2006-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: +// + +#include +#include + +#include "pbapxml.h" + +#include "btaccesshostlog.h" + + +//DTD strings (in UTF-8 encoding) +_LIT8(KXMLVersion, "\n"); +_LIT8(KXMLDocType, "\n"); +_LIT8(KXMLBegin, "\n"); +_LIT8(KXMLEnd, "\n"); +_LIT8(KXMLEntryPreamble, "\n"); +_LIT8(KXMLHandleExtension, ".vcf"); +_LIT8(KXMLHandleFormat, "%x"); + +_LIT8(KXMLEscapedQuote, """); +_LIT8(KXMLEscapedAmpersand, "&"); +_LIT8(KXMLEscapedLessThan, "<"); +_LIT8(KXMLEscapedGreaterThan, ">"); + + +const TInt KXMLHandleLength = 8; // handle represented as 32-bit hex string + + +/*static*/ void PbapDTD::WriteBeginL(RWriteStream& aWriteStream) + { + LOG_STATIC_FUNC + aWriteStream.WriteL(KXMLVersion); + aWriteStream.WriteL(KXMLDocType); + aWriteStream.WriteL(KXMLBegin); + } + +/*static*/ void PbapDTD::WriteListingEntryL(RWriteStream& aWriteStream, TInt aHandle, const TDesC& aName) + { + LOG_STATIC_FUNC + // convert handle to hexadecimal string + TBuf8 handleBuf; + handleBuf.Format(KXMLHandleFormat, aHandle); + + // convert formatted name to UTF-8 + RBuf8 name(CnvUtfConverter::ConvertFromUnicodeToUtf8L(aName)); + CleanupClosePushL(name); + + // escape &,<,>, and " characters in name + EscapeAttributeValueL(name); + + // write to the stream + aWriteStream.WriteL(KXMLEntryPreamble); + aWriteStream.WriteL(handleBuf); + aWriteStream.WriteL(KXMLHandleExtension); + aWriteStream.WriteL(KXMLEntryMidamble); + aWriteStream.WriteL(name); + aWriteStream.WriteL(KXMLEntryPostamble); + + CleanupStack::PopAndDestroy(); //name + } + + +/*static*/ void PbapDTD::WriteEndL(RWriteStream& aWriteStream) + { + LOG_STATIC_FUNC + aWriteStream.WriteL(KXMLEnd); + } + +/** +Add XML escaping to attribute value. Replaces " with ", & with &, +< with < and > with > (attribute values always surrounded by quotes +so no need to escape apostrophes) +*/ +/*static*/ void PbapDTD::EscapeAttributeValueL(RBuf8& aValue) + { + LOG_STATIC_FUNC + // iterate through descriptor adding escaping if necessary. The descriptor has + // to be resized each time an escape sequence is added, however these characters + // are unlikely to appear in the attribute value + for (TInt ii = 0; ii < aValue.Length(); ++ii) + { + switch (aValue[ii]) + { + case '\"': + { + aValue.ReAllocL(aValue.Length() + KXMLEscapedQuote().Length()); + aValue.Replace(ii, 1, KXMLEscapedQuote); + } + break; + case '&': + { + aValue.ReAllocL(aValue.Length() + KXMLEscapedAmpersand().Length()); + aValue.Replace(ii, 1, KXMLEscapedAmpersand); + } + break; + case '<': + { + aValue.ReAllocL(aValue.Length() + KXMLEscapedLessThan().Length()); + aValue.Replace(ii, 1, KXMLEscapedLessThan); + } + break; + case '>': + { + aValue.ReAllocL(aValue.Length() + KXMLEscapedGreaterThan().Length()); + aValue.Replace(ii, 1, KXMLEscapedGreaterThan); + } + break; + default: + break; + } + } + } +