Commit fa528fb5bb97b91b53f250c4f685e1d3d7706ca0
1 parent
37bf41db
Exists in
master
and in
2 other branches
Implementing default log file from command line option.
Showing
3 changed files
with
76 additions
and
15 deletions
Show diff stats
src/include/pw3270/application.h
@@ -73,6 +73,7 @@ GList * pw3270_application_get_keypad_models(GApplication *app); | @@ -73,6 +73,7 @@ GList * pw3270_application_get_keypad_models(GApplication *app); | ||
73 | 73 | ||
74 | void pw3270_application_set_ui_style(GApplication *app, PW3270_UI_STYLE type); | 74 | void pw3270_application_set_ui_style(GApplication *app, PW3270_UI_STYLE type); |
75 | PW3270_UI_STYLE pw3270_application_get_ui_style(GApplication *app); | 75 | PW3270_UI_STYLE pw3270_application_get_ui_style(GApplication *app); |
76 | +void pw3270_application_set_log_filename(GApplication *app, const gchar *filename); | ||
76 | 77 | ||
77 | // Plugins | 78 | // Plugins |
78 | void pw3270_application_plugin_foreach(GApplication *app, GFunc func, gpointer user_data); | 79 | void pw3270_application_plugin_foreach(GApplication *app, GFunc func, gpointer user_data); |
src/main/main.c
@@ -57,11 +57,6 @@ static gboolean quit_signal(GtkApplication *app) { | @@ -57,11 +57,6 @@ static gboolean quit_signal(GtkApplication *app) { | ||
57 | } | 57 | } |
58 | #endif // G_OS_UNIX | 58 | #endif // G_OS_UNIX |
59 | 59 | ||
60 | -static void g_log_to_lib3270(const gchar *log_domain,GLogLevelFlags G_GNUC_UNUSED(log_level),const gchar *message,gpointer G_GNUC_UNUSED(user_data)) { | ||
61 | - debug("%s",message); | ||
62 | - lib3270_write_log(NULL,log_domain ? log_domain : G_STRINGIFY(PRODUCT_NAME),"%s",message); | ||
63 | -} | ||
64 | - | ||
65 | int main (int argc, char **argv) { | 60 | int main (int argc, char **argv) { |
66 | 61 | ||
67 | int status = -1; | 62 | int status = -1; |
@@ -86,8 +81,6 @@ int main (int argc, char **argv) { | @@ -86,8 +81,6 @@ int main (int argc, char **argv) { | ||
86 | } | 81 | } |
87 | #endif // _WIN32 | 82 | #endif // _WIN32 |
88 | 83 | ||
89 | - g_log_set_default_handler(g_log_to_lib3270,NULL); | ||
90 | - | ||
91 | bind_textdomain_codeset(PACKAGE_NAME, "UTF-8"); | 84 | bind_textdomain_codeset(PACKAGE_NAME, "UTF-8"); |
92 | textdomain(PACKAGE_NAME); | 85 | textdomain(PACKAGE_NAME); |
93 | 86 |
src/objects/application/application.c
@@ -56,6 +56,7 @@ struct _pw3270Application { | @@ -56,6 +56,7 @@ struct _pw3270Application { | ||
56 | 56 | ||
57 | GSettings * settings; | 57 | GSettings * settings; |
58 | GList * keypads; | 58 | GList * keypads; |
59 | + gchar * logfile; | ||
59 | gboolean allow_tabs; ///< @brief Always open window. | 60 | gboolean allow_tabs; ///< @brief Always open window. |
60 | 61 | ||
61 | GSList * plugins; ///< @brief Handlers of the loaded plugins. | 62 | GSList * plugins; ///< @brief Handlers of the loaded plugins. |
@@ -127,10 +128,22 @@ static void window_removed(GtkApplication *application, GtkWindow *window) { | @@ -127,10 +128,22 @@ static void window_removed(GtkApplication *application, GtkWindow *window) { | ||
127 | 128 | ||
128 | } | 129 | } |
129 | 130 | ||
131 | +static void g_log_to_lib3270(const gchar *log_domain,GLogLevelFlags G_GNUC_UNUSED(log_level),const gchar *message,gpointer G_GNUC_UNUSED(user_data)) { | ||
132 | + debug("%s",message); | ||
133 | + lib3270_write_log( | ||
134 | + NULL, | ||
135 | + log_domain ? log_domain : G_STRINGIFY(PRODUCT_NAME), | ||
136 | + "%s", | ||
137 | + message | ||
138 | + ); | ||
139 | +} | ||
140 | + | ||
130 | static void pw3270Application_class_init(pw3270ApplicationClass *klass) { | 141 | static void pw3270Application_class_init(pw3270ApplicationClass *klass) { |
131 | 142 | ||
132 | GObjectClass *object_class = G_OBJECT_CLASS(klass); | 143 | GObjectClass *object_class = G_OBJECT_CLASS(klass); |
133 | 144 | ||
145 | + g_log_set_default_handler(g_log_to_lib3270,NULL); | ||
146 | + | ||
134 | object_class->get_property = get_property; | 147 | object_class->get_property = get_property; |
135 | object_class->set_property = set_property; | 148 | object_class->set_property = set_property; |
136 | object_class->finalize = finalize; | 149 | object_class->finalize = finalize; |
@@ -217,12 +230,6 @@ static gboolean on_user_interface(const gchar G_GNUC_UNUSED(*option), const gcha | @@ -217,12 +230,6 @@ static gboolean on_user_interface(const gchar G_GNUC_UNUSED(*option), const gcha | ||
217 | 230 | ||
218 | } | 231 | } |
219 | 232 | ||
220 | -static gboolean on_log_file(const gchar G_GNUC_UNUSED(*option), const gchar *value, gpointer G_GNUC_UNUSED(dunno), GError **error) { | ||
221 | - pw3270Application *app = PW3270_APPLICATION(g_application_get_default()); | ||
222 | - | ||
223 | - return TRUE; | ||
224 | -} | ||
225 | - | ||
226 | static gboolean on_allow_tabs(const gchar G_GNUC_UNUSED(*option), const gchar *value, gpointer G_GNUC_UNUSED(dunno), GError **error) { | 233 | static gboolean on_allow_tabs(const gchar G_GNUC_UNUSED(*option), const gchar *value, gpointer G_GNUC_UNUSED(dunno), GError **error) { |
227 | pw3270Application *app = PW3270_APPLICATION(g_application_get_default()); | 234 | pw3270Application *app = PW3270_APPLICATION(g_application_get_default()); |
228 | app->allow_tabs = (g_ascii_strcasecmp(value,"no") != 0); | 235 | app->allow_tabs = (g_ascii_strcasecmp(value,"no") != 0); |
@@ -234,13 +241,19 @@ static gboolean on_allow_tabs(const gchar G_GNUC_UNUSED(*option), const gchar *v | @@ -234,13 +241,19 @@ static gboolean on_allow_tabs(const gchar G_GNUC_UNUSED(*option), const gchar *v | ||
234 | return TRUE; | 241 | return TRUE; |
235 | } | 242 | } |
236 | 243 | ||
244 | +static gboolean on_logfile(const gchar G_GNUC_UNUSED(*option), const gchar *value, gpointer G_GNUC_UNUSED(dunno), GError **error) { | ||
245 | + pw3270Application *app = PW3270_APPLICATION(g_application_get_default()); | ||
246 | + pw3270_application_set_log_filename(app,value); | ||
247 | + return TRUE; | ||
248 | +} | ||
249 | + | ||
237 | static void pw3270Application_init(pw3270Application *app) { | 250 | static void pw3270Application_init(pw3270Application *app) { |
238 | 251 | ||
239 | static GOptionEntry cmd_options[] = { | 252 | static GOptionEntry cmd_options[] = { |
240 | 253 | ||
241 | { "user-interface", 'U', 0, G_OPTION_ARG_CALLBACK, &on_user_interface, N_( "Set the user-interface type" ), NULL }, | 254 | { "user-interface", 'U', 0, G_OPTION_ARG_CALLBACK, &on_user_interface, N_( "Set the user-interface type" ), NULL }, |
242 | - { "log-filename", 'l', 0, G_OPTION_ARG_CALLBACK, &on_log_file, N_( "Set custom log file for the active session" ), NULL }, | ||
243 | - { "allow-tabs", 'T', 0, G_OPTION_ARG_CALLBACK, &on_allow_tabs, N_( "If 'no' allways open a window" ), NULL }, | 255 | + { "allow-tabs", 'T', 0, G_OPTION_ARG_CALLBACK, &on_allow_tabs, N_( "If 'no' allways open a window" ), NULL }, |
256 | + { "logfile", 'l', 0, G_OPTION_ARG_CALLBACK, &on_logfile, N_( "Set default log file name" ), NULL }, | ||
244 | { NULL } | 257 | { NULL } |
245 | 258 | ||
246 | }; | 259 | }; |
@@ -355,6 +368,13 @@ static void finalize(GObject *object) { | @@ -355,6 +368,13 @@ static void finalize(GObject *object) { | ||
355 | application->settings = NULL; | 368 | application->settings = NULL; |
356 | } | 369 | } |
357 | 370 | ||
371 | + lib3270_set_log_handler(NULL,NULL,NULL); | ||
372 | + | ||
373 | + if(application->logfile) { | ||
374 | + g_free(application->logfile); | ||
375 | + application->logfile = NULL; | ||
376 | + } | ||
377 | + | ||
358 | g_list_free_full(application->keypads,g_object_unref); | 378 | g_list_free_full(application->keypads,g_object_unref); |
359 | 379 | ||
360 | G_OBJECT_CLASS(pw3270Application_parent_class)->finalize(object); | 380 | G_OBJECT_CLASS(pw3270Application_parent_class)->finalize(object); |
@@ -640,3 +660,50 @@ GList * pw3270_application_get_keypad_models(GApplication *app) { | @@ -640,3 +660,50 @@ GList * pw3270_application_get_keypad_models(GApplication *app) { | ||
640 | return PW3270_APPLICATION(app)->keypads; | 660 | return PW3270_APPLICATION(app)->keypads; |
641 | } | 661 | } |
642 | 662 | ||
663 | +static int loghandler(const H3270 *hSession, pw3270Application *app, const char *module, int code, const char *message) { | ||
664 | + | ||
665 | + if(!app->logfile) { | ||
666 | + return -1; | ||
667 | + } | ||
668 | + | ||
669 | + FILE *f = fopen(app->logfile,"a"); | ||
670 | + | ||
671 | + if(f) { | ||
672 | + time_t ltime = time(0); | ||
673 | + | ||
674 | + char timestamp[80]; | ||
675 | +#ifdef HAVE_LOCALTIME_R | ||
676 | + struct tm tm; | ||
677 | + strftime(timestamp, 79, "%x %X", localtime_r(<ime,&tm)); | ||
678 | +#else | ||
679 | + strftime(timestamp, 79, "%x %X", localtime(<ime)); | ||
680 | +#endif // HAVE_LOCALTIME_R | ||
681 | + | ||
682 | + fprintf(f,"%s %s\t%s\n",timestamp,module,message); | ||
683 | + | ||
684 | + fclose(f); | ||
685 | + } | ||
686 | + | ||
687 | + return 0; | ||
688 | +} | ||
689 | + | ||
690 | +void pw3270_application_set_log_filename(GApplication *app, const gchar *filename) { | ||
691 | + | ||
692 | + g_return_if_fail(PW3270_IS_APPLICATION(app)); | ||
693 | + | ||
694 | + pw3270Application * application = PW3270_APPLICATION(app); | ||
695 | + | ||
696 | + if(application->logfile) { | ||
697 | + g_free(application->logfile); | ||
698 | + application->logfile = NULL; | ||
699 | + } | ||
700 | + | ||
701 | + if(filename) { | ||
702 | + application->logfile = g_strdup(filename); | ||
703 | + lib3270_set_log_handler(NULL,(LIB3270_LOG_HANDLER) loghandler, app); | ||
704 | + } else { | ||
705 | + lib3270_set_log_handler(NULL,NULL,NULL); | ||
706 | + } | ||
707 | + | ||
708 | +} | ||
709 | + |