loggingservices/eventlogger/LogCli/src/logservcli.cpp
changeset 0 08ec8eefde2f
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/loggingservices/eventlogger/LogCli/src/logservcli.cpp	Fri Jan 22 11:06:30 2010 +0200
@@ -0,0 +1,250 @@
+// Copyright (c) 2002-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:
+//
+
+#include "logservcli.h"
+
+// System includes
+#include <e32math.h>
+#include <s32mem.h>
+
+// User includes
+#include "LogServShared.h"
+
+static TInt StartServer()
+//
+// Start the server process/thread which lives in an EPOCEXE object
+//
+	{
+	const TUidType serverUid(KNullUid,KNullUid,KServerUid3);
+
+	//
+	// EPOC is easy, we just create a new server process. Simultaneous launching
+	// of two such processes should be detected when the second one attempts to
+	// create the server object, failing with KErrAlreadyExists.
+	//
+	RProcess server;
+	TInt r=server.Create(KLogServerName,KNullDesC,serverUid);
+	if (r == KErrNone)
+		server.SetPriority(EPriorityForeground);
+		
+	if (r!=KErrNone)
+		return r;
+	
+	TRequestStatus stat;
+	server.Rendezvous(stat);
+	if (stat!=KRequestPending)
+		server.Kill(0);		// abort startup
+	else
+		server.Resume();	// logon OK - start the server
+	User::WaitForRequest(stat);		// wait for start or death
+	// we can't use the 'exit reason' if the server panicked as this
+	// is the panic 'reason' and may be '0' which cannot be distinguished
+	// from KErrNone
+	r=(server.ExitType()==EExitPanic) ? KErrGeneral : stat.Int();
+	server.Close();
+	return r;
+
+	}
+
+// Initialise the operation and view ids
+RLogSession::RLogSession()
+: iOperationId(KLogNullOperationId + 1), iViewId(KLogNullViewId + 1)
+	{
+	}
+
+TInt RLogSession::Connect()
+//
+// Connect to the server, attempting to start it if necessary
+//
+	{
+	TInt retry=2;
+	for (;;)
+		{
+		TInt r=CreateSession(KLogServerFullName,TVersion(0,0,0));
+		if (r!=KErrNotFound && r!=KErrServerTerminated)
+			return r;
+		if (--retry==0)
+			return r;
+		r=StartServer();
+		if (r!=KErrNone && r!=KErrAlreadyExists)
+			return r;
+		}
+	}
+
+
+void RLogSession::Send(TInt aType, const TIpcArgs& aArgs, TRequestStatus& aStatus) const
+	{
+	SendWithRetryAsync(aType, aArgs, aStatus);
+	}
+
+TInt RLogSession::Send(TInt aType, const TIpcArgs& aArgs) const
+	{
+	return SendWithRetry(aType, aArgs);
+	}
+
+TInt RLogSession::SendWithRetry(TInt aType, const TIpcArgs& aParam) const
+	{
+	TInt ret = SendReceive(aType, aParam);
+	if (ret < KErrNone)
+		{
+		if(ret == KErrServerTerminated || ret == KErrNotFound)
+			{
+			// Try to reconnect
+			const_cast<RLogSession&>(*this).Close();
+			ret = const_cast<RLogSession&>(*this).Connect();
+			if(ret == KErrNone)
+				{
+				// Try to resend
+				ret = SendReceive(aType, aParam);
+				}
+			}
+		}
+	return ret;
+	}
+
+
+void RLogSession::SendWithRetryAsync(TInt aType, const TIpcArgs& aParam, TRequestStatus& aStatus) const
+	{
+	SendReceive(aType, aParam, aStatus);
+	}
+
+
+
+
+
+
+
+
+
+
+
+#ifdef LOGGING_ENABLED
+
+const TInt KLogEngLogBufferSize = 256;
+
+void Log::New()
+	{
+	_LIT(KNewLogText, "===== NEW LOG =====");
+	//
+	RFileLogger logger;
+	TInt ret=logger.Connect();
+	if	(ret==KErrNone)
+		{
+		logger.CreateLog(KLogFolder, KLogFileName, EFileLoggingModeOverwrite);
+		logger.Write(KNewLogText);
+		}
+	logger.Close();
+	}
+
+void Log::Write(const TDesC& aText)
+	{
+	PruneLogFile();
+
+	RFileLogger logger;
+	TInt ret=logger.Connect();
+	if (ret==KErrNone)
+		{
+		logger.SetDateAndTime(EFalse,EFalse);
+		logger.CreateLog(KLogFolder, KLogFileName,EFileLoggingModeAppend);
+		TBuf<KLogEngLogBufferSize> buf;
+		
+		// The debug log uses hometime rather than UTC for its timestamps. This is
+		// purely a debugging aid.
+		TTime now;
+		now.HomeTime();
+		
+		TDateTime dateTime;
+		dateTime = now.DateTime();
+		buf.Format(KTimeFormat,dateTime.Hour(),dateTime.Minute(),dateTime.Second(),dateTime.MicroSecond());
+		buf.AppendFormat(KTextFormat,&aText);
+
+		logger.Write(buf);
+		}
+
+	logger.Close();
+	}
+
+void Log::WriteFormat(TRefByValue<const TDesC> aFmt,...)
+	{
+    VA_LIST list;
+    VA_START(list,aFmt);
+
+	PruneLogFile();
+
+	TBuf<2*KLogEngLogBufferSize> buf;
+	buf.SetMax();
+	buf.FillZ();
+	
+	// The debug log uses hometime rather than UTC for its timestamps. This is
+	// purely a debugging aid.
+	TTime now;
+	now.HomeTime();
+	
+	TDateTime dateTime;
+	dateTime = now.DateTime();
+	buf.Format(KTimeFormat,dateTime.Hour(),dateTime.Minute(),dateTime.Second(),dateTime.MicroSecond());
+	buf.AppendFormatList(aFmt, list );
+
+	RFileLogger logger;
+	TInt ret=logger.Connect();
+	if (ret==KErrNone)
+		{
+		logger.SetDateAndTime(EFalse,EFalse);
+		logger.CreateLog(KLogFolder, KLogFileName,EFileLoggingModeAppend);
+		logger.Write(buf);
+		}
+
+	logger.Close();
+	}
+
+void Log::PruneLogFile()
+	{
+	const TInt KMaxLogSize = 1024 * 500;
+	//
+	_LIT(KBaseFolder, "_:\\Logs\\");
+	TFileName fileName(KBaseFolder);
+	fileName[0] = 'A' + static_cast<TInt>(RFs::GetSystemDrive());
+	fileName.Append(KLogFolder);
+	fileName.Append(KPathDelimiter);
+	fileName.Append(KLogFileName);
+	//
+	RFs fsSession;
+	if	(fsSession.Connect() == KErrNone)
+		{
+		TEntry entry;
+		if	(fsSession.Entry(fileName, entry) == KErrNone)
+			{
+			// Check size and delete if its too big
+			if (entry.iSize >= KMaxLogSize)
+				{
+				TInt fileDeleteErr=fsSession.Delete(fileName); 
+
+				// If a debug build - record error
+				#ifdef _DEBUG
+					if (fileDeleteErr != KErrNone)
+						{
+						RDebug::Print(_L("Log::PruneLogFile - Failed to delete file. Error = %d"), fileDeleteErr);
+						}
+				#else
+					(void)fileDeleteErr;
+				#endif
+				}	
+			}
+		}
+	fsSession.Close();
+	}
+
+#endif
+