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 | 73 | |
| 74 | 74 | void pw3270_application_set_ui_style(GApplication *app, PW3270_UI_STYLE type); |
| 75 | 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 | 78 | // Plugins |
| 78 | 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 | 57 | } |
| 58 | 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 | 60 | int main (int argc, char **argv) { |
| 66 | 61 | |
| 67 | 62 | int status = -1; |
| ... | ... | @@ -86,8 +81,6 @@ int main (int argc, char **argv) { |
| 86 | 81 | } |
| 87 | 82 | #endif // _WIN32 |
| 88 | 83 | |
| 89 | - g_log_set_default_handler(g_log_to_lib3270,NULL); | |
| 90 | - | |
| 91 | 84 | bind_textdomain_codeset(PACKAGE_NAME, "UTF-8"); |
| 92 | 85 | textdomain(PACKAGE_NAME); |
| 93 | 86 | ... | ... |
src/objects/application/application.c
| ... | ... | @@ -56,6 +56,7 @@ struct _pw3270Application { |
| 56 | 56 | |
| 57 | 57 | GSettings * settings; |
| 58 | 58 | GList * keypads; |
| 59 | + gchar * logfile; | |
| 59 | 60 | gboolean allow_tabs; ///< @brief Always open window. |
| 60 | 61 | |
| 61 | 62 | GSList * plugins; ///< @brief Handlers of the loaded plugins. |
| ... | ... | @@ -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 | 141 | static void pw3270Application_class_init(pw3270ApplicationClass *klass) { |
| 131 | 142 | |
| 132 | 143 | GObjectClass *object_class = G_OBJECT_CLASS(klass); |
| 133 | 144 | |
| 145 | + g_log_set_default_handler(g_log_to_lib3270,NULL); | |
| 146 | + | |
| 134 | 147 | object_class->get_property = get_property; |
| 135 | 148 | object_class->set_property = set_property; |
| 136 | 149 | object_class->finalize = finalize; |
| ... | ... | @@ -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 | 233 | static gboolean on_allow_tabs(const gchar G_GNUC_UNUSED(*option), const gchar *value, gpointer G_GNUC_UNUSED(dunno), GError **error) { |
| 227 | 234 | pw3270Application *app = PW3270_APPLICATION(g_application_get_default()); |
| 228 | 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 | 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 | 250 | static void pw3270Application_init(pw3270Application *app) { |
| 238 | 251 | |
| 239 | 252 | static GOptionEntry cmd_options[] = { |
| 240 | 253 | |
| 241 | 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 | 257 | { NULL } |
| 245 | 258 | |
| 246 | 259 | }; |
| ... | ... | @@ -355,6 +368,13 @@ static void finalize(GObject *object) { |
| 355 | 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 | 378 | g_list_free_full(application->keypads,g_object_unref); |
| 359 | 379 | |
| 360 | 380 | G_OBJECT_CLASS(pw3270Application_parent_class)->finalize(object); |
| ... | ... | @@ -640,3 +660,50 @@ GList * pw3270_application_get_keypad_models(GApplication *app) { |
| 640 | 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 | + | ... | ... |