sl@0: // Copyright (c) 2002-2009 Nokia Corporation and/or its subsidiary(-ies). sl@0: // All rights reserved. sl@0: // This component and the accompanying materials are made available sl@0: // under the terms of "Eclipse Public License v1.0" sl@0: // which accompanies this distribution, and is available sl@0: // at the URL "http://www.eclipse.org/legal/epl-v10.html". sl@0: // sl@0: // Initial Contributors: sl@0: // Nokia Corporation - initial contribution. sl@0: // sl@0: // Contributors: sl@0: // sl@0: // Description: sl@0: // sl@0: sl@0: #include "LogServServer.h" sl@0: #include "logservsession.h" sl@0: #include "logservpanic.h" sl@0: #include "LogServShutdownTimer.h" sl@0: #include "LogServDatabaseMarshall.h" sl@0: #include "LogServDatabaseDriver.h" sl@0: #include "LogServBackupManager.h" sl@0: #include "LogServOperationQueue.h" sl@0: #include "LogServResourceInterpreter.h" sl@0: #include "LogServDatabaseChangeTracker.h" sl@0: #include "LogServRecentListManager.h" sl@0: sl@0: sl@0: ///////////////////////////////////////////////////////////////////////////////////////// sl@0: // -----> CLogServServer (source) sl@0: ///////////////////////////////////////////////////////////////////////////////////////// sl@0: sl@0: CLogServServer::CLogServServer() sl@0: : CServer2(CActive::EPriorityStandard, ESharableSessions) sl@0: { sl@0: } sl@0: sl@0: CLogServServer::~CLogServServer() sl@0: { sl@0: LOGTEXT("CLogServServer::~CLogServServer()"); sl@0: TDblQueIter iter(iSessionIter); sl@0: iter.SetToFirst(); sl@0: sl@0: for (CSession2* session = iter++; session != NULL; session = iter++) sl@0: { sl@0: delete session; sl@0: } sl@0: sl@0: // Order is important sl@0: delete iOperationQueue; sl@0: // sl@0: delete iDatabaseDriver; sl@0: delete iChangeTracker; sl@0: delete iDatabaseMarshall; sl@0: // sl@0: delete iRecentListManager; sl@0: delete iResourceInterpreter; sl@0: // sl@0: delete iBackupManager; sl@0: delete iShutdownTimer; sl@0: iFsSession.Close(); sl@0: sl@0: LOGTEXT("CLogServServer::~CLogServServer() - end"); sl@0: } sl@0: sl@0: void CLogServServer::ConstructL() sl@0: { sl@0: LOGTEXT("CLogServServer::ConstructL() - about to connect to file server"); sl@0: User::LeaveIfError(iFsSession.Connect()); sl@0: sl@0: LOGTEXT("CLogServServer::ConstructL() - about to start server"); sl@0: StartL(KLogServerFullName); sl@0: sl@0: // Low level objects sl@0: LOGTEXT("CLogServServer::ConstructL() - about to create shutdown timer"); sl@0: iShutdownTimer = CLogServShutdownTimer::NewL(Priority() + 1); sl@0: sl@0: LOGTEXT("CLogServServer::ConstructL() - about to create backup manager"); sl@0: iBackupManager = CLogServBackupManager::NewL(Priority()); sl@0: sl@0: LOGTEXT("CLogServServer::ConstructL() - about to create resource interpreter"); sl@0: iResourceInterpreter = CLogServResourceInterpreter::NewL(iFsSession); sl@0: sl@0: LOGTEXT("CLogServServer::ConstructL() - about to create recent list manager"); sl@0: iRecentListManager = CLogServRecentListManager::NewL(*iResourceInterpreter, R_LOG_RECENT); sl@0: sl@0: // Medium level objects sl@0: LOGTEXT("CLogServServer::ConstructL() - about to create database marshall"); sl@0: iDatabaseMarshall = CLogServDatabaseMarshall::NewL(iFsSession, *iResourceInterpreter, *iBackupManager); sl@0: sl@0: LOGTEXT("CLogServServer::ConstructL() - about to create change tracker"); sl@0: iChangeTracker = CLogServDatabaseChangeTracker::NewL(*iDatabaseMarshall, *iBackupManager, Priority() + 1); sl@0: sl@0: // Setup the pointer to the change tracker from within the database marshall (since its underlying sl@0: // mixin provides a means of submitting change events) sl@0: LOGTEXT("CLogServServer::ConstructL() - about to set change interface for database marshall "); sl@0: iDatabaseMarshall->SetChangeInterface(*iChangeTracker); sl@0: sl@0: // These objects are quite high level... i.e. they use the engine objects above sl@0: LOGTEXT("CLogServServer::ConstructL() - about to create database driver"); sl@0: iDatabaseDriver = CLogServDatabaseDriver::NewL(*iBackupManager, *iDatabaseMarshall, *iResourceInterpreter, *iRecentListManager, Priority() - 1); sl@0: sl@0: LOGTEXT("CLogServServer::ConstructL() - about to create operation queue"); sl@0: iOperationQueue = CLogServOperationQueue::NewL(*iDatabaseDriver, Priority()); sl@0: sl@0: // Ensure that the server still exits even if the 1st client fails to connect sl@0: // Only shutdown the server if it's transient - by default it isn't, but keeping sl@0: // this code here in case this changes sl@0: if (iTransient) sl@0: iShutdownTimer->Start(); sl@0: sl@0: LOGTEXT("CLogServServer::ConstructL() - end"); sl@0: } sl@0: sl@0: CLogServServer* CLogServServer::NewLC() sl@0: { sl@0: CLogServServer* self = new(ELeave) CLogServServer; sl@0: CleanupStack::PushL(self); sl@0: self->ConstructL(); sl@0: return self; sl@0: } sl@0: sl@0: ///////////////////////////////////////////////////////////////////////////////////////// sl@0: ///////////////////////////////////////////////////////////////////////////////////////// sl@0: ///////////////////////////////////////////////////////////////////////////////////////// sl@0: sl@0: void CLogServServer::SLOHandleEvent(TLogServSessionId /*aId*/, TLogServSessionEvent aEvent) sl@0: { sl@0: switch(aEvent) sl@0: { sl@0: case ELogServSessionEventCreated: sl@0: iShutdownTimer->Cancel(); sl@0: ++iSessionCount; sl@0: break; sl@0: case ELogServSessionEventDestroyed: sl@0: // Only shutdown the server if it's transient - by default it isn't sl@0: if (--iSessionCount == 0 && iTransient) sl@0: iShutdownTimer->Start(); sl@0: break; sl@0: } sl@0: sl@0: } sl@0: sl@0: ///////////////////////////////////////////////////////////////////////////////////////// sl@0: ///////////////////////////////////////////////////////////////////////////////////////// sl@0: ///////////////////////////////////////////////////////////////////////////////////////// sl@0: CSession2* CLogServServer::NewSessionL(const TVersion& /*aVersion*/,const RMessage2& /*aMessage*/) const sl@0: // sl@0: // Create a new client session. This should really check the version number. sl@0: // sl@0: { sl@0: CLogServServer* self = const_cast(this); sl@0: const TLogServSessionId sessionId = ++self->iNextFreeSessionId; sl@0: sl@0: LOGTEXT2("CLogServServer::NewSessionL() - session id is: %d", sessionId); sl@0: // sl@0: CLogServSession* session = new(ELeave) CLogServSession(sessionId, sl@0: *self, sl@0: *iBackupManager, sl@0: *iDatabaseDriver, sl@0: *iOperationQueue, sl@0: *iChangeTracker, sl@0: *iDatabaseMarshall); sl@0: LOGTEXT("CLogServServer::NewSessionL() - end"); sl@0: return session; sl@0: } sl@0: sl@0: #ifdef _DEBUG sl@0: void CLogServServer::MakeTransient(TBool aTransient) sl@0: { sl@0: iTransient = aTransient; sl@0: } sl@0: #endif//_DEBUG sl@0: sl@0: ///////////////////////////////////////////////////////////////////////////////////////// sl@0: ///////////////////////////////////////////////////////////////////////////////////////// sl@0: ///////////////////////////////////////////////////////////////////////////////////////// sl@0: