connectivitymodules/SeCon/wbxml/conmlhandler/src/sconconmlgenerator.cpp
author Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
Tue, 06 Jul 2010 14:06:02 +0300
changeset 36 9ba7f05d28a5
parent 20 e1de7d03f843
permissions -rw-r--r--
Revision: 201025 Kit: 2010127

/*
* Copyright (c) 2005-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:  ConML parser/generator
*
*/

// -----------------------------------------------------------------------------
// Includes
// -----------------------------------------------------------------------------    
#include "sconconmlgenerator.h"
#include "sconconmlhandlererror.h"
#include "sconconmldtd.h"
#include "sconxmlelement.h"
#include "debug.h"

// -----------------------------------------------------------------------------
// CSConConMLGenerator
// -----------------------------------------------------------------------------
CSConConMLGenerator::CSConConMLGenerator()
    {
    }
    
// -----------------------------------------------------------------------------
// ~CSConConMLGenerator
// -----------------------------------------------------------------------------
CSConConMLGenerator::~CSConConMLGenerator()
    {
    if (iCmdStack)
        {
        iCmdStack->Reset();
        delete iCmdStack;
        iCmdStack = NULL;
        }
        
    if ( iWBXMLWorkspace )
        {
        delete iWBXMLWorkspace;
        iWBXMLWorkspace = NULL;
        }
        
    if ( iXMLWorkspace )
        {
        delete iXMLWorkspace;
        iXMLWorkspace = NULL;
        }
        
    if (iCleanupStack)
        {
        iCleanupStack->ResetAndDestroy();
        delete iCleanupStack;
        iCleanupStack = NULL;
        }

    iElemStack.Close();
    }
    
// -----------------------------------------------------------------------------
// NewL
// -----------------------------------------------------------------------------
CSConConMLGenerator* CSConConMLGenerator::NewL ()
    {
    LOGGER_ENTERFN( "CSConConMLGenerator::NewL()" );
    CSConConMLGenerator* self = new ( ELeave ) CSConConMLGenerator();
    CleanupStack::PushL(self);
    self->ConstructL();
    CleanupStack::Pop(); // self
    LOGGER_LEAVEFN( "CSConConMLGenerator::NewL()" );
    return self;
    }

// -----------------------------------------------------------------------------
// ConstructL
// -----------------------------------------------------------------------------
void CSConConMLGenerator::ConstructL()
    {
    LOGGER_ENTERFN( "CSConConMLGenerator::ConstructL()" );
    iCmdStack = CXMLStack<CXMLElement>::NewL();
    iCleanupStack = CXMLStack<CXMLElement>::NewL();
    iWBXMLWorkspace = CXMLWorkspace::NewL();
    iXMLWorkspace = CXMLWorkspace::NewL();
    LOGGER_LEAVEFN( "CSConConMLGenerator::ConstructL()" );
    }
    
// -----------------------------------------------------------------------------
// SetCallbacks
// -----------------------------------------------------------------------------
void CSConConMLGenerator::SetCallback ( MWBXMLConMLCallback* aCallback )
    {
    iCallback = aCallback;
    }

// -----------------------------------------------------------------------------
// StartDocument
// -----------------------------------------------------------------------------    
void CSConConMLGenerator::StartDocument( 
    TUint8 /*aVersion*/, TInt32 /*aPublicId*/, TUint32 /*aCharset*/ )
    {
    LOGGER_ENTERFN( "CSConConMLGenerator::StartDocumentL()" );
    iCmdStack->Reset();
    LOGGER_LEAVEFN( "CSConConMLGenerator::StartDocumentL()" );
    }

// -----------------------------------------------------------------------------
// StartDocument
// -----------------------------------------------------------------------------
void CSConConMLGenerator::StartDocument( 
    TUint8 /*aVersion*/, const TDesC8& /*aPublicIdStr*/, TUint32 /*aCharset*/ )
    {
    LOGGER_ENTERFN( "CSConConMLGenerator::StartDocumentL()" );
    iCmdStack->Reset();
    LOGGER_LEAVEFN( "CSConConMLGenerator::StartDocumentL()" );
    }
    
// -----------------------------------------------------------------------------
// StartElementL
// -----------------------------------------------------------------------------
void CSConConMLGenerator::StartElementL( TWBXMLTag aTag )
    {
    if( iCmdStack->Top() != 0 )
        {
        AddElementL(iCmdStack->Top()->BeginElementL( 
            aTag, TXMLElementParams(iCallback, iCmdStack, iCleanupStack ) ) );
        }
    else
        {
        if( aTag == EConML )
            {
            ConML_ConML_t* element = new (ELeave) ConML_ConML_t();
            CleanupStack::PushL( element );
            AddElementL( element );
            CleanupStack::Pop( element );
            }
        else
            {
            LOGGER_WRITE( "CSConConMLGenerator::StartElementL() : Leave KWBXMLParserErrorInvalidTag" );
            User::Leave(KWBXMLParserErrorInvalidTag);
            }
        }
    }
    
