// =====================================================================
/*!
//
//  \file TSystemLogging.hh
//  \brief This file contains the TSystemLogging class.
//  \author Go IWAI <goiwai@users.sourceforge.jp>
//
//  $Id: TSystemLogging.hh,v 1.10 2004/06/24 15:15:26 goiwai Exp $
//  $Name: CLDAQ-1-14-06 $
//  $Log: TSystemLogging.hh,v $
//  Revision 1.10  2004/06/24 15:15:26  goiwai
//  たくさんの変更
//  Tcout,Tcerr,Tlogをバッファ経由にした。
//  何個かexternした。Tlog,Tcout,Tcerr,Tinfo...Tcritなど出力関係。
//
//  Revision 1.9  2004/03/07 10:30:34  goiwai
//  ROOTに組みこむためのおまじないマクロを埋めこみました。
//  全てにおいて完全に動作するわけではありません。
//
//  Revision 1.8  2004/01/19 23:10:08  goiwai
//  Tsyslog.hでやってたことをここで行なうようにしました.(TemergやTinfoなど)
//  どうもexternすると共有ライブラリつくるときにこけてしまうので,staticな
//  変数とした.いいのかな?
//
//  Revision 1.7  2004/01/19 21:09:43  goiwai
//  プリプロセッサの接頭辞をCLDAQ__に変更しました.
//
//  Revision 1.6  2003/12/06 10:13:51  goiwai
//  TSystemLogging& operator=() -> const TSystemLogging& operator=()
//  に変更しました.
//
//  Revision 1.5  2003/12/04 23:19:52  goiwai
//  システムロガーにメッセージ送信するための部品です.
//  ここでexternするとリンクできないといって怒られるので
//  Tsyslog.hというファイルでextern宣言しています.
//
//  Revision 1.4  2003/11/03 08:35:15  goiwai
//  Doxygen用のタグとコメントをうちこんでいく試みを開始しました.
//
//  Revision 1.3  2003/10/06 16:37:49  goiwai
//  *** empty log message ***
//
//  Revision 1.2  2003/07/30 16:21:21  goiwai
//  ファイルにコミットログをつけることにしました.
//
*/
// =====================================================================
#ifndef CLDAQ__TSYSTEMLOGGING_HH
#define CLDAQ__TSYSTEMLOGGING_HH

#include "Tglobals.h"

/*!
// \example
//
// If example code exists.
//
*/

/*!
// \class TSystemLogging
// \brief This is the TSystemLogging class.
// \author Go IWAI <goiwai@users.sourceforge.jp>
//
// The TSystemLogging class detail description.
// Write it down ASAP!
//
// \todo None?
// \bug None?
// \ingroup SystemCategory
*/
class TSystemLogging
{

  public:
    //! theOptionにはORしたものをあたえる
    enum {
      //! システムロガーに送る一方でシステムコンソールにも直接書く.
      CONS = LOG_CONS, 
      //! ログ記録用プログラムとの接続を即座に開始する.
      NDELAY = LOG_NDELAY,
      //! メッセージを記録する際に生成される子プロセスの終了を待たない.
      NOWAIT = LOG_NOWAIT,
      //! Record()が呼ばれるまで,接続の開始を行わない.
      ODELAY = LOG_ODELAY,
      //! 標準エラー出力もする.
      PERORR = LOG_PERROR,
      //! 個々のメッセージにPIDを含める.
      PID = LOG_PID
    };

