simpleengine/xmlutils/src/simplebasedocument.cpp
author Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
Tue, 02 Feb 2010 01:05:17 +0200
changeset 0 c8caa15ef882
permissions -rw-r--r--
Revision: 201003 Kit: 201005

/*
* Copyright (c) 2006 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:    Simple Engine
*
*/




// INCLUDE FILES

#include <e32std.h>
#include <s32strm.h>
#include <SenBaseElement.h>
#include <SenBaseAttribute.h>
#include <SenXmlUtils.h>
#include <SenXmlReader.h>
#include <SenDomFragment.h>

// own simple
#include "simplecommon.h"
#include "simpleelement.h"
#include "simplenamespace.h"
#include "simpleattribute.h"
#include "simplebasedocument.h"
#include "simpleutils.h"

// ================= MEMBER FUNCTIONS =======================
//

// ----------------------------------------------------------
// CSimpleBaseDocument::CSimpleBaseDocument
// ----------------------------------------------------------
//
CSimpleBaseDocument::CSimpleBaseDocument( )
: iRoot( NULL )
    {
    }

// ----------------------------------------------------------
// CSimpleBaseDocument::~CSimpleBaseDocument
// ----------------------------------------------------------
//
CSimpleBaseDocument::~CSimpleBaseDocument()
    {
    // Reset and delete namespace C-class entities.
    iNsps.ResetAndDestroy();
    // Just reset array of M-class entities, 
    // do not try to delete entities.
    iMNsps.Reset();
    // Delete root entity.
    delete iRoot;
    }

// ----------------------------------------------------------
// CSimpleBaseDocument::BaseConstructL
// ----------------------------------------------------------
//
void CSimpleBaseDocument::BaseConstructL(
    const TDesC8& aNsUri,
    const TDesC8& aLocalName )
    {
    iRoot = CSimpleElement::NewL( aNsUri, aLocalName );
    }

// ----------------------------------------------------------
// CSimpleBaseDocument::BaseConstructL
// ----------------------------------------------------------
//
void CSimpleBaseDocument::BaseConstructL(
    const TDesC8& aXml )
    {       
    CSenXmlReader* reader = CSenXmlReader::NewL();
    CleanupStack::PushL(reader);
    //create a CSenDomFragment
    CSenDomFragment* pBase = CSenDomFragment::NewL();
    CleanupStack::PushL( pBase );

    //must set the content handler
    reader->SetContentHandler( *pBase );
    // and the reader
    pBase->SetReader( *reader );
    //do the parsing
    reader->ParseL( aXml );

    // Get the root element
    // OWNERSHIP IS TRANSFERRED
    //
    CSenElement* e = pBase->ExtractElement();
    const TDesC8& p8 = e->LocalName();
    ValidateXmlL( p8 );
    // This is a document root
    iRoot = CSimpleElement::NewL( e, ETrue );

    CleanupStack::PopAndDestroy( pBase );
    CleanupStack::PopAndDestroy( reader );
    }

// ----------------------------------------------------------
// CSimpleBaseDocument::DefaultNamespace
// ----------------------------------------------------------
//
TPtrC8 CSimpleBaseDocument::DefaultNamespace()
    {
    TInt err(KErrNone);
    TPtrC8 p8;
    TRAP( err, p8.Set( DoDefaultNamespaceL() ));
    if ( err )
        {
        return TPtrC8();
        }
    return p8;
    }

// ----------------------------------------------------------
// CSimpleBaseDocument::AddNamespaceL
// ----------------------------------------------------------
//
void CSimpleBaseDocument::AddNamespaceL(
    const TDesC8& aPrefix,
    const TDesC8& aUri )
    {
    iRoot->BaseElement()->AddNamespaceL( aPrefix, aUri );
    }

// ----------------------------------------------------------
// CSimpleBaseDocument::NamespacesL
// ----------------------------------------------------------
//
RPointerArray<MSimpleNamespace>& CSimpleBaseDocument::NamespacesL()
    {
    // Notice: 
    // We have to maintain two arrays, one for C-classes and another
    // for M-classes, since deletion of M-classes does not work.
    // This is not very good design to return RpointerArray of
    // M-classes, but let's not change API for this minor drawback.
     
    // reset old stuff
    iNsps.ResetAndDestroy();
    iMNsps.Reset();

    RPointerArray<CSenNamespace>& nsa = iRoot->BaseElement()->NamespacesL();

    TInt elemCount = nsa.Count();
    for ( TInt i = 0; i < elemCount; i++ )
        {
        CSenNamespace* ns = nsa[i];
        CSimpleNamespace* simpleNs = CSimpleNamespace::NewL( ns->Prefix(), ns->URI() );
        User::LeaveIfError( iNsps.Append( simpleNs ) );
        User::LeaveIfError( iMNsps.Append( simpleNs ) );
        }

    return iMNsps;
    }

// ----------------------------------------------------------
// CSimpleBaseDocument::ExternalizeL
// ----------------------------------------------------------
//
void CSimpleBaseDocument::ExternalizeL( RWriteStream& aStream )
    {
    aStream.WriteL( KSimpleXmlStart );
    iRoot->BaseElement()->WriteAsXMLToL( aStream);
    }

