diff -r 000000000000 -r f5a58ecadc66 upnp/upnpstack/serviceframework/src/upnpdispatcher.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/upnp/upnpstack/serviceframework/src/upnpdispatcher.cpp Tue Feb 02 01:12:20 2010 +0200 @@ -0,0 +1,370 @@ +/** @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: Message dispatcher +* +*/ + + +// INCLUDE FILES +#include +#include "upnpdispatcher.pan" +#include "upnpdispatcher.h" +#include "upnpdiscoveryobserver.h" +#include "upnpdispatcherengine.h" +#include "upnpstring.h" +#include "upnpsettings.h" +#include "upnpcustomlog.h" + +#ifdef _DEBUG +#define KLogFile _L("UPnPStack.txt") +#endif + +// ============================ MEMBER FUNCTIONS =============================== + +// ----------------------------------------------------------------------------- +// CUpnpDispatcher::CUpnpDispatcher +// C++ default constructor can NOT contain any code, that +// might leave. +// ----------------------------------------------------------------------------- +// +CUpnpDispatcher::CUpnpDispatcher( MUpnpDiscoveryObserver* aParent) + : iParent( aParent ) +{ +} + +// ----------------------------------------------------------------------------- +// CUpnpDispatcher::ConstructL +// Symbian 2nd phase constructor can leave. +// ----------------------------------------------------------------------------- +// +void CUpnpDispatcher::ConstructL( ) + { + // LOGSH(iHandle, "Dispatcher::ConstructL"); + + iEngine = CUpnpDispatcherEngine::NewL( *this ); + iUpdateId = 0; + + iEngine->UpdateDevicesL(iUpdateId); + } + +// ----------------------------------------------------------------------------- +// CUpnpDispatcher::NewL +// Two-phased constructor. +// ----------------------------------------------------------------------------- +// +EXPORT_C CUpnpDispatcher* CUpnpDispatcher::NewL( MUpnpDiscoveryObserver* aParent ) +{ + CUpnpDispatcher* self = NewLC( aParent ); + CleanupStack::Pop( self ); + return( self ); +} + +// ----------------------------------------------------------------------------- +// CUpnpDispatcher::NewLC +// Two-phased constructor. +// ----------------------------------------------------------------------------- +// +EXPORT_C CUpnpDispatcher* CUpnpDispatcher::NewLC( MUpnpDiscoveryObserver* aParent ) +{ + CUpnpDispatcher* self = new (ELeave) CUpnpDispatcher( aParent ); + CleanupStack::PushL( self ); + self->ConstructL(); + + if( aParent ) + { + self->StartHttpServerL( EFalse , KRandomPort ); + } + return self; +} + +// ----------------------------------------------------------------------------- +// CUpnpDispatcher::~CUpnpDispatcher +// Destructor. +// ----------------------------------------------------------------------------- +// +EXPORT_C CUpnpDispatcher::~CUpnpDispatcher() +{ + delete iEngine; +} + +// ----------------------------------------------------------------------------- +// CUpnpDispatcher::DeviceListReceivedL +// +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +void CUpnpDispatcher::DeviceListReceivedL(TInt aUpdateId) +{ + //LOGSH( iHandle, "Dispatcher DeviceListReceived"); + UpdateDevicesL(aUpdateId); +} + +// ----------------------------------------------------------------------------- +// CUpnpDispatcher::AddCustomer +// Adds a customer to this Dispatcher. +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +EXPORT_C void CUpnpDispatcher::AddCustomer( const MUpnpDispatcherCustomer& aCustomer ) +{ + //LOGSH( iHandle, "Dispatcher AddCustomer"); + TRAP_IGNORE(AddCustomerL(aCustomer, ETrue )); +} + +// ----------------------------------------------------------------------------- +// CUpnpDispatcher::RemoveCustomer +// Removes a customer from Dispatcher. +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +EXPORT_C void CUpnpDispatcher::RemoveCustomer( const MUpnpDispatcherCustomer& aCustomer ) +{ + RemoveCustomer(aCustomer, ETrue); +} + +// ----------------------------------------------------------------------------- +// CUpnpDispatcher::AddCustomer +// Adds a customer to this Dispatcher. +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +EXPORT_C void CUpnpDispatcher::AddCustomerL( const MUpnpDispatcherCustomer& aCustomer, TBool aIsCP) +{ + //LOGSH( iHandle, "Dispatcher AddCustomer"); + iEngine->AddCustomer( aCustomer ); + if (aIsCP) + { + iEngine->AddControlPointClientL( ); + } +} + +// ----------------------------------------------------------------------------- +// CUpnpDispatcher::RemoveCustomer +// Removes a customer from Dispatcher. +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +EXPORT_C void CUpnpDispatcher::RemoveCustomer( const MUpnpDispatcherCustomer& aCustomer, + TBool aIsCP) +{ + LOGS1("CUpnpDispatcher::RemoveCustomer 0x%x", &aCustomer); + iEngine->RemoveCustomer( aCustomer ); + if ( aIsCP ) + { + TRAP_IGNORE(iEngine->RemoveControlPointClientL( )); + } +} + +// ----------------------------------------------------------------------------- +// CUpnpDispatcher::SendMessageL +// Sends a message using Engine's HTTP server, +// if device is local (third param), used local sending feature, type of message has to be EAction +// ----------------------------------------------------------------------------- +// +EXPORT_C void CUpnpDispatcher::SendMessageL( CUpnpHttpMessage* aMessage, + MUpnpDispatcherCustomer& aCustomer , + TBool /*aIsLocal*/ ) +{ + //LOGSH( iHandle, "Dispatcher SendMessageL"); + + TPtrC8 path(0,0); + if (iParent != NULL) + { + path.Set(iParent->Path()); + } + + + HBufC8* wholePath = HBufC8::NewLC( path.Length() + + 1 + + aCustomer.Path().Length() ); + TPtr8 ptr = wholePath->Des(); + ptr.Append( path ); + ptr.Append( UpnpString::KSlash() ); + ptr.Append( aCustomer.Path() ); + + if ( aMessage ) + { + aMessage->SetSenderPathL( *wholePath ); + iEngine->SendMessageL( aMessage ); + } + + CleanupStack::PopAndDestroy(wholePath); +} + +// ----------------------------------------------------------------------------- +// CUpnpDispatcher::UpdateDevicesL +// +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +EXPORT_C void CUpnpDispatcher::UpdateDevicesL( TInt aNewId ) + { + + //LOGSH( iHandle, "Dispatcher UpdateDevicesL"); + if ( iUpdateId != aNewId ) + { + // Go through the new devices and add them inform + // the Control Point of the new devices? + const RPointerArray& newDevices = iEngine->NewDevices(); + for ( TInt i = 0; i < newDevices.Count(); i++ ) + { + CUpnpDevice* dev = newDevices[i]; + + if ( iParent != NULL ) + { + + if ( dev->Alive() ) + { + iParent->DeviceFoundL( *dev ); + } + else + { + iParent->DeviceLostL( *dev ); + } + } + + } + iEngine->RemoveDevices(); + + iUpdateId = aNewId; + } + } + +// ----------------------------------------------------------------------------- +// CUpnpDispatcher::AddLocalDeviceL +// +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +EXPORT_C void CUpnpDispatcher::AddLocalDeviceL( const TDesC8& aUuid, + const TDesC8& aDeviceType, + const TDesC8& aDescriptionPath, + const CDesC8Array& aServices, + const TBool aIsRootDevice ) +{ + //LOGSH( iHandle, "Dispatcher AddLocalDeviceL"); + iEngine->AddLocalDeviceL( aUuid, aDeviceType, aDescriptionPath, aServices, aIsRootDevice ); +} + +// ----------------------------------------------------------------------------- +// CUpnpDispatcher::RemoveLocalDeviceL +// ----------------------------------------------------------------------------- +// +void CUpnpDispatcher::RemoveLocalDeviceL( const TDesC8& aUuid, TBool aSilent ) +{ + //LOGSH( iHandle, "Dispatcher RemoveLocalDeviceL"); + iEngine->RemoveLocalDeviceL( aUuid, aSilent ); +} + +// ----------------------------------------------------------------------------- +// CUpnpDispatcher::SearchL +// Sends a SSDP search with given string. +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +EXPORT_C void CUpnpDispatcher::SearchL( const TDesC8& aSearchString ) +{ + iEngine->SsdpSearchL( aSearchString ); +} + +// ----------------------------------------------------------------------------- +// CUpnpDispatcher::StopFilteringL +// ----------------------------------------------------------------------------- +// +EXPORT_C void CUpnpDispatcher::StopFilteringL( const TDesC8& aUuids ) +{ + iEngine->SsdpStopFilteringL( aUuids ); +} + +// ----------------------------------------------------------------------------- +// CUpnpDispatcher::SearchL +// +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +EXPORT_C void CUpnpDispatcher::SearchL( const TDesC16& aSearchString ) +{ + //LOGSH( iHandle, "Dispatcher SearchL"); + HBufC8* buf = UpnpString::FromUnicodeL( aSearchString ); + SearchL( *buf ); + delete buf; +} + +// ----------------------------------------------------------------------------- +// CUpnpDispatcher::HttpServerAddressL +// Returns the HTTP servers IP address. +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +EXPORT_C TInetAddr CUpnpDispatcher::HttpServerAddress() + { + return iEngine->HttpServerAddress(); + } + +// ----------------------------------------------------------------------------- +// CUpnpDispatcher::MacAddressL +// Returns the MAC address of HTTP server. +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +const HBufC8* CUpnpDispatcher::MacAddressL() +{ + //LOGSH( iHandle, "Dispatcher MacAddressL"); + return iEngine->MacAddressL(); +} + +// ----------------------------------------------------------------------------- +// CUpnpDispatcher::SetTransactionCreator +// ----------------------------------------------------------------------------- +// +void CUpnpDispatcher::SetTransactionCreator( + MUpnpHttpServerTransactionCreator* aTransactionCreator ) + { + iEngine->SetTransactionCreator( aTransactionCreator ); + } + +// ----------------------------------------------------------------------------- +// CUpnpDispatcher::StartHttpServerL +// ----------------------------------------------------------------------------- +// +EXPORT_C void CUpnpDispatcher::StartHttpServerL( TBool aRegister , const TInt aPort ) + { + iEngine->StartHttpServerL( aRegister , aPort ); + } + +// ----------------------------------------------------------------------------- +// CUpnpDispatcher::StopHttpServerL +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +EXPORT_C void CUpnpDispatcher::StopHttpServer() + { + iEngine->StopHttpServer(); + } + +EXPORT_C void CUpnpDispatcher::StartIPFilteringL( ) + { + #ifdef RD_UPNP_REMOTE_ACCESS + iEngine->HttpServer()->StartIPFilteringL(); + #endif + } + +EXPORT_C void CUpnpDispatcher::StopIPFiltering( ) + { + #ifdef RD_UPNP_REMOTE_ACCESS + iEngine->HttpServer()->StopIPFiltering( ); + #endif + } + +// End of File