// -----------------------------------------------------------------------------
// AddElement
// -----------------------------------------------------------------------------
void CSConConMLGenerator::AddElementL( CXMLElement* aElement )
    {
    if( aElement )
        {
        iCmdStack->PushL(aElement);
        if( aElement->NeedsCleanup() )
            {
            iCleanupStack->PushL(aElement);
            }
        }
    }

// -----------------------------------------------------------------------------
// CharactersL
// -----------------------------------------------------------------------------
void CSConConMLGenerator::CharactersL( const TDesC8& aBuffer )
    {
    if( iCmdStack->Top() != 0 )
        {
        iCmdStack->Top()->SetDataL(aBuffer);
        }
    else
        {
        LOGGER_WRITE( "CSConConMLGenerator::CharactersL() : Leave KWBXMLParserErrorInvalidTag" );
        User::Leave(KWBXMLParserErrorInvalidTag);
        }
    }
    
// -----------------------------------------------------------------------------
// EndElementL
// -----------------------------------------------------------------------------
void CSConConMLGenerator::EndElementL( TWBXMLTag aTag )
    {
    if( iCmdStack->Top() != 0 )
        {
        CXMLElement::TAction action = iCmdStack->Top()->EndElementL( 
            iCallback, aTag );
        if( action != CXMLElement::ENone )
            {
            CXMLElement* elem = iCmdStack->Pop();
            if( iCleanupStack->Top() == elem )
                {
                iCleanupStack->Pop();
                }
            if( action == CXMLElement::EPopAndDestroy )
                {
                delete elem;
                }
            }
        }
    }
    
// -----------------------------------------------------------------------------
// WriteMUint32L
// -----------------------------------------------------------------------------
void CSConConMLGenerator::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 )
        {
        iWBXMLWorkspace->WriteL(temp[++i]);
        }
    }

// -----------------------------------------------------------------------------
// WriteOpaqueDataL
// -----------------------------------------------------------------------------
void CSConConMLGenerator::WriteOpaqueDataL( const TDesC8& aData )
    {
    iWBXMLWorkspace->WriteL( OPAQUE );
    WriteMUint32L( aData.Size() );
    iWBXMLWorkspace->WriteL( aData );
    iXMLWorkspace->WriteL( aData );
    }
    
// -----------------------------------------------------------------------------
// WriteInlineStringL
// -----------------------------------------------------------------------------
void CSConConMLGenerator::WriteInlineStringL( const TDesC8& aData )
    {
    iWBXMLWorkspace->WriteL( STR_I );
    iWBXMLWorkspace->WriteL( aData );
    iWBXMLWorkspace->WriteL( 0 );
    iXMLWorkspace->WriteL( aData );
    }
    
// -----------------------------------------------------------------------------
// IndentL
// -----------------------------------------------------------------------------
void CSConConMLGenerator::IndentL()
    {
    for( TInt i = 0; i < iElemStack.Count() + iInitialIndentLevel; i++ )
        {
        iXMLWorkspace->WriteL(KXMLIndent());
        }
    }

// -----------------------------------------------------------------------------
// TranslateElement
// -----------------------------------------------------------------------------    
TPtrC8 CSConConMLGenerator::TranslateElement( TUint8 aElement )
    {
    TPtrC8 buf( KConMLElements );
    while( aElement-- )
        {
        TInt pos = buf.Find(KXMLElemenentSeparator());
        if( pos == KErrNotFound )
            {
            return TPtrC8();
            }
        buf.Set(buf.Right(buf.Length() - pos - 1));
        }

    TInt pos = buf.Find(KXMLElemenentSeparator());
    
    if( pos != KErrNotFound )
        {
        buf.Set(buf.Left(pos));
        }
    return buf;
    }
    
// -----------------------------------------------------------------------------
// EndDocument
// -----------------------------------------------------------------------------
void CSConConMLGenerator::EndDocument()
    {
    LOGGER_ENTERFN( "CSConConMLGenerator::EndDocument()" );
    LOGGER_LEAVEFN( "CSConConMLGenerator::EndDocument()" );
    }

    
