syncmlfw/common/wbxml/src/WBXMLGenerator.cpp
author Stefan Karlsson <stefan.karlsson@nokia.com>
Tue, 30 Mar 2010 13:00:58 +0100
branchCompilerCompatibility
changeset 18 c93bcd9bf89c
parent 0 b497e44ab2fc
permissions -rw-r--r--
Merge.

/*
* Copyright (c) 2002 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:  Generic WBXML generator class implementation.
*
*/


// ------------------------------------------------------------------------------------------------
// Includes
// ------------------------------------------------------------------------------------------------
#include "WBXMLGenerator.h"
#include "WBXMLDefs.h"
#include "XMLStaticWorkspace.h"
#include "XMLDynamicWorkspace.h"
#include "WBXMLGeneratorError.h"

// ------------------------------------------------------------------------------------------------
// CWBXMLGenerator
// ------------------------------------------------------------------------------------------------
EXPORT_C TPtrC8 CWBXMLGenerator::Document()
	{
	return Workspace()->Buffer();
	}

// ------------------------------------------------------------------------------------------------
EXPORT_C void CWBXMLGenerator::Reset()
	{
	Workspace()->Reset();
	}

// ------------------------------------------------------------------------------------------------
EXPORT_C void CWBXMLGenerator::CreateStaticWorkspaceL( TInt aBufferSize )
	{
	FreeWorkspace();
	iWorkspace = CXMLStaticWorkspace::NewL(aBufferSize);
	iOwnsWorkspace = ETrue;
	}

// ------------------------------------------------------------------------------------------------
EXPORT_C void CWBXMLGenerator::CreateDynamicWorkspaceL()
	{
	FreeWorkspace();
	iWorkspace = CXMLDynamicWorkspace::NewL();
	iOwnsWorkspace = ETrue;
	}

// ------------------------------------------------------------------------------------------------
EXPORT_C CXMLWorkspace* CWBXMLGenerator::Workspace() const
	{
	return iWorkspace;
	}

// ------------------------------------------------------------------------------------------------
EXPORT_C void CWBXMLGenerator::SetWorkspace( CXMLWorkspace* aBuffer, TBool aTakeOwnership )
	{	
	FreeWorkspace();
	iOwnsWorkspace = aTakeOwnership;
	iWorkspace = aBuffer;
	}

// ------------------------------------------------------------------------------------------------
void CWBXMLGenerator::FreeWorkspace()
	{
	if( iOwnsWorkspace )
		{
		delete iWorkspace;
		iWorkspace = 0;
		}
	}

// ------------------------------------------------------------------------------------------------
EXPORT_C CWBXMLGenerator::CWBXMLGenerator()
	{
	}

// ------------------------------------------------------------------------------------------------
EXPORT_C CWBXMLGenerator::~CWBXMLGenerator()
	{
	FreeWorkspace();
	}

// ------------------------------------------------------------------------------------------------
EXPORT_C void CWBXMLGenerator::BeginDocumentL( TUint8 aVersion, TInt32 aPublicId, TUint32 aCharset, const TDesC8& aStringTbl )
	{
	Workspace()->WriteL(aVersion);

	if( aPublicId <= 0 )
		{
		Workspace()->WriteL(0);
		WriteMUint32L(-aPublicId);
		}
	else
		{
		WriteMUint32L(aPublicId);
		}
	WriteMUint32L(aCharset);
	WriteMUint32L(aStringTbl.Size());
	Workspace()->WriteL(aStringTbl);
	}

// ------------------------------------------------------------------------------------------------
EXPORT_C void CWBXMLGenerator::BeginElementL( TUint8 aElement, TBool aHasContent, TBool aHasAttributes )
	{
	if( aHasAttributes )
		{
		aElement |= KWBXMLHasAttributes;
		}
	if( aHasContent )
		{
		aElement |= KWBXMLHasContent;
		}
	WriteMUint32L(aElement);
	}

