diff -r 000000000000 -r f5a58ecadc66 upnp/upnpstack/serviceframework/src/upnphttpservertransactionhandler.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/upnp/upnpstack/serviceframework/src/upnphttpservertransactionhandler.cpp Tue Feb 02 01:12:20 2010 +0200 @@ -0,0 +1,201 @@ +/** @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: CUpnpHttpServerTransactionHandler implementation. + * + */ +// INCLUDES +#include + +#include "upnphttpservertransactionhandler.h" +#include "upnpstring.h" +#include "upnphttpmessage.h" +#include "upnpicon.h" + +#include "upnphttpservertransactiondescription.h" +#include "upnpdevicedescriptionrequest.h" +#include "upnpdevicedescriptionprovider.h" +#include "upnpdeviceimplementationbase.h" + + + + +// ============================ MEMBER FUNCTIONS =============================== + +// ----------------------------------------------------------------------------- +// CUpnpHttpServerTransactionHandler::CUpnpHttpServerTransactionHandler +// C++ default constructor. +// ----------------------------------------------------------------------------- +// +CUpnpHttpServerTransactionHandler::CUpnpHttpServerTransactionHandler( + CUpnpDeviceImplementationBase& aDevice ) : + iDevice( aDevice ) + + { + } + +// ----------------------------------------------------------------------------- +// CUpnpHttpServerTransactionHandler::~CUpnpHttpServerTransactionHandler +// C++ default destructor. +// ----------------------------------------------------------------------------- +// +CUpnpHttpServerTransactionHandler::~CUpnpHttpServerTransactionHandler() + { + } + +// ----------------------------------------------------------------------------- +// CUpnpHttpServerTransactionHandler::NewLC +// Two-phased constructor. +// ----------------------------------------------------------------------------- +// +CUpnpHttpServerTransactionHandler* CUpnpHttpServerTransactionHandler::NewLC( + CUpnpDeviceImplementationBase& aDevice ) + { + CUpnpHttpServerTransactionHandler* self = + new ( ELeave ) CUpnpHttpServerTransactionHandler( aDevice ); + CleanupStack::PushL( self ); + self->ConstructL(); + return self; + } + +// ----------------------------------------------------------------------------- +// CUpnpHttpServerTransactionHandler::NewL +// Two-phased constructor. +// ----------------------------------------------------------------------------- +// +CUpnpHttpServerTransactionHandler* CUpnpHttpServerTransactionHandler::NewL( + CUpnpDeviceImplementationBase& aDevice ) + { + CUpnpHttpServerTransactionHandler* self = + CUpnpHttpServerTransactionHandler::NewLC( aDevice ); + CleanupStack::Pop( self ); + return self; + } + +// ----------------------------------------------------------------------------- +// CUpnpHttpServerTransactionHandler::ConstructL +// EPOC default constructor for performing 2nd stage construction. +// ----------------------------------------------------------------------------- +// +void CUpnpHttpServerTransactionHandler::ConstructL() + { + } + + +// ----------------------------------------------------------------------------- +// CUpnpHttpServerTransactionHandler::NewTransactionL +// +// ----------------------------------------------------------------------------- +// +void CUpnpHttpServerTransactionHandler::NewTransactionL( + const TDesC8& aMethod, const TDesC8& aUri, + const TInetAddr& aSender, CUpnpHttpServerTransaction*& aResultTrans ) + { + _LIT8( KGet, "GET" ); + _LIT8( KHead, "HEAD" ); + if ( (aMethod.CompareF(KGet)==0) || (aMethod.CompareF(KHead)==0) ) + { + aResultTrans = CUpnpHttpServerTransactionDescription::NewL( *this, aSender, aUri ); + } + else + { + User::Leave( KErrGeneral );//bad request + } + } + + +// ----------------------------------------------------------------------------- +// CUpnpHttpServerTransactionHandler::GetFileL +// +// ----------------------------------------------------------------------------- +// +TInt CUpnpHttpServerTransactionHandler::GetFileL( RFile& aFile, + const TDesC8& aUri, const TInetAddr& aInetAdress ) + { + + CUpnpDeviceDescriptionRequest* request = CUpnpDeviceDescriptionRequest::NewL( aUri, aInetAdress ); + TInt error = KErrNone; + + switch ( MatchType( aUri ) ) + { + case EDevice: + error = iDevice.DescritptionProvider().OnDeviceDescription( *request ); + break; + case EService: + error = iDevice.DescritptionProvider().OnServiceDescription( *request ); + break; + case EIcon: + error = iDevice.DescritptionProvider().OnIcon( *request ); + break; + default: + error = -EHttpNotFound; + break; + } + delete request; + request = NULL; + + if( KErrNone == error ) + { + if ( KErrNone != iDevice.DescritptionProvider().GetFile( aUri, aFile ) ) + { + error = -EHttpNotFound; + } + } + else + { + error = -EHttpNotFound; + } + + return error; + } + +// ----------------------------------------------------------------------------- +// CUpnpHttpServerTransactionHandler::MatchType +// +// ----------------------------------------------------------------------------- +// +CUpnpHttpServerTransactionHandler::TDescriptionType + CUpnpHttpServerTransactionHandler::MatchType( const TDesC8& aUri ) + { + if ( aUri.CompareF( iDevice.DescriptionUrl() ) == 0 ) + { + return EDevice; + } + + //1st check if url is service url + RPointerArray servList = + iDevice.ServiceList(); + TInt count = servList.Count(); + for( TInt index = 0; index < count; index++ ) + { + if( servList[ index ]->ServiceDescriptionUrl().CompareF( aUri ) == 0 ) + { + return EService; + } + } + //next check icon list + RPointerArray iconList = + iDevice.Icons(); + count = iconList.Count(); + for( TInt index2 = 0; index2 < count; index2++ ) + { + if( iconList[ index2 ]->Url().CompareF( aUri ) == 0 ) + { + return EIcon; + } + } + return ENotFound; + } + + +// End of File