diff -r 000000000000 -r 7f85d04be362 upnpsharing/upnpcontentserver/src/upnpcontentserver.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/upnpsharing/upnpcontentserver/src/upnpcontentserver.cpp Thu Dec 17 08:52:00 2009 +0200 @@ -0,0 +1,394 @@ +/* +* Copyright (c) 2006-2007 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: CUpnpContentServer class implamentation + * +*/ + + + + + +#include +#include + +#include "upnpcontentserver.h" +#include "upnpcontentserversession.h" +#include "upnpcontentserverdefs.h" +#include "upnpcontentserverhandler.h" +#include "upnpperiodic.h" + +_LIT( KComponentLogfile, "contentserver.txt"); +#include "upnplog.h" + +// CONSTANTS +_LIT( KUpnpContentServerString, "Upnp content server"); + +using namespace UpnpContentServer; + +// -------------------------------------------------------------------------- +// Server's policy +// -------------------------------------------------------------------------- + +//Total number of ranges +static const TUint KContentServerRangeCount = 1; + +//Definition of the ranges of IPC numbers +static const TInt contentServerRanges[KContentServerRangeCount] = + { + 0 + }; + +//Policy to implement for each of the above ranges +static const TUint8 contentServerElementsIndex[KContentServerRangeCount] = + { + 0, //applies to 0th range + }; + +//Specific capability checks +static const CPolicyServer::TPolicyElement contentServerElements[] = + { + {_INIT_SECURITY_POLICY_C3(ECapabilityReadUserData, + ECapabilityWriteUserData, + ECapabilityNetworkServices), + CPolicyServer::EFailClient} + //policy "0", + //fail call if all capabilities not present + }; + +//Package all the above together into a policy +static const CPolicyServer::TPolicy KUpnpContentServerPolicy = + { + CPolicyServer::EAlwaysPass, //all connect attempts should pass + KContentServerRangeCount, + contentServerRanges, + contentServerElementsIndex, + contentServerElements + }; + +// -------------------------------------------------------------------------- +// E32Main +// main function called by E32 +// -------------------------------------------------------------------------- +// +GLDEF_C TInt E32Main() + { + TRAPD( ret, CUpnpContentServer::LaunchServerL() ); + return ret; + } + +// -------------------------------------------------------------------------- +// CUpnpContentServer::LaunchServer +// Initializes the process and creates an instance of CUpnpContentServer. +// -------------------------------------------------------------------------- +// +TInt CUpnpContentServer::LaunchServerL() + { + __LOG8_1( "%s begin.", __PRETTY_FUNCTION__ ); + // Check server not already started + TFindServer findHostServer( KUpnpContentServer ); + + TInt err( KErrNone ); + TFullName name; + if ( findHostServer.Next(name) == KErrNone ) + { // found server already + __LOG1( "Error: %d", __LINE__ ); + err = KErrGeneral; + } + if ( !err ) + { + User::RenameThread( KUpnpContentServer ); + + // Create cleanup stack. + CTrapCleanup* cleanup = CTrapCleanup::New(); + + // Construct and install active scheduler. + CActiveScheduler* scheduler = new (ELeave) CActiveScheduler; + CActiveScheduler::Install( scheduler ); + + // Construct server. + CUpnpContentServer* server = NULL; + TRAPD( err, server = CUpnpContentServer::NewL() ); + if ( err ) + { + __LOG1( "Error: %d", err ); + } + RProcess::Rendezvous( err ); + + __LOG("CUpnpContentServer::LaunchServer, Start CActiveScheduler"); + // Start handling requests. + CActiveScheduler::Start(); + + delete server; + __LOG("CUpnpContentServer::LaunchServer, Server deleted."); + delete scheduler; + delete cleanup; + } + __LOG8_1( "%s end.", __PRETTY_FUNCTION__ ); + return err; + } + +// -------------------------------------------------------------------------- +// CUpnpContentServer::NewL +// 2-phased constructor. +// -------------------------------------------------------------------------- +// +CUpnpContentServer* CUpnpContentServer::NewL() + { + __LOG8_1( "%s begin.", __PRETTY_FUNCTION__ ); + CUpnpContentServer* self = new (ELeave) CUpnpContentServer(); + CleanupStack::PushL(self); + self->ConstructL(); + self->StartL( KUpnpContentServer ); + CleanupStack::Pop(); // self + __LOG8_1( "%s end.", __PRETTY_FUNCTION__ ); + return self; + } + +// -------------------------------------------------------------------------- +// CUpnpContentServer::CUpnpContentServer() +// C++ constructor. +// -------------------------------------------------------------------------- +// +CUpnpContentServer::CUpnpContentServer() + : CPolicyServer( EPriorityStandard, KUpnpContentServerPolicy, + ESharableSessions ) + { + } + +// -------------------------------------------------------------------------- +// CUpnpContentServer::ConstructL +// 2nd phase constructor. +// -------------------------------------------------------------------------- +// +void CUpnpContentServer::ConstructL() + { + iHandler = CUpnpContentServerHandler::NewL( this ); + } + +// -------------------------------------------------------------------------- +// CUpnpContentServer::~CUpnpContentServer() +// C++ destructor. +// -------------------------------------------------------------------------- +// +CUpnpContentServer::~CUpnpContentServer() + { + delete iHandler; + delete iContainerIndex; + delete iConMon; + delete iIdle; + } + +// -------------------------------------------------------------------------- +// CUpnpContentServer::Handler +// Returns pointer to CUpnpContentServerHandler +// -------------------------------------------------------------------------- +// +CUpnpContentServerHandler* CUpnpContentServer::Handler() const + { + return iHandler; + } + + +// -------------------------------------------------------------------------- +// CUpnpContentServer::NewContainerL +// Deletes objcet container +// -------------------------------------------------------------------------- +// +void CUpnpContentServer::RemoveSession( ) + { + __LOG8_1( "%s begin.", __PRETTY_FUNCTION__ ); + iSessionCount--; + __LOG8_1( "%s end.", __PRETTY_FUNCTION__ ); + } + +// -------------------------------------------------------------------------- +// CUpnpContentServer::NewContainerL +// Deletes objcet container +// -------------------------------------------------------------------------- +// +void CUpnpContentServer::AddSession() + { + __LOG8_1( "%s begin.", __PRETTY_FUNCTION__ ); + iSessionCount++; + __LOG8_1( "%s end.", __PRETTY_FUNCTION__ ); + } + +// -------------------------------------------------------------------------- +// CUpnpContentServer::CanStop +// ( other items are commented in header ) +// -------------------------------------------------------------------------- +// +TBool CUpnpContentServer::CanStop() const + { + __LOG8_1( "%s begin.", __PRETTY_FUNCTION__ ); + TBool ret( EFalse ); + if ( iSessionCount < 1 && !iConMon ) + { + ret = ETrue; + } + __LOG8_1( "%s end.", __PRETTY_FUNCTION__ ); + return ret; + } + +// -------------------------------------------------------------------------- +// CUpnpContentServer::Stop +// ( other items are commented in header ) +// -------------------------------------------------------------------------- +// +void CUpnpContentServer::Stop() + { + __LOG8_1( "%s begin.", __PRETTY_FUNCTION__ ); + if ( iIdle ) + { + iIdle->Cancel(); + } + else + { + TRAPD( err, iIdle = CUPnPPeriodic::NewL( CActive::EPriorityIdle ) ); + __ASSERT( err == KErrNone, __FILE__, __LINE__ ); + } + + iIdle->Start( KShutdownTimeout, + KShutdownTimeout, + TCallBack( Shutdown, this ) ); + __LOG8_1( "%s end.", __PRETTY_FUNCTION__ ); + } + +// -------------------------------------------------------------------------- +// CUpnpContentServer::Shutdown +// ( other items are commented in header ) +// -------------------------------------------------------------------------- +// +TInt CUpnpContentServer::Shutdown( TAny* aPtr ) + { + __LOG8_1( "%s begin.", __PRETTY_FUNCTION__ ); + CUpnpContentServer* server = static_cast(aPtr); + delete server->iIdle; + server->iIdle = NULL; + CActiveScheduler::Stop(); + __LOG8_1( "%s end.", __PRETTY_FUNCTION__ ); + return KErrNone; + } + +// -------------------------------------------------------------------------- +// CUpnpContentServer::RequestConnectionLostL +// ( other items are commented in header ) +// -------------------------------------------------------------------------- +// +TInt CUpnpContentServer::RequestConnectionLostL( + const TInt aIapId ) + { + __LOG8_1( "%s begin.", __PRETTY_FUNCTION__ ); + if ( iHandler ) + { + iHandler->ValidateDefaultContainersL(); + } + TInt err( KErrNone ); + if ( !iConMon ) + { + iConMon = CUPnPConnectionMonitor::NewL( *this, aIapId ); + iActiveIapId = aIapId; + } + else if ( iActiveIapId != aIapId ) + { + err = KErrInUse; + } + + __LOG8_1( "%s end.", __PRETTY_FUNCTION__ ); + return err; + } + +// -------------------------------------------------------------------------- +// CUpnpContentServer::CancelConnectionLostL +// ( other items are commented in header ) +// -------------------------------------------------------------------------- +// +void CUpnpContentServer::CancelConnectionLostL() + { + __LOG8_1( "%s begin.", __PRETTY_FUNCTION__ ); + // Stop connection monitoring + delete iConMon; + iConMon = NULL; + + __LOG8_1( "%s end.", __PRETTY_FUNCTION__ ); + } + +// -------------------------------------------------------------------------- +// CUpnpContentServer::ConnectionLost +// ( other items are commented in header ) +// -------------------------------------------------------------------------- +// +void CUpnpContentServer::ConnectionLost() + { + __LOG8_1( "%s begin.", __PRETTY_FUNCTION__ ); + + TRAP_IGNORE( iHandler->ConnectionLostL() ); + + __LOG8_1( "%s end.", __PRETTY_FUNCTION__ ); + } + +// -------------------------------------------------------------------------- +// CUpnpContentServer::RunError +// ( other items are commented in header ) +// -------------------------------------------------------------------------- +// +TInt CUpnpContentServer::RunError( TInt aError ) + { + __LOG8_1( "%s begin.", __PRETTY_FUNCTION__ ); + if ( aError ) + { + __LOG1( "Error: %d", aError ); + } + if ( aError == KErrBadDescriptor ) + { + Message().Panic( KUpnpContentServerString, aError ); + } + else + { + Message().Complete( aError ); + } + ReStart(); + __LOG8_1( "%s end.", __PRETTY_FUNCTION__ ); + return KErrNone; + } + +// -------------------------------------------------------------------------- +// CUpnpContentServer::NewSessionL +// from CServer2, creates a new session. +// -------------------------------------------------------------------------- +// +CSession2* CUpnpContentServer::NewSessionL( + const TVersion& aVersion, + const RMessage2& /*aMessage*/ ) const + { + __LOG8_1( "%s begin.", __PRETTY_FUNCTION__ ); + + if ( iIdle ) + { + iIdle->Cancel(); + } + + TVersion v( KUpnpContentServerVersionMajor, + KUpnpContentServerVersionMinor, + 0 ); + if( !User::QueryVersionSupported(v,aVersion) ) + { + User::Leave(KErrNotSupported); + } + + __LOG8_1( "%s end.", __PRETTY_FUNCTION__ ); + return CUpnpContentServerSession::NewL( (CUpnpContentServer*)this ); + } + +// End of file