/* * "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 gobject.c e possui - linhas de código. * * Contatos: * * perry.werneck@gmail.com (Alexandre Perry de Souza Werneck) * * Referencias: * * https://live.gnome.org/DBusGlibBindings * */ #include #include #include #include #include #include #include "service.h" /*---[ Globals ]---------------------------------------------------------------------------------*/ /*---[ Implement ]-------------------------------------------------------------------------------*/ G_DEFINE_TYPE(PW3270Dbus, pw3270_dbus, G_TYPE_OBJECT) static void pw3270_dbus_finalize(GObject *object) { G_OBJECT_CLASS(pw3270_dbus_parent_class)->finalize (object); } static void pw3270_dbus_class_init(PW3270DbusClass *klass) { GObjectClass *object_class; object_class = G_OBJECT_CLASS (klass); object_class->finalize = pw3270_dbus_finalize; } static void pw3270_dbus_init(PW3270Dbus *object) { } PW3270Dbus * pw3270_dbus_new(void) { g_message("Creating D-Bus proxy"); return g_object_new(PW3270_TYPE_DBUS, NULL); } static void pw3270_dbus_return_error(DBusGMethodInvocation *context, int err) { GError *error = g_error_new(ERROR_DOMAIN,err,"%s",g_strerror(err)); dbus_g_method_return_error(context,error); g_error_free(error); } void pw3270_dbus_get_revision(PW3270Dbus *object, DBusGMethodInvocation *context) { dbus_g_method_return(context,lib3270_get_revision()); } void pw3270_dbus_get_version(PW3270Dbus *object, DBusGMethodInvocation *context) { dbus_g_method_return(context,lib3270_get_version()); } void pw3270_dbus_create_session(PW3270Dbus *object, DBusGMethodInvocation *context) { struct session * ses = session_new(); gchar * key = g_strdup_printf("%p-%u",ses,ses->id); dbus_g_method_return(context,key); g_free(key); } void pw3270_dbus_destroy_session(PW3270Dbus *object, const gchar *id, DBusGMethodInvocation *context) { struct session * ses = session_find(id); if(!ses) { dbus_g_method_return(context,ENOENT); return; } session_destroy(ses); dbus_g_method_return(context,0); } void pw3270_dbus_connect(PW3270Dbus *object, const gchar *id, const gchar *uri, DBusGMethodInvocation *context) { struct session * ses = session_find(id); if(!ses) { pw3270_dbus_return_error(context,ENOENT); return; } if(uri && *uri) { lib3270_set_url(ses->host,uri); } dbus_g_method_return(context,lib3270_connect(ses->host,0)); } void pw3270_dbus_disconnect(PW3270Dbus *object, const gchar *id, DBusGMethodInvocation *context) { struct session * ses = session_find(id); if(!ses) { pw3270_dbus_return_error(context,ENOENT); return; } dbus_g_method_return(context,lib3270_disconnect(ses->host)); } void pw3270_dbus_enter(PW3270Dbus *object, const gchar *id, DBusGMethodInvocation *context) { struct session * ses = session_find(id); if(!ses) { pw3270_dbus_return_error(context,ENOENT); return; } dbus_g_method_return(context,lib3270_enter(ses->host)); } void pw3270_dbus_pf_key(PW3270Dbus *object, const gchar *id, int key, DBusGMethodInvocation *context) { struct session * ses = session_find(id); if(!ses) { pw3270_dbus_return_error(context,ENOENT); return; } dbus_g_method_return(context,lib3270_pfkey(ses->host,key)); } void pw3270_dbus_pa_key(PW3270Dbus *object, const gchar *id, int key, DBusGMethodInvocation *context) { struct session * ses = session_find(id); if(!ses) { pw3270_dbus_return_error(context,ENOENT); return; } dbus_g_method_return(context,lib3270_pakey(ses->host,key)); } void pw3270_dbus_set_text_at(PW3270Dbus *object, const gchar *id, int row, int col, const gchar *utftext, DBusGMethodInvocation *context) { gchar * text; struct session * ses = session_find(id); if(!ses) { pw3270_dbus_return_error(context,ENOENT); return; } text = g_convert_with_fallback(utftext,-1,lib3270_get_display_charset(ses->host),"UTF-8","?",NULL,NULL,NULL); dbus_g_method_return(context,lib3270_set_string_at(ses->host,row,col,(const unsigned char *) text)); g_free(text); } void pw3270_dbus_get_text_at(PW3270Dbus *object, const gchar *id, int row, int col, int len, DBusGMethodInvocation *context) { gchar *text; struct session * ses = session_find(id); if(!ses) { pw3270_dbus_return_error(context,ENOENT); return; } text = lib3270_get_text_at(ses->host, row, col, len); if(!text) { pw3270_dbus_return_error(context,errno); } else { gchar * utftext = g_convert_with_fallback(text,-1,"UTF-8",lib3270_get_display_charset(ses->host),"?",NULL,NULL,NULL); lib3270_free(text); dbus_g_method_return(context,utftext); g_free(utftext); } } void pw3270_dbus_is_ready(PW3270Dbus *object, const gchar *id, DBusGMethodInvocation *context) { struct session * ses = session_find(id); if(!ses) { pw3270_dbus_return_error(context,ENOENT); return; } dbus_g_method_return(context,lib3270_is_ready(ses->host)); } void pw3270_dbus_chk_id(PW3270Dbus *object, const gchar *id, DBusGMethodInvocation *context) { struct session * ses = session_find(id); if(!ses) { dbus_g_method_return(context,ENOENT); return; } dbus_g_method_return(context,0); } void pw3270_dbus_cmp_text_at(PW3270Dbus *object, const gchar *id, int row, int col, const gchar *utftext, DBusGMethodInvocation *context) { gchar * text; struct session * ses = session_find(id); if(!ses) { pw3270_dbus_return_error(context,ENOENT); return; } text = g_convert_with_fallback(utftext,-1,lib3270_get_display_charset(ses->host),"UTF-8","?",NULL,NULL,NULL); dbus_g_method_return(context,lib3270_cmp_text_at(ses->host,row,col,text)); g_free(text); } void pw3270_dbus_is_connected(PW3270Dbus *object, const gchar *id, DBusGMethodInvocation *context) { struct session * ses = session_find(id); if(!ses) { pw3270_dbus_return_error(context,ENOENT); return; } dbus_g_method_return(context,lib3270_is_connected(ses->host)); } void pw3270_dbus_get_connection_state(PW3270Dbus *object, const gchar *id, DBusGMethodInvocation *context) { struct session * ses = session_find(id); if(!ses) { pw3270_dbus_return_error(context,ENOENT); return; } dbus_g_method_return(context,lib3270_get_connection_state(ses->host)); }