diff -r 000000000000 -r f5a58ecadc66 servicediscoveryandcontrol/pnp/test/upnp/codec/src/cupnpheaderwriter.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/servicediscoveryandcontrol/pnp/test/upnp/codec/src/cupnpheaderwriter.cpp Tue Feb 02 01:12:20 2010 +0200 @@ -0,0 +1,302 @@ +// 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 +#include +#include + +#include "cupnpheaderwriter.h" +#include "CHeaderField.h" + + +const TInt KMaxNumDigits = 10; +_LIT8(KTimeoutSecond, "Second-"); +_LIT8(KSemiSpaceSep,"; "); +_LIT8(KQuotes, "\""); +_LIT8(KOpenAngleBracket, "<"); +_LIT8(KCloseAngleBracket, ">"); + + +CUPnPHeaderWriter* CUPnPHeaderWriter::NewL(RStringPool aStringPool) + { + return new (ELeave) CUPnPHeaderWriter(aStringPool); + } + +CUPnPHeaderWriter::~CUPnPHeaderWriter() + { + // do nothing. + } + +void CUPnPHeaderWriter::EncodeHeaderL(RHeaderField& aHeader) + { + RStringF fieldStr = iStringPool.StringF(aHeader.Name()); + switch( fieldStr.Index(TUPnPTable::Table()) ) + { + case UPnP::EST: + EncodeGenericUpnpHeaderL(aHeader, KErrUPnPEncodeST); + break; + case UPnP::EUSN: + EncodeGenericUpnpHeaderL(aHeader, KErrUPnPEncodeUSN); + break; + case UPnP::ETimeout: + EncodeTimeoutHeaderL(aHeader, KErrUPnPEncodeTimeout); + break; + case UPnP::EExt: + EncodeExtL(aHeader); + break; + case UPnP::ESID: + EncodeGenericUpnpHeaderL(aHeader, KErrUPnPEncodeSID); + break; + case UPnP::ENTS: + EncodeGenericUpnpHeaderL(aHeader, KErrUPnPEncodeNTS); + break; + case UPnP::ENT: + EncodeGenericUpnpHeaderL(aHeader, KErrUPnPEncodeNT); + break; + case UPnP::EMX: + EncodeGenericNumberHeaderL(aHeader, KErrUPnPEncodeMX); + break; + case UPnP::ESEQ: + EncodeGenericNumberHeaderL(aHeader, KErrUPnPEncodeSEQ); + break; + case UPnP::EMAN: + EncodeMANL(aHeader, KErrUPnPEncodeMAN); + break; + case UPnP::ESoapAction: + EncodeSoapActionL(aHeader); + break; + case UPnP::ECallback: + EncodeCallbackL(aHeader); + break; + default: + User::Leave(KErrNotSupported); + } + } + +CUPnPHeaderWriter::CUPnPHeaderWriter(RStringPool aStringPool) +:iStringPool(aStringPool) + { + // do nothing. + } + +void CUPnPHeaderWriter::EncodeGenericUpnpHeaderL(RHeaderField& aHeader, TInt aErrorCode) const + { + THeaderFieldPartIter iter = aHeader.PartsL(); + iter.First(); + if (iter.AtEnd()) + User::Leave(aErrorCode); + + aHeader.BeginRawDataL(); + + const CHeaderFieldPart* part = iter(); + if (part == NULL) + User::Leave(aErrorCode); + + THTTPHdrVal ptVal = part->Value(); + if (ptVal.Type() != THTTPHdrVal::KStrFVal) + User::Leave(aErrorCode); + aHeader.WriteRawDataL(ptVal.StrF().DesC()); + + aHeader.CommitRawData(); + } + +void CUPnPHeaderWriter::EncodeGenericNumberHeaderL(RHeaderField& aHeader, TInt aErrorCodeToUseOnFailure) const + { + // header =
":" 1*DIGIT + THeaderFieldPartIter iter1 = aHeader.PartsL(); + iter1.First(); + if (!iter1.AtEnd()) + { + const CHeaderFieldPart* part = iter1(); + if (part) + { + THTTPHdrVal pt1val = part->Value(); + if (pt1val.Type() == THTTPHdrVal::KTIntVal) + { + TBuf8 lenBuf; + lenBuf.Num(pt1val.Int()); + aHeader.BeginRawDataL(); + aHeader.WriteRawDataL(lenBuf); + aHeader.CommitRawData(); + return; + } + } + } + User::Leave(aErrorCodeToUseOnFailure); + } + +void CUPnPHeaderWriter::EncodeTimeoutHeaderL(RHeaderField& aHeader, TInt aErrorCode) const + { + THeaderFieldPartIter iter = aHeader.PartsL(); + iter.First(); + if (iter.AtEnd()) + User::Leave(aErrorCode); + + aHeader.BeginRawDataL(); + + const CHeaderFieldPart* part = iter(); + if (part == NULL) + User::Leave(aErrorCode); + + THTTPHdrVal ptVal = part->Value(); + if (ptVal.Type() != THTTPHdrVal::KTIntVal) + User::Leave(aErrorCode); + + if(ptVal.Int() == -KMaxTInt) + { + RStringF infiniteStrF = iStringPool.StringF(UPnP::EInfinite, TUPnPTable::Table()); + aHeader.WriteRawDataL(infiniteStrF.DesC()); + } + else + { + HBufC8* ptValDesC; + InetProtTextUtils::ConvertIntToDescriptorL(ptVal.Int(), ptValDesC); + CleanupStack::PushL(ptValDesC); + RBuf8 buf; + buf.CreateL(KTimeoutSecond()); + CleanupClosePushL(buf); + buf.ReAllocL(buf.Length() + ptValDesC->Length()); + buf.Append(ptValDesC->Des()); + aHeader.WriteRawDataL(buf); + CleanupStack::PopAndDestroy(&buf); + CleanupStack::PopAndDestroy(ptValDesC); + } + + aHeader.CommitRawData(); + } + +void CUPnPHeaderWriter::EncodeMANL(RHeaderField& aHeader, TInt aErrorCode) const + { + THeaderFieldPartIter iter = aHeader.PartsL(); + iter.First(); + if (iter.AtEnd()) + User::Leave(aErrorCode); + + aHeader.BeginRawDataL(); + const CHeaderFieldPart* part = WriteRawStrFMANPartL(aHeader, iter, aErrorCode); + + // Check for parameters + THeaderFieldParamIter iter2 = part->Parameters(); + iter2.First(); + + if(!iter2.AtEnd()) + { + aHeader.WriteRawDataL(KSemiSpaceSep); + const CHeaderFieldParam* param = iter2(); + if (!param) + User::Leave(aErrorCode); + + RStringF nsStr = iStringPool.StringF(UPnP::ENS,TUPnPTable::Table()); + THTTPHdrVal paramVal = param->Value(); + if (param->Name() == nsStr) + { + // Get the ns value + if (paramVal.Type() != THTTPHdrVal::KTIntVal) + User::Leave(aErrorCode); + HBufC8* nsValBuf; + InetProtTextUtils::ConvertIntToDescriptorL(paramVal.Int(), nsValBuf); + CleanupStack::PushL(nsValBuf); + aHeader.WriteRawDataL(nsStr.DesC()); + aHeader.WriteRawDataL('='); + aHeader.WriteRawDataL(*nsValBuf); + CleanupStack::PopAndDestroy(nsValBuf); + } + else + { + // Extension parameter - handle strings only + if (paramVal.Type() != THTTPHdrVal::KStrFVal) + User::Leave(aErrorCode); + RStringF paramName = iStringPool.StringF(param->Name()); + aHeader.WriteRawDataL(paramName.DesC()); + aHeader.WriteRawDataL('='); + aHeader.WriteRawDataL(paramVal.StrF().DesC()); + } + } + + // Done + aHeader.CommitRawData(); + } + +const CHeaderFieldPart* CUPnPHeaderWriter::WriteRawStrFMANPartL(RHeaderField& aHeader, THeaderFieldPartIter& aIter, TInt aErrorCode) const + { + const CHeaderFieldPart* part = aIter(); + if (part == NULL) + User::Leave(aErrorCode); + THTTPHdrVal ptVal = part->Value(); + if (ptVal.Type() != THTTPHdrVal::KStrFVal) + User::Leave(aErrorCode); + + aHeader.WriteRawDataL(KQuotes()); + aHeader.WriteRawDataL(ptVal.StrF().DesC()); + aHeader.WriteRawDataL(KQuotes()); + + return part; + } + +void CUPnPHeaderWriter::EncodeSoapActionL(RHeaderField& aHeader) const + { + THeaderFieldPartIter iter = aHeader.PartsL(); + iter.First(); + if (iter.AtEnd()) + User::Leave(KErrUPnPEncodeSoapAction); + + aHeader.BeginRawDataL(); + + const CHeaderFieldPart* part = iter(); + if (part == NULL) + User::Leave(KErrUPnPEncodeSoapAction); + THTTPHdrVal ptVal = part->Value(); + if (ptVal.Type() != THTTPHdrVal::KStrFVal) + User::Leave(KErrUPnPEncodeSoapAction); + + aHeader.WriteRawDataL(KQuotes()); + aHeader.WriteRawDataL(ptVal.StrF().DesC()); + aHeader.WriteRawDataL(KQuotes()); + aHeader.CommitRawData(); + } + +void CUPnPHeaderWriter::EncodeCallbackL(RHeaderField& aHeader) const + { + THeaderFieldPartIter iter = aHeader.PartsL(); + iter.First(); + if (iter.AtEnd()) + User::Leave(KErrUPnPEncodeCallback); + + aHeader.BeginRawDataL(); + + while (!iter.AtEnd()) + { + const CHeaderFieldPart* part = iter(); + if (part == NULL) + User::Leave(KErrUPnPEncodeCallback); + THTTPHdrVal ptVal = part->Value(); + if (ptVal.Type() != THTTPHdrVal::KStrFVal) + User::Leave(KErrUPnPEncodeCallback); + + aHeader.WriteRawDataL(KOpenAngleBracket()); + aHeader.WriteRawDataL(ptVal.StrF().DesC()); + aHeader.WriteRawDataL(KCloseAngleBracket()); + ++iter; + } + + aHeader.CommitRawData(); + } + +void CUPnPHeaderWriter::EncodeExtL(RHeaderField& aHeader) + { + aHeader.BeginRawDataL(); + aHeader.WriteRawDataL(KNullDesC8); + aHeader.CommitRawData(); + }