// -----------------------------------------------------------------------------
// GenerateConMLDocument
// -----------------------------------------------------------------------------
TInt CSConConMLGenerator::GenerateConMLDocument ( ConML_ConMLPtr_t aContent )
    {
    LOGGER_ENTERFN( "CSConConMLGenerator::GenerateConMLDocument()" );
    iWBXMLWorkspace->Reset();
    iWBXMLWorkspace->BeginTransaction();
    iXMLWorkspace->Reset();
    iXMLWorkspace->BeginTransaction();
    TRAPD(result, AppendConMLL(aContent));
    LOGGER_WRITE_1( "CSConConMLGenerator::GenerateConMLDocument()\
     : returned %d", result );
    return HandleResult(result);
    }
    
// -----------------------------------------------------------------------------
// AppendConMLL
// -----------------------------------------------------------------------------
void CSConConMLGenerator::AppendConMLL( ConML_ConMLPtr_t aContent )
    {
    BeginDocumentL(KSConConMLVersion, KSConConMLPublicId, KSConConMLUTF8);
    BeginElementL(EConML, ETrue);
    AppendExecuteL( aContent->execute );
    AppendGetStatusL( aContent->getStatus );
    AppendCancelL( aContent->cancel );
    AppendStatusL( aContent->status );
    EndElementL(); // EConML
    }

// -----------------------------------------------------------------------------
// AppendExecuteL
// -----------------------------------------------------------------------------
void CSConConMLGenerator::AppendExecuteL( ConML_ExecutePtr_t aContent )
    {
    if ( aContent )
        {
        BeginElementL( EConMLExecute, ETrue );
        AppendPCDataL( EConMLID, aContent->id );
        AppendInstallL( aContent->install );
        AppendUnInstallL( aContent->unInstall );
        AppendListInstalledAppsL( aContent->listInstalledApps );
        AppendListDataOwnersL( aContent->listDataOwners );
        AppendSetBURModeL( aContent->setBurMode );
        AppendGetDataSizeL( aContent->getDataSize );
        AppendRequestDataL( aContent->requestData );
        AppendUpdateDeviceInfoL( aContent->updateDeviceInfo );
        AppendListPublicFilesL( aContent->listPublicFiles );
        AppendSupplyDataL( aContent->supplyData );
        AppendGetDataOwnerStatusL( aContent->getDataOwnerStatus );
        AppendGetMetadataL( aContent->getMetadata );
        
        if ( aContent->reboot )
            {
            BeginElementL( EConMLReboot );
            }
        EndElementL(); // EConMLExecute
        }
    }

// -----------------------------------------------------------------------------
// AppendSupplyDataL
// -----------------------------------------------------------------------------
void CSConConMLGenerator::AppendSupplyDataL( ConML_SupplyDataPtr_t aContent )
    {
    if ( aContent )
        {
        BeginElementL( EConMLSupplyData, ETrue );
        AppendSIDListL( aContent->sid );
        AppendResultsL( aContent->results );
        EndElementL(); // EConMLSupplyData
        }
    }
// -----------------------------------------------------------------------------
// AppendInstallL
// -----------------------------------------------------------------------------
void CSConConMLGenerator::AppendInstallL( ConML_InstallPtr_t aContent )
    {
    if ( aContent)
        {
        BeginElementL( EConMLInstall, ETrue );
        AppendPCDataL( EConMLName, aContent->name );
        if ( aContent->instParams) 
            {
            if ( aContent->instParams->param )
                {
                AppendInstParamsL( aContent->instParams );  
                }
            else 
                {
                BeginElementL( EConMLInstParams );
                }
            }
        AppendResultsL( aContent->results );
        EndElementL(); // EConMLInstall
        }
    }

// -----------------------------------------------------------------------------
// AppendCancelL
// -----------------------------------------------------------------------------    
void CSConConMLGenerator::AppendCancelL ( ConML_CancelPtr_t aContent )
    {
    if ( aContent )
        {
        BeginElementL( EConMLCancel, ETrue );
        AppendPCDataL ( EConMLID, aContent->id );
        AppendPCDataL( EConMLAll, aContent->all);
        EndElementL(); // EConMLCancel
        }
    }

// -----------------------------------------------------------------------------
// AppendStatusL
// -----------------------------------------------------------------------------
void CSConConMLGenerator::AppendStatusL ( ConML_StatusPtr_t aContent )
    {
    if ( aContent )
        {
        if ( aContent->task )
            {
            BeginElementL( EConMLStatus, ETrue );
            AppendTaskListL( aContent->task );
            EndElementL(); // EConMLStatus
            }
        else
            {
            BeginElementL( EConMLStatus );  
            }
        }
    }
    
// -----------------------------------------------------------------------------
// AppendGetStatusL
// -----------------------------------------------------------------------------
void CSConConMLGenerator::AppendGetStatusL( ConML_GetStatusPtr_t aContent )
    {
    if ( aContent )
        {
        BeginElementL( EConMLGetStatus, ETrue );
        AppendPCDataL( EConMLID, aContent->id);
        if ( aContent->all )
            {
            BeginElementL( EConMLAll );
            }
        EndElementL(); // EConMLGetStatus
        }
    }

