diff -r 000000000000 -r f5a58ecadc66 servicediscoveryandcontrol/pnp/test/upnp/upnpdescription/src/cupnpservicecomposer.cpp --- /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(KStringXmlStart,""); + +_LIT8(KStringScpdStart,"\n"); + +_LIT8(KStringStVarStart,"\n\t\t"); +#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(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(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(); + }