00001 #ifndef __reporter_h__
00002 #define __reporter_h__
00003
00004 #include <string>
00005 #include <vector>
00006
00007 #include "asserts.h"
00008 #include "types.h"
00009 #include "timer.h"
00010 #include "table.h"
00011
00012
00013 class vault_stats_report
00014 {
00015 public:
00016 vault_stats_report();
00017 vault_stats_report(const vault_stats_report& a_class);
00018 vault_stats_report(
00019 const std::string& a_message,
00020 const filesystem& a_class
00021 );
00022 ~vault_stats_report();
00023
00024 void clear(void);
00025
00026 void assign(
00027 const vault_stats_report& a_class
00028 );
00029 void assign(
00030 const std::string& a_message,
00031 const filesystem& a_class
00032 );
00033 void assign(
00034 const std::string& a_message,
00035 const uint64 a_total_blocks,
00036 const uint64 a_free_blocks,
00037 const uint64 a_total_inodes,
00038 const uint64 a_free_inodes
00039 );
00040 void assign(
00041 const std::string& a_message,
00042 const std::string& a_time,
00043 const uint64 a_total_blocks,
00044 const uint64 a_free_blocks,
00045 const uint64 a_total_inodes,
00046 const uint64 a_free_inodes
00047 );
00048
00049 const std::string& time(void) const;
00050 const std::string& message(void) const;
00051 const uint64 total_blocks(void) const;
00052 const uint64 free_blocks(void) const;
00053 const uint64 total_inodes(void) const;
00054 const uint64 free_inodes(void) const;
00055
00056 vault_stats_report& operator=(const vault_stats_report& a_class);
00057
00058 private:
00059 std::string m_time;
00060 std::string m_message;
00061 uint64 m_total_blocks;
00062 uint64 m_free_blocks;
00063 uint64 m_total_inodes;
00064 uint64 m_free_inodes;
00065 };
00066
00067
00068 class vault_report
00069 {
00070 public:
00071 vault_report();
00072 ~vault_report();
00073
00074 void clear(void);
00075
00076 void add_report(const vault_stats_report& a_class);
00077
00078 void write_report(std::ostream& a_out);
00079
00080 void format_synopsis(table& a_table);
00081 private:
00082 std::vector<vault_stats_report> m_reports;
00083 };
00084
00085
00086 class job_path_report
00087 {
00088 public:
00089 job_path_report();
00090 job_path_report(const job_path_report& a_class);
00091 job_path_report(
00092 const std::string a_source,
00093 const timer a_time,
00094 const uint16 a_exit_code,
00095 const uint16 a_signal_num,
00096 const rsync_behavior::value_type a_behavior,
00097 const std::string a_error_message
00098 );
00099 ~job_path_report();
00100
00101 void clear(void);
00102
00103 void assign(const job_path_report& a_class);
00104 void assign(
00105 const std::string a_source,
00106 const timer a_time,
00107 const uint16 a_exit_code,
00108 const uint16 a_signal_num,
00109 const rsync_behavior::value_type a_behavior,
00110 const std::string a_error_message
00111 );
00112
00113 const bool status(void) const;
00114 void source(const std::string& a_class);
00115 const std::string& source(void) const;
00116 void time(const timer& a_class);
00117 const timer& time(void) const;
00118 void exit_code(const int a_exit_code);
00119 const int exit_code(void) const;
00120 void signal_num(const int a_signal_num);
00121 const int signal_num(void) const;
00122 const rsync_behavior::value_type behavior(void) const;
00123 void error_msg(const std::string& a_class);
00124 const std::string& error_msg(void) const;
00125
00126 job_path_report& operator=(const job_path_report& a_class);
00127
00128 private:
00129 std::string m_source;
00130 timer m_time;
00131 int m_exit_code;
00132 int m_signal_num;
00133 std::string m_error_msg;
00134 rsync_behavior::value_type m_behavior;
00135 };
00136
00137
00138 class reportio
00139 {
00140 public:
00141 enum source_type {
00142 rsync,
00143 report
00144 };
00145 static const char *tags[];
00146
00147 void write_rsync_out(const std::string& a_str);
00148 void write_rsync_err(const std::string& a_str);
00149 void write_report(
00150 const std::string a_source,
00151 const timer& a_timer,
00152 const int a_exit_code,
00153 const int a_signal_num,
00154 const rsync_behavior::value_type& a_behavior,
00155 const std::string& a_error_msg
00156 );
00157
00158 job_path_report parse(const std::string& a_str);
00159
00160 bool is_report(const std::string& a_str);
00161 };
00162
00163
00164 class single_job_report
00165 {
00166 public:
00167 single_job_report();
00168 ~single_job_report();
00169
00170 void clear(void);
00171
00172 void add_report(const job_path_report& a_class);
00173 const std::vector<job_path_report>& reports(void) const;
00174
00175 void id(const std::string& a_str);
00176 const std::string& id(void) const;
00177
00178 const bool status(void) const;
00179
00180 private:
00181 std::vector<job_path_report> m_reports;
00182 std::string m_id;
00183 };
00184
00185
00186 class jobs_report
00187 {
00188 public:
00189 jobs_report();
00190 ~jobs_report();
00191
00192 void clear(void);
00193
00194 void add_report(const single_job_report& a_class);
00195 const std::vector<single_job_report>& reports(void) const;
00196
00197 void write_report(std::ostream& a_out);
00198
00199 void format_synopsis(table& a_table);
00200
00201 private:
00202 std::vector<single_job_report> m_jobs;
00203 };
00204
00205
00206
00207
00208
00209
00210 class report_manager
00211 {
00212 public:
00213 report_manager();
00214 ~report_manager();
00215
00216 void init(void);
00217 const bool initialized(void) const;
00218 void clear(void);
00219
00220 void set_total_time(const timer& a_class);
00221
00222 vault_report& vault(void);
00223 jobs_report& jobs(void);
00224
00225 void print_report(void);
00226 void file_report(void);
00227 void write_report(std::ostream& a_out);
00228
00229 void format_synopsis(table& a_table);
00230
00231 private:
00232 bool m_initialized;
00233 timer m_total_time;
00234 vault_report m_vault;
00235 jobs_report m_jobs;
00236
00237 void mf_write_header(std::ostream& a_out);
00238 void mf_write_synopsis(std::ostream& a_out);
00239 };
00240
00241 extern report_manager reporter;
00242
00243 #endif