// -----------------------------------------------------------------------------
// AppendRebootL
// -----------------------------------------------------------------------------
void CSConConMLGenerator::AppendRebootL( ConML_RebootPtr_t aContent )
    {
    if ( aContent )
        {
        BeginElementL( EConMLReboot, ETrue );
        AppendResultsL( aContent->results );
        EndElementL(); // EConMLReboot
        }
    }
    
// -----------------------------------------------------------------------------
// AppendTaskL
// -----------------------------------------------------------------------------
void CSConConMLGenerator::AppendTaskL( ConML_TaskPtr_t aContent )
    {
    if ( aContent )
        {
        BeginElementL( EConMLTask, ETrue );
        AppendPCDataL( EConMLID, aContent->id );
        AppendInstallL(aContent->install );
        AppendUnInstallL( aContent->unInstall );
        AppendListInstalledAppsL ( aContent->listInstalledApps );
        AppendListDataOwnersL ( aContent->listDataOwners );
        AppendSetBURModeL ( aContent->setBurMode );
        AppendGetDataSizeL ( aContent->getDataSize );
        AppendRequestDataL ( aContent->requestData );
        AppendUpdateDeviceInfoL ( aContent->updateDeviceInfo);
        AppendListPublicFilesL ( aContent->listPublicFiles );
        AppendGetDataOwnerStatusL( aContent->getDataOwnerStatus );
        AppendSupplyDataL( aContent->supplyData );
        AppendRebootL( aContent->reboot );
        AppendGetMetadataL( aContent->getMetadata );
        EndElementL();
        }
    }
    
// -----------------------------------------------------------------------------
// AppendTaskListL
// -----------------------------------------------------------------------------
void CSConConMLGenerator::AppendTaskListL( ConML_TaskListPtr_t aContent )
    {
    for ( ConML_TaskListPtr_t p = aContent; p && p->data; p=p->next )
        {
        AppendTaskL( p->data );
        }
    }
    
// -----------------------------------------------------------------------------
// AppendListInstalledAppsL
// -----------------------------------------------------------------------------
void CSConConMLGenerator::AppendListInstalledAppsL ( 
    ConML_ListInstalledAppsPtr_t aContent )
    {
    if ( aContent )
        {
        BeginElementL( EConMLListInstalledApps, ETrue );
        AppendDrivesL( aContent->drives );
        if ( aContent ->all )
            {
            BeginElementL( EConMLAll );
            }
        AppendResultsL( aContent->results );
        EndElementL(); // EConMLListInstalledApps
        }
    }

// -----------------------------------------------------------------------------
// AppendListDataOwnersL
// -----------------------------------------------------------------------------
void CSConConMLGenerator::AppendListDataOwnersL ( 
    ConML_ListDataOwnersPtr_t aContent )
    {
    if ( aContent )
        {
        if ( aContent->results )
            {
            BeginElementL( EConMLListDataOwners, ETrue );
            AppendResultsL( aContent->results );
            EndElementL(); // EConMLListDataOwners
            }
        else
            {
            BeginElementL( EConMLListDataOwners );          
            }
        }
    }

// -----------------------------------------------------------------------------
// CSConConMLGanerator::AppendBUROptionsL
// -----------------------------------------------------------------------------
void CSConConMLGenerator::AppendBUROptionsL( ConML_BUROptionsPtr_t aContent )
    {
    if ( aContent )
        {
        BeginElementL( EConMLBUROptions, ETrue );
        if ( aContent->requiresReboot )
            {
            BeginElementL( EConMLRequiresReboot );
            }
        if ( aContent->hasFiles )
            {
            AppendPCDataL( EConMLHasFiles, aContent->hasFiles );
            }
        if ( aContent->supportsInc )
            {
            BeginElementL( EConMLSupportsInc );
            }
        if ( aContent->delayToPrepareData )
            {
            BeginElementL( EConMLDelayToPrepareData );
            }
        EndElementL(); // EConMLBUROptions
        }
    }

// -----------------------------------------------------------------------------
// AppendSetBURModeL
// -----------------------------------------------------------------------------
void CSConConMLGenerator::AppendSetBURModeL( ConML_SetBURModePtr_t aContent )
    {
    if ( aContent )
        {
        BeginElementL( EConMLSetBURMode, ETrue );
        AppendDrivesL( aContent->drives );
        AppendPCDataL( EConMLPartialType, aContent->partialType );
        AppendPCDataL( EConMLIncType, aContent->incType );
        AppendResultsL( aContent->results );
        EndElementL(); //EConMLSetBURMode
        }
    }
    
