getset.c 4.27 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. 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 - e possui - linhas de código.
 *
 * Contatos:
 *
 * perry.werneck@gmail.com	(Alexandre Perry de Souza Werneck)
 * erico.mendonca@gmail.com	(Erico Mascarenhas Mendonça)
 *
 */


/**
 *	@file toggles/getset.c
 *	@brief This module handles toggle changes and properties.
 */

#include <config.h>
#include <internals.h>
#include <lib3270/toggle.h>
#include <lib3270/log.h>
#include "togglesc.h"

/*---[ Implement ]------------------------------------------------------------------------------------------------------------*/

LIB3270_EXPORT unsigned char lib3270_get_toggle(const H3270 *hSession, LIB3270_TOGGLE_ID ix) {

	if(ix < 0 || ix >= LIB3270_TOGGLE_COUNT) {
		errno = EINVAL;
		return 0;
	}

	return hSession->toggle[ix].value != 0;
}

/**
 * @brief Call the internal update routine and listeners.
 */
static void toggle_notify(H3270 *session, struct lib3270_toggle *t, LIB3270_TOGGLE_ID ix) {
	trace("%s: ix=%d upcall=%p",__FUNCTION__,ix,t->upcall);

	t->upcall(session, t, LIB3270_TOGGLE_TYPE_INTERACTIVE);

	if(session->cbk.update_toggle)
		session->cbk.update_toggle(session,ix,t->value,LIB3270_TOGGLE_TYPE_INTERACTIVE,toggle_descriptor[ix].name);

	// Notify customers.
	struct lib3270_linked_list_node * node;
	for(node = session->listeners.toggle[ix].first; node; node = node->next)
	{
		((struct lib3270_toggle_callback *) node)->func(session, ix, t->value, node->userdata);
	}

	/*
	for(st = session->listeners.toggle.callbacks[ix]; st != (struct lib3270_toggle_callback *) NULL; st = (struct lib3270_toggle_callback *) st->next)
	{
		st->func(session, ix, t->value, st->data);
	}
	*/

}

/**
 * @brief Set toggle state.
 *
 * @param h		Session handle.
 * @param ix	Toggle id.
 * @param value	New toggle state (non zero for true).
 *
 * @returns 0 if the toggle is already at the state, 1 if the toggle was changed; < 0 on error (sets errno).
 */
LIB3270_EXPORT int lib3270_set_toggle(H3270 *session, LIB3270_TOGGLE_ID ix, int value) {
	char v = value ? True : False;
	struct lib3270_toggle * t;

	CHECK_SESSION_HANDLE(session);

	if(ix < 0 || ix >= LIB3270_TOGGLE_COUNT)
		return -(errno = EINVAL);

	t = &session->toggle[ix];

	if(v == t->value)
		return 0;

	t->value = v;

	toggle_notify(session,t,ix);
	return 1;
}

LIB3270_EXPORT int lib3270_toggle(H3270 *session, LIB3270_TOGGLE_ID ix) {
	struct lib3270_toggle	*t;

	CHECK_SESSION_HANDLE(session);

	if(ix < 0 || ix >= LIB3270_TOGGLE_COUNT) {
		return -(errno = EINVAL);
	}

	t = &session->toggle[ix];

	t->value = t->value ? False : True;
	toggle_notify(session,t,ix);

	return (int) t->value;
}

LIB3270_EXPORT const char * lib3270_toggle_get_name(const LIB3270_TOGGLE *toggle) {

	if(toggle && toggle->name)
		return dgettext(GETTEXT_PACKAGE,toggle->name);

	return "";

}

LIB3270_EXPORT const char * lib3270_toggle_get_label(const LIB3270_TOGGLE *toggle) {

	if(toggle && toggle->label)
		return dgettext(GETTEXT_PACKAGE,toggle->label);

	return "";

}

LIB3270_EXPORT const char * lib3270_toggle_get_summary(const LIB3270_TOGGLE *toggle) {

	if(toggle && toggle->summary)
		return dgettext(GETTEXT_PACKAGE,toggle->summary);

	return "";

}

LIB3270_EXPORT const char * lib3270_toggle_get_description(const LIB3270_TOGGLE *toggle) {

	if(toggle && toggle->description)
		return dgettext(GETTEXT_PACKAGE,toggle->description);

	return "";

}