// ------------------------------------------------------------------------------------------------
EXPORT_C void CWBXMLGenerator::EndElementL()
	{
	Workspace()->WriteL(END);
	}

// ------------------------------------------------------------------------------------------------
EXPORT_C void CWBXMLGenerator::AddElementL( TUint8 aElement, const TDesC8& aContent, const TWBXMLContentFormat aFormat )
	{
	BeginElementL(aElement, ETrue);
	if( aFormat == EWBXMLContentFormatOpaque )
		{
		WriteOpaqueDataL(aContent);
		}
	else
		{
		WriteInlineStringL(aContent);
		}
	EndElementL();
	}

// ------------------------------------------------------------------------------------------------
EXPORT_C void CWBXMLGenerator::AddElementL( TUint8 /*aElement*/, const TDesC8& /*aContent*/, const CWBXMLAttributes& /*aAttributes*/, const TWBXMLContentFormat /*aFormat*/ )
	{
	}

// ------------------------------------------------------------------------------------------------
EXPORT_C void CWBXMLGenerator::AddEntityL( TUint32 aEntity )
	{
	Workspace()->WriteL(ENTITY);
	WriteMUint32L(aEntity);
	}

// ------------------------------------------------------------------------------------------------
EXPORT_C void CWBXMLGenerator::AddExt_IL( TInt aExtNum, const TDesC8& aContent )
	{
	Workspace()->WriteL(TUint8(EXT_I_0 + aExtNum));
	WriteInlineStringL(aContent);
	}

// ------------------------------------------------------------------------------------------------
EXPORT_C void CWBXMLGenerator::AddExt_TL( TInt aExtNum, TUint32 aContent )
	{
	Workspace()->WriteL(TUint8(EXT_T_0 + aExtNum));
	WriteMUint32L(aContent);
	}

// ------------------------------------------------------------------------------------------------
EXPORT_C void CWBXMLGenerator::AddExtL( TInt aExtNum )
	{
	Workspace()->WriteL(TUint8(EXT_0 + aExtNum));
	}

// ------------------------------------------------------------------------------------------------
EXPORT_C void CWBXMLGenerator::SwitchCodePageL( TUint8 aNewCodePage )
	{
	Workspace()->WriteL(SWITCH_PAGE);
	Workspace()->WriteL(aNewCodePage);
	}

// ------------------------------------------------------------------------------------------------
EXPORT_C TInt CWBXMLGenerator::HandleResult( TInt aResult, TInt aTreshold )
	{
	switch( aResult )
		{
		case KErrNone:
			if( Workspace()->FreeSize() < aTreshold )
				{				
				Workspace()->Rollback();
				return KWBXMLGeneratorBufferFull;
				}
			Workspace()->Commit();
			return KWBXMLGeneratorOk;

		case KErrTooBig:
			Workspace()->Rollback();
			return KWBXMLGeneratorBufferFull;

		default:
			return KErrGeneral;
		}
	}

// ------------------------------------------------------------------------------------------------
void CWBXMLGenerator::WriteMUint32L( TUint32 aValue )
	{
	TUint8 temp[5];
	TInt i(4);
	
	temp[i--] = TUint8(aValue & 0x7F);
	aValue >>= 7;
	while( aValue > 0 )
		{
		temp[i--] = TUint8((aValue & 0x7F) | 0x80);
		aValue >>= 7;
		}
			
	while( i < 4 )
		{
		Workspace()->WriteL(temp[++i]);
		}
	}

// ------------------------------------------------------------------------------------------------
void CWBXMLGenerator::WriteOpaqueDataL( const TDesC8& aData )
	{
	Workspace()->WriteL(OPAQUE);
	WriteMUint32L(aData.Size());
	Workspace()->WriteL(aData);
	}

// ------------------------------------------------------------------------------------------------
void CWBXMLGenerator::WriteInlineStringL( const TDesC8& aData )
	{
	Workspace()->WriteL(STR_I);
	Workspace()->WriteL(aData);
	Workspace()->WriteL(0);
	}