diff --git a/pw3270.cbp b/pw3270.cbp index 026476a..a5b2ab4 100644 --- a/pw3270.cbp +++ b/pw3270.cbp @@ -130,6 +130,9 @@ + + diff --git a/src/include/pw3270/application.h b/src/include/pw3270/application.h index a5a6250..558d255 100644 --- a/src/include/pw3270/application.h +++ b/src/include/pw3270/application.h @@ -65,6 +65,7 @@ typedef struct _pw3270Application pw3270Application; GType pw3270Application_get_type(); GtkApplication * pw3270_application_new(const gchar *application_id, GApplicationFlags flags); +void pw3270_application_open_file(GtkApplication *application, GtkWindow **window, GFile *file); /// @brief Get application settings. /// @param app The pw3270 application object. diff --git a/src/objects/application/open.c b/src/objects/application/open.c index 32c7ece..f999d54 100644 --- a/src/objects/application/open.c +++ b/src/objects/application/open.c @@ -31,120 +31,6 @@ #include #include -gchar * v3270_keyfile_find(const gchar *name) { - // - // It can be a session file, scans for it - // - const gchar * paths[] = { - g_get_user_special_dir(G_USER_DIRECTORY_DOCUMENTS), - g_get_user_config_dir() - }; - - static const gchar *subdirs[] = { - "3270", - G_STRINGIFY(PRODUCT_NAME), - PACKAGE_NAME - }; - - size_t path, subdir; - - g_autofree gchar * filename = g_strconcat(name,".3270",NULL); - - for(path = 0; path < G_N_ELEMENTS(paths); path++) { - - for(subdir = 0; subdir < G_N_ELEMENTS(subdirs); subdir++) { - - gchar * fullpath = g_build_filename(paths[path],subdirs[subdir],filename,NULL); - - debug("Searching for \"%s\"",fullpath); - - if(g_file_test(fullpath,G_FILE_TEST_IS_REGULAR)) { - return fullpath; - } - g_free(fullpath); - - } - } - - return NULL; - -} - -/// @brief Open session file -static void open(GtkApplication *application, GtkWindow **window, const gchar *filename) { - - g_message("Opening '%s'",filename); - - if(*window) { - - // Already open a window, open in new tab. - pw3270_application_window_new_tab(GTK_WIDGET(*window), filename); - - } else { - // It's a new window - *window = GTK_WINDOW(pw3270_application_window_new(application, filename)); - - } - -} - -void pw3270_application_open_file(GtkApplication *application, GtkWindow **window, GFile *file) { - - g_autofree gchar * scheme = g_file_get_uri_scheme(file); - - if(g_ascii_strcasecmp(scheme,"file") == 0) { - - // It's a file scheme. - if(g_file_query_exists(file,NULL)) { - - // The file exists, load it. - g_autofree gchar *filename = g_file_get_path(file); - open(application,window,filename); - - } else { - - // Search for file. - g_autofree gchar * basename = g_file_get_basename(file); - g_autofree gchar * filename = v3270_keyfile_find(basename); - - if(filename) { - open(application,window,filename); - } else { - g_warning("Cant find session '%s'",basename); - } - - } - - } else if(g_ascii_strcasecmp(scheme,"tn3270") == 0 || g_ascii_strcasecmp(scheme,"tn3270s") == 0) { - - g_autofree gchar * uri = g_file_get_uri(file); - size_t sz = strlen(uri); - - if(sz > 0 && uri[sz-1] == '/') - uri[sz-1] = 0; - - g_message("Opening '%s' with default settings",uri); - - if(!*window) { - *window = GTK_WINDOW(pw3270_application_window_new(application, NULL)); - } else { - pw3270_application_window_new_tab(GTK_WIDGET(*window), NULL); - } - - GtkWidget * terminal = pw3270_application_window_get_active_terminal(GTK_WIDGET(*window)); - v3270_set_default_session(terminal); - v3270_set_url(terminal,uri); - - } else { - - g_warning("Don't know how to handle '%s' scheme",scheme); - - } - - - -} - void pw3270_application_open(GApplication *application, GFile **files, gint n_files, const gchar G_GNUC_UNUSED(*hint)) { gint file; diff --git a/src/objects/application/private.h b/src/objects/application/private.h index 0f0dc52..8b6c506 100644 --- a/src/objects/application/private.h +++ b/src/objects/application/private.h @@ -47,6 +47,7 @@ #include G_GNUC_INTERNAL void pw3270_application_open(GApplication * application, GFile **files, gint n_files, const gchar *hint); + G_GNUC_INTERNAL GtkWidget * pw3270_terminal_new(const gchar *session_file); // Actions diff --git a/src/objects/os/linux/open.c b/src/objects/os/linux/open.c new file mode 100644 index 0000000..f0dcf3c --- /dev/null +++ b/src/objects/os/linux/open.c @@ -0,0 +1,163 @@ +/* + * "Software pw3270, desenvolvido com base nos códigos fontes do WC3270 e X3270 + * (Paul Mattes Paul.Mattes@usa.net), de emulação de terminal 3270 para acesso a + * aplicativos mainframe. Registro no INPI sob o nome G3270. + * + * Copyright (C) <2008> + * + * Este programa é software livre. Você pode redistribuí-lo e/ou modificá-lo sob + * os termos da GPL v.2 - Licença Pública Geral GNU, conforme publicado pela + * Free Software Foundation. + * + * Este programa é distribuído na expectativa de ser útil, mas SEM QUALQUER + * GARANTIA; sem mesmo a garantia implícita de COMERCIALIZAÇÃO ou de ADEQUAÇÃO + * A QUALQUER PROPÓSITO EM PARTICULAR. Consulte a Licença Pública Geral GNU para + * obter mais detalhes. + * + * Você deve ter recebido uma cópia da Licença Pública Geral GNU junto com este + * programa; se não, escreva para a Free Software Foundation, Inc., 51 Franklin + * St, Fifth Floor, Boston, MA 02110-1301 USA + * + * Este programa está nomeado como - e possui - linhas de código. + * + * Contatos: + * + * perry.werneck@gmail.com (Alexandre Perry de Souza Werneck) + * erico.mendonca@gmail.com (Erico Mascarenhas Mendonça) + * + */ + +#include + +#include +#include +#include +#include +#include +#include + +static gchar * v3270_keyfile_find(const gchar *name) { + // + // It can be a session file, scans for it + // + const gchar * paths[] = { + g_get_user_special_dir(G_USER_DIRECTORY_DOCUMENTS), + g_get_user_config_dir() + }; + + static const gchar *subdirs[] = { + "3270", + G_STRINGIFY(PRODUCT_NAME), + PACKAGE_NAME + }; + + size_t path, subdir; + + g_autofree gchar * filename = g_strconcat(name,".3270",NULL); + + for(path = 0; path < G_N_ELEMENTS(paths); path++) { + + // Try subdirs. + for(subdir = 0; subdir < G_N_ELEMENTS(subdirs); subdir++) { + + gchar * fullpath = g_build_filename(paths[path],subdirs[subdir],filename,NULL); + + debug("Searching for \"%s\"",fullpath); + + if(g_file_test(fullpath,G_FILE_TEST_IS_REGULAR)) { + return fullpath; + } + g_free(fullpath); + + } + + // Try path. + { + gchar * fullpath = g_build_filename(paths[path],filename,NULL); + + debug("Searching for \"%s\"",fullpath); + + if(g_file_test(fullpath,G_FILE_TEST_IS_REGULAR)) { + return fullpath; + } + g_free(fullpath); + } + + } + + return NULL; + +} + +/// @brief Open session file +static void open(GtkApplication *application, GtkWindow **window, const gchar *filename) { + + g_message("Opening '%s'",filename); + + if(*window) { + + // Already open a window, open in new tab. + pw3270_application_window_new_tab(GTK_WIDGET(*window), filename); + + } else { + // It's a new window + *window = GTK_WINDOW(pw3270_application_window_new(application, filename)); + + } + +} + +void pw3270_application_open_file(GtkApplication *application, GtkWindow **window, GFile *file) { + + g_autofree gchar * scheme = g_file_get_uri_scheme(file); + + if(g_ascii_strcasecmp(scheme,"file") == 0) { + + // It's a file scheme. + if(g_file_query_exists(file,NULL)) { + + // The file exists, load it. + g_autofree gchar *filename = g_file_get_path(file); + open(application,window,filename); + + } else { + + // Search for file. + g_autofree gchar * basename = g_file_get_basename(file); + g_autofree gchar * filename = v3270_keyfile_find(basename); + + if(filename) { + open(application,window,filename); + } else { + g_warning("Cant find session '%s'",basename); + } + + } + + } else if(g_ascii_strcasecmp(scheme,"tn3270") == 0 || g_ascii_strcasecmp(scheme,"tn3270s") == 0) { + + g_autofree gchar * uri = g_file_get_uri(file); + size_t sz = strlen(uri); + + if(sz > 0 && uri[sz-1] == '/') + uri[sz-1] = 0; + + g_message("Opening '%s' with default settings",uri); + + if(!*window) { + *window = GTK_WINDOW(pw3270_application_window_new(application, NULL)); + } else { + pw3270_application_window_new_tab(GTK_WIDGET(*window), NULL); + } + + GtkWidget * terminal = pw3270_application_window_get_active_terminal(GTK_WIDGET(*window)); + v3270_set_default_session(terminal); + v3270_set_url(terminal,uri); + + } else { + + g_warning("Don't know how to handle '%s' scheme",scheme); + + } + +} -- libgit2 0.21.2