devicediagnosticsfw/diagresultsdb/server/src/diagresultsdbserver.cpp
changeset 0 b497e44ab2fc
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/devicediagnosticsfw/diagresultsdb/server/src/diagresultsdbserver.cpp	Thu Dec 17 09:07:52 2009 +0200
@@ -0,0 +1,245 @@
+/*
+* Copyright (c) 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:  Class definition of 
+*
+*/
+
+
+#include "diagresultsdatabasecommon.h"
+#include "diagresultsdbserver.h"
+#include "diagresultsdbsession.h"
+
+#include <e32base.h>
+#include <e32uid.h>
+
+//Enter any new accepted UIDs here.
+const TInt KAcceptedUids[] = 
+    { 
+    0x2000B0E8, //Phone Doctor
+    0x2000E542, //Diagnostics application
+    0x102073E4,    // STIF
+#if defined( _DEBUG ) || defined( __WINSCW__ )
+    0x10282CDA,   //Results DB test app
+    0x20000FB1,   //EUnitAppEnv
+    0x20000FB2,   //EUnitEikApp
+    0x20000FB3,   //EUnitExeEnv
+    0xED80F513,   // DiagFramework Test app
+#endif // _DEBUG || __WINSCW__
+    0x2000F8E8    // donno
+    };
+
+const TInt KAcceptedUidCount = sizeof( KAcceptedUids ) / sizeof( TInt );
+
+// ---------------------------------------------------------------------------
+// Constructor.
+// ---------------------------------------------------------------------------
+//  
+CDiagResultsDbServer::CDiagResultsDbServer(TInt aPriority, 
+                                            const TPolicy &aPolicy)
+: CPolicyServer(aPriority, aPolicy), iContainerIndex( NULL ), iSessionCount(0)
+	{
+	}
+
+// ---------------------------------------------------------------------------
+// Destructor.
+// ---------------------------------------------------------------------------
+//  
+CDiagResultsDbServer::~CDiagResultsDbServer()
+	{
+	delete iContainerIndex;
+	}
+
+// ---------------------------------------------------------------------------
+// NewLC.
+// ---------------------------------------------------------------------------
+//  
+void CDiagResultsDbServer::NewLC(const TPolicy &aPolicy)
+	{
+	CDiagResultsDbServer *pS = new CDiagResultsDbServer( 
+	                                        CActive::EPriorityHigh, aPolicy );
+	CleanupStack::PushL( pS ); 
+	pS->StartL( KDiagResultsDatabaseServerName );
+	pS->ConstructL();
+	}
+
+// ---------------------------------------------------------------------------
+// ConstructL.
+// ---------------------------------------------------------------------------
+// 
+void CDiagResultsDbServer::ConstructL()
+	{
+	iContainerIndex = CObjectConIx::NewL();
+	}
+
+
+// ---------------------------------------------------------------------------
+// Create a new server session.
+// ---------------------------------------------------------------------------
+// 
+CSession2 *CDiagResultsDbServer::NewSessionL(const TVersion &aVersion, 
+                                        const RMessage2 &/*aMessage*/) const
+	{
+	// check we're the right version
+	TVersion v(KDiagResultsDatabaseServerMajor, KDiagResultsDatabaseServerMinor, 
+	                                            KDiagResultsDatabaseServerBuild);
+	if( !User::QueryVersionSupported( v, aVersion ) )
+		User::Leave( KErrNotSupported );
+	// make new session
+	return CDiagResultsDbSession::NewL((CDiagResultsDbServer*)this);
+	}
+
+// ---------------------------------------------------------------------------
+// Create new object container.
+// ---------------------------------------------------------------------------
+//
+CPolicyServer::TCustomResult CDiagResultsDbServer::CustomSecurityCheckL(
+                        const RMessage2 &aMsg, 
+                        TInt &/*aAction*/, 
+                        TSecurityInfo &/*aMissing*/)
+	{
+	CPolicyServer::TCustomResult result = EFail;
+	TInt sid = aMsg.SecureId();
+
+    for ( TInt i = 0; i < KAcceptedUidCount; ++i )
+        {
+        if ( sid == KAcceptedUids[i] )
+            {
+            if ( aMsg.HasCapability( ECapabilityReadDeviceData ) &&
+	             aMsg.HasCapability( ECapabilityWriteDeviceData ) )
+	            {
+	            result = EPass;   
+	            break; 
+	            }    
+            }
+        }
+	    
+	return result;
+	}
+
+// ---------------------------------------------------------------------------
+// Create new object container.
+// ---------------------------------------------------------------------------
+//
+CObjectCon* CDiagResultsDbServer::NewContainerL()
+	{
+	return iContainerIndex->CreateL();
+	}
+	
+
+// ---------------------------------------------------------------------------
+// Remove object from a container index,
+// ---------------------------------------------------------------------------
+// 
+void CDiagResultsDbServer::RemoveContainer(CObjectCon* aCon)
+	{
+	iContainerIndex->Remove( aCon );
+	}	
+
+// ---------------------------------------------------------------------------
+// Return the total amount of client sessions.
+// ---------------------------------------------------------------------------
+// 	
+TInt CDiagResultsDbServer::SessionCount()
+	{
+	return iSessionCount;
+	}
+
+// ---------------------------------------------------------------------------
+// Decrease session count when one client leaves and stop server if there are
+// no more clients.
+// ---------------------------------------------------------------------------
+// 
+void CDiagResultsDbServer::DecreaseSessionCount()
+	{
+	iSessionCount--;
+	if (iSessionCount == 0)
+		{
+		CActiveScheduler::Stop();
+		}
+	}
+
+// ---------------------------------------------------------------------------
+// One new session created.
+// ---------------------------------------------------------------------------
+// 	
+void CDiagResultsDbServer::IncreaseSessionCount()
+	{
+	iSessionCount++;
+	}		
+    
+// ---------------------------------------------------------------------------
+// Create cleanupStack and call RunserverL.
+// ---------------------------------------------------------------------------
+// 
+TInt CDiagResultsDbServer::RunServer()
+	{
+	__UHEAP_MARK;
+	//
+	CTrapCleanup* cleanup = CTrapCleanup::New();
+	TInt ret = KErrNoMemory;
+	if( cleanup )
+		{
+		TRAP( ret, CDiagResultsDbServer::RunServerL() );
+		delete cleanup;
+		}
+	//
+	__UHEAP_MARKEND;
+	if( ret != KErrNone )
+		{
+		// Signal the client that server creation failed
+		RProcess::Rendezvous( ret );
+		}
+	return ret;
+	}
+
+// ---------------------------------------------------------------------------
+// Create active scheduler and run server.
+// ---------------------------------------------------------------------------
+// 
+void CDiagResultsDbServer::RunServerL()
+	{
+	User::RenameThread(KDiagResultsDatabaseServerName);
+	
+	// Create and install the active scheduler we need
+	CActiveScheduler *as=new (ELeave)CActiveScheduler;
+	CleanupStack::PushL( as );
+	CActiveScheduler::Install(as);
+
+	// Create server
+	CDiagResultsDbServer::NewLC(policy);
+
+	// Initialisation complete, now signal the client
+
+	RProcess::Rendezvous(KErrNone);
+
+	// Ready to run
+	CActiveScheduler::Start();
+
+	// Cleanup the server and scheduler
+	CleanupStack::PopAndDestroy(2, as);
+	}
+
+
+// ---------------------------------------------------------------------------
+// Main function that is called when server(.EXE) is launched.
+// ---------------------------------------------------------------------------
+// 
+TInt E32Main()
+	{
+	TInt error(KErrNone);
+	error = CDiagResultsDbServer::RunServer();
+	return error;
+	}
+
+