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