diff -r 000000000000 -r 08ec8eefde2f loggingservices/filelogger/SSVR/FLOGMAN.CPP --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/loggingservices/filelogger/SSVR/FLOGMAN.CPP Fri Jan 22 11:06:30 2010 +0200 @@ -0,0 +1,387 @@ +// 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 + @internalComponent +*/ + +#include "FLOGMAN.H" +#include "FLOGSTD.H" + +const TInt KLoggerGranularity=5; + +/** +Literal const that hold back slash. +*/ +const TText KBackSlash='\\'; + +/** +full path for log folder +*/ +_LIT(KLogFolder,"C:\\LOGS\\"); + +/** +CFileLoggerManager definitions +*/ + +CFileLoggerManager* CFileLoggerManager::NewL() +/** +Creates a new CFileLoggerManager Object +*/ + { + + CFileLoggerManager* r=new(ELeave) CFileLoggerManager(); + CleanupStack::PushL(r); + r->ConstructL(); + CleanupStack::Pop(); + return r; + } + +CFileLoggerManager::~CFileLoggerManager() +/** +Destructor +*/ + { + + TInt i; + TInt count=iLogger.Count(); + for (i=0; iCancelDeletionTimer(); + iLogger[indexFound]->IncrementAccessCount(); + aLogFile.SetValid(iLogger[indexFound]->LogFile().Valid()); + return; + } + + CFileLogger* log=CFileLogger::NewL(this,aLogFile,iFs); + CleanupStack::PushL(log); + iLogger.AppendL(log); + CleanupStack::Pop(); + } + +void CFileLoggerManager::CloseLog(const TLogFile& aLogFile) +/** +Searches the log file, if not found return. Decrement the access +count and check for the client usage. If no client is using it +any more, delete the log file. + +@param aLogFile Name of log file +*/ + { + + TInt indexFound=FindLogger(aLogFile); + if (indexFound==KErrNotFound) + return; + + if (!iLogger[indexFound]->DeletionTimerActive()) + { + iLogger[indexFound]->DecrementAccessCount(); + + if (iLogger[indexFound]->AccessCount()==0) // if no client is using it any more + { + TBool started=iLogger[indexFound]->StartDeletionTimer(); + if (!started) + { + delete iLogger[indexFound]; + iLogger.Delete(indexFound,1); + } + } + } + } + +void CFileLoggerManager::WriteToLogL(const TLogFile& aLogFile, const TDesC8& aBuf) +/** +Searches and Writes to log file. + +@param aLogFile Name of log file +@param aBuf Text to write +*/ + { + + TInt indexFound=FindLogger(aLogFile); + if (indexFound==KErrNotFound) + { + User::Leave(KErrNotFound); + return; + } + + iLogger[indexFound]->WriteLogL(aBuf); + } + +void CFileLoggerManager::DeleteLogger(CFileLogger* aLogger) + { + + TInt index=FindLogger(aLogger->LogFile()); + __ASSERT_DEBUG(index!=KErrNotFound, User::Invariant()); + if (index!=KErrNotFound) + { + delete iLogger[index]; + iLogger.Delete(index,1); + } + } + +TInt CFileLoggerManager::FindLogger(const TLogFile& aLogFile) const +/** +Searches log file. +@param aLogFile Name of the log file +*/ + { + + TInt i; + TInt indexFound=KErrNotFound; + for (i=0; iLogFile()==aLogFile) + { + indexFound=i; + break; + } + } + return indexFound; + } + +/** +CFileLogger defintions +*/ + +CFileLogger* CFileLogger::NewL(CFileLoggerManager* aLoggerManager,TLogFile& aLogFile, RFs& aFs) +/** +Creates CFileLogger + +*/ + { + + CFileLogger* r=new(ELeave) CFileLogger(aLoggerManager,aLogFile,aFs); + CleanupStack::PushL(r); + r->ConstructL(aLogFile); + CleanupStack::Pop(); + return r; + } + +CFileLogger::~CFileLogger() +/** +Destructor +*/ + { + + __ASSERT_DEBUG(iAccessCount==0, User::Invariant()); + iFile.Close(); + delete iTimer; + } + +CFileLogger::CFileLogger(CFileLoggerManager* aLoggerManager,TLogFile& aLogFile, RFs& aFs) + : iLoggerManager(aLoggerManager), iFs(aFs), iLogFile(aLogFile), iAccessCount(0) +/** +Access count will be incremented when construcion is complete + +*/ + {} + +void CFileLogger::ConstructL(TLogFile& aLogFile) +/** +Decide whether to create a log (only create a log if the folder exists) and if +so delete any existing one, if the mode is overwirte, append to any existing one +if the mode is append. Open or create and the file and position to the end of it. +If an error occurs, the iValid flag will just be left as FALSE, as initialised. + +@param aLogFile Name of the log file +*/ + { + + iTimer=CLoggerDeletionTimer::NewL(this); + + iLogFile.SetValid(EFalse); + aLogFile.SetValid(EFalse); + + TFileName logFolder,logFilename; + GetFolderAndFileNameL(logFolder,logFilename); + + TUint n; + if (iFs.Att(logFolder,n)==KErrNone) // the folder exists => do logging + { + TInt ret=KErrNone; + TBool fileExists=EFalse; + if (iLogFile.Mode()==EFileLoggingModeOverwrite) + { + ret=iFs.Delete(logFilename); + if (ret!=KErrNotFound && ret!=KErrNone) + User::Leave(ret); + } + else // append + { + if (iFs.Att(logFilename,n)==KErrNone) + fileExists=ETrue; + } + + if (!fileExists) + ret=iFile.Create(iFs,logFilename,EFileShareAny|EFileWrite); + else + ret=iFile.Open(iFs,logFilename,EFileShareAny|EFileWrite); + if (ret==KErrNone) // if we managed to open/create it + { + TInt pos=0; + ret=iFile.Seek(ESeekEnd,pos); + if (ret==KErrNone) + { + iLogFile.SetValid(ETrue); + aLogFile.SetValid(ETrue); + IncrementAccessCount(); + return; + } + } + iFile.Close(); + User::Leave(ret); + } + IncrementAccessCount(); + } + +void CFileLogger::WriteLogL(const TDesC8& aBuf) +/** +Checks for log file and then Writes the text + +@param aBuf Text to write +*/ + { + + if (iLogFile.Valid()) + { + User::LeaveIfError(iFile.Write(aBuf)); + User::LeaveIfError(iFile.Flush()); + } + } + +TBool CFileLogger::StartDeletionTimer() +/** +Starts timer if this was a valid log file (i.e. it was open) +*/ + { + + if (!iLogFile.Valid()) + return EFalse; + iTimer->After(KShutdownPause); + return ETrue; + } + +void CFileLogger::CancelDeletionTimer() +/** +*/ + { + + iTimer->Cancel(); + } + +void CFileLogger::DeletionTimerExpired() +/** +*/ + { + + iLoggerManager->DeleteLogger(this); + } + +void CFileLogger::GetFolderAndFileNameL(TFileName& aFolder,TFileName& aFilename) const +/** +Work out the full path of the folder and file name of the log + +@param aFolder Full path of log file +@param aFilename Name of log file +*/ + { + + aFolder.Append(KLogFolder); + if ((aFolder.MaxLength()-aFolder.Length()-iLogFile.Directory().Length()-1)>=0) + { + aFolder.Append(iLogFile.Directory()); + aFolder.Append(KBackSlash); + } + else + User::Leave(KErrOverflow); + + if ((aFilename.MaxLength()-aFolder.Length()-iLogFile.Name().Length())>=0) + { + aFilename.Append(aFolder); + aFilename.Append(iLogFile.Name()); + } + else + User::Leave(KErrOverflow); + } + +/** +CLoggerDeletionTimer class definitions +*/ + +CLoggerDeletionTimer* CLoggerDeletionTimer::NewL(CFileLogger* aLogger) +/** +Creates CLoggerDeletionTimer +*/ + { + + CLoggerDeletionTimer* r=new(ELeave) CLoggerDeletionTimer(aLogger); + CleanupStack::PushL(r); + r->ConstructL(); + CleanupStack::Pop(); + return r; + } + +CLoggerDeletionTimer::~CLoggerDeletionTimer() +/** +Destructor +*/ + {} + +CLoggerDeletionTimer::CLoggerDeletionTimer(CFileLogger* aLogger) + : CTimer(EPriorityIdle), iLogger(aLogger) + { + CActiveScheduler::Add(this); + } + +void CLoggerDeletionTimer::RunL() + { + + iLogger->DeletionTimerExpired(); + }