gobject.c 7.11 KB
/*
 * "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> <Banco do Brasil S.A.>
 *
 * 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 <glib.h>
#include <dbus/dbus.h>
#include <dbus/dbus-glib-lowlevel.h>
#include <dbus/dbus-glib.h>

#include <lib3270.h>
#include <lib3270/actions.h>

#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));

}