// -----------------------------------------------------------------------------
// AppendUnInstallL
// -----------------------------------------------------------------------------
void CSConConMLGenerator::AppendUnInstallL( ConML_UnInstallPtr_t aContent )
    {
    if ( aContent )
        {
        BeginElementL( EConMLUnInstall, ETrue );
        AppendApplicationsL( aContent->applications );
        AppendInstParamsL( aContent->instParams );
        AppendResultsL( aContent->results );
        EndElementL(); // EConMLUnInstall
        }
    }

// -----------------------------------------------------------------------------
// AppendGetDataSizeL
// -----------------------------------------------------------------------------
void CSConConMLGenerator::AppendGetDataSizeL( ConML_GetDataSizePtr_t aContent )
    {
    if ( aContent )
        {
        BeginElementL( EConMLGetDataSize, ETrue );
        AppendDataOwnersL( aContent->dataOwners );
        AppendResultsL( aContent->results );
        EndElementL(); //EConMLGetDataSize
        }
    }

// -----------------------------------------------------------------------------
// AppendRequestDataL
// -----------------------------------------------------------------------------
void CSConConMLGenerator::AppendRequestDataL( ConML_RequestDataPtr_t aContent )
    {
    if ( aContent )
        {
        BeginElementL( EConMLRequestData, ETrue );
        AppendSIDListL( aContent->sid );
        AppendResultsL( aContent->results );
        EndElementL();//EConMLRequestData
        }
    }

// -----------------------------------------------------------------------------
// AppendUpdateDeviceInfoL
// -----------------------------------------------------------------------------
void CSConConMLGenerator::AppendUpdateDeviceInfoL( 
    ConML_UpdateDeviceInfoPtr_t aContent )
    {
    if ( aContent )
        {
        BeginElementL(EConMLUpdateDeviceInfo, ETrue);
        AppendDeviceInfoL( aContent-> deviceInfo );
        AppendResultsL( aContent->results );
        EndElementL();// EConMLUpdateDeviceInfo
        }
    }

// -----------------------------------------------------------------------------
// AppendListPublicFilesL
// -----------------------------------------------------------------------------
void CSConConMLGenerator::AppendListPublicFilesL( 
    ConML_ListPublicFilesPtr_t aContent )
    {
    if ( aContent )
        {
        BeginElementL( EConMLListPublicFiles, ETrue );
        AppendSIDListL ( aContent->sid );
        AppendResultsL( aContent->results );
        EndElementL(); // EConMLListPublicFiles
        }
    }

// -----------------------------------------------------------------------------
// AppendApplicationL
// -----------------------------------------------------------------------------
void CSConConMLGenerator::AppendApplicationL( ConML_ApplicationPtr_t aContent )
    {
    if ( aContent )
        {
        BeginElementL(EConMLApplication, ETrue );
        AppendPCDataL( EConMLName, aContent->name );
        AppendPCDataL( EConMLUID, aContent->uid );
        EndElementL(); //EConMLApplication
        }
    }

// -----------------------------------------------------------------------------
// AppendApplicationListL
// -----------------------------------------------------------------------------
void CSConConMLGenerator::AppendApplicationListL( 
    ConML_ApplicationListPtr_t aContent )
    {
    for ( ConML_ApplicationListPtr_t p = aContent; p && p->data; p = p->next )
        {
        AppendApplicationL( p->data );
        }
    }

// -----------------------------------------------------------------------------
// AppendApplicationsL
// -----------------------------------------------------------------------------
void CSConConMLGenerator::AppendApplicationsL( 
    ConML_ApplicationsPtr_t aContent )
    {
    if ( aContent )
        {
        BeginElementL( EConMLApplications, ETrue );
        AppendApplicationListL( aContent->application );
        EndElementL(); // EConMLApplications
        }
    }

// -----------------------------------------------------------------------------
// AppendParamL
// -----------------------------------------------------------------------------
void CSConConMLGenerator::AppendParamL( ConML_ParamPtr_t aContent )
    {
    if ( aContent )
        {
        BeginElementL( EConMLParam, ETrue );
        AppendPCDataL( EConMLName, aContent->name );
        AppendPCDataL( EConMLValue, aContent->value );
        EndElementL(); // EConMLParam
        }
    }

// -----------------------------------------------------------------------------
// AppendParamListL
// -----------------------------------------------------------------------------
void CSConConMLGenerator::AppendParamListL( ConML_ParamListPtr_t aContent )
    {
    for ( ConML_ParamListPtr_t p = aContent; p && p->data; p = p->next )
        {
        AppendParamL( p-> data );
        }
    }

