--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/servicediscoveryandcontrol/pnp/test/upnp/upnpdescription/src/cupnpservicecomposer.cpp Tue Feb 02 01:12:20 2010 +0200
@@ -0,0 +1,301 @@
+// 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 "cupnpservicecomposer.h"
+#include "upnpdescriptionschema.h"
+#include "inetprottextutils.h"
+#include "tattributeiter.h"
+#include "cattribute.h"
+
+_LIT8(KBeginOpen,"\n<");
+_LIT8(KBeginClose,"</");
+_LIT8(KEnd,">");
+
+_LIT8(KStringXmlStart,"<?xml version=\"1.0\" encoding=\"utf-8\"?>");
+
+_LIT8(KStringScpdStart,"\n<scpd xmlns=\"urn:schemas-upnp-org:service-1-0\">");
+
+_LIT8(KStringStVarStart,"\n\t\t<stateVariable sendEvents=\"");
+_LIT8(KStringStVarStart1,"\">");
+#define COMPOSE_BUFLENGTH 1024
+
+void CUPnPServiceXmlComposer::AppendLiteralL(TInt aTag, RBuf8& aBuf, TInt& count, TBool aIsStart )
+ {
+
+ RString str = iStringPool.String(aTag,UPNPDESCRIPTIONXMLTAGS::Table );
+ TInt litSize = str.DesC().Size();
+
+ if(aIsStart)
+ {
+ litSize+= KBeginOpen.iTypeLength + KEnd.iTypeLength;
+ }
+ else
+ {
+ litSize+= KBeginClose.iTypeLength + KEnd.iTypeLength;
+ }
+
+ if((count+litSize)>= aBuf.MaxSize())
+ {
+ aBuf.ReAllocL(((aBuf.MaxSize()+COMPOSE_BUFLENGTH)<(aBuf.MaxSize()+litSize))?(aBuf.MaxSize()+litSize):(aBuf.MaxSize()+COMPOSE_BUFLENGTH));
+ }
+
+ if(aIsStart)
+ {
+ aBuf.Append(KBeginOpen);
+ }
+ else
+ {
+ aBuf.Append(KBeginClose);
+ }
+ aBuf.Append(str.DesC());
+ aBuf.Append(KEnd);
+ count+=litSize;
+ }
+
+void CUPnPServiceXmlComposer::AppendLiteralL(const RString& aString, RBuf8& aBuf, TInt& count, TBool aIsStart )
+ {
+ TInt litSize = aString.DesC().Size();
+ if(aIsStart)
+ {
+ litSize+= KBeginOpen.iTypeLength + KEnd.iTypeLength;
+ }
+ else
+ {
+ litSize+= KBeginClose.iTypeLength + KEnd.iTypeLength;
+ }
+
+ if((count+litSize)>= aBuf.MaxSize())
+ {
+ aBuf.ReAllocL(((aBuf.MaxSize()+COMPOSE_BUFLENGTH)<(aBuf.MaxSize()+litSize))?(aBuf.MaxSize()+litSize):(aBuf.MaxSize()+COMPOSE_BUFLENGTH));
+ }
+
+ if(aIsStart)
+ {
+ aBuf.Append(KBeginOpen);
+ }
+ else
+ {
+ aBuf.Append(KBeginClose);
+ }
+ aBuf.Append(aString.DesC());
+ aBuf.Append(KEnd);
+ count+=litSize;
+ }
+void CUPnPServiceXmlComposer::AppendLiteralL(const TDesC8& aLiteral, RBuf8& aBuf, TInt& count)
+ {
+ TInt litSize = aLiteral.Length();
+
+ if((count+litSize)>= aBuf.MaxSize())
+ {
+ aBuf.ReAllocL(((aBuf.MaxSize()+COMPOSE_BUFLENGTH)<(aBuf.MaxSize()+litSize))?(aBuf.MaxSize()+litSize):(aBuf.MaxSize()+COMPOSE_BUFLENGTH));
+ }
+
+ aBuf.Append(aLiteral);
+ count+=litSize;
+ }
+/**
+Allocates and constructs a CUPnPServiceXmlComposer object.
+Initialises all member data to their default values.
+*/
+CUPnPServiceXmlComposer* CUPnPServiceXmlComposer::NewL( const RStringPool& aStringPool )
+ {
+ CUPnPServiceXmlComposer* self = new (ELeave) CUPnPServiceXmlComposer( aStringPool );
+ return self;
+ }
+
+CUPnPServiceXmlComposer::CUPnPServiceXmlComposer( const RStringPool& aStringPool ):iStringPool ( aStringPool )
+ {
+ iError = KErrNone;
+ }
+/**
+Destructor
+*/
+CUPnPServiceXmlComposer::~CUPnPServiceXmlComposer()
+ {
+ }
+
+
+const TStringTable& CUPnPServiceXmlComposer::GetTable()
+ {
+ return UPNPDESCRIPTIONXMLTAGS::Table;
+ }
+
+void CUPnPServiceXmlComposer::AppendActionL(const CUPnPAction* aUPnPAction, RBuf8 &aXmlData, TInt &count)
+ {
+ AppendLiteralL(UPNPDESCRIPTIONXMLTAGS::EAction,aXmlData,count,ETrue);
+ AppendLiteralL(UPNPDESCRIPTIONXMLTAGS::EName,aXmlData,count,ETrue);
+ AppendLiteralL(aUPnPAction->Property(iStringPool.String(UPNPDESCRIPTIONXMLTAGS::EName, GetTable())),aXmlData,count);
+ AppendLiteralL(UPNPDESCRIPTIONXMLTAGS::EName,aXmlData,count,EFalse);
+ AppendLiteralL(UPNPDESCRIPTIONXMLTAGS::EArgumentList,aXmlData,count,ETrue);
+
+ for(TInt j =0;j< aUPnPAction->Count();j++ )
+ {
+ CUPnPArgument *uPnPArgument = aUPnPAction->At(j);
+ if (!uPnPArgument->Validate(iStringPool, GetTable()))
+ User::Leave(KErrCorrupt);
+ AppendLiteralL(UPNPDESCRIPTIONXMLTAGS::EArgument,aXmlData,count,ETrue);
+ TAttributeIter it(uPnPArgument);
+ const CAttribute* nextParam = NULL;
+ while (!it.AtEnd())
+ {
+ nextParam = it();
+ AppendLiteralL(nextParam->AttributeName(),aXmlData,count,ETrue);
+ AppendLiteralL(nextParam->AttributeValue(),aXmlData,count);
+ AppendLiteralL(nextParam->AttributeName(),aXmlData,count,EFalse);
+ ++it;
+ }
+ if ( uPnPArgument->RetVal() )
+ {
+ AppendLiteralL(UPNPDESCRIPTIONXMLTAGS::ERetValue,aXmlData,count,ETrue);
+ AppendLiteralL(UPNPDESCRIPTIONXMLTAGS::ERetValue,aXmlData,count,EFalse);
+ }
+ AppendLiteralL(UPNPDESCRIPTIONXMLTAGS::EArgument,aXmlData,count,EFalse);
+ }
+
+ AppendLiteralL(UPNPDESCRIPTIONXMLTAGS::EArgumentList,aXmlData,count,EFalse);
+ AppendLiteralL(UPNPDESCRIPTIONXMLTAGS::EAction,aXmlData,count,EFalse);
+ }
+
+void CUPnPServiceXmlComposer::AppendStateVariableL(const CUPnPStateVariable* aUPnPStateVariable, RBuf8 &aXmlData, TInt &count)
+ {
+
+ AppendLiteralL(KStringStVarStart,aXmlData,count);
+ AppendLiteralL(aUPnPStateVariable->Property(iStringPool.String(UPNPDESCRIPTIONXMLTAGS::ESendEvents, GetTable())),aXmlData,count);
+ AppendLiteralL(KStringStVarStart1,aXmlData,count);
+
+ TAttributeIter it(aUPnPStateVariable);
+ const CAttribute* nextParam = NULL;
+ while (!it.AtEnd())
+ {
+ nextParam = it();
+ if ( nextParam->AttributeName() == iStringPool.String(UPNPDESCRIPTIONXMLTAGS::ESendEvents, GetTable()))
+ {
+ ++it;
+ continue;
+ }
+ else
+ {
+ AppendLiteralL(nextParam->AttributeName(),aXmlData,count,ETrue);
+ AppendLiteralL(nextParam->AttributeValue(),aXmlData,count);
+ AppendLiteralL(nextParam->AttributeName(),aXmlData,count,EFalse);
+ ++it;
+ }
+ }
+
+ if(aUPnPStateVariable->AllowedValues())
+ {
+ if(aUPnPStateVariable->AllowedValueType())
+ {
+ const CUPnPArgValueList* aTempArgValueList = static_cast<const CUPnPArgValueList*>(aUPnPStateVariable->AllowedValues());
+ AppendLiteralL(UPNPDESCRIPTIONXMLTAGS::EAllowedValueList,aXmlData,count,ETrue);
+ for(TInt k = 0; k< aTempArgValueList->Count();k++)
+ {
+ AppendLiteralL(UPNPDESCRIPTIONXMLTAGS::EAllowedValue,aXmlData,count,ETrue);
+ AppendLiteralL(aTempArgValueList->At(k),aXmlData,count);
+ AppendLiteralL(UPNPDESCRIPTIONXMLTAGS::EAllowedValue,aXmlData,count,EFalse);
+ }
+ AppendLiteralL(UPNPDESCRIPTIONXMLTAGS::EAllowedValueList,aXmlData,count,EFalse);
+ }
+ else
+ {
+ const CUPnPValueRange* aTempValueRange = static_cast<const CUPnPValueRange*>(aUPnPStateVariable->AllowedValues());
+ AppendLiteralL(UPNPDESCRIPTIONXMLTAGS::EAllowedValueRange,aXmlData,count,ETrue);
+ TAttributeIter it(aTempValueRange);
+ const CAttribute* nextParam = NULL;
+ while (!it.AtEnd())
+ {
+ nextParam = it();
+ AppendLiteralL(nextParam->AttributeName(),aXmlData,count,ETrue);
+ AppendLiteralL(nextParam->AttributeValue(),aXmlData,count);
+ AppendLiteralL(nextParam->AttributeName(),aXmlData,count,EFalse);
+ ++it;
+ }
+
+ AppendLiteralL(UPNPDESCRIPTIONXMLTAGS::EAllowedValueRange,aXmlData,count,EFalse);
+ }
+ }
+ AppendLiteralL(UPNPDESCRIPTIONXMLTAGS::EStateVariable,aXmlData,count,EFalse);
+ }
+
+
+void CUPnPServiceXmlComposer::ComposeServiceXmlL(const CUPnPServiceDescription *aServDescObj, RBuf8 &aXmlData)
+ {
+ RBuf unicode;
+ TInt count = 0;
+
+
+ if(!(aServDescObj->Validate(iStringPool, GetTable())))
+ User::Leave(KErrCorrupt);
+
+ User::LeaveIfError(aXmlData.Create(COMPOSE_BUFLENGTH));
+
+
+ AppendLiteralL(KStringXmlStart,aXmlData,count);
+ AppendLiteralL(KStringScpdStart,aXmlData,count);
+ AppendLiteralL(UPNPDESCRIPTIONXMLTAGS::ESpecVersion,aXmlData,count,ETrue);
+
+ HBufC8* versionMajor = NULL;
+ HBufC8* versionMinor = NULL;
+ InetProtTextUtils::ConvertIntToDescriptorL(aServDescObj->MajorNumber(), versionMajor);
+ InetProtTextUtils::ConvertIntToDescriptorL(aServDescObj->MinorNumber(), versionMinor);
+ CleanupStack::PushL(versionMajor);
+ CleanupStack::PushL(versionMinor);
+
+ AppendLiteralL(UPNPDESCRIPTIONXMLTAGS::EMajorNumber,aXmlData,count,ETrue);
+ AppendLiteralL(versionMajor->Des(),aXmlData,count);
+ AppendLiteralL(UPNPDESCRIPTIONXMLTAGS::EMajorNumber,aXmlData,count,EFalse);
+ AppendLiteralL(UPNPDESCRIPTIONXMLTAGS::EMinorNumber,aXmlData,count,ETrue);
+ AppendLiteralL(versionMinor->Des(),aXmlData,count);
+ AppendLiteralL(UPNPDESCRIPTIONXMLTAGS::EMinorNumber,aXmlData,count,EFalse);
+
+ CleanupStack::PopAndDestroy(versionMinor);
+ CleanupStack::PopAndDestroy(versionMajor);
+
+ AppendLiteralL(UPNPDESCRIPTIONXMLTAGS::ESpecVersion,aXmlData,count,EFalse);
+
+
+ if(aServDescObj->CountOfActionList()!= 0)
+ {
+ AppendLiteralL(UPNPDESCRIPTIONXMLTAGS::EActionList,aXmlData,count,ETrue);
+ }
+
+ for(TInt i =0;i< aServDescObj->CountOfActionList();i++ )
+ {
+ const CUPnPAction *uPnPAction = aServDescObj->AtActionList(i);
+ AppendActionL(uPnPAction,aXmlData,count);
+ }
+ if(aServDescObj->CountOfActionList()!= 0)
+ {
+ AppendLiteralL(UPNPDESCRIPTIONXMLTAGS::EActionList,aXmlData,count,EFalse);
+ }
+
+ AppendLiteralL(UPNPDESCRIPTIONXMLTAGS::EServiceStateTable,aXmlData,count,ETrue);
+
+ for(TInt i =0;i< aServDescObj->CountOfServiceStateTable();i++ )
+ {
+ const CUPnPStateVariable *uPnPStateVariable = aServDescObj->AtServiceStateTable(i);
+ AppendStateVariableL(uPnPStateVariable,aXmlData, count);
+ }
+
+ AppendLiteralL(UPNPDESCRIPTIONXMLTAGS::EServiceStateTable,aXmlData,count,EFalse);
+
+ AppendLiteralL(UPNPDESCRIPTIONXMLTAGS::EScpd,aXmlData,count,EFalse);
+
+
+
+ unicode.CreateL(aXmlData.Length());
+ unicode.Copy(aXmlData);
+ unicode.Close();
+ }