00001 #ifndef _FV_LOG_H_
00002 #define _FV_LOG_H_
00003
00004 #ifdef PARALLEL
00005 #include"pch_intf.h"
00006 #endif
00007 #include"uth_log.h"
00008 #include<memory>
00009 #include<cstdio>
00010 #include<fstream>
00011 #include<sstream>
00012
00013 namespace FemViewer {
00014
00015
00016 enum {
00017 NOWERE = 0x0000,
00018 LOGCONSOLE = 0x0001,
00019 LOGFILE = 0x0010,
00020 LOGDIALOG = 0x0100,
00021 LOGEXTERNAL = 0x1000,
00022 };
00023
00024
00025 enum eLevel {
00026 LogERROR = 0,
00027 LogWARNING,
00028 LogINFO,
00029 LogDEBUG,
00030 LogDEBUG1,
00031 };
00032
00033
00034 class mfvWindow;
00035
00036 class Log
00037 {
00038 static std::unique_ptr<Log> m_selfp;
00039 static const eLevel m_dfErrLevel;
00040 static const int m_dfLogDest;
00041 static FILE * m_dfLogFile;
00042 static FILE * m_dfLogConsole;
00043
00044 public:
00045 static bool Init(FILE *fp = stdout,mfvWindow *dlgp = nullptr);
00046 static bool IsInit(void) { return m_selfp != nullptr; }
00047 static const eLevel& Level() { return m_dfErrLevel; }
00048 static void Destroy();
00049 static Log& GetInstance();
00050 ~Log();
00051 void Msg(const char* str);
00052 void SetMode(int mode);
00053 void SetLevel(eLevel level);
00054 void Close();
00055
00056 protected:
00057 std::ostringstream m_log;
00058 int m_mode;
00059 FILE* m_consolep;
00060 FILE* m_filep;
00061 mfvWindow* m_dlgp;
00062
00063 void StartLogToFile();
00064 void EndLogToFile();
00065
00066 private:
00067
00068 Log(int mode,FILE* console,FILE* file,mfvWindow * dlgp);
00069
00070
00071 Log(const Log& rhs);
00072 Log& operator=(const Log& rhs);
00073
00074 #ifdef PARALLEL
00075 int _myprocid;
00076 int _mymasterid;
00077 int (*logto)(const char* str);
00078 static int sendlog(const char* str);
00079 static int updatelog(const char* str);
00080 #endif
00081 };
00082
00083 void log(const int level, const char *msg, ...);
00084
00085 #define MFP_FILE_NAME MF_FILE_NAME
00086 #ifdef NDEBUG
00087
00088
00089
00090 #define mfp_log_debug(M, ...)
00091 #else
00092
00093
00094
00095 #define mfp_log_debug(M, ...) log(FemViewer::LogDEBUG, "DEBUG %s:%d: " M "\n",MFP_FILE_NAME, __LINE__, ##__VA_ARGS__)
00096 #endif
00097
00098 #define mfp_log_err(M, ...) log(FemViewer::LogERROR, "ERROR: " M "\n", ##__VA_ARGS__)
00099 #define mfp_log_warn(M, ...) log(FemViewer::LogWARNING,"WARNING: " M "\n", ##__VA_ARGS__)
00100 #define mfp_log_info(M, ...) log(FemViewer::LogINFO,"INFO: " M "\n", ##__VA_ARGS__)
00101
00102 #ifdef PARALLEL
00103 void printParallel(const char*, ...);
00104 void printSynchronizedParallel(const char*, ...);
00105 #endif
00106
00107
00108 }
00109
00110
00111 #endif