sysstatemgmt/systemstarter/amastartsrc/amastartsrv.cpp
changeset 0 4e1aa6a622a0
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sysstatemgmt/systemstarter/amastartsrc/amastartsrv.cpp	Tue Feb 02 00:53:00 2010 +0200
@@ -0,0 +1,262 @@
+// Copyright (c) 2007-2009 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:
+//
+
+/**
+ @file
+*/
+
+#include <e32debug.h>
+
+#include "amastartsrv.h"
+
+
+
+/**
+ * Used to create a new CAmaStartServer
+ * @return A pointer to the CAmaStartServer
+ * @leave One of the system-wide error codes if construction fails.
+ */
+EXPORT_C CAmaStartServer* CAmaStartServer::NewLC()
+	{
+	DEBUGPRINT1A( ">CAmaStartServer::NewLC" );
+	CAmaStartServer* self = new(ELeave) CAmaStartServer();	
+	CleanupStack::PushL( self );
+	self->ConstructL();
+	DEBUGPRINT1A( "CAmaStartServer::NewLC>" );
+	return self;	
+	}
+
+
+
+/**
+ * Static function used to create and start CAmaStartServer
+ * 
+ * @return KErrAlreadyExists if the server is already running
+ */
+EXPORT_C TInt CAmaStartServer::StartAmaStartSrv()
+	{
+	DEBUGPRINT1A( ">CAmaStartServer::StartAmaStartSrv" );
+	
+	const TInt KAmaStartSrvMinHeapSize = 0x2000;
+	const TInt KAmaStartSrvMaxHeapSize = 10 * KAmaStartSrvMinHeapSize;
+	RThread srvThread;
+
+	TInt err = srvThread.Create( KAmaStartSrvName, &CAmaStartServer::AmaStartSrvThreadFn, 
+								 KDefaultStackSize, KAmaStartSrvMinHeapSize, KAmaStartSrvMaxHeapSize, 
+								 NULL, EOwnerProcess );
+
+	if( KErrNone == err )
+		{
+		TRequestStatus trs;
+		srvThread.Rendezvous( trs );
+		if ( trs != KRequestPending)
+			{
+			srvThread.Kill(trs.Int());
+			srvThread.Close();
+			DEBUGPRINT1A( "CAmaStartServer::StartAmaStartSrv> (Not Request pending)" );
+			return trs.Int();
+			}
+		srvThread.Resume();
+		User::WaitForRequest( trs );
+		srvThread.Close();
+		err = trs.Int();
+		}
+
+	DEBUGPRINT1A( "CAmaStartServer::StartAmaStartSrv>" );
+	return err;
+	}
+
+
+
+CAmaStartServer::~CAmaStartServer()
+	{
+	DEBUGPRINT1A( ">CAmaStartServer::~CAmaStartServer" );
+	TInt i = 0;
+	TInt count = iSessionInfoArray.Count();
+	for(; i < count; i++ )
+		{
+		delete iSessionInfoArray[ i ].iStarter;
+		iSessionInfoArray[ i ].iStarter = NULL;
+		}
+	iSessionInfoArray.Close();
+	DEBUGPRINT1A( "CAmaStartServer::~CAmaStartServer>" );
+	}
+
+
+
+void CAmaStartServer::StartDscL( const TUid& aDscId, const RMessage2& aMessage, const TInt aSessionIndex )
+	{
+	DEBUGPRINT1A( ">CAmaStartServer::StartDscL" );
+	
+	if( !__IN_RANGE(aSessionIndex, iSessionInfoArray.Count()) )
+		{
+		User::Leave( KErrArgument );
+		}
+	iSessionInfoArray[ aSessionIndex ].iStarter = CAmaStartAsync::NewL( aMessage );
+	iSessionInfoArray[ aSessionIndex ].iMessagePtr = aMessage;
+	iSessionInfoArray[ aSessionIndex ].iStarter->StartL( aDscId );
+	
+	DEBUGPRINT1A( "CAmaStartServer::StartDscL>" );
+	}
+
+
+
+/**
+ * Locate the CommandListExecutor associated with the session calling CommandListCancel.
+ * Delete the Command list (which cancels its AO) then complete the client's RMessage with KErrCancel.
+ */
+void CAmaStartServer::StartDscCancel( const TInt aSessionIndex )
+	{
+	DEBUGPRINT1A( ">CAmaStartServer::StartDscCancel" );
+	__ASSERT_DEBUG( __IN_RANGE( aSessionIndex, iSessionInfoArray.Count()), User::Panic( KAmaStartSrvBadIdx, KAmaStartSrvArrayIndexInvalid ) );
+
+	iSessionInfoArray[ aSessionIndex ].iStarter->Cancel();
+	
+	DEBUGPRINT1A( "CAmaStartServer::StartDscCancel>" );
+	}
+	
+
+
+/**
+ * Iterate through iSessionInfoArray to find an unused array element
+ * If found, use it. Otherwise, Append() a new TAmaStartSessionInfo.
+ * Called during CSession construction.
+ */
+void CAmaStartServer::RegisterSessionL( TInt& aSessionIndex )
+	{
+	DEBUGPRINT1A( ">CAmaStartServer::RegisterSessionL" );
+	
+	TInt i = 0;
+	TInt count = iSessionInfoArray.Count();
+	TBool slotFound = EFalse;
+	
+	for(; i < count; i++ )
+		{
+		if( iSessionInfoArray[ i ].iInUse )
+			{
+			continue;
+			}
+		else
+			{
+			iSessionInfoArray[ i ].iInUse = ETrue;
+			iSessionInfoArray[ i ].iStarter = NULL;
+			aSessionIndex = i;
+			slotFound = ETrue;
+			iSessionCount++;
+			break;
+			}
+		}
+	
+	if( !slotFound )
+		{
+		TAmaStartSessionInfo sessionInfo;
+		sessionInfo.iStarter = NULL;
+		sessionInfo.iInUse = ETrue;
+		iSessionInfoArray.AppendL( sessionInfo );
+		aSessionIndex = iSessionCount++;
+		}
+	
+	DEBUGPRINT2A( "Registered in slot %d", aSessionIndex );
+	DEBUGPRINT1A( "CAmaStartServer::RegisterSessionL>" );
+	}
+
+
+
+/**
+ * Called from CSession destructor.
+ */
+void CAmaStartServer::DeregisterSession( const TInt& aSessionIndex )
+	{
+	DEBUGPRINT1A( ">CAmaStartServer::DeregisterSession" );
+	__ASSERT_DEBUG( __IN_RANGE(aSessionIndex, iSessionInfoArray.Count()), User::Panic(KAmaStartSrvBadIdx, KAmaStartSrvArrayIndexInvalid) );
+	
+	if( iSessionInfoArray[ aSessionIndex ].iStarter )
+		{
+		delete iSessionInfoArray[ aSessionIndex ].iStarter;
+		iSessionInfoArray[ aSessionIndex ].iStarter = NULL;
+		}
+	iSessionInfoArray[ aSessionIndex ].iInUse = EFalse;
+	iSessionCount--;
+	
+	DEBUGPRINT2A( "De-registered slot %d", aSessionIndex );
+	DEBUGPRINT1A( "CAmaStartServer::DeregisterSession>" );
+	}
+
+
+
+/**
+ * Used to create a new server-side session.
+ * @return A pointer to the new instance of CSession2.
+ * @leave KErrNotSupported if versions are incompatible.
+ */
+EXPORT_C CSession2* CAmaStartServer::NewSessionL( const TVersion& aVersion, const RMessage2& /*aMessage*/ ) const
+	{
+	DEBUGPRINT1A( ">CAmaStartServer::NewSessionL" );
+    CAmaStartServer& mutatedSelf = MUTABLE_CAST( CAmaStartServer&, *this );
+	if( !User::QueryVersionSupported(iVersion, aVersion) )
+		{
+		User::Leave( KErrNotSupported );
+		}
+	DEBUGPRINT1A( "CAmaStartServer::NewSessionL>" );
+	return CAmaStartSession::NewL( mutatedSelf ); 
+	}
+
+
+
+CAmaStartServer::CAmaStartServer()
+: CServer2( EPriorityHigh, EUnsharableSessions ),
+  iVersion( KAmaStartSrvVersionMajor, KAmaStartSrvVersionMinor, KAmaStartSrvVersionBuild )
+	{
+	DEBUGPRINT1A( ">CAmaStartServer::CAmaStartServer> (Empty constructor)" );
+	}
+	
+	
+	
+void CAmaStartServer::ConstructL()
+	{
+	DEBUGPRINT1A( ">CAmaStartServer::ConstructL" );
+	StartL( KAmaStartSrvName );
+	// The starting thread is signalled in the thread function.
+	DEBUGPRINT1A( "CAmaStartServer::ConstructL>" );
+	}
+	
+
+// Static functions
+	
+TInt CAmaStartServer::AmaStartSrvThreadFn( TAny* /*aAny*/ )
+	{
+	DEBUGPRINT1A( ">CAmaStartServer::AmaStartSrvThreadFn" );
+    CTrapCleanup* cleanup = CTrapCleanup::New();
+    TRAPD( err, AmaStartSrvThreadRunL() ); 
+    delete cleanup;
+    DEBUGPRINT1A( "CAmaStartServer::AmaStartSrvThreadFn>" );
+    return err;
+	}
+
+
+
+void CAmaStartServer::AmaStartSrvThreadRunL()
+	{
+	DEBUGPRINT1A( ">CAmaStartServer::AmaStartSrvThreadRunL" );
+    CActiveScheduler* sched = new(ELeave) CActiveScheduler();
+    CleanupStack::PushL( sched );
+    CActiveScheduler::Install( sched );
+    CAmaStartServer* amaStartSrv = CAmaStartServer::NewLC();
+    RThread::Rendezvous( KErrNone );
+    CActiveScheduler::Start();
+
+    CleanupStack::PopAndDestroy( 2, sched );
+    DEBUGPRINT1A( "CAmaStartServer::AmaStartSrvThreadRunL>" );
+	} //lint !e529 not subsequently referenced (amaStartSrv)