// -----------------------------------------------------------------------------
// AppendInstParamsL
// -----------------------------------------------------------------------------
void CSConConMLGenerator::AppendInstParamsL( ConML_InstParamsPtr_t aContent )
    {
    if ( aContent )
        {
        BeginElementL( EConMLInstParams, ETrue );
        AppendParamListL( aContent->param );
        EndElementL(); //EConMLInstParams
        }
    }

// -----------------------------------------------------------------------------
// AppendProgressL
// -----------------------------------------------------------------------------
void CSConConMLGenerator::AppendProgressL( ConML_ProgressPtr_t aContent )
    {
    if ( aContent )
        {
        BeginElementL( EConMLProgress, ETrue );
        AppendPCDataL( EConMLValue, aContent->value );
        EndElementL(); // EconMLProgress
        }
    }
    
// -----------------------------------------------------------------------------
// AppendResultsL
// -----------------------------------------------------------------------------
void CSConConMLGenerator::AppendResultsL( ConML_ResultsPtr_t aContent )
    {
    if ( aContent )
        {
        BeginElementL( EConMLResults, ETrue );
        if ( aContent->complete )
            {
            BeginElementL( EConMLComplete );
            }
        AppendProgressL( aContent->progress );
        AppendApplicationsL( aContent->applications );
        AppendDataOwnersL( aContent->dataOwners );
        if ( aContent->filename )
            {
            AppendPCDataL( EConMLFilename, aContent->filename );
            }
        AppendPCDataL( EConMLData, aContent->data );
        if ( aContent->moreData )
            {
            BeginElementL( EConMLMoreData );
            }
        AppendDeviceInfoL( aContent->deviceInfo );
        AppendFilesL( aContent->files );
        EndElementL(); //EConMLResults
        }
    }

// -----------------------------------------------------------------------------
// AppendDriveL
// -----------------------------------------------------------------------------
void CSConConMLGenerator::AppendDriveL( ConML_DrivePtr_t aContent )
    {
    if ( aContent )
        {
        BeginElementL( EConMLDrive, ETrue );
        AppendPCDataL( EConMLName, aContent->name );
        EndElementL(); //EConMLDrive
        }
    }

// -----------------------------------------------------------------------------
// AppendDriveListL
// -----------------------------------------------------------------------------
void CSConConMLGenerator::AppendDriveListL( ConML_DriveListPtr_t aContent )
    {
    for ( ConML_DriveListPtr_t p =  aContent; p && p->data; p=p->next )
        {
        AppendDriveL( p->data );
        }
    }

// -----------------------------------------------------------------------------
// AppendDrivesL
// -----------------------------------------------------------------------------
void CSConConMLGenerator::AppendDrivesL( ConML_DrivesPtr_t aContent )
    {
    if ( aContent )
        {
        BeginElementL( EConMLDrives, ETrue );
        AppendDriveListL( aContent->drive );
        EndElementL(); // EConMLDrives
        }
    }

// -----------------------------------------------------------------------------
// AppendDataOwnersL
// -----------------------------------------------------------------------------
void CSConConMLGenerator::AppendDataOwnersL( ConML_DataOwnersPtr_t aContent )
    {
    if ( aContent )
        {
        BeginElementL( EConMLDataOwners, ETrue );
        AppendSIDListL( aContent->sid );
        EndElementL(); //EConMLDataOwners
        }
    }

// -----------------------------------------------------------------------------
// AppendGetDataOwnerStatusL
// -----------------------------------------------------------------------------
void CSConConMLGenerator::AppendGetDataOwnerStatusL
    ( ConML_GetDataOwnerStatusPtr_t aContent )
    {
    if ( aContent)
        {
        BeginElementL( EConMLGetDataOwnerStatus, ETrue );
        AppendDataOwnersL( aContent->dataOwners );
        AppendResultsL( aContent->results );
        EndElementL(); // EconMLGetDataOwnerStatus
        }
    }

// -----------------------------------------------------------------------------
// AppendGetMetadataL
// -----------------------------------------------------------------------------
void CSConConMLGenerator::AppendGetMetadataL
    ( ConML_GetMetadataPtr_t aContent )
    {
    if ( aContent)
        {
        BeginElementL( EConMLGetMetadata, ETrue );
        AppendPCDataL( EConMLFilename, aContent->filename );
        AppendResultsL( aContent->results );
        EndElementL(); // EConMLGetMetadata
        }
    }

// -----------------------------------------------------------------------------
// AppendPackageInfoL
// -----------------------------------------------------------------------------
void CSConConMLGenerator::AppendPackageInfoL ( ConML_PackageInfoPtr_t aContent )
    {
    if ( aContent )
        {
        BeginElementL( EConMLPackageInfo, ETrue );
        AppendPCDataL( EConMLName, aContent->name );
        EndElementL(); // EConMLPackageInfo
        }
    }

