upnpavcontrolpoint/avcpengine/src/upnpavcpengine.cpp
changeset 0 7f85d04be362
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/upnpavcontrolpoint/avcpengine/src/upnpavcpengine.cpp	Thu Dec 17 08:52:00 2009 +0200
@@ -0,0 +1,238 @@
+/** @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:  CUpnpAVCPEngine
+*
+*/
+
+
+// INCLUDE FILES
+#include <e32svr.h>
+#include "upnpavcpengine.h"
+#include "upnpavcpenginesession.h"
+#include "upnpavcpmanager.h"
+#include "upnpavcpenginecommon.h"
+#include "upnpmdebug.h"
+
+// -----------------------------------------------------------------------------
+// CUpnpAVCPEngine::CUpnpAVCPEngine
+// constructor.
+// -----------------------------------------------------------------------------
+//
+CUpnpAVCPEngine::CUpnpAVCPEngine( TInt aPriority )
+    : CServer2( aPriority )
+    {
+    }
+
+// -----------------------------------------------------------------------------
+// CUpnpAVCPEngine::~CUpnpAVCPEngine
+// destructor.
+// -----------------------------------------------------------------------------
+//
+CUpnpAVCPEngine::~CUpnpAVCPEngine()
+    {   
+    delete iAVCPManger;
+    }
+
+// -----------------------------------------------------------------------------
+// CUpnpAVCPEngine::NewLC
+// Two-phased constructor.
+// -----------------------------------------------------------------------------
+//
+CUpnpAVCPEngine* CUpnpAVCPEngine::NewLC()
+    {
+    CUpnpAVCPEngine* engine = new (ELeave) CUpnpAVCPEngine( EPriorityNormal );
+    CleanupStack::PushL( engine );
+    engine->ConstructL() ;
+    return engine;
+    }
+
+// -----------------------------------------------------------------------------
+// CUpnpAVCPEngine::ConstructL
+// Symbian 2nd phase constructor can leave.
+// -----------------------------------------------------------------------------
+//
+void CUpnpAVCPEngine::ConstructL()
+    {
+     DEBUGSTRING(("CUpnpAVCPEngine::ConstructL "));
+    iAVCPManger = CUpnpAVCPManager::NewL();
+    StartL( KAVCPEngineName );
+    }
+
+// -----------------------------------------------------------------------------
+// CUpnpAVCPEngine::NewSessionL
+// Create new session.
+// -----------------------------------------------------------------------------
+//
+CSession2* CUpnpAVCPEngine::NewSessionL( const TVersion& aVersion, const RMessage2& aMessage ) const
+    {
+    // Check it's the right version
+    if ( !User::QueryVersionSupported( TVersion( 
+            KAVCPEngineMajorVersionNumber,
+            KAVCPEngineMinorVersionNumber,
+            KAVCPEngineBuildVersionNumber ),
+            aVersion ) )
+        {
+        User::Leave( KErrNotSupported );
+        }
+
+	RThread client;
+	aMessage.Client(client); 
+    return CUpnpAVCPEngineSession::NewL( client, *const_cast<CUpnpAVCPEngine*> ( this ), *const_cast<CUpnpAVCPManager*> (iAVCPManger) );
+    }
+
+// -----------------------------------------------------------------------------
+// CUpnpAVCPEngine::IncrementSessions
+// Increment sessions.
+// -----------------------------------------------------------------------------
+//
+void CUpnpAVCPEngine::IncrementSessions(CUpnpAVCPEngineSession* /*aObserver*/)
+    {    
+    iSessionCount++;   
+    DEBUGSTRING(("IncrementSessions (%d)", iSessionCount));
+    }
+
+// -----------------------------------------------------------------------------
+// CUpnpAVCPEngine::DecrementSessions
+// Decrement sessions.
+// -----------------------------------------------------------------------------
+//
+void CUpnpAVCPEngine::DecrementSessions( CUpnpAVCPEngineSession* aObserver)
+    {
+    TRAP_IGNORE( iAVCPManger->CleanupSessionL(aObserver) );
+    iSessionCount--; 
+    DEBUGSTRING(("DecrementSessions (%d)", iSessionCount));    
+    if ( iSessionCount <= 0 )
+		{
+		CActiveScheduler::Stop();
+		}
+    }
+
+// -----------------------------------------------------------------------------
+// CUpnpAVCPEngine::RunError
+// RunError is called when RunL leaves.
+// -----------------------------------------------------------------------------
+//
+TInt CUpnpAVCPEngine::RunError( TInt aError )
+    {
+    DEBUGSTRING(("CUpnpAVCPEngine::RunError (%d)", aError));    
+    
+    if ( aError == KErrBadDescriptor )
+        {
+        // A bad descriptor error implies a badly programmed client, so panic it;
+        // otherwise report the error to the client
+        PanicClient( Message(), /*EMessageHandlerBadDescriptor*/EAVCPEngineGenerealPanic );
+        }
+    else
+        {
+        Message().Complete( aError );
+        }
+
+    // The leave will result in an early return from CServer::RunL(), skipping
+    // the call to request another message. So do that now in order to keep the
+    // server running.
+    ReStart();
+
+    return KErrNone;
+    }
+
+// -----------------------------------------------------------------------------
+// CUpnpAVCPEngine::PanicClient
+// Panic client.
+// -----------------------------------------------------------------------------
+//
+void CUpnpAVCPEngine::PanicClient( const RMessage2& aMessage, 
+                                   TAVCPEnginePanic aPanic )
+    {
+    aMessage.Panic( KAVCPEngine, aPanic );
+    }
+
+// -----------------------------------------------------------------------------
+// CUpnpAVCPEngine::PanicServer
+// Panic server.
+// -----------------------------------------------------------------------------
+//
+void CUpnpAVCPEngine::PanicServer( TAVCPEnginePanic aPanic )
+    {
+    User::Panic( KAVCPEngine, aPanic );
+    }
+
+
+// -----------------------------------------------------------------------------
+// CUpnpAVCPEngine::ThreadFunctionL
+// Create and start the server.
+// -----------------------------------------------------------------------------
+//
+void CUpnpAVCPEngine::ThreadFunctionL()
+    {
+    // Construct active scheduler
+    CActiveScheduler* activeScheduler = new (ELeave) CActiveScheduler;
+    CleanupStack::PushL( activeScheduler );
+
+    // Install active scheduler
+    // We don't need to check whether an active scheduler is already installed
+    // as this is a new thread, so there won't be one
+    CActiveScheduler::Install( activeScheduler );
+
+	User::RenameThread( KAVCPEngineName );
+    // Construct our server
+    CUpnpAVCPEngine* engine = CUpnpAVCPEngine::NewLC();    // Anonymous
+
+    RProcess::Rendezvous(KErrNone);
+
+	// Start handling requests
+	CActiveScheduler::Start();	
+
+    CleanupStack::PopAndDestroy( engine );
+	CleanupStack::PopAndDestroy( activeScheduler );
+
+    }
+
+// -----------------------------------------------------------------------------
+// CUpnpAVCPEngine::ThreadFunctionL
+// Create and start the server.
+// -----------------------------------------------------------------------------
+//
+TInt CUpnpAVCPEngine::ThreadFunction( TAny* /*aNone*/ )
+    {
+    __UHEAP_MARK;
+    
+    CTrapCleanup* cleanupStack = CTrapCleanup::New();
+    if ( !(cleanupStack) )
+        {
+        PanicServer( EAVCPEngineGenerealPanic );
+        }
+
+    TRAPD( err, ThreadFunctionL() );
+    if ( err != KErrNone )
+        {
+        PanicServer( EAVCPEngineGenerealPanic );
+        }
+
+    delete cleanupStack;
+    cleanupStack = NULL;
+
+    __UHEAP_MARKEND;
+
+    return KErrNone;
+    }
+
+
+// ============================= LOCAL FUNCTIONS ===============================
+
+TInt E32Main()
+    {
+	return CUpnpAVCPEngine::ThreadFunction(NULL);
+    }
+
+// End of File