// ----------------------------------------------------------
// CSimpleBaseDocument::Close
// ----------------------------------------------------------
//
void CSimpleBaseDocument::Close()
    {
    delete this;
    }

// ----------------------------------------------------------
// CSimpleBaseDocument::LocalName
// ----------------------------------------------------------
//
const TDesC8& CSimpleBaseDocument::LocalName()
    {
    return iRoot->LocalName();
    }

// ----------------------------------------------------------
// CSimpleBaseDocument::DefNamespaceL
// ----------------------------------------------------------
//
MSimpleNamespace* CSimpleBaseDocument::DefNamespaceL()
    {
    return iRoot->DefNamespaceL();
    }

// ----------------------------------------------------------
// CSimpleBaseDocument::HasContent
// ----------------------------------------------------------
//
TBool CSimpleBaseDocument::HasContent()
    {
    return iRoot->HasContent();
    }

// ----------------------------------------------------------
// CSimpleBaseDocument::ContentUnicodeL
// ----------------------------------------------------------
//
HBufC* CSimpleBaseDocument::ContentUnicodeL()
    {
    return iRoot->ContentUnicodeL();
    }

// ----------------------------------------------------------
// CSimpleBaseDocument::SetContentUnicodeL
// ----------------------------------------------------------
//
void CSimpleBaseDocument::SetContentUnicodeL( const TDesC& aContent )
    {
    iRoot->SetContentUnicodeL( aContent );
    }

// ----------------------------------------------------------
// CSimpleBaseDocument::SimpleElementsL
// ----------------------------------------------------------
//
TInt CSimpleBaseDocument::SimpleElementsL( RPointerArray<MSimpleElement>& aElementArray )
    {
    return iRoot->SimpleElementsL( aElementArray );
    }

// ----------------------------------------------------------
// CSimpleBaseDocument::AttrValueLC
// ----------------------------------------------------------
//
HBufC* CSimpleBaseDocument::AttrValueLC( const TDesC8& aName )
    {
    return iRoot->AttrValueLC( aName );
    }

// ----------------------------------------------------------
// CSimpleBaseDocument::AttrValue
// ----------------------------------------------------------
//
const TDesC8* CSimpleBaseDocument::AttrValue( const TDesC8& aName )
    {
  return iRoot->AttrValue( aName );
    }

// ----------------------------------------------------------
// CSimpleBaseDocument::AddAttrL
// ----------------------------------------------------------
//
void CSimpleBaseDocument::AddAttrL( const TDesC8& aName, const TDesC& aValue )
    {
    iRoot->AddAttrL( aName, aValue );
    }

// ----------------------------------------------------------
// CSimpleBaseDocument::SimpleAttributesL
// ----------------------------------------------------------
//
TInt CSimpleBaseDocument::SimpleAttributesL( RPointerArray<MSimpleAttribute>& aArray )
    {
    return iRoot->SimpleAttributesL( aArray );
    }

// ----------------------------------------------------------
// CSimpleBaseDocument::SimpleParentL
// ----------------------------------------------------------
//
MSimpleElement* CSimpleBaseDocument::SimpleParentL()
    {
    return iRoot->SimpleParentL( );
    }

// ----------------------------------------------------------
// CSimpleBaseDocument::DetachSimpleL
// ----------------------------------------------------------
//
void CSimpleBaseDocument::DetachSimpleL()
    {
    return iRoot->DetachSimpleL( );
    }


// ----------------------------------------------------------
// CSimpleBaseDocument::AddSimpleElementL
// ----------------------------------------------------------
//
MSimpleElement* CSimpleBaseDocument::AddSimpleElementL(
    const TDesC8& aNsUri,
    const TDesC8& aLocalName )
    {
    return iRoot->AddSimpleElementL( aNsUri, aLocalName );
    }

// ----------------------------------------------------------
// CSimpleBaseDocument::AddSimpleElementL
// ----------------------------------------------------------
//
MSimpleElement* CSimpleBaseDocument::AddSimpleElementL(
    const TDesC8& aLocalName )
    {
    return iRoot->AddSimpleElementL( aLocalName );
    }


// ----------------------------------------------------------
// CSimpleBaseDocument::RemoveSimpleElement
// ----------------------------------------------------------
//
void CSimpleBaseDocument::RemoveSimpleElement(
    const TDesC8& aNsUri,
    const TDesC8& aLocalName )
    {
    iRoot->RemoveSimpleElement( aNsUri, aLocalName );
    }

// ----------------------------------------------------------
// CSimpleBaseDocument::Root
// ----------------------------------------------------------
//
CSimpleElement* CSimpleBaseDocument::Root()
    {
    return iRoot;
    }
    
// ----------------------------------------------------------
// CSimpleBaseDocument::DoDefaultNamespaceL
// ----------------------------------------------------------
//
TPtrC8 CSimpleBaseDocument::DoDefaultNamespaceL()
    {
    RPointerArray<CSenNamespace>& nsa = iRoot->BaseElement()->NamespacesL();
    TInt elemCount = nsa.Count();
    if ( !elemCount )
        {
        User::Leave( KErrNotFound );
        }
    CSenNamespace* ns = nsa[0];
    return ns->URI();
    }