servicediscoveryandcontrol/pnp/test/upnp/Server/Flow/src/csoapparser.cpp
changeset 0 f5a58ecadc66
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/servicediscoveryandcontrol/pnp/test/upnp/Server/Flow/src/csoapparser.cpp	Tue Feb 02 01:12:20 2010 +0200
@@ -0,0 +1,95 @@
+// Copyright (c) 2008-2009 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:
+//
+
+#include "csoapparser.h"
+#include "upnpserverconstants.h"
+CSoapParser* CSoapParser::NewL ()
+	{
+	CSoapParser* self = new (ELeave) CSoapParser;
+	CleanupStack::PushL (self);
+	self->ConstructL();
+	CleanupStack::Pop();
+	return self;
+	}
+
+CSoapParser::CSoapParser() 
+	{
+	}
+	
+CSoapParser::~CSoapParser() 
+	{
+	delete iParser;
+	iSoapAction.Close();
+	}
+
+void CSoapParser::ConstructL ()
+	{
+	iParser = CParser::NewL (KXmlMimeType(), *this);
+	iParser->ParseBeginL();	
+	}
+
+void CSoapParser::OnStartElementL(const RTagInfo& aElement, const RAttributeArray& /*aAttributes*/, TInt aErrorCode)
+	{	
+	User::LeaveIfError(aErrorCode);
+	if (aElement.LocalName().DesC().Compare(KBody) == 0)
+		{
+		iInBodySec = ETrue;	
+		return;		
+		}
+	if (iInBodySec && iSoapAction.Length() == 0)
+		{
+		const TChar KHash = '#';
+		const TDesC8& localName = aElement.LocalName().DesC();
+		const TDesC8& uri = aElement.Uri().DesC();	
+
+        iSoapAction.CreateL(uri.Length() + localName.Length() + 1); // 1 for #
+        iSoapAction.Append(uri);
+        iSoapAction.Append(KHash);
+        iSoapAction.Append(localName);
+		}	
+	}
+
+const TDesC8& CSoapParser::SoapAction () const
+	{
+	return iSoapAction;	
+	}
+
+TBool CSoapParser::ParseSoapL(const TDesC8& aBuffer)
+	{
+	const TInt KXmlInputSize = 1024;
+	TInt totalLength = aBuffer.Length();
+	TInt consumedBytes = 0;
+	while(totalLength && iSoapAction.Length() == 0)	
+		{
+		TInt len = (totalLength < KXmlInputSize) ? totalLength : KXmlInputSize;
+		TPtrC8 inputBuffer(aBuffer.Ptr() + consumedBytes, len);
+		iParser->ParseL(inputBuffer);
+		totalLength -= len;
+		consumedBytes += len;
+		}
+	
+	if ( iError != KErrNone )
+		{
+		iParser->ParseEndL();
+		User::Leave(iError);
+		}
+	
+	if ( iSoapAction.Length() > 0 )
+		{
+		iParser->ParseEndL();
+		return ETrue;
+		}
+	return EFalse;
+	}