// -----------------------------------------------------------------------------
// AppendSIDL
// -----------------------------------------------------------------------------
void CSConConMLGenerator::AppendSIDL( ConML_SIDPtr_t aContent )
    {
    if ( aContent )
        {
        BeginElementL( EConMLSID, ETrue );
        AppendPCDataL( EConMLType, aContent->type );
        AppendPCDataL( EConMLUID, aContent->uid );
        AppendPCDataL( EConMLDataOwnerStatus, aContent->dataOwnerStatus );
        AppendDrivesL( aContent->drives );
        if ( aContent->size )
            {
            AppendPCDataL( EConMLSize, aContent->size ); 
            }
        AppendPackageInfoL( aContent->packageInfo );
        AppendBUROptionsL( aContent->burOptions );
        AppendPCDataL( EConMLTransferDataType, aContent->transferDataType );
        AppendPCDataL( EConMLData, aContent->data );
        if ( aContent->moreData)
            {
            BeginElementL(EConMLMoreData );
            }
        EndElementL(); // EconMLSID
        }
    }
    
// -----------------------------------------------------------------------------
// AppendSIDListL
// -----------------------------------------------------------------------------
void CSConConMLGenerator::AppendSIDListL( ConML_SIDListPtr_t aContent )
    {
    for ( ConML_SIDListPtr_t p = aContent; p && p->data; p=p->next )
        {
        AppendSIDL( p->data );
        }
    }

// -----------------------------------------------------------------------------
// AppendDeviceInfoL
// -----------------------------------------------------------------------------
void CSConConMLGenerator::AppendDeviceInfoL( ConML_DeviceInfoPtr_t aContent )
    {
    if ( aContent )
        {
        BeginElementL( EConMLDeviceInfo, ETrue );
        AppendPCDataL( EConMLVersion, aContent->version );
        AppendSupportedMethodsL ( aContent->supportedMethods );
        AppendPCDataL(EConMLMaxObjectSize, aContent->maxObjectSize );
        EndElementL(); // EConMLDeviceInfo
        }
    }

// -----------------------------------------------------------------------------
// AppendFilesL
// -----------------------------------------------------------------------------
void CSConConMLGenerator::AppendFilesL( ConML_FilesPtr_t aContent )
    {
    if ( aContent )
        {
        BeginElementL( EConMLFiles, ETrue );
        AppendFileListL( aContent->file );
        EndElementL(); // EConMLFiles
        }
    }

// -----------------------------------------------------------------------------
// AppendSupportedMethodsL
// -----------------------------------------------------------------------------
void CSConConMLGenerator::AppendSupportedMethodsL
    ( ConML_SupportedMethodsPtr_t aContent )
    {
    if ( aContent )
        {
        BeginElementL( EConMLSupportedMethods, ETrue );
        if  ( aContent->install )
            {
            BeginElementL( EConMLInstall );
            }
        if ( aContent->unInstall )
            {
            BeginElementL( EConMLUnInstall );
            }
        if ( aContent->listInstalledApps )
            {
            BeginElementL( EConMLListInstalledApps );
            }
        if ( aContent->listDataOwners )
            {
            BeginElementL( EConMLListDataOwners );
            }
        if ( aContent->setBurMode )
            {
            BeginElementL( EConMLSetBURMode );
            }
        if ( aContent->getDataSize )
            {
            BeginElementL( EConMLGetDataSize );
            }
        if ( aContent->requestData )
            {
            BeginElementL( EConMLRequestData );
            }
        if ( aContent->supplyData )
            {
            BeginElementL( EConMLSupplyData );
            }
        if ( aContent->reboot )
            {
            BeginElementL( EConMLReboot );
            }
        EndElementL(); // EConMLSupportedMethods
        }
    }

// -----------------------------------------------------------------------------
// AppendFileListL
// -----------------------------------------------------------------------------
void CSConConMLGenerator::AppendFileListL( ConML_FileListPtr_t  aContent )
    {
    if ( aContent )
        {
        for ( ConML_FileListPtr_t p = aContent; p && p->data; p = p->next )
            {
            AppendFileL(p->data );
            }
        }
    }

// -----------------------------------------------------------------------------
// AppendFileL
// -----------------------------------------------------------------------------
void CSConConMLGenerator::AppendFileL( ConML_FilePtr_t aContent )
    {
    if ( aContent )
        {
        BeginElementL( EConMLFile, ETrue );
        AppendPCDataL( EConMLName, aContent->name );
        AppendPCDataL( EConMLModified, aContent->modified );
        AppendPCDataL( EConMLSize, aContent->size );
        AppendPCDataL( EConMLUserPerm, aContent->userPerm );
        EndElementL(); // EConMLFile
        }
    }

