diff --git a/src/include/pw3270/application.h b/src/include/pw3270/application.h index c58eb5f..c08b3c9 100644 --- a/src/include/pw3270/application.h +++ b/src/include/pw3270/application.h @@ -73,6 +73,7 @@ GList * pw3270_application_get_keypad_models(GApplication *app); void pw3270_application_set_ui_style(GApplication *app, PW3270_UI_STYLE type); PW3270_UI_STYLE pw3270_application_get_ui_style(GApplication *app); +void pw3270_application_set_log_filename(GApplication *app, const gchar *filename); // Plugins void pw3270_application_plugin_foreach(GApplication *app, GFunc func, gpointer user_data); diff --git a/src/main/main.c b/src/main/main.c index cca6e34..be15450 100644 --- a/src/main/main.c +++ b/src/main/main.c @@ -57,11 +57,6 @@ static gboolean quit_signal(GtkApplication *app) { } #endif // G_OS_UNIX -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)) { - debug("%s",message); - lib3270_write_log(NULL,log_domain ? log_domain : G_STRINGIFY(PRODUCT_NAME),"%s",message); -} - int main (int argc, char **argv) { int status = -1; @@ -86,8 +81,6 @@ int main (int argc, char **argv) { } #endif // _WIN32 - g_log_set_default_handler(g_log_to_lib3270,NULL); - bind_textdomain_codeset(PACKAGE_NAME, "UTF-8"); textdomain(PACKAGE_NAME); diff --git a/src/objects/application/application.c b/src/objects/application/application.c index d56174a..1e10e38 100644 --- a/src/objects/application/application.c +++ b/src/objects/application/application.c @@ -56,6 +56,7 @@ struct _pw3270Application { GSettings * settings; GList * keypads; + gchar * logfile; gboolean allow_tabs; ///< @brief Always open window. GSList * plugins; ///< @brief Handlers of the loaded plugins. @@ -127,10 +128,22 @@ static void window_removed(GtkApplication *application, GtkWindow *window) { } +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)) { + debug("%s",message); + lib3270_write_log( + NULL, + log_domain ? log_domain : G_STRINGIFY(PRODUCT_NAME), + "%s", + message + ); +} + static void pw3270Application_class_init(pw3270ApplicationClass *klass) { GObjectClass *object_class = G_OBJECT_CLASS(klass); + g_log_set_default_handler(g_log_to_lib3270,NULL); + object_class->get_property = get_property; object_class->set_property = set_property; object_class->finalize = finalize; @@ -217,12 +230,6 @@ static gboolean on_user_interface(const gchar G_GNUC_UNUSED(*option), const gcha } -static gboolean on_log_file(const gchar G_GNUC_UNUSED(*option), const gchar *value, gpointer G_GNUC_UNUSED(dunno), GError **error) { - pw3270Application *app = PW3270_APPLICATION(g_application_get_default()); - - return TRUE; -} - static gboolean on_allow_tabs(const gchar G_GNUC_UNUSED(*option), const gchar *value, gpointer G_GNUC_UNUSED(dunno), GError **error) { pw3270Application *app = PW3270_APPLICATION(g_application_get_default()); 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 return TRUE; } +static gboolean on_logfile(const gchar G_GNUC_UNUSED(*option), const gchar *value, gpointer G_GNUC_UNUSED(dunno), GError **error) { + pw3270Application *app = PW3270_APPLICATION(g_application_get_default()); + pw3270_application_set_log_filename(app,value); + return TRUE; +} + static void pw3270Application_init(pw3270Application *app) { static GOptionEntry cmd_options[] = { { "user-interface", 'U', 0, G_OPTION_ARG_CALLBACK, &on_user_interface, N_( "Set the user-interface type" ), NULL }, - { "log-filename", 'l', 0, G_OPTION_ARG_CALLBACK, &on_log_file, N_( "Set custom log file for the active session" ), NULL }, - { "allow-tabs", 'T', 0, G_OPTION_ARG_CALLBACK, &on_allow_tabs, N_( "If 'no' allways open a window" ), NULL }, + { "allow-tabs", 'T', 0, G_OPTION_ARG_CALLBACK, &on_allow_tabs, N_( "If 'no' allways open a window" ), NULL }, + { "logfile", 'l', 0, G_OPTION_ARG_CALLBACK, &on_logfile, N_( "Set default log file name" ), NULL }, { NULL } }; @@ -355,6 +368,13 @@ static void finalize(GObject *object) { application->settings = NULL; } + lib3270_set_log_handler(NULL,NULL,NULL); + + if(application->logfile) { + g_free(application->logfile); + application->logfile = NULL; + } + g_list_free_full(application->keypads,g_object_unref); G_OBJECT_CLASS(pw3270Application_parent_class)->finalize(object); @@ -640,3 +660,50 @@ GList * pw3270_application_get_keypad_models(GApplication *app) { return PW3270_APPLICATION(app)->keypads; } +static int loghandler(const H3270 *hSession, pw3270Application *app, const char *module, int code, const char *message) { + + if(!app->logfile) { + return -1; + } + + FILE *f = fopen(app->logfile,"a"); + + if(f) { + time_t ltime = time(0); + + char timestamp[80]; +#ifdef HAVE_LOCALTIME_R + struct tm tm; + strftime(timestamp, 79, "%x %X", localtime_r(<ime,&tm)); +#else + strftime(timestamp, 79, "%x %X", localtime(<ime)); +#endif // HAVE_LOCALTIME_R + + fprintf(f,"%s %s\t%s\n",timestamp,module,message); + + fclose(f); + } + + return 0; +} + +void pw3270_application_set_log_filename(GApplication *app, const gchar *filename) { + + g_return_if_fail(PW3270_IS_APPLICATION(app)); + + pw3270Application * application = PW3270_APPLICATION(app); + + if(application->logfile) { + g_free(application->logfile); + application->logfile = NULL; + } + + if(filename) { + application->logfile = g_strdup(filename); + lib3270_set_log_handler(NULL,(LIB3270_LOG_HANDLER) loghandler, app); + } else { + lib3270_set_log_handler(NULL,NULL,NULL); + } + +} + -- libgit2 0.21.2