os/persistentdata/loggingservices/eventlogger/LogServ/src/LogServServer.cpp
author sl@SLION-WIN7.fritz.box
Fri, 15 Jun 2012 03:10:57 +0200
changeset 0 bde4ae8d615e
permissions -rw-r--r--
First public contribution.
     1 // Copyright (c) 2002-2009 Nokia Corporation and/or its subsidiary(-ies).
     2 // All rights reserved.
     3 // This component and the accompanying materials are made available
     4 // under the terms of "Eclipse Public License v1.0"
     5 // which accompanies this distribution, and is available
     6 // at the URL "http://www.eclipse.org/legal/epl-v10.html".
     7 //
     8 // Initial Contributors:
     9 // Nokia Corporation - initial contribution.
    10 //
    11 // Contributors:
    12 //
    13 // Description:
    14 //
    15 
    16 #include "LogServServer.h"
    17 #include "logservsession.h"
    18 #include "logservpanic.h"
    19 #include "LogServShutdownTimer.h"
    20 #include "LogServDatabaseMarshall.h"
    21 #include "LogServDatabaseDriver.h"
    22 #include "LogServBackupManager.h"
    23 #include "LogServOperationQueue.h"
    24 #include "LogServResourceInterpreter.h"
    25 #include "LogServDatabaseChangeTracker.h"
    26 #include "LogServRecentListManager.h"
    27 
    28 
    29 /////////////////////////////////////////////////////////////////////////////////////////
    30 // -----> CLogServServer (source)
    31 /////////////////////////////////////////////////////////////////////////////////////////
    32 
    33 CLogServServer::CLogServServer()
    34 :	CServer2(CActive::EPriorityStandard, ESharableSessions)
    35 	{
    36 	}
    37 
    38 CLogServServer::~CLogServServer()
    39 	{
    40 	LOGTEXT("CLogServServer::~CLogServServer()");
    41 	TDblQueIter<CSession2> iter(iSessionIter);
    42 	iter.SetToFirst();
    43 
    44 	for (CSession2* session = iter++; session != NULL; session = iter++)
    45 		{
    46 		delete session;
    47 		}
    48 
    49 	// Order is important
    50 	delete iOperationQueue;
    51 	//
    52 	delete iDatabaseDriver;
    53 	delete iChangeTracker;
    54 	delete iDatabaseMarshall;
    55 	//
    56 	delete iRecentListManager;
    57 	delete iResourceInterpreter;
    58 	//
    59 	delete iBackupManager;
    60 	delete iShutdownTimer;
    61 	iFsSession.Close();
    62 
    63 	LOGTEXT("CLogServServer::~CLogServServer() - end");
    64 	}
    65 
    66 void CLogServServer::ConstructL()
    67 	{
    68 	LOGTEXT("CLogServServer::ConstructL() - about to connect to file server");
    69 	User::LeaveIfError(iFsSession.Connect());
    70 
    71 	LOGTEXT("CLogServServer::ConstructL() - about to start server");
    72 	StartL(KLogServerFullName);
    73 
    74 	// Low level objects
    75 	LOGTEXT("CLogServServer::ConstructL() - about to create shutdown timer");
    76 	iShutdownTimer = CLogServShutdownTimer::NewL(Priority() + 1);
    77 
    78 	LOGTEXT("CLogServServer::ConstructL() - about to create backup manager");
    79 	iBackupManager = CLogServBackupManager::NewL(Priority());
    80 
    81 	LOGTEXT("CLogServServer::ConstructL() - about to create resource interpreter");
    82 	iResourceInterpreter = CLogServResourceInterpreter::NewL(iFsSession);
    83 
    84 	LOGTEXT("CLogServServer::ConstructL() - about to create recent list manager");
    85 	iRecentListManager = CLogServRecentListManager::NewL(*iResourceInterpreter, R_LOG_RECENT);
    86 
    87 	// Medium level objects
    88 	LOGTEXT("CLogServServer::ConstructL() - about to create database marshall");
    89 	iDatabaseMarshall = CLogServDatabaseMarshall::NewL(iFsSession, *iResourceInterpreter, *iBackupManager);
    90 
    91 	LOGTEXT("CLogServServer::ConstructL() - about to create change tracker");
    92 	iChangeTracker = CLogServDatabaseChangeTracker::NewL(*iDatabaseMarshall, *iBackupManager, Priority() + 1);
    93 
    94 	// Setup the pointer to the change tracker from within the database marshall (since its underlying
    95 	// mixin provides a means of submitting change events)
    96 	LOGTEXT("CLogServServer::ConstructL() - about to set change interface for database marshall ");
    97 	iDatabaseMarshall->SetChangeInterface(*iChangeTracker);
    98 
    99 	// These objects are quite high level... i.e. they use the engine objects above
   100 	LOGTEXT("CLogServServer::ConstructL() - about to create database driver");
   101 	iDatabaseDriver = CLogServDatabaseDriver::NewL(*iBackupManager, *iDatabaseMarshall, *iResourceInterpreter, *iRecentListManager, Priority() - 1);
   102 
   103 	LOGTEXT("CLogServServer::ConstructL() - about to create operation queue");
   104 	iOperationQueue = CLogServOperationQueue::NewL(*iDatabaseDriver, Priority());
   105 
   106 	// Ensure that the server still exits even if the 1st client fails to connect
   107 	// Only shutdown the server if it's transient - by default it isn't, but keeping
   108 	// this code here in case this changes
   109 	if	(iTransient)
   110 		iShutdownTimer->Start();
   111 
   112 	LOGTEXT("CLogServServer::ConstructL() - end");
   113 	}
   114 
   115 CLogServServer* CLogServServer::NewLC()
   116 	{
   117 	CLogServServer* self = new(ELeave) CLogServServer;
   118 	CleanupStack::PushL(self);
   119 	self->ConstructL();
   120 	return self;
   121 	}
   122 
   123 /////////////////////////////////////////////////////////////////////////////////////////
   124 /////////////////////////////////////////////////////////////////////////////////////////
   125 /////////////////////////////////////////////////////////////////////////////////////////
   126 
   127 void CLogServServer::SLOHandleEvent(TLogServSessionId /*aId*/, TLogServSessionEvent aEvent)
   128 	{
   129 	switch(aEvent)
   130 		{
   131 	case ELogServSessionEventCreated:
   132 		iShutdownTimer->Cancel();
   133 		++iSessionCount;
   134 		break;
   135 	case ELogServSessionEventDestroyed:
   136 		// Only shutdown the server if it's transient - by default it isn't
   137 		if	(--iSessionCount == 0 && iTransient)
   138 			iShutdownTimer->Start();
   139 		break;
   140 		}
   141 
   142 	}
   143 
   144 /////////////////////////////////////////////////////////////////////////////////////////
   145 /////////////////////////////////////////////////////////////////////////////////////////
   146 /////////////////////////////////////////////////////////////////////////////////////////
   147 CSession2* CLogServServer::NewSessionL(const TVersion& /*aVersion*/,const RMessage2& /*aMessage*/) const
   148 //
   149 //	Create a new client session. This should really check the version number.
   150 //
   151 	{
   152 	CLogServServer* self = const_cast<CLogServServer*>(this);
   153 	const TLogServSessionId sessionId = ++self->iNextFreeSessionId;
   154 
   155 	LOGTEXT2("CLogServServer::NewSessionL() - session id is: %d", sessionId);
   156 	//
   157 	CLogServSession* session = new(ELeave) CLogServSession(sessionId, 
   158 												*self,
   159 												*iBackupManager,
   160 												*iDatabaseDriver,
   161 												*iOperationQueue,
   162 												*iChangeTracker,
   163 												*iDatabaseMarshall);
   164 	LOGTEXT("CLogServServer::NewSessionL() - end");
   165 	return session;
   166 	}
   167 
   168 #ifdef _DEBUG
   169 void CLogServServer::MakeTransient(TBool aTransient)
   170 	{
   171 	iTransient = aTransient;
   172 	}
   173 #endif//_DEBUG
   174 
   175 /////////////////////////////////////////////////////////////////////////////////////////
   176 /////////////////////////////////////////////////////////////////////////////////////////
   177 /////////////////////////////////////////////////////////////////////////////////////////
   178