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".
8 // Initial Contributors:
9 // Nokia Corporation - initial contribution.
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"
29 /////////////////////////////////////////////////////////////////////////////////////////
30 // -----> CLogServServer (source)
31 /////////////////////////////////////////////////////////////////////////////////////////
33 CLogServServer::CLogServServer()
34 : CServer2(CActive::EPriorityStandard, ESharableSessions)
38 CLogServServer::~CLogServServer()
40 LOGTEXT("CLogServServer::~CLogServServer()");
41 TDblQueIter<CSession2> iter(iSessionIter);
44 for (CSession2* session = iter++; session != NULL; session = iter++)
50 delete iOperationQueue;
52 delete iDatabaseDriver;
53 delete iChangeTracker;
54 delete iDatabaseMarshall;
56 delete iRecentListManager;
57 delete iResourceInterpreter;
59 delete iBackupManager;
60 delete iShutdownTimer;
63 LOGTEXT("CLogServServer::~CLogServServer() - end");
66 void CLogServServer::ConstructL()
68 LOGTEXT("CLogServServer::ConstructL() - about to connect to file server");
69 User::LeaveIfError(iFsSession.Connect());
71 LOGTEXT("CLogServServer::ConstructL() - about to start server");
72 StartL(KLogServerFullName);
75 LOGTEXT("CLogServServer::ConstructL() - about to create shutdown timer");
76 iShutdownTimer = CLogServShutdownTimer::NewL(Priority() + 1);
78 LOGTEXT("CLogServServer::ConstructL() - about to create backup manager");
79 iBackupManager = CLogServBackupManager::NewL(Priority());
81 LOGTEXT("CLogServServer::ConstructL() - about to create resource interpreter");
82 iResourceInterpreter = CLogServResourceInterpreter::NewL(iFsSession);
84 LOGTEXT("CLogServServer::ConstructL() - about to create recent list manager");
85 iRecentListManager = CLogServRecentListManager::NewL(*iResourceInterpreter, R_LOG_RECENT);
87 // Medium level objects
88 LOGTEXT("CLogServServer::ConstructL() - about to create database marshall");
89 iDatabaseMarshall = CLogServDatabaseMarshall::NewL(iFsSession, *iResourceInterpreter, *iBackupManager);
91 LOGTEXT("CLogServServer::ConstructL() - about to create change tracker");
92 iChangeTracker = CLogServDatabaseChangeTracker::NewL(*iDatabaseMarshall, *iBackupManager, Priority() + 1);
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);
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);
103 LOGTEXT("CLogServServer::ConstructL() - about to create operation queue");
104 iOperationQueue = CLogServOperationQueue::NewL(*iDatabaseDriver, Priority());
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
110 iShutdownTimer->Start();
112 LOGTEXT("CLogServServer::ConstructL() - end");
115 CLogServServer* CLogServServer::NewLC()
117 CLogServServer* self = new(ELeave) CLogServServer;
118 CleanupStack::PushL(self);
123 /////////////////////////////////////////////////////////////////////////////////////////
124 /////////////////////////////////////////////////////////////////////////////////////////
125 /////////////////////////////////////////////////////////////////////////////////////////
127 void CLogServServer::SLOHandleEvent(TLogServSessionId /*aId*/, TLogServSessionEvent aEvent)
131 case ELogServSessionEventCreated:
132 iShutdownTimer->Cancel();
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();
144 /////////////////////////////////////////////////////////////////////////////////////////
145 /////////////////////////////////////////////////////////////////////////////////////////
146 /////////////////////////////////////////////////////////////////////////////////////////
147 CSession2* CLogServServer::NewSessionL(const TVersion& /*aVersion*/,const RMessage2& /*aMessage*/) const
149 // Create a new client session. This should really check the version number.
152 CLogServServer* self = const_cast<CLogServServer*>(this);
153 const TLogServSessionId sessionId = ++self->iNextFreeSessionId;
155 LOGTEXT2("CLogServServer::NewSessionL() - session id is: %d", sessionId);
157 CLogServSession* session = new(ELeave) CLogServSession(sessionId,
164 LOGTEXT("CLogServServer::NewSessionL() - end");
169 void CLogServServer::MakeTransient(TBool aTransient)
171 iTransient = aTransient;
175 /////////////////////////////////////////////////////////////////////////////////////////
176 /////////////////////////////////////////////////////////////////////////////////////////
177 /////////////////////////////////////////////////////////////////////////////////////////