williamr@2: // Copyright (c) 1997-2009 Nokia Corporation and/or its subsidiary(-ies).
williamr@2: // All rights reserved.
williamr@2: // This component and the accompanying materials are made available
williamr@2: // under the terms of the License "Symbian Foundation License v1.0" to Symbian Foundation members and "Symbian Foundation End User License Agreement v1.0" to non-members
williamr@2: // which accompanies this distribution, and is available
williamr@2: // at the URL "http://www.symbianfoundation.org/legal/licencesv10.html".
williamr@2: //
williamr@2: // Initial Contributors:
williamr@2: // Nokia Corporation - initial contribution.
williamr@2: //
williamr@2: // Contributors:
williamr@2: //
williamr@2: // Description:
williamr@2: // FLogger Client side header
williamr@2: // 
williamr@2: //
williamr@2: 
williamr@2: 
williamr@2: 
williamr@2: /**
williamr@2:  @file
williamr@2:  @internalTechnology
williamr@2: */
williamr@2: 
williamr@2: 
williamr@2: 
williamr@2: #ifndef __FLOGGER_H__
williamr@2: #define __FLOGGER_H__
williamr@2: 
williamr@2: #include <e32base.h>
williamr@2: 
williamr@2: /** Maximum log buffer size.
williamr@2: @internalTechnology */
williamr@2: const TInt KLogBufferSize=150;
williamr@2: 
williamr@2: // [All of this start up stuff copied from DBMS]
williamr@2: 
williamr@2: class FLogger
williamr@2: /** Controls the flogger server.
williamr@2: @internalComponent */
williamr@2: 	{
williamr@2: public:
williamr@2: 	class TSignal
williamr@2: /**
williamr@2: @internalComponent
williamr@2: */
williamr@2: 		{
williamr@2: 		friend class FLogger;
williamr@2: 	public:
williamr@2: 		inline TSignal() {}
williamr@2: 		inline TInt Set(const TDesC& aCommand);
williamr@2: 	
williamr@2: 		inline TSignal(TRequestStatus& aStatus);
williamr@2: 
williamr@2: 		inline TPtrC Command() const;
williamr@2: 
williamr@2: 	private:
williamr@2: 		TRequestStatus* iStatus;
williamr@2: 		TThreadId iId;
williamr@2: 		};
williamr@2: public:
williamr@2: 	static TInt Start();
williamr@2: 
williamr@2: 	IMPORT_C static TInt Run(TSignal& aSignal);
williamr@2: 
williamr@2: private:
williamr@2: 	static TInt Init();
williamr@2: 	};
williamr@2: 
williamr@2: 
williamr@2: /** The mode used to write to the log file.
williamr@2: @internalTechnology */
williamr@2: enum TFileLoggingMode 
williamr@2: 	{
williamr@2: 	/** Log file mode has not been explicitly set. */
williamr@2: 	EFileLoggingModeUnknown =0,
williamr@2: 	/** Open the log file in append mode. */
williamr@2: 	EFileLoggingModeAppend,
williamr@2: 	/** Open the log file in overwrite mode. */
williamr@2: 	EFileLoggingModeOverwrite,
williamr@2: 	EFileLoggingModeAppendRaw,
williamr@2: 	EFileLoggingModeOverwriteRaw	
williamr@2: 	};
williamr@2: 
williamr@2: NONSHARABLE_CLASS(TLogFormatter16Overflow) :public TDes16Overflow
williamr@2: /** Unicode overflow handler.
williamr@2: @internalComponent */
williamr@2: 	{
williamr@2: public:
williamr@2: 	virtual void Overflow(TDes16& aDes);
williamr@2: 	};
williamr@2: 
williamr@2: NONSHARABLE_CLASS(TLogFormatter8Overflow) :public TDes8Overflow
williamr@2: /** Overflow handler.
williamr@2: @internalComponent */
williamr@2: 	{
williamr@2: public:
williamr@2: 	virtual void Overflow(TDes8& aDes);
williamr@2: 	};
williamr@2: 
williamr@2: class TLogFormatter
williamr@2: /** Formatting methods for log file data.
williamr@2: @internalComponent */
williamr@2: 	{
williamr@2: public:
williamr@2: 	TLogFormatter();
williamr@2: 	void SetDateAndTime(TBool aUseDate,TBool aUseTime);
williamr@2: 	TInt FormatTextToWritableBuffer(TDes8& aBuf, const TDesC16& aText) const;
williamr@2: 	TInt FormatTextToWritableBuffer(TDes8& aBuf, const TDesC8& aText) const;
williamr@2: 	TInt ConvertToWritableBuffer(TDes8& aBuf, TRefByValue<const TDesC16> aFmt, VA_LIST& aList);
williamr@2: 	TInt ConvertToWritableBuffer(TDes8& aBuf, TRefByValue<const TDesC8> aFmt, VA_LIST& aList);
williamr@2: private:
williamr@2: 	void GetDateAndTimeL(TDes& aDate, TDes& aTime) const;
williamr@2: 	void WriteL(TDes8& aTrg, const TDesC16& aSrc) const;
williamr@2: 	void WriteL(TDes8& aTrg, const TDesC8& aSrc) const;
williamr@2: private:
williamr@2: 	TBool iUseDate;
williamr@2: 	TBool iUseTime;
williamr@2: 	TLogFormatter16Overflow iOverflow16;
williamr@2: 	TLogFormatter8Overflow iOverflow8;
williamr@2: 	};
williamr@2: 
williamr@2: class TLogFile
williamr@2: /** General access to packaged log files.
williamr@2: @internalComponent */
williamr@2: 	{
williamr@2: public:
williamr@2: 	TLogFile();
williamr@2: 	TLogFile(const TDesC& aDir, const TDesC& aName, TFileLoggingMode aMode);
williamr@2: 	TBool operator==(const TLogFile& aLogFile) const;
williamr@2: 	void Set(const TDesC& aDir, const TDesC& aName, TFileLoggingMode aMode);
williamr@2: 	inline TBool Valid() const;
williamr@2: 	inline TFileName Directory() const;
williamr@2: 	inline TFileName Name() const;
williamr@2: 	inline TFileLoggingMode Mode() const;
williamr@2: 	inline void SetValid(TBool aValid);
williamr@2: private:
williamr@2: 	TBool iValid;
williamr@2: 	TFileName iDirectory;
williamr@2: 	TFileName iName;
williamr@2: 	TFileLoggingMode iMode;
williamr@2: 	};
williamr@2: 
williamr@2: #include <flogger.inl>
williamr@2: 
williamr@2: class RFileLogger : public RSessionBase
williamr@2: /** Provides access methods to file logging.
williamr@2: 
williamr@2: The file logger API contains both static and non-static versions of access 
williamr@2: functions to the file logging system. 
williamr@2: @internalTechnology */
williamr@2: 	{
williamr@2: public:
williamr@2: 	IMPORT_C RFileLogger();
williamr@2: 	IMPORT_C ~RFileLogger();
williamr@2: 	IMPORT_C TVersion Version() const;
williamr@2: 	IMPORT_C TInt Connect();
williamr@2: 	IMPORT_C void SetDateAndTime(TBool aUseDate,TBool aUseTime);
williamr@2: 	IMPORT_C void CreateLog(const TDesC& aDir, const TDesC& aName, TFileLoggingMode aMode);
williamr@2: 	IMPORT_C void CloseLog();
williamr@2: 	IMPORT_C void Write(const TDesC16& aText);
williamr@2: 	IMPORT_C void WriteFormat(TRefByValue<const TDesC16> aFmt,...);
williamr@2: 	IMPORT_C void WriteFormat(TRefByValue<const TDesC16> aFmt, VA_LIST& aList);
williamr@2: 	IMPORT_C void Write(const TDesC8& aText);
williamr@2: 	IMPORT_C void WriteFormat(TRefByValue<const TDesC8> aFmt,...);
williamr@2: 	IMPORT_C void WriteFormat(TRefByValue<const TDesC8> aFmt, VA_LIST& aList);
williamr@2: 	IMPORT_C void HexDump(const TText* aHeader, const TText* aMargin, const TUint8* aPtr, TInt aLen);
williamr@2: 	IMPORT_C static void Write(const TDesC& aDir, const TDesC& aName, TFileLoggingMode aMode, const TDesC16& aText);
williamr@2: 	IMPORT_C static void WriteFormat(const TDesC& aDir, const TDesC& aName, TFileLoggingMode aMode, TRefByValue<const TDesC16> aFmt,...);
williamr@2: 	IMPORT_C static void WriteFormat(const TDesC& aDir, const TDesC& aName, TFileLoggingMode aMode, TRefByValue<const TDesC16> aFmt, VA_LIST& aList);
williamr@2: 	IMPORT_C static void Write(const TDesC& aDir, const TDesC& aName, TFileLoggingMode aMode, const TDesC8& aText);
williamr@2: 	IMPORT_C static void WriteFormat(const TDesC& aDir, const TDesC& aName, TFileLoggingMode aMode, TRefByValue<const TDesC8> aFmt,...);
williamr@2: 	IMPORT_C static void WriteFormat(const TDesC& aDir, const TDesC& aName, TFileLoggingMode aMode, TRefByValue<const TDesC8> aFmt, VA_LIST& aList);
williamr@2: 	IMPORT_C static void HexDump(const TDesC& aDir, const TDesC& aName, TFileLoggingMode aMode, const TText* aHeader, const TText* aMargin, const TUint8* aPtr, TInt aLen);
williamr@2: 	IMPORT_C TInt LastError() const;
williamr@2: 	IMPORT_C TBool LogValid() const;
williamr@2: 
williamr@2: private:
williamr@2: 	TInt DoConnect();
williamr@2: 	void DoWrite(const TDesC8& aBuf);
williamr@2: 	void DoStaticWrite(const TDesC8& aBuf);
williamr@2: 	void DoWriteFormat(TRefByValue<const TDesC16> aFmt, VA_LIST& aList);
williamr@2: 	void DoWriteFormat(TRefByValue<const TDesC8> aFmt, VA_LIST& aList);
williamr@2: 	static void DoStaticWriteFormat(const TDesC& aDir, const TDesC& aName, TFileLoggingMode aMode, TRefByValue<const TDesC16> aFmt, VA_LIST& aList);
williamr@2: 	static void DoStaticWriteFormat(const TDesC& aDir, const TDesC& aName, TFileLoggingMode aMode, TRefByValue<const TDesC8> aFmt, VA_LIST& aList);
williamr@2: 	void DoHexDump(const TText* aHeader, const TText* aMargin, const TUint8* aPtr, TInt aLen);
williamr@2: private:
williamr@2: 	TLogFormatter iFormatter;
williamr@2: 	TLogFile iLogFile;
williamr@2: 	TInt iLastError;
williamr@2: 	};
williamr@2: 
williamr@2: #endif