1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
1.2 +++ b/os/persistentdata/loggingservices/eventlogger/LogServ/src/LogServServer.cpp Fri Jun 15 03:10:57 2012 +0200
1.3 @@ -0,0 +1,178 @@
1.4 +// Copyright (c) 2002-2009 Nokia Corporation and/or its subsidiary(-ies).
1.5 +// All rights reserved.
1.6 +// This component and the accompanying materials are made available
1.7 +// under the terms of "Eclipse Public License v1.0"
1.8 +// which accompanies this distribution, and is available
1.9 +// at the URL "http://www.eclipse.org/legal/epl-v10.html".
1.10 +//
1.11 +// Initial Contributors:
1.12 +// Nokia Corporation - initial contribution.
1.13 +//
1.14 +// Contributors:
1.15 +//
1.16 +// Description:
1.17 +//
1.18 +
1.19 +#include "LogServServer.h"
1.20 +#include "logservsession.h"
1.21 +#include "logservpanic.h"
1.22 +#include "LogServShutdownTimer.h"
1.23 +#include "LogServDatabaseMarshall.h"
1.24 +#include "LogServDatabaseDriver.h"
1.25 +#include "LogServBackupManager.h"
1.26 +#include "LogServOperationQueue.h"
1.27 +#include "LogServResourceInterpreter.h"
1.28 +#include "LogServDatabaseChangeTracker.h"
1.29 +#include "LogServRecentListManager.h"
1.30 +
1.31 +
1.32 +/////////////////////////////////////////////////////////////////////////////////////////
1.33 +// -----> CLogServServer (source)
1.34 +/////////////////////////////////////////////////////////////////////////////////////////
1.35 +
1.36 +CLogServServer::CLogServServer()
1.37 +: CServer2(CActive::EPriorityStandard, ESharableSessions)
1.38 + {
1.39 + }
1.40 +
1.41 +CLogServServer::~CLogServServer()
1.42 + {
1.43 + LOGTEXT("CLogServServer::~CLogServServer()");
1.44 + TDblQueIter<CSession2> iter(iSessionIter);
1.45 + iter.SetToFirst();
1.46 +
1.47 + for (CSession2* session = iter++; session != NULL; session = iter++)
1.48 + {
1.49 + delete session;
1.50 + }
1.51 +
1.52 + // Order is important
1.53 + delete iOperationQueue;
1.54 + //
1.55 + delete iDatabaseDriver;
1.56 + delete iChangeTracker;
1.57 + delete iDatabaseMarshall;
1.58 + //
1.59 + delete iRecentListManager;
1.60 + delete iResourceInterpreter;
1.61 + //
1.62 + delete iBackupManager;
1.63 + delete iShutdownTimer;
1.64 + iFsSession.Close();
1.65 +
1.66 + LOGTEXT("CLogServServer::~CLogServServer() - end");
1.67 + }
1.68 +
1.69 +void CLogServServer::ConstructL()
1.70 + {
1.71 + LOGTEXT("CLogServServer::ConstructL() - about to connect to file server");
1.72 + User::LeaveIfError(iFsSession.Connect());
1.73 +
1.74 + LOGTEXT("CLogServServer::ConstructL() - about to start server");
1.75 + StartL(KLogServerFullName);
1.76 +
1.77 + // Low level objects
1.78 + LOGTEXT("CLogServServer::ConstructL() - about to create shutdown timer");
1.79 + iShutdownTimer = CLogServShutdownTimer::NewL(Priority() + 1);
1.80 +
1.81 + LOGTEXT("CLogServServer::ConstructL() - about to create backup manager");
1.82 + iBackupManager = CLogServBackupManager::NewL(Priority());
1.83 +
1.84 + LOGTEXT("CLogServServer::ConstructL() - about to create resource interpreter");
1.85 + iResourceInterpreter = CLogServResourceInterpreter::NewL(iFsSession);
1.86 +
1.87 + LOGTEXT("CLogServServer::ConstructL() - about to create recent list manager");
1.88 + iRecentListManager = CLogServRecentListManager::NewL(*iResourceInterpreter, R_LOG_RECENT);
1.89 +
1.90 + // Medium level objects
1.91 + LOGTEXT("CLogServServer::ConstructL() - about to create database marshall");
1.92 + iDatabaseMarshall = CLogServDatabaseMarshall::NewL(iFsSession, *iResourceInterpreter, *iBackupManager);
1.93 +
1.94 + LOGTEXT("CLogServServer::ConstructL() - about to create change tracker");
1.95 + iChangeTracker = CLogServDatabaseChangeTracker::NewL(*iDatabaseMarshall, *iBackupManager, Priority() + 1);
1.96 +
1.97 + // Setup the pointer to the change tracker from within the database marshall (since its underlying
1.98 + // mixin provides a means of submitting change events)
1.99 + LOGTEXT("CLogServServer::ConstructL() - about to set change interface for database marshall ");
1.100 + iDatabaseMarshall->SetChangeInterface(*iChangeTracker);
1.101 +
1.102 + // These objects are quite high level... i.e. they use the engine objects above
1.103 + LOGTEXT("CLogServServer::ConstructL() - about to create database driver");
1.104 + iDatabaseDriver = CLogServDatabaseDriver::NewL(*iBackupManager, *iDatabaseMarshall, *iResourceInterpreter, *iRecentListManager, Priority() - 1);
1.105 +
1.106 + LOGTEXT("CLogServServer::ConstructL() - about to create operation queue");
1.107 + iOperationQueue = CLogServOperationQueue::NewL(*iDatabaseDriver, Priority());
1.108 +
1.109 + // Ensure that the server still exits even if the 1st client fails to connect
1.110 + // Only shutdown the server if it's transient - by default it isn't, but keeping
1.111 + // this code here in case this changes
1.112 + if (iTransient)
1.113 + iShutdownTimer->Start();
1.114 +
1.115 + LOGTEXT("CLogServServer::ConstructL() - end");
1.116 + }
1.117 +
1.118 +CLogServServer* CLogServServer::NewLC()
1.119 + {
1.120 + CLogServServer* self = new(ELeave) CLogServServer;
1.121 + CleanupStack::PushL(self);
1.122 + self->ConstructL();
1.123 + return self;
1.124 + }
1.125 +
1.126 +/////////////////////////////////////////////////////////////////////////////////////////
1.127 +/////////////////////////////////////////////////////////////////////////////////////////
1.128 +/////////////////////////////////////////////////////////////////////////////////////////
1.129 +
1.130 +void CLogServServer::SLOHandleEvent(TLogServSessionId /*aId*/, TLogServSessionEvent aEvent)
1.131 + {
1.132 + switch(aEvent)
1.133 + {
1.134 + case ELogServSessionEventCreated:
1.135 + iShutdownTimer->Cancel();
1.136 + ++iSessionCount;
1.137 + break;
1.138 + case ELogServSessionEventDestroyed:
1.139 + // Only shutdown the server if it's transient - by default it isn't
1.140 + if (--iSessionCount == 0 && iTransient)
1.141 + iShutdownTimer->Start();
1.142 + break;
1.143 + }
1.144 +
1.145 + }
1.146 +
1.147 +/////////////////////////////////////////////////////////////////////////////////////////
1.148 +/////////////////////////////////////////////////////////////////////////////////////////
1.149 +/////////////////////////////////////////////////////////////////////////////////////////
1.150 +CSession2* CLogServServer::NewSessionL(const TVersion& /*aVersion*/,const RMessage2& /*aMessage*/) const
1.151 +//
1.152 +// Create a new client session. This should really check the version number.
1.153 +//
1.154 + {
1.155 + CLogServServer* self = const_cast<CLogServServer*>(this);
1.156 + const TLogServSessionId sessionId = ++self->iNextFreeSessionId;
1.157 +
1.158 + LOGTEXT2("CLogServServer::NewSessionL() - session id is: %d", sessionId);
1.159 + //
1.160 + CLogServSession* session = new(ELeave) CLogServSession(sessionId,
1.161 + *self,
1.162 + *iBackupManager,
1.163 + *iDatabaseDriver,
1.164 + *iOperationQueue,
1.165 + *iChangeTracker,
1.166 + *iDatabaseMarshall);
1.167 + LOGTEXT("CLogServServer::NewSessionL() - end");
1.168 + return session;
1.169 + }
1.170 +
1.171 +#ifdef _DEBUG
1.172 +void CLogServServer::MakeTransient(TBool aTransient)
1.173 + {
1.174 + iTransient = aTransient;
1.175 + }
1.176 +#endif//_DEBUG
1.177 +
1.178 +/////////////////////////////////////////////////////////////////////////////////////////
1.179 +/////////////////////////////////////////////////////////////////////////////////////////
1.180 +/////////////////////////////////////////////////////////////////////////////////////////
1.181 +