loggingservices/eventlogger/LogServ/src/LogServServer.cpp
changeset 0 08ec8eefde2f
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/loggingservices/eventlogger/LogServ/src/LogServServer.cpp	Fri Jan 22 11:06:30 2010 +0200
@@ -0,0 +1,178 @@
+// Copyright (c) 2002-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:
+//
+
+#include "LogServServer.h"
+#include "logservsession.h"
+#include "logservpanic.h"
+#include "LogServShutdownTimer.h"
+#include "LogServDatabaseMarshall.h"
+#include "LogServDatabaseDriver.h"
+#include "LogServBackupManager.h"
+#include "LogServOperationQueue.h"
+#include "LogServResourceInterpreter.h"
+#include "LogServDatabaseChangeTracker.h"
+#include "LogServRecentListManager.h"
+
+
+/////////////////////////////////////////////////////////////////////////////////////////
+// -----> CLogServServer (source)
+/////////////////////////////////////////////////////////////////////////////////////////
+
+CLogServServer::CLogServServer()
+:	CServer2(CActive::EPriorityStandard, ESharableSessions)
+	{
+	}
+
+CLogServServer::~CLogServServer()
+	{
+	LOGTEXT("CLogServServer::~CLogServServer()");
+	TDblQueIter<CSession2> iter(iSessionIter);
+	iter.SetToFirst();
+
+	for (CSession2* session = iter++; session != NULL; session = iter++)
+		{
+		delete session;
+		}
+
+	// Order is important
+	delete iOperationQueue;
+	//
+	delete iDatabaseDriver;
+	delete iChangeTracker;
+	delete iDatabaseMarshall;
+	//
+	delete iRecentListManager;
+	delete iResourceInterpreter;
+	//
+	delete iBackupManager;
+	delete iShutdownTimer;
+	iFsSession.Close();
+
+	LOGTEXT("CLogServServer::~CLogServServer() - end");
+	}
+
+void CLogServServer::ConstructL()
+	{
+	LOGTEXT("CLogServServer::ConstructL() - about to connect to file server");
+	User::LeaveIfError(iFsSession.Connect());
+
+	LOGTEXT("CLogServServer::ConstructL() - about to start server");
+	StartL(KLogServerFullName);
+
+	// Low level objects
+	LOGTEXT("CLogServServer::ConstructL() - about to create shutdown timer");
+	iShutdownTimer = CLogServShutdownTimer::NewL(Priority() + 1);
+
+	LOGTEXT("CLogServServer::ConstructL() - about to create backup manager");
+	iBackupManager = CLogServBackupManager::NewL(Priority());
+
+	LOGTEXT("CLogServServer::ConstructL() - about to create resource interpreter");
+	iResourceInterpreter = CLogServResourceInterpreter::NewL(iFsSession);
+
+	LOGTEXT("CLogServServer::ConstructL() - about to create recent list manager");
+	iRecentListManager = CLogServRecentListManager::NewL(*iResourceInterpreter, R_LOG_RECENT);
+
+	// Medium level objects
+	LOGTEXT("CLogServServer::ConstructL() - about to create database marshall");
+	iDatabaseMarshall = CLogServDatabaseMarshall::NewL(iFsSession, *iResourceInterpreter, *iBackupManager);
+
+	LOGTEXT("CLogServServer::ConstructL() - about to create change tracker");
+	iChangeTracker = CLogServDatabaseChangeTracker::NewL(*iDatabaseMarshall, *iBackupManager, Priority() + 1);
+
+	// Setup the pointer to the change tracker from within the database marshall (since its underlying
+	// mixin provides a means of submitting change events)
+	LOGTEXT("CLogServServer::ConstructL() - about to set change interface for database marshall ");
+	iDatabaseMarshall->SetChangeInterface(*iChangeTracker);
+
+	// These objects are quite high level... i.e. they use the engine objects above
+	LOGTEXT("CLogServServer::ConstructL() - about to create database driver");
+	iDatabaseDriver = CLogServDatabaseDriver::NewL(*iBackupManager, *iDatabaseMarshall, *iResourceInterpreter, *iRecentListManager, Priority() - 1);
+
+	LOGTEXT("CLogServServer::ConstructL() - about to create operation queue");
+	iOperationQueue = CLogServOperationQueue::NewL(*iDatabaseDriver, Priority());
+
+	// Ensure that the server still exits even if the 1st client fails to connect
+	// Only shutdown the server if it's transient - by default it isn't, but keeping
+	// this code here in case this changes
+	if	(iTransient)
+		iShutdownTimer->Start();
+
+	LOGTEXT("CLogServServer::ConstructL() - end");
+	}
+
+CLogServServer* CLogServServer::NewLC()
+	{
+	CLogServServer* self = new(ELeave) CLogServServer;
+	CleanupStack::PushL(self);
+	self->ConstructL();
+	return self;
+	}
+
+/////////////////////////////////////////////////////////////////////////////////////////
+/////////////////////////////////////////////////////////////////////////////////////////
+/////////////////////////////////////////////////////////////////////////////////////////
+
+void CLogServServer::SLOHandleEvent(TLogServSessionId /*aId*/, TLogServSessionEvent aEvent)
+	{
+	switch(aEvent)
+		{
+	case ELogServSessionEventCreated:
+		iShutdownTimer->Cancel();
+		++iSessionCount;
+		break;
+	case ELogServSessionEventDestroyed:
+		// Only shutdown the server if it's transient - by default it isn't
+		if	(--iSessionCount == 0 && iTransient)
+			iShutdownTimer->Start();
+		break;
+		}
+
+	}
+
+/////////////////////////////////////////////////////////////////////////////////////////
+/////////////////////////////////////////////////////////////////////////////////////////
+/////////////////////////////////////////////////////////////////////////////////////////
+CSession2* CLogServServer::NewSessionL(const TVersion& /*aVersion*/,const RMessage2& /*aMessage*/) const
+//
+//	Create a new client session. This should really check the version number.
+//
+	{
+	CLogServServer* self = const_cast<CLogServServer*>(this);
+	const TLogServSessionId sessionId = ++self->iNextFreeSessionId;
+
+	LOGTEXT2("CLogServServer::NewSessionL() - session id is: %d", sessionId);
+	//
+	CLogServSession* session = new(ELeave) CLogServSession(sessionId, 
+												*self,
+												*iBackupManager,
+												*iDatabaseDriver,
+												*iOperationQueue,
+												*iChangeTracker,
+												*iDatabaseMarshall);
+	LOGTEXT("CLogServServer::NewSessionL() - end");
+	return session;
+	}
+
+#ifdef _DEBUG
+void CLogServServer::MakeTransient(TBool aTransient)
+	{
+	iTransient = aTransient;
+	}
+#endif//_DEBUG
+
+/////////////////////////////////////////////////////////////////////////////////////////
+/////////////////////////////////////////////////////////////////////////////////////////
+/////////////////////////////////////////////////////////////////////////////////////////
+