messagingappbase/smilengine/engine/parser/smilparser_dom.cpp
branchRCL_3
changeset 27 7fdbb852d323
parent 0 72b543305e3a
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/messagingappbase/smilengine/engine/parser/smilparser_dom.cpp	Wed Sep 01 12:31:54 2010 +0100
@@ -0,0 +1,101 @@
+/*
+* Copyright (c) 2003 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: smilparser_dom implementation
+*
+*/
+
+
+
+#include "smilparser.h"
+
+#include <gmxmldocument.h>
+#include <gmxmlelement.h>
+
+class DOMParserPrivate
+	{
+public:
+	DOMParserPrivate(CSmilParser* p) { parser=p; }
+	void OpenNodeL(CMDXMLNode* n);
+	void CloseNodeL(CMDXMLNode* n);
+	CSmilParser* parser;
+	};
+
+void DOMParserPrivate::OpenNodeL(CMDXMLNode* n)
+	{
+	if (n->NodeType()==CMDXMLNode::EElementNode)
+		{
+		CMDXMLElement* el = static_cast<CMDXMLElement*>(n);
+		parser->BeginElementL(el->NodeName());
+
+		for (TInt i = 0; i<el->NumAttributes(); ++i)
+			{
+			TPtrC name, value;
+			el->AttributeDetails(i,name,value);
+			parser->AttributeValueL(name,value);
+			}
+
+		parser->AttributesEndL(el->NumAttributes());
+		}			
+	return;
+	}
+
+
+void DOMParserPrivate::CloseNodeL(CMDXMLNode* n)
+	{
+	if (n->NodeType()==CMDXMLNode::EElementNode)
+		{
+		parser->EndElementL(n->NodeName());
+		}			
+	return;
+	}
+
+
+void ParseDomL(CSmilParser* parser, CMDXMLDocument* doc)
+	{
+
+	CMDXMLElement* root = doc->DocumentElement();
+
+	CMDXMLNode* n = root;
+
+	DOMParserPrivate* dp = new (ELeave) DOMParserPrivate(parser);
+	CleanupStack::PushL(dp);
+
+	while (n)
+		{
+		dp->OpenNodeL(n);
+
+		if (n->FirstChild())
+			n = n->FirstChild();
+		else if (n->NextSibling())
+			{
+			dp->CloseNodeL(n);
+			n = n->NextSibling();
+			}
+		else 
+			{
+			while (n)
+				{
+				dp->CloseNodeL(n);
+				if (n->NextSibling())
+					{
+					n=n->NextSibling();
+					break;
+					}				
+				n = n->ParentNode();			
+				}
+			}
+		}
+	CleanupStack::PopAndDestroy();
+	return;
+	}