blob: 8ec29c915c9485d8b1e7b3abed3a156bfad00b3c [file] [log] [blame]
#include "event.h"
#ifdef HAVE_CONFIG_H
#include "config.h"
#endif
#include "php.h"
#include "php_ini.h"
#include "ext/standard/info.h"
#include "php_grpc.h"
#include <stdbool.h>
#include "grpc/grpc.h"
#include "byte_buffer.h"
#include "call.h"
#include "timeval.h"
/* Frees and finishes a wrapped instance of grpc_event */
void free_wrapped_grpc_event(void *object TSRMLS_DC){
wrapped_grpc_event *event = (wrapped_grpc_event*)object;
if(event->wrapped != NULL){
grpc_event_finish(event->wrapped);
}
efree(event);
}
/* Initializes an instance of wrapped_grpc_channel to be associated with an
* object of a class specified by class_type */
zend_object_value create_wrapped_grpc_event(
zend_class_entry *class_type TSRMLS_DC){
zend_object_value retval;
wrapped_grpc_event *intern;
intern = (wrapped_grpc_event*)emalloc(sizeof(wrapped_grpc_event));
memset(intern, 0, sizeof(wrapped_grpc_event));
zend_object_std_init(&intern->std, class_type TSRMLS_CC);
object_properties_init(&intern->std, class_type);
retval.handle = zend_objects_store_put(
intern,
(zend_objects_store_dtor_t)zend_objects_destroy_object,
free_wrapped_grpc_event,
NULL TSRMLS_CC);
retval.handlers = zend_get_std_object_handlers();
return retval;
}
zval *grpc_php_wrap_event(grpc_event *wrapped){
zval *event_object;
MAKE_STD_ZVAL(event_object);
object_init_ex(event_object, grpc_ce_event);
wrapped_grpc_event *event = (wrapped_grpc_event*)zend_object_store_get_object(
event_object TSRMLS_CC);
event->wrapped = wrapped;
return event_object;
}
/**
* Get the type of the event
* @return long Integer representing the type
*/
PHP_METHOD(Event, get_type){
wrapped_grpc_event *event = (wrapped_grpc_event*)zend_object_store_get_object(
getThis() TSRMLS_CC);
RETURN_LONG((long)(event->wrapped->type));
}
/**
* Get the tag of the event
* @return long The event's tag
*/
PHP_METHOD(Event, get_tag){
wrapped_grpc_event *event = (wrapped_grpc_event*)zend_object_store_get_object(
getThis() TSRMLS_CC);
RETURN_LONG((long)(event->wrapped->tag));
}
/**
* Get the call associated with the event
* @return Call The call
*/
PHP_METHOD(Event, get_call){
wrapped_grpc_event *event = (wrapped_grpc_event*)zend_object_store_get_object(
getThis() TSRMLS_CC);
zval *call_obj = grpc_php_wrap_call(event->wrapped->call);
RETURN_DESTROY_ZVAL(call_obj);
}
/**
* Get the data associated with the event
* @return object The data, with type depending on the type field
*/
PHP_METHOD(Event, get_data){
zval *retval;
wrapped_grpc_event *wrapped_event =
(wrapped_grpc_event*)zend_object_store_get_object(
getThis() TSRMLS_CC);
grpc_event *event = wrapped_event->wrapped;
char *detail_string;
size_t detail_len;
char *method_string;
size_t method_len;
char *host_string;
size_t host_len;
char *read_string;
size_t read_len;
switch(event->type){
case GRPC_QUEUE_SHUTDOWN: RETURN_NULL(); break;
case GRPC_READ:
if(event->data.read == NULL){
RETURN_NULL();
} else {
byte_buffer_to_string(event->data.read, &read_string, &read_len);
RETURN_STRINGL(read_string, read_len, true);
}
break;
case GRPC_INVOKE_ACCEPTED:
RETURN_LONG((long)event->data.invoke_accepted); break;
case GRPC_WRITE_ACCEPTED:
RETURN_LONG((long)event->data.write_accepted); break;
case GRPC_FINISH_ACCEPTED:
RETURN_LONG((long)event->data.finish_accepted); break;
case GRPC_CLIENT_METADATA_READ:
retval = grpc_call_create_metadata_array(
event->data.client_metadata_read.count,
event->data.client_metadata_read.elements);
break;
case GRPC_FINISHED:
MAKE_STD_ZVAL(retval);
object_init(retval);
add_property_long(retval, "code", event->data.finished.code);
if(event->data.finished.details == NULL){
add_property_null(retval, "details");
} else {
detail_len = strlen(event->data.finished.details);
detail_string = ecalloc(detail_len+1, sizeof(char));
memcpy(detail_string, event->data.finished.details, detail_len);
add_property_string(retval,
"details",
detail_string,
true);
}
break;
case GRPC_SERVER_RPC_NEW:
MAKE_STD_ZVAL(retval);
object_init(retval);
method_len = strlen(event->data.server_rpc_new.method);
method_string = ecalloc(method_len+1, sizeof(char));
memcpy(method_string, event->data.server_rpc_new.method, method_len);
add_property_string(retval,
"method",
method_string,
false);
host_len = strlen(event->data.server_rpc_new.host);
host_string = ecalloc(host_len+1, sizeof(char));
memcpy(host_string, event->data.server_rpc_new.host, host_len);
add_property_string(retval,
"host",
host_string,
false);
add_property_zval(retval,
"absolute_timeout",
grpc_php_wrap_timeval(
event->data.server_rpc_new.deadline));
add_property_zval(retval,
"metadata",
grpc_call_create_metadata_array(
event->data.server_rpc_new.metadata_count,
event->data.server_rpc_new.metadata_elements));
break;
default: RETURN_NULL(); break;
}
RETURN_DESTROY_ZVAL(retval);
}
static zend_function_entry event_methods[] = {
PHP_ME(Event, get_call, NULL, ZEND_ACC_PUBLIC)
PHP_ME(Event, get_data, NULL, ZEND_ACC_PUBLIC)
PHP_ME(Event, get_tag, NULL, ZEND_ACC_PUBLIC)
PHP_ME(Event, get_type, NULL, ZEND_ACC_PUBLIC)
PHP_FE_END
};
void grpc_init_event(TSRMLS_D){
zend_class_entry ce;
INIT_CLASS_ENTRY(ce, "Grpc\\Event", event_methods);
ce.create_object = create_wrapped_grpc_event;
grpc_ce_event = zend_register_internal_class(&ce TSRMLS_CC);
}