--- /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 <e32debug.h>
+#include <w32std.h>
+
+#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<CUpnpContentServer*>(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