traceservices/commsdebugutility/INC/comsdbgsvr.h
changeset 0 08ec8eefde2f
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/traceservices/commsdebugutility/INC/comsdbgsvr.h	Fri Jan 22 11:06:30 2010 +0200
@@ -0,0 +1,205 @@
+// 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:
+// Flogger (File and Serial logger) server side header
+// 
+//
+
+/**
+ @file
+ @internalComponent
+*/
+
+#ifndef __COMSDBGSVR_H__
+#define __COMSDBGSVR_H__
+
+#include <f32file.h>
+#include <comms-infras/commsdebugutility.h>
+
+class CLogMessageBase;
+class CIniFileWatcher;
+class CIniFileParser;
+class CTimeManager;
+class CLogStringMessage;
+class CLogCommentMessage;
+class CSecondaryThread;
+class CShutDownMessage;
+
+_LIT(KFloggerIniInROM, "Z:\\resource\\commsdbg.ini");
+_LIT(KFloggerIniFile, "commsdbg.ini");
+_LIT(KFloggerIniOldFile, "comsdbg.ini");
+_LIT(KFloggerIniOldFilePartialPath, ":\\logs\\comsdbg.ini");
+_LIT(KFloggerIniDir, "\\logs\\");
+_LIT(KFloggerIniRscDir, "\\resource\\");
+_LIT(KFloggerDfltIniPartialPath, ":\\logs\\commsdbg.ini");
+
+_LIT8(KFileMedia, "File");
+_LIT8(KSerial1Media, "Serial::1");
+_LIT8(KSerial2Media, "Serial::2");
+_LIT8(KRDebugMedia, "RDebug");
+_LIT8(KOSTv2Media, "OSTv2");
+_LIT8(KDefaultMedia, "Default");		// This is not supplied in the ini file, but is used to set the media
+										// before the media is read from the ini file.
+const TInt KMaxMediaStringLength = 9;	//This ties in with the above three strings
+
+const TInt KMaxLoggingPathStringLength = 100;	// Given that "c:\logs\log.txt" = 15, 100 should be enough.
+                                                // The whole purpose is just to allow someone to output to a different drive
+typedef TBuf8<KMaxLoggingPathStringLength> TFilePath;
+
+_LIT(KFloggerServerPanic, "Comsdbg internal");
+
+typedef TBuf8<KMaxTagLength> TNameTag;
+
+enum TFloggerServerPanics
+	{
+	ENullMessageInArray,
+	ENoLoggingMediaSetUp,
+	EBadMessageFunction
+	};
+
+enum TFlushStates 
+	{
+	ENoValue,
+	EFlushOn, 
+	EFlushOff
+	}; ///< Stops us switching between flushing and nonflushing: We can only move from ENoValue to one of the others
+
+/**
+ * MLogArrayAccess - Provides an interface for other classes to interact with the log queue in CFileLoggerServer.
+ *
+ * Overridden by CFileLoggerServer.
+ */
+class MLogArrayAccess
+	{
+public:
+	virtual TInt AppendAndGiveOwnership(CLogMessageBase* aMessage) = 0;
+	virtual void GetFirstMessageAndTakeOwnership(CLogMessageBase*& aMessage) = 0;
+	virtual void PutOOMErrorInLog() = 0;
+	virtual void SignalCompletionSemaphore() = 0;
+	};
+
+#if defined (__WINS__)
+class CDebugPortProtocol;
+#endif
+
+/**
+ * CFileLoggerServer - maintain server state
+ *
+ * This class is responsible for maintaining the server state. It provides
+ * control of the second thread, the ini file change notifier, the current
+ * list of valid logs and other ini file settings, and
+ * the log queue.
+ */
+class CFileLoggerServer : public CServer2, public MLogArrayAccess
+	{
+public:
+	static CFileLoggerServer* NewL();
+	~CFileLoggerServer();
+// CServer
+	virtual CSession2* NewSessionL(const TVersion& aVersion,const RMessage2& aMessage) const;
+// MLogArrayAccess
+	virtual TInt AppendAndGiveOwnership(CLogMessageBase* aMessage);
+	virtual void GetFirstMessageAndTakeOwnership(CLogMessageBase*& aMessage);
+	virtual void PutOOMErrorInLog();
+	virtual void SignalCompletionSemaphore();
+
+	void IniFileChanged(TDesC& aIniFile);
+#ifdef _DEBUG
+	void __DbgKillTimeManager();
+#endif
+protected:
+	virtual TInt RunError(TInt aError);
+private:
+	CFileLoggerServer();
+	void ConstructL();
+	void UpdateMediaL();
+	void RePrepareForOOML();
+private:
+	RPointerArray<CLogMessageBase> iLogMessageArray;
+	TBool iArrayHasSpaceForWrite;
+	RSemaphore iCompletionSemaphore;     ///< used to signal completion of write when flushing
+	RCriticalSection iCriticalSection;         ///< manages atomic access to array of log messages.
+	CIniFileWatcher* iIniFileWatcher;
+	CIniFileWatcher* iIniOldFileWatcher;
+	CIniFileParser* iIniFileParser;
+	CTimeManager* iTimeManager;
+	CLogCommentMessage* iPreAllocatedErrorMessage;	///< For error mesg to be allocated before all memory is consumed.
+	CSecondaryThread* iSecondaryThread;
+	RFs iFs;
+
+#if defined (__WINS__)
+	CDebugPortProtocol* iDebugWriter;   ///< Win32 debug port support provider
+#endif
+	};	
+
+class MIniFlushModeAndLogValidQuery;
+class MIniLoggingMediaQuery;
+
+/**
+ * CFileLogSession -  
+ *
+ * This class is responsible for servicing the client requests sent. It forms the back-end server side of
+ * each client connection to flogger server and implements the ServiceL() to service all client requests.
+ */
+class CFileLogSession : public CSession2
+	{
+public:
+	static CFileLogSession* NewL(MLogArrayAccess& aArrayAccess, const MIniFlushModeAndLogValidQuery& aLogValidQuery);
+	~CFileLogSession();
+	// CSession
+	virtual void ServiceL(const RMessage2& aMessage);
+	//
+	void IniFileChanged();
+	void SetLoggingOnOffInClient();
+private:
+	CFileLogSession(MLogArrayAccess& aArrayAccess, const MIniFlushModeAndLogValidQuery& aLogValidQuery);
+	void CheckClientHasSetTagsL(const RMessage2& aMessage);
+private:
+	TNameTag iSubsystem;
+	TNameTag iComponent;
+	MLogArrayAccess& iArrayAccess;
+	const MIniFlushModeAndLogValidQuery& iFlushModeLogValidQuery;
+	TBool iLogValid;
+	RMessage2 iSetLogMessage;
+	TThreadId iThreadId;
+	};
+
+/**
+ * CSecondaryThread - An active object who's sole purpose is to start the second thread and keep it alive.
+ *
+ * .
+ */
+class CSecondaryThread : public CActive
+	{
+public:
+	static CSecondaryThread* NewL(MLogArrayAccess& aArrayAccess, TBool aFlushOn);
+	virtual void RunL();
+	virtual void DoCancel();
+	TInt RunError(TInt aError);
+	void SignalRequestSemaphore();
+	~CSecondaryThread();
+private:
+	CSecondaryThread(MLogArrayAccess& aArrayAccess, TBool aFlushOn);
+	void ConstructL();
+	void StartSecondaryThreadL(TBool aRestarting);
+private:
+	MLogArrayAccess& iArrayAccess;
+	CShutDownMessage* iShutDownMessage;
+	RThread iSecondaryThread;
+	TBool iFlushingOn;
+	};
+
+
+
+#endif // __COMSDBGSVR_H__
+