    //! ファシリティ,出力先と考えてよい
    enum {
      //! セキュリティ/認証 メッセージ
      AUTH = LOG_AUTH,
      //! セキュリティ/認証 メッセージ (プライベート)
      AUTHPRIV = LOG_AUTHPRIV,
      //! クロックデーモン (cron と at)
      CRON = LOG_CRON,
      //! 特定の facility 値を持たないシステムデーモン
      DAEMON = LOG_DAEMON,
      //! ftp デーモン
      FTP = LOG_FTP,
      //! カーネルメッセージ
      KERN = LOG_KERN,
      //! ローカルな使用のためにリザーブされている
      LOCAL0 = LOG_LOCAL0,
      //! ローカルな使用のためにリザーブされている
      LOCAL1 = LOG_LOCAL1,
      //! ローカルな使用のためにリザーブされている
      LOCAL2 = LOG_LOCAL2,
      //! ローカルな使用のためにリザーブされている
      LOCAL3 = LOG_LOCAL3,
      //! ローカルな使用のためにリザーブされている
      LOCAL4 = LOG_LOCAL4,
      //! ローカルな使用のためにリザーブされている
      LOCAL5 = LOG_LOCAL5,
      //! ローカルな使用のためにリザーブされている
      LOCAL6 = LOG_LOCAL6,
      //! ローカルな使用のためにリザーブされている
      LOCAL7 = LOG_LOCAL7,
      //! ラインプリンタ・サブシステム
      LPR = LOG_LPR,
      //! メール・サブシステム
      MAIL = LOG_MAIL,
      //! USENET ニュース・サブシステム
      NEWS = LOG_NEWS,
      //! syslogd によって内部的に発行されるメッセージ
      SYSLOG = LOG_SYSLOG,
      //! 一般的なユーザレベルメッセージ
      USER = LOG_USER,
      //! UUCPサブシステム
      UUCP = LOG_UUCP
    };

    //! レベル (プライオリティはファシリティとの組み合わせ)
    enum {
      //! システムが使用不可
      EMERG = LOG_EMERG,
      //! 直ちに行動を起こさなければならない
      ALERT = LOG_ALERT,
      //! 危険な状態  
      CRIT = LOG_CRIT,
      //! エラーの状態
      ERROR = LOG_ERR,
      //! ワーニングの状態
      WARNING = LOG_WARNING,
      //! 通常だが重要な状態
      NOTICE = LOG_NOTICE,
      //! インフォメーションメッセージ
      INFO = LOG_INFO,
      //! デバッグレベルのメッセージ
      DEBUG = LOG_DEBUG
    };


  private:
    Tint theLevel;
    Tint theFacility;
    Tint theOption;
    Tstring theID;
    Tstring theMessageBuffer;

  public:
    TSystemLogging( Tint level=INFO, Tint facility=USER, Tint option=PID|ODELAY );
    TSystemLogging( const TSystemLogging& right );
    ~TSystemLogging();

  public:
    Tvoid Open( Tint option, Tint facility );
    Tvoid Open( Tint option );
    Tvoid Open();
    Tvoid Close();
    Tvoid Record( Tint level, const Tstring& format, ...);
    Tvoid Record( const Tstring& format, ...);
    Tvoid Record( Tint level, const Tstring& format, va_list ap );
    Tvoid Record( const Tstring& format, va_list ap );

  public:
    Tint GetLevel() const;
    Tint GetFacility() const;
    Tint GetOption() const;
    const Tstring& GetID() const;
    const Tstring& GetMessageBuffer() const;
    Tvoid SetLevel( Tint level );
    Tvoid SetFacility( Tint facility );
    Tvoid SetOption( Tint option );
    Tvoid SetID( const Tstring& ident );
    Tvoid SetID();
    Tvoid SetMessageBuffer( const Tstring& buffer );

  public:
    Tvoid AddBuffer( const Tstring& message );
    Tvoid ClearBuffer();

  public:
    const TSystemLogging& operator=( const TSystemLogging& right );
    TSystemLogging& operator<<( Tostream& (*pf)(Tostream&) );
    TSystemLogging& operator<<( Tostream& os );
    TSystemLogging& operator<<( const Tstring& message );
    TSystemLogging& operator<<( Tdouble n );
    TSystemLogging& operator<<( Tdouble* n );
    TSystemLogging& operator<<( Tfloat n );
    TSystemLogging& operator<<( Tfloat* n );
    TSystemLogging& operator<<( Tint n );
    TSystemLogging& operator<<( Tint* n );
    TSystemLogging& operator<<( TUint n );
    TSystemLogging& operator<<( TUint* n );
    TSystemLogging& operator<<( Tshort n );
    TSystemLogging& operator<<( Tshort* n );
    TSystemLogging& operator<<( TUshort n );
    TSystemLogging& operator<<( TUshort* n );
    TSystemLogging& operator<<( Tlong n );
    TSystemLogging& operator<<( Tlong* n );
    TSystemLogging& operator<<( TUlong n );
    TSystemLogging& operator<<( TUlong* n );
    TSystemLogging& operator<<( Tchar n );
    TSystemLogging& operator<<( TUchar n );

#ifdef __CLDAQ_ROOT_DLL
    ClassDef(TSystemLogging,0)
#endif

};

