loggingservices/filelogger/SSVR/FLOGSVR.CPP
changeset 0 08ec8eefde2f
child 24 b6ab70c1385f
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/loggingservices/filelogger/SSVR/FLOGSVR.CPP	Fri Jan 22 11:06:30 2010 +0200
@@ -0,0 +1,359 @@
+// Copyright (c) 1997-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:
+//
+
+/**
+ @file
+*/
+
+#include "FLOGSVR.H"
+#include "FLOGMAN.H"
+#include "FLOGSTD.H"
+
+/**
+@internalComponent
+*/
+const TInt KOpenLogFilesGranularity=5;
+
+/**
+panics for log client
+
+@internalComponent
+*/
+enum TLogClientPanic 
+    {
+	ELogDirectoryNameDoesNotExist =1,   ///<  panic if no log directory name 
+	ELogFileNameDoesNotExist	        ///< panic if file name doesnot exist 
+	};
+
+/**
+CFileLoggerServer class definition
+*/
+
+CFileLoggerServer* CFileLoggerServer::NewL()
+/**
+Creates new CFileLoggerServer object
+
+@return Pointer to CFileLoggerServer object
+*/
+	{
+
+	CFileLoggerServer* r=new(ELeave) CFileLoggerServer();
+	CleanupStack::PushL(r);
+	r->ConstructL();
+	r->StartL(KFLoggerServerName);
+	CleanupStack::Pop();
+	return r;
+	}
+
+CFileLoggerServer::CFileLoggerServer()
+ 	: CServer2(EPriority)
+ 	{}
+
+void CFileLoggerServer::ConstructL()
+	{
+
+	iLoggerManager=CFileLoggerManager::NewL();
+	iSessionCounter=CFileLogSessionCounter::NewL();
+	}
+
+CFileLoggerServer::~CFileLoggerServer()
+/**
+Destructor
+*/
+	{
+
+	delete iSessionCounter;
+	delete iLoggerManager;
+	}
+
+CFileLogSessionCounter* CFileLoggerServer::SessionCounter() const
+	{
+
+	return iSessionCounter;
+	}
+
+void CFileLoggerServer::Error(TInt aError)
+	{
+
+	Message().Complete(aError);
+	ReStart();
+	}
+
+CSession2* CFileLoggerServer::NewSessionL(const TVersion &aVersion, const RMessage2& /* aMessage */) const
+/**
+Create a new server session. Check we're the right version and make a new session
+
+@param aVersion version of new session
+*/
+	{
+
+	TVersion v(KFLogSrvMajorVersionNumber,KFLogSrvMinorVersionNumber,KFLogSrvBuildVersionNumber);
+	if (!User::QueryVersionSupported(v,aVersion))
+		User::Leave(KErrNotSupported);
+	
+	iSessionCounter->CancelTimer();
+	return CFileLogSession::NewL(CONST_CAST(CFileLoggerServer*,this),iLoggerManager);
+	}
+/**
+CFileLogSessionCounter class definition 
+*/
+
+CFileLogSessionCounter* CFileLogSessionCounter::NewL()
+/**
+Creates new CFileLogSessionCounter object
+
+@return Pointer to CFileLogSessionCounter object
+*/
+	{
+	
+	CFileLogSessionCounter* r=new(ELeave) CFileLogSessionCounter();
+	CleanupStack::PushL(r);
+	r->ConstructL();
+	CleanupStack::Pop();
+	return r;
+	}
+
+CFileLogSessionCounter::~CFileLogSessionCounter()
+/**
+Destructor
+*/
+	{
+
+	delete iShutdownTimer;
+	}
+
+CFileLogSessionCounter::CFileLogSessionCounter()
+	: iSessionCount(0)
+/**
+Default Constructor
+*/
+	{}
+
+void CFileLogSessionCounter::ConstructL()
+	{
+
+	iShutdownTimer=CShutdownTimer::NewL();
+	}
+	
+void CFileLogSessionCounter::IncrementSessionCount()
+/**
+Increments the Session count 
+*/
+	{
+
+	iSessionCount++;
+	}
+
+void CFileLogSessionCounter::DecrementSessionCount()
+/**
+Decrements the Session count
+*/
+	{
+
+	iSessionCount--;
+	if (iSessionCount<=0)
+		iShutdownTimer->After(KShutdownPause);
+	}
+
+void CFileLogSessionCounter::CancelTimer()
+/**
+Cancels the timer 
+*/
+	{
+
+	iShutdownTimer->Cancel();
+	}	
+
+/**
+CShutdownTimer class definitions
+*/
+
+CShutdownTimer* CShutdownTimer::NewL()
+/**
+Creates new CShutdownTimer object
+@return Pointer to CShutdownTimer object
+*/
+	{
+
+	CShutdownTimer* r=new(ELeave) CShutdownTimer();
+	CleanupStack::PushL(r);
+	r->ConstructL();
+	CleanupStack::Pop();
+	return r;
+	}
+
+CShutdownTimer::~CShutdownTimer()
+/**
+Destructor
+*/
+	{}
+
+CShutdownTimer::CShutdownTimer()
+	: CTimer(EPriorityIdle)
+/**
+Default Constructor
+*/
+	{
+	CActiveScheduler::Add(this);
+	}
+
+void CShutdownTimer::RunL()
+/**
+*/
+	{
+
+	CActiveScheduler::Stop();
+	}
+
+/**
+CFileLogSession class definition
+*/
+
+CFileLogSession* CFileLogSession::NewL(CFileLoggerServer* aServer, CFileLoggerManager* aManager)
+ 	{
+   
+ 	CFileLogSession* r=new(ELeave) CFileLogSession(aServer,aManager);
+ 	CleanupStack::PushL(r);
+ 	r->ConstructL();
+ 	CleanupStack::Pop();
+ 	return r;
+ 	}
+
+CFileLogSession::CFileLogSession( CFileLoggerServer* aServer, CFileLoggerManager* aManager)
+ 	: CSession2(), iLoggerServer(aServer), iLoggerManager(aManager)
+ 	{}
+
+void CFileLogSession::ConstructL()
+	{
+
+	iLoggerServer->SessionCounter()->IncrementSessionCount();		// should be done first because it will be decremented in the destructor
+	iOpenLogFiles=new(ELeave) CArrayFixFlat<TLogFile>(KOpenLogFilesGranularity);
+ 	}
+
+CFileLogSession::~CFileLogSession()
+/**
+Destructor
+*/
+	{
+	if  (iOpenLogFiles)
+		{
+	TInt count=iOpenLogFiles->Count();
+	TInt i;
+	for (i=0; i<count; i++)
+		{
+		iLoggerManager->CloseLog(iOpenLogFiles->At(i));
+		}
+	iOpenLogFiles->Delete(0,count);
+	delete iOpenLogFiles;
+		}
+	iLoggerServer->SessionCounter()->DecrementSessionCount();		// starts the timer if this is the last session
+	}
+
+void CFileLogSession::ServiceL(const RMessage2& aMessage)
+/**
+@internalTechnology
+*/
+	{
+  
+ 	TRAPD(ret,DispatchMessageL(aMessage));
+ 	aMessage.Complete(ret);
+ 	}
+
+void CFileLogSession::DispatchMessageL(const RMessage2& aMessage)
+ 	{
+ 
+ 	TInt func=aMessage.Function();
+ 	if (func!=ECreateLog && func!=EWriteLog && func!=ECloseLog && func!=ECreateWriteAndCloseLog)
+ 		User::Leave(KErrNotSupported);
+ 
+ 	TLogFile log;
+ 	TPckg<TLogFile> logPckg(log);
+ 	aMessage.ReadL(0,logPckg);
+ 	__ASSERT_ALWAYS(log.Directory().Length()!=0,aMessage.Panic(KFLoggerServerName,ELogDirectoryNameDoesNotExist));
+ 	__ASSERT_ALWAYS(log.Name().Length()!=0,aMessage.Panic(KFLoggerServerName,ELogFileNameDoesNotExist));	
+ 
+ //	TBuf8<KLogBufferSize> buf;
+ 	TBuf8<1600> buf;
+ 	if (func==EWriteLog || func==ECreateWriteAndCloseLog)
+ 		aMessage.ReadL(1,buf);
+ 
+ 	switch (func)
+ 		{
+ 	case ECreateLog:
+ 		OpenLogL(log);
+ 		aMessage.WriteL(0,logPckg);
+ 		break;
+ 
+ 	case EWriteLog:
+ 		iLoggerManager->WriteToLogL(log,buf);
+ 		break;
+ 
+ 	case ECloseLog:
+ 		CloseLog(log);
+ 		break;
+ 
+ 	case ECreateWriteAndCloseLog:
+  		{
+  		OpenLogL(log); // Ok to leave here; assume that log not left open
+ 		TInt rc = aMessage.Write(0,logPckg);
+  		if (rc == KErrNone && log.Valid())
+  			TRAP(rc,iLoggerManager->WriteToLogL(log,buf));
+    		CloseLog(log);
+  		User::LeaveIfError(rc);
+    		break;
+  		}
+ 
+ 	default:
+ 		User::Leave(KErrNotSupported);
+ 		break;
+ 		}
+ 	}
+ 
+
+void CFileLogSession::OpenLogL(TLogFile& aLogFile)
+/**
+Opens log file
+
+@param aLogFile Log file name
+*/
+	{
+
+	iOpenLogFiles->AppendL(aLogFile);
+	iLoggerManager->FindOrCreateLogL(aLogFile);
+	}
+
+void CFileLogSession::CloseLog(TLogFile& aLogFile)
+/**
+Closes the log file
+
+@param aLogFile Log file name
+*/
+	{
+
+	iLoggerManager->CloseLog(aLogFile);
+	TInt count=iOpenLogFiles->Count();
+	TInt i=0;
+	for (i=0; i<count; i++)
+		{
+		if (iOpenLogFiles->At(i)==aLogFile)
+			{
+			iOpenLogFiles->Delete(i,1);
+			break;
+			}
+		}	
+
+	__ASSERT_DEBUG(i<=count, User::Invariant());
+	}
+