--- /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;
+ }