inline Tvoid TSystemLogging::AddBuffer( const Tstring& message )
{
  theMessageBuffer += message;
  return;
}

inline Tvoid TSystemLogging::ClearBuffer()
{
  theMessageBuffer.clear();
  return;
}

inline TSystemLogging& TSystemLogging::operator<<( Tostream& os )
{
  return *this;
}

inline TSystemLogging& TSystemLogging::operator<<( const Tstring& message )
{
  AddBuffer( message );
  return *this;
}

inline TSystemLogging& TSystemLogging::operator<<( Tchar n )
{
  Tstring s(1,n);
  return *this << s;
}

inline TSystemLogging& TSystemLogging::operator<<( TUchar n )
{
  Tstring s(1,(Tchar)n);
  return *this << s;
}

inline TSystemLogging& TSystemLogging::operator<<( Tdouble n )
{
  return *this << dtostr( n, 0 );
}

inline TSystemLogging& TSystemLogging::operator<<( Tdouble* n )
{
  return *this << (Tint*)n;
}

inline TSystemLogging& TSystemLogging::operator<<( Tfloat n )
{
  return *this << ftostr( n, 0 );
}

inline TSystemLogging& TSystemLogging::operator<<( Tfloat* n )
{
  return *this << (Tint*)n;
}

inline TSystemLogging& TSystemLogging::operator<<( Tint n )
{
  return *this << itostr( n, 0 );
}

inline TSystemLogging& TSystemLogging::operator<<( TUint n )
{
  return *this << ultostr( n, 0 );
}

inline TSystemLogging& TSystemLogging::operator<<( TUint* n )
{
  return *this << (Tint*)n;
}

inline TSystemLogging& TSystemLogging::operator<<( Tshort n )
{
  return *this << itostr( n, 0 );
}

inline TSystemLogging& TSystemLogging::operator<<( Tshort* n )
{
  return *this << (Tint*)n;
}

inline TSystemLogging& TSystemLogging::operator<<( TUshort n )
{
  return *this << ultostr( n, 0 );
}

inline TSystemLogging& TSystemLogging::operator<<( TUshort* n )
{
  return *this << (Tint*)n;
}

inline TSystemLogging& TSystemLogging::operator<<( Tlong n )
{
  return *this << ltostr( n, 0 );
}

inline TSystemLogging& TSystemLogging::operator<<( Tlong* n )
{
  return *this << (Tint*)n;
}

inline TSystemLogging& TSystemLogging::operator<<( TUlong n )
{
  return *this << ultostr( n, 0 );
}

inline TSystemLogging& TSystemLogging::operator<<( TUlong* n )
{
  return *this << (Tint*)n;
}

inline Tint TSystemLogging::GetLevel() const
{
  return theLevel;
}

inline Tint TSystemLogging::GetFacility() const
{
  return theFacility;
}

inline Tint TSystemLogging::GetOption() const
{
  return theOption;
}

inline const Tstring& TSystemLogging::GetID() const
{
  return theID;
}

inline const Tstring& TSystemLogging::GetMessageBuffer() const
{
  return theMessageBuffer;
}

inline Tvoid TSystemLogging::SetLevel( Tint level )
{
  theLevel = level;
  SetID();
  return;
}

inline Tvoid TSystemLogging::SetFacility( Tint facility )
{
  theFacility = facility;
  return;
}

inline Tvoid TSystemLogging::SetOption( Tint option )
{
  theOption = option;
  return;
}

inline Tvoid TSystemLogging::SetID( const Tstring& ident )
{
  theID = ident;
  return;
}

inline Tvoid TSystemLogging::SetMessageBuffer( const Tstring& buffer )
{
  theMessageBuffer = buffer;
  return;
}

#ifdef __cplusplus
extern "C" {
#endif
  extern TSystemLogging Temerg;
  extern TSystemLogging Talert;
  extern TSystemLogging Tcrit;
  extern TSystemLogging Terror;
  extern TSystemLogging Twarn;
  extern TSystemLogging Tnotice;
  extern TSystemLogging Tinfo;
  extern TSystemLogging Tdebug;
#ifdef __cplusplus
}
#endif

#endif