// -----------------------------------------------------------------------------
// HandleResult
// -----------------------------------------------------------------------------
TInt CSConConMLGenerator::HandleResult( TInt aResult, TInt aTreshold )
    {
    LOGGER_ENTERFN( "CSConConMLGenerator::HandleResult()" );
    switch( aResult )
        {
        case KErrNone:
            if( iWBXMLWorkspace->FreeSize() < aTreshold )
                {               
                iWBXMLWorkspace->Rollback();
                return KWBXMLGeneratorBufferFull;
                }
            iWBXMLWorkspace->Commit();
            return KWBXMLGeneratorOk;

        case KErrTooBig:
            iWBXMLWorkspace->Rollback();
            return KWBXMLGeneratorBufferFull;
        }
    LOGGER_WRITE_1( "CSConConMLGenerator::HandleResult() : returned %d", aResult);
    return aResult;
    }

// -----------------------------------------------------------------------------
// BeginDocumentL
// -----------------------------------------------------------------------------
void CSConConMLGenerator::BeginDocumentL( 
    TUint8 aVersion, 
    TInt32 aPublicId, 
    TUint32 aCharset, 
    const TDesC8& aStringTbl )
    {
    LOGGER_ENTERFN( "CSConConMLGenerator::BeginDocumentL()" );
    iWBXMLWorkspace->WriteL(aVersion);

    if( aPublicId <= 0 )
        {
        iWBXMLWorkspace->WriteL(0);
        WriteMUint32L(-aPublicId);
        }
    else
        {
        WriteMUint32L(aPublicId);
        }
    WriteMUint32L(aCharset);
    WriteMUint32L(aStringTbl.Size());
    iWBXMLWorkspace->WriteL(aStringTbl);
    LOGGER_LEAVEFN( "CSConConMLGenerator::BeginDocumentL()" );
    }

// -----------------------------------------------------------------------------
// BeginElementL
// -----------------------------------------------------------------------------
void CSConConMLGenerator::BeginElementL( 
    TUint8 aElement, TBool aHasContent, TBool aHasAttributes )
    {
    IndentL();
    iXMLWorkspace->WriteL(KXMLTagStart());
    iXMLWorkspace->WriteL(TranslateElement(aElement));
        
    if( aHasAttributes )
        {
        aElement |= KWBXMLHasAttributes;
        }
        
    if( aHasContent )
        {
        iXMLWorkspace->WriteL(KXMLTagEnd());
        iElemStack.Insert(aElement, 0);
        aElement |= KWBXMLHasContent;
        }
    else
        {
        iXMLWorkspace->WriteL(KXMLTagEndNoContent());
        }

    if( !iDontNewLine )
        {
        iXMLWorkspace->WriteL(KXMLNewLine());
        }
    iDontNewLine = EFalse;

    WriteMUint32L(aElement);
    }

// -----------------------------------------------------------------------------
// EndElementL
// -----------------------------------------------------------------------------
void CSConConMLGenerator::EndElementL()
    {
    TUint8 elem = iElemStack[0];
    iElemStack.Remove(0);
    if( !iDontIndent )
        {
        IndentL();
        }
    iDontIndent = EFalse;
    iXMLWorkspace->WriteL(KXMLTagStartEndTag());
    iXMLWorkspace->WriteL(TranslateElement(elem));
    iXMLWorkspace->WriteL(KXMLTagEnd());
    iXMLWorkspace->WriteL(KXMLNewLine());
    
    iWBXMLWorkspace->WriteL(END);
    }

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

// -----------------------------------------------------------------------------
// AppendPCDataL
// -----------------------------------------------------------------------------
void CSConConMLGenerator::AppendPCDataL( TUint8 aElement, pcdataPtr_t aContent )
    {
    if( !aContent )
        {
        return;
        }

    if( aContent->contentType == SML_PCDATA_OPAQUE )
        {
        AddElementL(aElement, 
                    TPtrC8((TUint8*)aContent->content, 
                    aContent->length));
        }
    else
        {
        LOGGER_WRITE( "CSConConMLGenerator::AppendPCDataL() : Data type not Opaque - ignoring " );
        }
    }
    
// -----------------------------------------------------------------------------
// WBXMLDocument
// -----------------------------------------------------------------------------
TPtrC8 CSConConMLGenerator::WBXMLDocument()
    {
    return iWBXMLWorkspace->Buffer();
    }
    
// -----------------------------------------------------------------------------
// XMLDocument
// -----------------------------------------------------------------------------
TPtrC8 CSConConMLGenerator::XMLDocument()
    {
    return iXMLWorkspace->Buffer();
    }