diff -r 000000000000 -r f5a58ecadc66 upnp/upnpstack/upnputils/src/upnphttpmessagefactory.cpp
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/upnp/upnpstack/upnputils/src/upnphttpmessagefactory.cpp Tue Feb 02 01:12:20 2010 +0200
@@ -0,0 +1,880 @@
+/** @file
+* Copyright (c) 2005-2006 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: HTTP message factory
+*
+*/
+
+
+// INCLUDES
+#include "upnphttpmessagefactory.h"
+#include "upnpstring.h"
+#include "upnpcons.h"
+#include "upnpcommonupnplits.h"
+
+_LIT8(KUpnpBodyMsgError1,"\n
\n");
+_LIT8(KUpnpBodyMsgError2,"\n\n");
+_LIT8(KUpnpBodyMsgError3,"
\n
\n");
+// ================= MEMBER FUNCTIONS =======================
+
+// -----------------------------------------------------------------------------
+// RUpnpHttpMessageFactory::HttpGetL
+// HTTP GET
+// -----------------------------------------------------------------------------
+//
+EXPORT_C CUpnpHttpMessage* RUpnpHttpMessageFactory::HttpGetL( TInetAddr& aDestination,
+ const TDesC8& aPath )
+ {
+ CUpnpHttpMessage* msg = CUpnpHttpMessage::NewL(aDestination);
+ CleanupStack::PushL(msg);
+ msg->SetDestinationPathL( aPath );
+
+ TInt headerLen = 0;
+
+ headerLen += KHttpGet().Length();
+ headerLen += UpnpString::KSpace().Length();
+ headerLen += UpnpString::KSlash().Length();
+ headerLen += aPath.Length();
+ headerLen += KHttp11().Length();
+
+ HBufC8* header = HBufC8::NewLC(headerLen);
+
+ header->Des().Zero();
+ header->Des().Append(KHttpGet());
+ header->Des().Append(UpnpString::KSpace());
+ if (aPath.Length() >= UpnpString::KSlash().Length())
+ {
+ if (aPath.Find(UpnpString::KSlash()) != 0)
+ {
+ header->Des().Append(UpnpString::KSlash());
+ }
+ }
+ else
+ {
+ header->Des().Append(UpnpString::KSlash());
+ }
+ header->Des().Append(aPath);
+ header->Des().Append(KHttp11);
+
+ msg->AddPairL(*header, KNullDesC8());
+
+ SetHostHeaderL( msg, aDestination );
+
+ msg->AddPairL( UpnpHTTP::KHdrCacheControl(), UpnpHTTP::KNoCache());
+
+ CleanupStack::PopAndDestroy(); // header
+ CleanupStack::Pop(msg);
+ return msg;
+ }
+
+// -----------------------------------------------------------------------------
+// RUpnpHttpMessageFactory::HttpGetL
+// HTTP GET
+// -----------------------------------------------------------------------------
+//
+EXPORT_C CUpnpHttpMessage* RUpnpHttpMessageFactory::HttpGetL( TInetAddr& aDestination,
+ const TDesC8& aHeadPath,
+ const TDesC8& aTailPath )
+ {
+ HBufC8 *wholePath = HBufC8::NewLC(aHeadPath.Length() + aTailPath.Length());
+ wholePath->Des().Append(aHeadPath);
+ wholePath->Des().Append(aTailPath);
+ CUpnpHttpMessage* msg = HttpGetL(aDestination, *wholePath);
+ CleanupStack::PopAndDestroy(wholePath);
+ return msg;
+ }
+
+// -----------------------------------------------------------------------------
+// RUpnpHttpMessageFactory::HttpGetL
+// HTTP GET
+// -----------------------------------------------------------------------------
+//
+EXPORT_C CUpnpHttpMessage* RUpnpHttpMessageFactory::HttpGetL(const TDesC8& aUrl)
+ {
+ TPtrC8 PathPtr;
+ PathPtr.Set(aUrl);
+ TInt PosOfDoubleSlash = PathPtr.FindC(UpnpString::KDoubleSlash());
+ TInt PosOfSlash=0;
+ if(PosOfDoubleSlash==KErrNotFound)
+ {
+ // no "//" found, so we assume that protocol (http://, ftp://)
+ // is not used in front of aPath
+ PosOfSlash=PathPtr.Find(UpnpString::KSlash());
+ if(PosOfSlash != 0)
+ {
+ PathPtr.Set(PathPtr.Mid(PosOfSlash+1));
+ }
+ }
+ else
+ {
+ // DoubleSlash found, so we have to get next slash after doubleSlash.
+ PathPtr.Set(PathPtr.Mid( PosOfDoubleSlash+2 ));
+ PosOfSlash=PathPtr.Find(UpnpString::KSlash());
+ if(PosOfSlash != KErrNotFound)
+ {
+ PathPtr.Set(PathPtr.Mid(PosOfSlash));
+ }
+ }
+
+ if(PathPtr.Length() == 0)
+ {
+ PathPtr.Set(aUrl.Mid( PosOfSlash+PosOfDoubleSlash+2 ));
+ }
+
+ TPtrC8 addressPtr;
+ addressPtr.Set(aUrl);
+ if(PosOfDoubleSlash != KErrNotFound)
+ {
+ addressPtr.Set(addressPtr.Mid(PosOfDoubleSlash+2));
+ }
+
+ PosOfSlash=0;
+ PosOfSlash=addressPtr.Find(UpnpString::KSlash());
+ if(PosOfSlash != KErrNotFound)
+ {
+ addressPtr.Set(addressPtr.Left(PosOfSlash));
+ }
+
+ TInetAddr addr;
+
+ TInt port=KDefaultHttpPortNumber; // default port of http.
+
+ TInt PosOfColon=addressPtr.Find(UpnpString::KColon());
+ if(PosOfColon != KErrNotFound)
+ {
+
+ // port is given in url, so we use that one.
+ TPtrC8 portPtr;
+ portPtr.Set(addressPtr);
+ portPtr.Set(addressPtr.Mid(PosOfColon+1));
+
+ TLex8 lex = TLex8(portPtr);
+ TInt error = lex.Val(port);
+ if( error == KErrNone )
+ {
+ addressPtr.Set(addressPtr.Left(PosOfColon));
+ }
+ }
+
+ addr.SetPort(port);
+
+ CUpnpHttpMessage::AddrInput(addr, addressPtr);
+
+ CUpnpHttpMessage* msg = HttpGetL(addr, PathPtr);
+
+ return msg;
+ }
+
+// -----------------------------------------------------------------------------
+// RUpnpHttpMessageFactory::HttpGetL
+// HTTP GET
+// -----------------------------------------------------------------------------
+//
+EXPORT_C CUpnpHttpMessage* RUpnpHttpMessageFactory::HttpGetL(
+ const TDesC8& aDestination,
+ const TDesC8& aPath )
+ {
+
+ TPtrC8 tempPtr(aPath);
+ TInt PosOfDoubleSlash = tempPtr.FindC(UpnpString::KDoubleSlash());
+ TInt PosOfSlash=0;
+ if(PosOfDoubleSlash==KErrNotFound)
+ {
+ // no "//" found, so we assume that protocol (http://, ftp://)
+ // is not used in front of aPath
+ PosOfSlash=tempPtr.Find( UpnpString::KSlash() );
+ if(PosOfSlash != 0)
+ {
+ tempPtr.Set(tempPtr.Mid(PosOfSlash+1));
+ }
+ }
+ else
+ {
+ // DoubleSlash found, so we have to get next slash after doubleSlash.
+ tempPtr.Set(tempPtr.Mid( PosOfDoubleSlash+2 ));
+ PosOfSlash=tempPtr.Find( UpnpString::KSlash() );
+ tempPtr.Set(tempPtr.Mid(PosOfSlash));
+ }
+
+ if(tempPtr.Length() == 0)
+ {
+ tempPtr.Set(aPath.Mid( PosOfSlash+PosOfDoubleSlash+2 ));
+ }
+
+ TInt port(KDefaultHttpPortNumber);
+
+ RPointerArray array;
+ CleanupClosePushL(array);
+ UpnpString::CutToPiecesL(aDestination, ':', array);
+
+ if( array.Count() == 0 )
+ {
+ CleanupStack::PopAndDestroy( &array ); //array
+ return NULL;
+ }
+
+ //if the port is defined. otherwise use 80 as a default
+ if(array.Count() > 1)
+ {
+ UpnpString::StringToInt( *(array)[1], &port );
+ }
+
+ TPtrC8 temp = *(array)[0];
+ CleanupStack::Pop(); //array
+ array.ResetAndDestroy();
+
+ TInetAddr* addr = new (ELeave) TInetAddr();
+ CleanupStack::PushL( addr );
+
+ TInt slash = temp.Find( UpnpString::KSlash() );
+
+ if(slash != KErrNotFound)
+ {
+ temp.Set(temp.Left(slash));
+ }
+
+ CUpnpHttpMessage::AddrInput(*addr, temp);
+ addr->SetPort(port);
+
+ CUpnpHttpMessage* msg = HttpGetL(*addr, tempPtr);
+
+ CleanupStack::PopAndDestroy( addr );
+
+ return msg;
+ }
+
+// -----------------------------------------------------------------------------
+// RUpnpHttpMessageFactory::HttpHeadL
+// HTTP HEAD
+// -----------------------------------------------------------------------------
+//
+EXPORT_C CUpnpHttpMessage* RUpnpHttpMessageFactory::HttpHeadL(const TDesC8& aUrl)
+ {
+ TPtrC8 PathPtr;
+ PathPtr.Set(aUrl);
+ TInt PosOfDoubleSlash = PathPtr.FindC(UpnpString::KDoubleSlash());
+ TInt PosOfSlash=0;
+ if(PosOfDoubleSlash==KErrNotFound)
+ {
+ // no "//" found, so we assume that protocol (http://, ftp://)
+ // is not used in front of aPath
+ PosOfSlash=PathPtr.Find(UpnpString::KSlash());
+ if(PosOfSlash != 0)
+ {
+ PathPtr.Set(PathPtr.Mid(PosOfSlash+1));
+ }
+ }
+ else
+ {
+ // DoubleSlash found, so we have to get next slash after doubleSlash.
+ PathPtr.Set(PathPtr.Mid( PosOfDoubleSlash+2 ));
+ PosOfSlash=PathPtr.Find(UpnpString::KSlash());
+ if(PosOfSlash != KErrNotFound)
+ {
+ PathPtr.Set(PathPtr.Mid(PosOfSlash));
+ }
+ }
+
+ if(PathPtr.Length() == 0)
+ {
+ PathPtr.Set(aUrl.Mid( PosOfSlash+PosOfDoubleSlash+2 ));
+ }
+
+ TPtrC8 addressPtr;
+ addressPtr.Set(aUrl);
+ if(PosOfDoubleSlash != KErrNotFound)
+ {
+ addressPtr.Set(addressPtr.Mid(PosOfDoubleSlash+2));
+ }
+
+ PosOfSlash=0;
+ PosOfSlash=addressPtr.Find(UpnpString::KSlash());
+ if(PosOfSlash != KErrNotFound)
+ {
+ addressPtr.Set(addressPtr.Left(PosOfSlash));
+ }
+
+ TInetAddr addr;
+
+ TInt port=KDefaultHttpPortNumber; // default port of http.
+
+ TInt PosOfColon=addressPtr.Find(UpnpString::KColon());
+ if(PosOfColon != KErrNotFound)
+ {
+
+ // port is given in url, so we use that one.
+ TPtrC8 portPtr;
+ portPtr.Set(addressPtr);
+ portPtr.Set(addressPtr.Mid(PosOfColon+1));
+
+ TLex8 lex = TLex8(portPtr);
+ TInt error = lex.Val(port);
+ if( error == KErrNone )
+ {
+ addressPtr.Set(addressPtr.Left(PosOfColon));
+ }
+ }
+
+ addr.SetPort(port);
+
+ CUpnpHttpMessage::AddrInput(addr, addressPtr);
+
+ CUpnpHttpMessage* msg = HttpHeadL(addr, PathPtr);
+
+ return msg;
+ }
+
+// -----------------------------------------------------------------------------
+// RUpnpHttpMessageFactory::HttpHeadL
+// HTTP HEAD
+// -----------------------------------------------------------------------------
+//
+EXPORT_C CUpnpHttpMessage* RUpnpHttpMessageFactory::HttpHeadL(
+ const TDesC8& aDestination,
+ const TDesC8& aPath )
+ {
+
+ TPtrC8 tempPtr(aPath);
+ TInt PosOfDoubleSlash = tempPtr.FindC(UpnpString::KDoubleSlash());
+ TInt PosOfSlash=0;
+ if(PosOfDoubleSlash==KErrNotFound)
+ {
+ // no "//" found, so we assume that protocol (http://, ftp://)
+ // is not used in front of aPath
+ PosOfSlash=tempPtr.Find( UpnpString::KSlash() );
+ if(PosOfSlash != 0)
+ {
+ tempPtr.Set(tempPtr.Mid(PosOfSlash+1));
+ }
+ }
+ else
+ {
+ // DoubleSlash found, so we have to get next slash after doubleSlash.
+ tempPtr.Set(tempPtr.Mid( PosOfDoubleSlash+2 ));
+ PosOfSlash=tempPtr.Find( UpnpString::KSlash() );
+ tempPtr.Set(tempPtr.Mid(PosOfSlash));
+ }
+
+ if(tempPtr.Length() == 0)
+ {
+ tempPtr.Set(aPath.Mid( PosOfSlash+PosOfDoubleSlash+2 ));
+ }
+
+ RPointerArray array;
+ CleanupClosePushL(array);
+ UpnpString::CutToPiecesL(aDestination, ':', array);
+ if( array.Count() == 0 )
+ {
+ CleanupStack::PopAndDestroy( &array ); //array
+ return NULL;
+ }
+ TInt port( KDefaultHttpPortNumber);
+ //if the port is defined. otherwise use 80 as a default
+ if(array.Count() > 1)
+ {
+ UpnpString::StringToInt( *(array)[1], &port );
+ }
+ TPtrC8 temp = *(array)[0];
+ CleanupStack::Pop(); //array
+ array.ResetAndDestroy();
+
+ TInetAddr* addr = new (ELeave) TInetAddr();
+ CleanupStack::PushL( addr );
+
+ TInt slash = temp.Find( UpnpString::KSlash() );
+
+ if(slash != KErrNotFound)
+ {
+ temp.Set(temp.Left(slash));
+ }
+
+ CUpnpHttpMessage::AddrInput(*addr, temp);
+ addr->SetPort(port);
+
+ CUpnpHttpMessage* msg = HttpHeadL(*addr, tempPtr);
+
+ CleanupStack::PopAndDestroy( addr );
+
+ return msg;
+ }
+
+// -----------------------------------------------------------------------------
+// RUpnpHttpMessageFactory::HttpHeadL
+// HTTP HEAD
+// -----------------------------------------------------------------------------
+//
+EXPORT_C CUpnpHttpMessage* RUpnpHttpMessageFactory::HttpHeadL( TInetAddr& aDestination,
+ const TDesC8& aPath )
+ {
+ CUpnpHttpMessage* msg = CUpnpHttpMessage::NewL(aDestination);
+ CleanupStack::PushL(msg);
+ msg->SetDestinationPathL( aPath );
+
+ TInt headerLen = 0;
+
+ headerLen += KHttpHead().Length();
+ headerLen += UpnpString::KSpace().Length();
+ headerLen += UpnpString::KSlash().Length();
+ headerLen += aPath.Length();
+ headerLen += KHttp11().Length();
+
+ HBufC8* header = HBufC8::NewLC(headerLen);
+
+ header->Des().Zero();
+ header->Des().Append(KHttpHead());
+ header->Des().Append(UpnpString::KSpace());
+ if (aPath.Length() >= UpnpString::KSlash().Length())
+ {
+ if (aPath.Find(UpnpString::KSlash()) != 0)
+ {
+ header->Des().Append(UpnpString::KSlash());
+ }
+ }
+ else
+ {
+ header->Des().Append(UpnpString::KSlash());
+ }
+ header->Des().Append(aPath);
+ header->Des().Append(KHttp11);
+
+ msg->AddPairL(*header, KNullDesC8());
+
+ SetHostHeaderL( msg, aDestination );
+
+ CleanupStack::PopAndDestroy(); // header
+ CleanupStack::Pop(msg);
+ return msg;
+ }
+
+// -----------------------------------------------------------------------------
+// RUpnpHttpMessageFactory::HttpPostL
+// HTTP POST
+// -----------------------------------------------------------------------------
+//
+EXPORT_C CUpnpHttpMessage* RUpnpHttpMessageFactory::HttpPostL(const TDesC8& aUrl)
+ {
+ TPtrC8 PathPtr;
+ PathPtr.Set(aUrl);
+ TInt PosOfDoubleSlash = PathPtr.FindC(UpnpString::KDoubleSlash());
+ TInt PosOfSlash=0;
+ if(PosOfDoubleSlash==KErrNotFound)
+ {
+ // no "//" found, so we assume that protocol (http://, ftp://)
+ // is not used in front of aPath
+ PosOfSlash=PathPtr.Find(UpnpString::KSlash());
+ if(PosOfSlash != 0)
+ {
+ PathPtr.Set(PathPtr.Mid(PosOfSlash+1));
+ }
+ }
+ else
+ {
+ // DoubleSlash found, so we have to get next slash after doubleSlash.
+ PathPtr.Set(PathPtr.Mid( PosOfDoubleSlash+2 ));
+ PosOfSlash=PathPtr.Find(UpnpString::KSlash());
+ if(PosOfSlash != KErrNotFound)
+ {
+ PathPtr.Set(PathPtr.Mid(PosOfSlash));
+ }
+ }
+
+ if(PathPtr.Length() == 0)
+ {
+ PathPtr.Set(aUrl.Mid( PosOfSlash+PosOfDoubleSlash+2 ));
+ }
+
+ TPtrC8 addressPtr;
+ addressPtr.Set(aUrl);
+ if(PosOfDoubleSlash != KErrNotFound)
+ {
+ addressPtr.Set(addressPtr.Mid(PosOfDoubleSlash+2));
+ }
+
+ PosOfSlash=0;
+ PosOfSlash=addressPtr.Find(UpnpString::KSlash());
+ if(PosOfSlash != KErrNotFound)
+ {
+ addressPtr.Set(addressPtr.Left(PosOfSlash));
+ }
+
+ TInetAddr addr;
+ HBufC* addrBuf;
+ TInt port=KDefaultHttpPortNumber; // default port of http
+
+ TInt PosOfColon=addressPtr.Find(UpnpString::KColon());
+ if(PosOfColon != KErrNotFound)
+ {
+ // port is given in url, so we use that one.
+ TPtrC8 portPtr;
+ portPtr.Set(addressPtr);
+ portPtr.Set(addressPtr.Mid(PosOfColon+1));
+
+ TLex8 lex = TLex8(portPtr);
+ lex.Val(port);
+
+ addressPtr.Set(addressPtr.Left(PosOfColon));
+ }
+
+ addr.SetPort(port);
+
+ addrBuf=UpnpString::ToUnicodeL(addressPtr);
+
+ CUpnpHttpMessage::AddrInput(addr, addressPtr);
+
+ delete addrBuf;
+ addrBuf=NULL;
+
+ CUpnpHttpMessage* msg = HttpPostL(addr, PathPtr);
+
+ return msg;
+ }
+
+// -----------------------------------------------------------------------------
+// RUpnpHttpMessageFactory::HttpPostL
+// HTTP POST
+// -----------------------------------------------------------------------------
+//
+EXPORT_C CUpnpHttpMessage* RUpnpHttpMessageFactory::HttpPostL(
+ const TDesC8& aDestination,
+ const TDesC8& aPath )
+ {
+ RPointerArray array;
+ CleanupClosePushL(array);
+ UpnpString::CutToPiecesL(aDestination, ':',array);
+ TInetAddr addr;
+ if(array.Count() > 1)
+ {
+ TInt port;
+ if((array)[1]->Length() >0)
+ {
+ TLex8 lex = TLex8( *(array)[1] );
+ lex.Val(port);
+ }
+ else
+ {
+ CleanupStack::Pop(); //array
+ array.ResetAndDestroy();
+ return NULL;
+ }
+
+ if((array)[0]->Length() > 0)
+ {
+ CUpnpHttpMessage::AddrInput(addr, *(array)[0]);
+ addr.SetPort( port);
+ }
+ else
+ {
+ CleanupStack::Pop(); //array
+ array.ResetAndDestroy();
+ return NULL;
+ }
+ }
+ else
+ {
+ CleanupStack::Pop(); //array
+ array.ResetAndDestroy();
+ return NULL;
+ }
+ CleanupStack::Pop();
+ array.ResetAndDestroy();
+ return HttpPostL(addr, aPath);
+ }
+
+// -----------------------------------------------------------------------------
+// RUpnpHttpMessageFactory::HttpPostL
+// HTTP POST
+// -----------------------------------------------------------------------------
+//
+EXPORT_C CUpnpHttpMessage* RUpnpHttpMessageFactory::HttpPostL(
+ const TInetAddr& aDestination,
+ const TDesC8& aPath )
+ {
+ CUpnpHttpMessage* msg = CUpnpHttpMessage::NewL(aDestination);
+ CleanupStack::PushL(msg);
+ msg->SetDestinationPathL( aPath );
+ HBufC8* temp = HBufC8::NewLC( KHttpPost().Length() +
+ UpnpString::KSpace().Length() +
+ aPath.Length() +
+ KHttp11().Length() );
+
+ temp->Des().Zero();
+ temp->Des().Append(KHttpPost());
+ temp->Des().Append(UpnpString::KSpace());
+ temp->Des().Append(aPath);
+ temp->Des().Append(KHttp11);
+ msg->AddPairL(*temp, KNullDesC8());
+
+ SetHostHeaderL( msg, aDestination );
+
+ msg->AddPairL(UpnpHTTP::KConnection(), UpnpHTTP::KClose());
+ CleanupStack::PopAndDestroy(temp);
+ CleanupStack::Pop();
+ return msg;
+ }
+
+// -----------------------------------------------------------------------------
+// RUpnpHttpMessageFactory::HttpResponseOkL
+// HTTP response OK
+// -----------------------------------------------------------------------------
+//
+EXPORT_C CUpnpHttpMessage* RUpnpHttpMessageFactory::HttpResponseOkL(
+ CUpnpHttpMessage* aMessage )
+ {
+ CUpnpHttpMessage* msg = CUpnpHttpMessage::NewL(aMessage->Sender(),
+ aMessage->SessionId());
+ CleanupStack::PushL(msg);
+
+ msg->AddPairL(KHttp11Ok(), KNullDesC8());
+
+
+ msg->SetDestinationPathL(aMessage->SenderPath());
+ msg->SetSenderPathL(aMessage->DestinationPath());
+
+ CleanupStack::Pop(msg);
+ return msg;
+ }
+
+// -----------------------------------------------------------------------------
+// RUpnpHttpMessageFactory::HttpResponseOkL
+// HTTP response OK
+// -----------------------------------------------------------------------------
+//
+EXPORT_C CUpnpHttpMessage* RUpnpHttpMessageFactory::HttpResponseOkL(
+ const TInetAddr& aDestination )
+ {
+ CUpnpHttpMessage* msg = CUpnpHttpMessage::NewL(aDestination);
+ CleanupStack::PushL(msg);
+
+ msg->AddPairL(KHttp11Ok(), KNullDesC8());
+
+ CleanupStack::Pop(msg);
+ return msg;
+ }
+
+// -----------------------------------------------------------------------------
+// RUpnpHttpMessageFactory::Http11Response
+// HTTP response
+// -----------------------------------------------------------------------------
+//
+EXPORT_C CUpnpHttpMessage* RUpnpHttpMessageFactory::Http11ResponseL(
+ CUpnpHttpMessage *aMessage,
+ TInt aStatus )
+ {
+ CUpnpHttpMessage* msg = RUpnpHttpMessageFactory::Http11ResponseL( aMessage->Sender(), aStatus );
+ CleanupStack::PushL(msg);
+
+ msg->SetSessionId( aMessage->SessionId() );
+ msg->SetDestinationPathL(aMessage->SenderPath());
+ msg->SetSenderPathL(aMessage->DestinationPath());
+
+ CleanupStack::Pop(msg);
+ return msg;
+ }
+
+// -----------------------------------------------------------------------------
+// RUpnpHttpMessageFactory::Http11Response
+// HTTP response
+// -----------------------------------------------------------------------------
+//
+EXPORT_C CUpnpHttpMessage* RUpnpHttpMessageFactory::Http11ResponseL(
+ const TInetAddr& aDestination,
+ TInt aStatus )
+ {
+ CUpnpHttpMessage* msg = CUpnpHttpMessage::NewL(aDestination);
+ CleanupStack::PushL(msg);
+ THttpStatusCode status = (THttpStatusCode) aStatus;
+
+ TBuf8 num;
+ num.Num( aStatus );
+
+ HBufC8* tempBuf;
+ tempBuf=HBufC8::NewLC( KHttp11WithoutSpace().Length() + KSpace().Length() +
+ num.Length() + KSpace().Length() +
+ (CUpnpHttpMessage::HttpError(status)).Length() );
+ tempBuf->Des().Zero();
+ tempBuf->Des().Append(KHttp11WithoutSpace());
+ tempBuf->Des().Append( KSpace() );
+ tempBuf->Des().Append( num );
+ tempBuf->Des().Append( KSpace );
+ tempBuf->Des().Append(CUpnpHttpMessage::HttpError(status));
+
+
+ msg->AddPairL((TDesC8&) *tempBuf, (TDesC8&) KNullDesC8());
+
+ CleanupStack::PopAndDestroy(tempBuf);
+ tempBuf=NULL;
+
+ CleanupStack::Pop(msg);
+ return msg;
+ }
+
+// -----------------------------------------------------------------------------
+// RUpnpHttpMessageFactory::HttpResponseErrorL
+// HTTP response ERROR
+// -----------------------------------------------------------------------------
+//
+EXPORT_C CUpnpHttpMessage* RUpnpHttpMessageFactory::HttpResponseErrorL(
+ CUpnpHttpMessage *aMessage,
+ TInt aError )
+ {
+ CUpnpHttpMessage* msg = RUpnpHttpMessageFactory::HttpResponseErrorL(
+ aMessage->Sender(), aError );
+ CleanupStack::PushL(msg);
+
+ msg->SetSessionId( aMessage->SessionId() );
+ msg->SetDestinationPathL(aMessage->SenderPath());
+ msg->SetSenderPathL(aMessage->DestinationPath());
+
+ CleanupStack::Pop(msg);
+ return msg;
+ }
+
+// -----------------------------------------------------------------------------
+// RUpnpHttpMessageFactory::HttpResponseErrorL
+// HTTP response ERROR
+// -----------------------------------------------------------------------------
+//
+EXPORT_C CUpnpHttpMessage* RUpnpHttpMessageFactory::HttpResponseErrorL(
+ const TInetAddr& aDestination,
+ TInt aError )
+ {
+ CUpnpHttpMessage* msg = CUpnpHttpMessage::NewL(aDestination);
+ CleanupStack::PushL(msg);
+ THttpStatusCode error = (THttpStatusCode) aError;
+
+ HBufC8* tempBuf;
+ tempBuf=HBufC8::NewLC((CUpnpHttpMessage::HttpError(error)).Length()+KMaxIntegerLength);
+ tempBuf->Des().Zero();
+
+ tempBuf->Des().Num(aError);
+ tempBuf->Des().Append( KSpace );
+ tempBuf->Des().Append(CUpnpHttpMessage::HttpError(error));
+
+ HBufC8* tempBuf2;
+ tempBuf2=HBufC8::NewLC(tempBuf->Des().Length()+KHttp11().Length()+1);
+ tempBuf2->Des().Zero();
+ tempBuf2->Des().Append(KHttp11WithoutSpace());
+ tempBuf2->Des().Append(UpnpString::KSpace());
+ tempBuf2->Des().Append(*tempBuf);
+
+ msg->AddPairL((TDesC8&) *tempBuf2, (TDesC8&) KNullDesC8());
+
+ CleanupStack::PopAndDestroy(tempBuf2);
+ tempBuf2=NULL;
+
+ HBufC8* BodyBuf;
+ BodyBuf=HBufC8::NewLC( KUpnpBodyMsgError1().Length() +
+ KUpnpBodyMsgError2().Length() +
+ KUpnpBodyMsgError3().Length() +
+ ( tempBuf->Length() * 2 ) );
+ BodyBuf->Des().Zero();
+ BodyBuf->Des().Append(KUpnpBodyMsgError1());
+ BodyBuf->Des().Append(*tempBuf);
+ BodyBuf->Des().Append(KUpnpBodyMsgError2());
+ BodyBuf->Des().Append(CUpnpHttpMessage::HttpError(error));
+ BodyBuf->Des().Append(KUpnpBodyMsgError3());
+
+ msg->SetBodyL( *BodyBuf);
+
+ CleanupStack::PopAndDestroy(BodyBuf);
+ CleanupStack::PopAndDestroy(tempBuf);
+ tempBuf=NULL;
+ BodyBuf=NULL;
+
+ CleanupStack::Pop(msg);
+ return msg;
+ }
+
+// -----------------------------------------------------------------------------
+// RUpnpHttpMessageFactory::UpnpResponseErrorL
+// UPnP response ERROR
+// -----------------------------------------------------------------------------
+//
+EXPORT_C CUpnpHttpMessage* RUpnpHttpMessageFactory::UpnpResponseErrorL(
+ CUpnpHttpMessage* aMessage,
+ TUpnpErrorCode aError )
+ {
+ CUpnpHttpMessage* msg = RUpnpHttpMessageFactory::UpnpResponseErrorL(
+ aMessage->Sender(), aError);
+ CleanupStack::PushL(msg);
+
+ msg->SetSessionId(aMessage->SessionId());
+ msg->SetDestinationPathL(aMessage->SenderPath());
+ msg->SetSenderPathL(aMessage->DestinationPath());
+
+ CleanupStack::Pop(msg);
+ return msg;
+ }
+
+// -----------------------------------------------------------------------------
+// RUpnpHttpMessageFactory::UpnpResponseErrorL
+// UPnP response ERROR
+// -----------------------------------------------------------------------------
+//
+EXPORT_C CUpnpHttpMessage* RUpnpHttpMessageFactory::UpnpResponseErrorL(
+ const TInetAddr& aDestination,
+ TUpnpErrorCode aError )
+ {
+ CUpnpHttpMessage* msg = CUpnpHttpMessage::NewL(aDestination);
+ CleanupStack::PushL(msg);
+
+ TBuf8 num;
+ num.Num((TInt)aError);
+
+ HBufC8* tempBuf;
+ tempBuf=HBufC8::NewLC((CUpnpHttpMessage::UpnpError(aError)).Length()
+ +KMaxIntegerLength+KHttp11().Length()+1);
+ tempBuf->Des().Zero();
+ tempBuf->Des().Append(KHttp11WithoutSpace());
+ tempBuf->Des().Append(UpnpString::KSpace());
+ tempBuf->Des().Append(num);
+ tempBuf->Des().Append( KSpace );
+ tempBuf->Des().Append(CUpnpHttpMessage::UpnpError(aError));
+
+ msg->AddPairL((TDesC8&) *tempBuf, (TDesC8&) KNullDesC8());
+
+ CleanupStack::PopAndDestroy(tempBuf);
+ tempBuf=NULL;
+
+ CleanupStack::Pop(msg);
+ return msg;
+ }
+
+// -----------------------------------------------------------------------------
+// RUpnpHttpMessageFactory::SetHostHeaderL
+// Sets Host HTTP header to given message basing on given destinstion address.
+// -----------------------------------------------------------------------------
+//
+void RUpnpHttpMessageFactory::SetHostHeaderL( CUpnpHttpMessage* aMessage, const TInetAddr& aDestination )
+ {
+
+ TInt port = aDestination.Port();
+ TBuf8 addrBuf;
+ TBuf8 portBuf;
+ portBuf.Num( port );
+
+ CUpnpHttpMessage::AddrOutput(aDestination, addrBuf);
+
+ HBufC8* hostBuf=HBufC8::NewLC(addrBuf.Length() + KColon().Length() + portBuf.Length());
+ TPtr8 hostPtr = hostBuf->Des();
+ hostPtr.Append( addrBuf );
+ hostPtr.Append( KColon() );
+ hostPtr.Append( portBuf );
+
+ aMessage->AddPairL(UpnpSSDP::KHdrHost(),*hostBuf);
+
+ CleanupStack::PopAndDestroy( hostBuf );
+ }
+
+// End of File
+