diff -r 000000000000 -r c8caa15ef882 simpleengine/xmlutils/src/simplebasedocument.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/simpleengine/xmlutils/src/simplebasedocument.cpp Tue Feb 02 01:05:17 2010 +0200 @@ -0,0 +1,355 @@ +/* +* 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 +#include +#include +#include +#include +#include +#include + +// 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& 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& 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& 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& 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& nsa = iRoot->BaseElement()->NamespacesL(); + TInt elemCount = nsa.Count(); + if ( !elemCount ) + { + User::Leave( KErrNotFound ); + } + CSenNamespace* ns = nsa[0]; + return ns->URI(); + } + + + +