/* * "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 #define ENABLE_NLS #define GETTEXT_PACKAGE PACKAGE_NAME #include #include #include #include #include #include #include #include #include #include #include static const gchar * get_word(gchar **ptr) { gchar *rc = g_strstrip(*ptr); gchar *next = rc; while(*next && !g_ascii_isspace(*next)) next++; *(next++) = 0; *ptr = g_strstrip(next); debug("next: \"%s\"",*ptr); return rc; } static int set_property(GtkWidget *widget, const gchar *name, const gchar * value) { GParamSpec * spec = g_object_class_find_property(G_OBJECT_GET_CLASS(widget),name); if(!spec) { return errno = ENOENT; } GValue val = G_VALUE_INIT; g_value_init(&val, spec->value_type); switch(spec->value_type) { case G_TYPE_STRING: { g_value_set_string(&val,value); g_object_set_property(G_OBJECT(widget),name,&val); } break; case G_TYPE_BOOLEAN: { g_value_set_boolean(&val,(atoi(value) == 0 ? FALSE : TRUE)); g_object_set_property(G_OBJECT(widget),name,&val); } break; case G_TYPE_INT: { g_value_set_int(&val,atoi(value)); g_object_set_property(G_OBJECT(widget),name,&val); } break; default: lib3270_write_trace(v3270_get_session(widget),"%s has an unexpected value type\n",spec->name); } g_value_unset(&val); return 0; /* size_t ix; debug("%s=%s",name,value); // Check toggles for(ix = 0; ix < (size_t) LIB3270_TOGGLE_COUNT; ix++) { if(g_ascii_strcasecmp(name,lib3270_get_toggle_name((LIB3270_TOGGLE) ix)) == 0) return lib3270_set_toggle(hSession,(LIB3270_TOGGLE) ix, atoi(value)); } // Check boolean properties const LIB3270_INT_PROPERTY * bProp = lib3270_get_boolean_properties_list(); for(ix = 0; bProp[ix].name; ix++) { if(g_ascii_strcasecmp(name,bProp[ix].name) == 0 && bProp[ix].set) return bProp[ix].set(hSession,atoi(value)); } // Check integer properties const LIB3270_INT_PROPERTY * iProp = lib3270_get_int_properties_list(); for(ix = 0; iProp[ix].name; ix++) { if(g_ascii_strcasecmp(name,iProp[ix].name) == 0 && iProp[ix].set) return iProp[ix].set(hSession,atoi(value)); } // Check string properties const LIB3270_STRING_PROPERTY * sProp = lib3270_get_string_properties_list(); for(ix = 0; sProp[ix].name; ix++) { if(g_ascii_strcasecmp(name,sProp[ix].name) == 0 && sProp[ix].set) return sProp[ix].set(hSession,value); } */ return errno = ENOENT; } static int get_property(GtkWidget *widget, const gchar *name) { GParamSpec * spec = g_object_class_find_property(G_OBJECT_GET_CLASS(widget),name); if(!spec) { return errno = ENOENT; } GValue val = G_VALUE_INIT; g_value_init(&val, spec->value_type); g_object_get_property(G_OBJECT(widget),name,&val); switch(spec->value_type) { case G_TYPE_STRING: lib3270_write_trace(v3270_get_session(widget),"%s=%s\n",spec->name,g_value_get_string(&val)); break; case G_TYPE_BOOLEAN: lib3270_write_trace(v3270_get_session(widget),"%s=%s\n",spec->name,(g_value_get_boolean(&val) ? "true" : "false")); break; case G_TYPE_INT: lib3270_write_trace(v3270_get_session(widget),"%s=%d\n",spec->name,g_value_get_int(&val)); break; default: lib3270_write_trace(v3270_get_session(widget),"%s has an unexpected value type\n",spec->name); } g_value_unset(&val); return 0; } int v3270_exec_command(GtkWidget *widget, const gchar *text) { size_t ix; g_return_val_if_fail(GTK_IS_V3270(widget),EINVAL); H3270 *hSession = v3270_get_session(widget); g_autofree gchar * cmdline = g_strdup(text); g_strstrip(cmdline); debug("cmdline: \"%s\"",cmdline); if(g_str_has_prefix(cmdline,"connect")) { return lib3270_reconnect(hSession,0); } if(g_str_has_prefix(cmdline,"reload")) { v3270_reload(widget); return 0; } if(g_str_has_prefix(cmdline,"pattern")) { lib3270_testpattern(hSession); return 0; } if(g_str_has_suffix(cmdline,"?")) { gchar * str = strchr(cmdline,'?'); *str = 0; g_strstrip(cmdline); return get_property(widget,cmdline); } if(strchr(cmdline,'=')) { gchar * value = strchr(cmdline,'='); *(value++) = 0; g_strstrip(cmdline); g_strstrip(value); return set_property(widget,cmdline,value); } if(g_str_has_prefix(cmdline,"disconnect")) { return lib3270_disconnect(hSession); } if(g_str_has_prefix(cmdline,"set")) { gchar *txtptr = cmdline+3; const gchar * name = get_word(&txtptr); g_strstrip(txtptr); return set_property(widget,name,(*txtptr ? txtptr : "1")); } if(g_str_has_prefix(cmdline,"get")) { gchar *txtptr = cmdline+3; const gchar * name = get_word(&txtptr); g_strstrip(txtptr); return get_property(widget,name); } if(g_str_has_prefix(cmdline,"reset")) { gchar *txtptr = cmdline+3; const gchar * name = get_word(&txtptr); g_strstrip(txtptr); return set_property(widget,name,(*txtptr ? txtptr : "0")); } gchar * sep = strchr(cmdline,'='); if(sep) { *(sep++) = 0; return set_property(widget,g_strstrip(cmdline),g_strstrip(sep)); } else { // Check for lib3270 actions. const LIB3270_ACTION_ENTRY *actions = lib3270_get_action_table(); for(ix=0; actions[ix].name; ix++) { if(!g_ascii_strcasecmp(actions[ix].name,cmdline)) { lib3270_trace_event(hSession,"Action: %s\n",actions[ix].name); return actions[ix].call(hSession); } } } return errno = ENOENT; }