blob: c15f479448d151cc7175fc37d354988f8a8e73aa [file] [log] [blame]
mlumishb892a272014-12-09 16:28:23 -08001#include "event.h"
2
3#ifdef HAVE_CONFIG_H
4#include "config.h"
5#endif
6
7#include "php.h"
8#include "php_ini.h"
9#include "ext/standard/info.h"
10#include "php_grpc.h"
11
12#include <stdbool.h>
13
14#include "grpc/grpc.h"
15
16#include "byte_buffer.h"
17#include "call.h"
18#include "timeval.h"
19
mlumish34cd1f02015-01-02 13:32:41 -080020/* Create a new PHP object containing the event data in the event struct.
21 event must not be used after this function is called */
22zval *grpc_php_convert_event(grpc_event *event) {
23 zval *data_object;
mlumishb892a272014-12-09 16:28:23 -080024 char *detail_string;
25 size_t detail_len;
26 char *method_string;
27 size_t method_len;
28 char *host_string;
29 size_t host_len;
30 char *read_string;
31 size_t read_len;
32
mlumish34cd1f02015-01-02 13:32:41 -080033 zval *event_object;
34
35 if(event == NULL) {
36 return NULL;
37 }
38
39 MAKE_STD_ZVAL(event_object);
40 object_init(event_object);
41
42 add_property_zval(event_object,
43 "call",
44 grpc_php_wrap_call(event->call,
45 event->type==GRPC_SERVER_RPC_NEW));
46 add_property_long(event_object, "type", event->type);
47 add_property_long(event_object, "tag", (long)event->tag);
48
mlumishb892a272014-12-09 16:28:23 -080049 switch(event->type){
mlumish34cd1f02015-01-02 13:32:41 -080050 case GRPC_QUEUE_SHUTDOWN: add_property_null(event_object, "data"); break;
mlumishb892a272014-12-09 16:28:23 -080051 case GRPC_READ:
52 if(event->data.read == NULL){
mlumish34cd1f02015-01-02 13:32:41 -080053 add_property_null(event_object, "data");
mlumishb892a272014-12-09 16:28:23 -080054 } else {
55 byte_buffer_to_string(event->data.read, &read_string, &read_len);
mlumish34cd1f02015-01-02 13:32:41 -080056 add_property_stringl(event_object, "data", read_string, read_len, true);
mlumishb892a272014-12-09 16:28:23 -080057 }
58 break;
59 case GRPC_INVOKE_ACCEPTED:
mlumish34cd1f02015-01-02 13:32:41 -080060 add_property_long(event_object,
61 "data",
62 (long)event->data.invoke_accepted);
63 break;
mlumishb892a272014-12-09 16:28:23 -080064 case GRPC_WRITE_ACCEPTED:
mlumish34cd1f02015-01-02 13:32:41 -080065 add_property_long(event_object, "data", (long)event->data.write_accepted);
66 break;
mlumishb892a272014-12-09 16:28:23 -080067 case GRPC_FINISH_ACCEPTED:
mlumish34cd1f02015-01-02 13:32:41 -080068 add_property_long(event_object,
69 "data",
70 (long)event->data.finish_accepted);
71 break;
mlumishb892a272014-12-09 16:28:23 -080072 case GRPC_CLIENT_METADATA_READ:
mlumish34cd1f02015-01-02 13:32:41 -080073 data_object = grpc_call_create_metadata_array(
mlumishb892a272014-12-09 16:28:23 -080074 event->data.client_metadata_read.count,
75 event->data.client_metadata_read.elements);
mlumish34cd1f02015-01-02 13:32:41 -080076 add_property_zval(event_object, "data", data_object);
mlumishb892a272014-12-09 16:28:23 -080077 break;
78 case GRPC_FINISHED:
mlumish34cd1f02015-01-02 13:32:41 -080079 MAKE_STD_ZVAL(data_object);
80 object_init(data_object);
81 add_property_long(data_object, "code", event->data.finished.status);
mlumishb892a272014-12-09 16:28:23 -080082 if(event->data.finished.details == NULL){
mlumish34cd1f02015-01-02 13:32:41 -080083 add_property_null(data_object, "details");
mlumishb892a272014-12-09 16:28:23 -080084 } else {
85 detail_len = strlen(event->data.finished.details);
86 detail_string = ecalloc(detail_len+1, sizeof(char));
87 memcpy(detail_string, event->data.finished.details, detail_len);
mlumish34cd1f02015-01-02 13:32:41 -080088 add_property_string(data_object,
mlumishb892a272014-12-09 16:28:23 -080089 "details",
90 detail_string,
91 true);
92 }
mlumish34cd1f02015-01-02 13:32:41 -080093 add_property_zval(data_object,
94 "metadata",
95 grpc_call_create_metadata_array(
96 event->data.finished.metadata_count,
97 event->data.finished.metadata_elements));
98 add_property_zval(event_object, "data", data_object);
mlumishb892a272014-12-09 16:28:23 -080099 break;
100 case GRPC_SERVER_RPC_NEW:
mlumish34cd1f02015-01-02 13:32:41 -0800101 MAKE_STD_ZVAL(data_object);
102 object_init(data_object);
mlumishb892a272014-12-09 16:28:23 -0800103 method_len = strlen(event->data.server_rpc_new.method);
104 method_string = ecalloc(method_len+1, sizeof(char));
105 memcpy(method_string, event->data.server_rpc_new.method, method_len);
mlumish34cd1f02015-01-02 13:32:41 -0800106 add_property_string(data_object,
mlumishb892a272014-12-09 16:28:23 -0800107 "method",
108 method_string,
109 false);
110 host_len = strlen(event->data.server_rpc_new.host);
111 host_string = ecalloc(host_len+1, sizeof(char));
112 memcpy(host_string, event->data.server_rpc_new.host, host_len);
mlumish34cd1f02015-01-02 13:32:41 -0800113 add_property_string(data_object,
mlumishb892a272014-12-09 16:28:23 -0800114 "host",
115 host_string,
116 false);
mlumish34cd1f02015-01-02 13:32:41 -0800117 add_property_zval(data_object,
mlumishb892a272014-12-09 16:28:23 -0800118 "absolute_timeout",
119 grpc_php_wrap_timeval(
120 event->data.server_rpc_new.deadline));
mlumish34cd1f02015-01-02 13:32:41 -0800121 add_property_zval(data_object,
mlumishb892a272014-12-09 16:28:23 -0800122 "metadata",
123 grpc_call_create_metadata_array(
124 event->data.server_rpc_new.metadata_count,
125 event->data.server_rpc_new.metadata_elements));
mlumish34cd1f02015-01-02 13:32:41 -0800126 add_property_zval(event_object, "data", data_object);
mlumishb892a272014-12-09 16:28:23 -0800127 break;
mlumish34cd1f02015-01-02 13:32:41 -0800128 default: add_property_null(event_object, "data"); break;
mlumishb892a272014-12-09 16:28:23 -0800129 }
mlumish34cd1f02015-01-02 13:32:41 -0800130 grpc_event_finish(event);
131 return event_object;
mlumishb892a272014-12-09 16:28:23 -0800132}