main.cc 5.54 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 main.cc e possui - linhas de código.
 *
 * Contatos:
 *
 * perry.werneck@gmail.com	(Alexandre Perry de Souza Werneck)
 * erico.mendonca@gmail.com	(Erico Mascarenhas Mendonça)
 *
 * Referências:
 *
 * http://devzone.zend.com/1435/wrapping-c-classes-in-a-php-extension/
 *
 */

 #include "php3270.h"

/*--[ Globals ]----------------------------------------------------------------------------------------------------*/

static zend_class_entry		* tn3270_ce = NULL;
static zend_object_handlers	  tn3270_object_handlers;

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

ZEND_BEGIN_ARG_INFO_EX(get_args, 0, 0, 1)
    ZEND_ARG_INFO(0, value)
ZEND_END_ARG_INFO()

ZEND_BEGIN_ARG_INFO_EX(set_args, 0, 0, 2)
    ZEND_ARG_INFO(0, name)
    ZEND_ARG_INFO(0, value)
ZEND_END_ARG_INFO()

zend_function_entry tn3270_methods[] =
{
    PHP_ME( tn3270,	__construct,		NULL, ZEND_ACC_PUBLIC | ZEND_ACC_CTOR)
    PHP_ME( tn3270,	__tostring,			NULL, ZEND_ACC_PUBLIC | ZEND_ACC_CTOR)
    PHP_ME( tn3270,	__get,				get_args, ZEND_ACC_PUBLIC | ZEND_ACC_CTOR)
    PHP_ME( tn3270,	__set,				set_args, ZEND_ACC_PUBLIC | ZEND_ACC_CTOR)

    PHP_ME( tn3270,	getversion,			NULL, ZEND_ACC_PUBLIC | ZEND_ACC_CTOR)
    PHP_ME( tn3270,	getrevision,		NULL, ZEND_ACC_PUBLIC | ZEND_ACC_CTOR)
	PHP_ME( tn3270,	getname,			NULL, ZEND_ACC_PUBLIC | ZEND_ACC_CTOR)

    PHP_ME( tn3270,	connect,			NULL, ZEND_ACC_PUBLIC | ZEND_ACC_CTOR)
    PHP_ME( tn3270,	disconnect,			NULL, ZEND_ACC_PUBLIC | ZEND_ACC_CTOR)
    PHP_ME( tn3270,	close,				NULL, ZEND_ACC_PUBLIC | ZEND_ACC_CTOR)

    PHP_ME( tn3270,	isconnected,		NULL, ZEND_ACC_PUBLIC | ZEND_ACC_CTOR)
    PHP_ME( tn3270,	isready,			NULL, ZEND_ACC_PUBLIC | ZEND_ACC_CTOR)

    PHP_ME( tn3270,	waitforready,		NULL, ZEND_ACC_PUBLIC | ZEND_ACC_CTOR)
    PHP_ME( tn3270,	wait,				NULL, ZEND_ACC_PUBLIC | ZEND_ACC_CTOR)
    PHP_ME( tn3270,	iterate,			NULL, ZEND_ACC_PUBLIC | ZEND_ACC_CTOR)

    PHP_ME( tn3270,	pfkey,				NULL, ZEND_ACC_PUBLIC | ZEND_ACC_CTOR)
    PHP_ME( tn3270,	pakey,				NULL, ZEND_ACC_PUBLIC | ZEND_ACC_CTOR)
    PHP_ME( tn3270,	enter,				NULL, ZEND_ACC_PUBLIC | ZEND_ACC_CTOR)

    PHP_ME( tn3270,	getstringat,		NULL, ZEND_ACC_PUBLIC | ZEND_ACC_CTOR)
    PHP_ME( tn3270,	setstringat,		NULL, ZEND_ACC_PUBLIC | ZEND_ACC_CTOR)
    PHP_ME( tn3270,	cmpstringat,		NULL, ZEND_ACC_PUBLIC | ZEND_ACC_CTOR)

    PHP_ME( tn3270,	getisprotected,		NULL, ZEND_ACC_PUBLIC | ZEND_ACC_CTOR)
    PHP_ME( tn3270,	getisprotectedat,	NULL, ZEND_ACC_PUBLIC | ZEND_ACC_CTOR)

    PHP_ME( tn3270,	action,				NULL, ZEND_ACC_PUBLIC | ZEND_ACC_CTOR)

    {NULL, NULL, NULL}
};

void tn3270_free_storage(void *object TSRMLS_DC)
{
	tn3270_object *obj = (tn3270_object *)object;

	trace("%s",__FUNCTION__);

	zend_object_std_dtor(&obj->std TSRMLS_CC);
	delete obj->hSession;

	efree(obj);
}

zend_object_value tn3270_create_handler(zend_class_entry *type TSRMLS_DC)
{
    zend_object_value	  retval;
	tn3270_object		* obj = (tn3270_object *) emalloc(sizeof(tn3270_object));

	trace("%s",__FUNCTION__);

    memset(obj, 0, sizeof(tn3270_object));

	zend_object_std_init( &(obj->std), type TSRMLS_CC );

	// http://stackoverflow.com/questions/14105529/writing-a-c-extension-for-php-5-4-example-code-is-obsolete
	// object_properties_init((zend_object*) &(obj->std), type);
#if PHP_VERSION_ID < 50399
    zend_hash_copy(obj->std.properties, &(type->default_properties),(copy_ctor_func_t) zval_add_ref, NULL, sizeof(zval*));
#else
    object_properties_init(&obj->std, type);
#endif

    retval.handle	= zend_objects_store_put(obj, NULL, tn3270_free_storage, NULL TSRMLS_CC);
    retval.handlers	= &tn3270_object_handlers;

    return retval;
}

PHP_MINIT_FUNCTION(tn3270)
{
	zend_class_entry ce;

	trace("%s",__FUNCTION__);

	INIT_CLASS_ENTRY(ce, "tn3270", tn3270_methods);

	tn3270_ce = zend_register_internal_class(&ce TSRMLS_CC);
	tn3270_ce->create_object = tn3270_create_handler;

	memcpy(&tn3270_object_handlers,zend_get_std_object_handlers(), sizeof(zend_object_handlers));
    tn3270_object_handlers.clone_obj = NULL;

    return SUCCESS;
}

zend_module_entry lib3270_module_entry =
{
#if ZEND_MODULE_API_NO >= 20010901
    STANDARD_MODULE_HEADER,
#endif
    PHP3270_EXTNAME,
    NULL,                  /* Functions */
    PHP_MINIT(tn3270),
    NULL,                  /* MSHUTDOWN */
    NULL,                  /* RINIT */
    NULL,                  /* RSHUTDOWN */
    NULL,                  /* MINFO */
#if ZEND_MODULE_API_NO >= 20010901
    PHP3270_EXTVER,
#endif
    STANDARD_MODULE_PROPERTIES
};

// #ifdef COMPILE_DL_LIB3270
extern "C"
{
	ZEND_GET_MODULE(lib3270)
}
// #endif