blob: 452c4b8bcbafdb57af19804a8f77d0fdf147144a [file] [log] [blame]
Craig Tiller1a61b172015-02-16 11:53:47 -08001/*
2 *
3 * Copyright 2015, Google Inc.
4 * All rights reserved.
5 *
6 * Redistribution and use in source and binary forms, with or without
7 * modification, are permitted provided that the following conditions are
8 * met:
9 *
10 * * Redistributions of source code must retain the above copyright
11 * notice, this list of conditions and the following disclaimer.
12 * * Redistributions in binary form must reproduce the above
13 * copyright notice, this list of conditions and the following disclaimer
14 * in the documentation and/or other materials provided with the
15 * distribution.
16 * * Neither the name of Google Inc. nor the names of its
17 * contributors may be used to endorse or promote products derived from
18 * this software without specific prior written permission.
19 *
20 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
21 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
22 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
23 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
24 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
25 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
26 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
27 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
28 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
29 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
30 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
31 *
32 */
33
mlumishb892a272014-12-09 16:28:23 -080034#include "event.h"
35
36#ifdef HAVE_CONFIG_H
37#include "config.h"
38#endif
39
40#include "php.h"
41#include "php_ini.h"
42#include "ext/standard/info.h"
43#include "php_grpc.h"
44
45#include <stdbool.h>
46
47#include "grpc/grpc.h"
48
49#include "byte_buffer.h"
50#include "call.h"
51#include "timeval.h"
52
mlumish34cd1f02015-01-02 13:32:41 -080053/* Create a new PHP object containing the event data in the event struct.
54 event must not be used after this function is called */
55zval *grpc_php_convert_event(grpc_event *event) {
56 zval *data_object;
mlumishb892a272014-12-09 16:28:23 -080057 char *detail_string;
58 size_t detail_len;
59 char *method_string;
60 size_t method_len;
61 char *host_string;
62 size_t host_len;
63 char *read_string;
64 size_t read_len;
65
mlumish34cd1f02015-01-02 13:32:41 -080066 zval *event_object;
67
Craig Tillerb5dcec52015-01-13 11:13:42 -080068 if (event == NULL) {
mlumish34cd1f02015-01-02 13:32:41 -080069 return NULL;
70 }
71
72 MAKE_STD_ZVAL(event_object);
73 object_init(event_object);
74
Craig Tillerb5dcec52015-01-13 11:13:42 -080075 add_property_zval(
76 event_object, "call",
77 grpc_php_wrap_call(event->call, event->type == GRPC_SERVER_RPC_NEW));
mlumish34cd1f02015-01-02 13:32:41 -080078 add_property_long(event_object, "type", event->type);
79 add_property_long(event_object, "tag", (long)event->tag);
80
Craig Tillerb5dcec52015-01-13 11:13:42 -080081 switch (event->type) {
82 case GRPC_QUEUE_SHUTDOWN:
83 add_property_null(event_object, "data");
84 break;
mlumishb892a272014-12-09 16:28:23 -080085 case GRPC_READ:
Craig Tillerb5dcec52015-01-13 11:13:42 -080086 if (event->data.read == NULL) {
mlumish34cd1f02015-01-02 13:32:41 -080087 add_property_null(event_object, "data");
mlumishb892a272014-12-09 16:28:23 -080088 } else {
89 byte_buffer_to_string(event->data.read, &read_string, &read_len);
mlumish34cd1f02015-01-02 13:32:41 -080090 add_property_stringl(event_object, "data", read_string, read_len, true);
mlumishb892a272014-12-09 16:28:23 -080091 }
92 break;
mlumishb892a272014-12-09 16:28:23 -080093 case GRPC_WRITE_ACCEPTED:
mlumish34cd1f02015-01-02 13:32:41 -080094 add_property_long(event_object, "data", (long)event->data.write_accepted);
95 break;
mlumishb892a272014-12-09 16:28:23 -080096 case GRPC_FINISH_ACCEPTED:
Craig Tillerb5dcec52015-01-13 11:13:42 -080097 add_property_long(event_object, "data",
mlumish34cd1f02015-01-02 13:32:41 -080098 (long)event->data.finish_accepted);
99 break;
mlumishb892a272014-12-09 16:28:23 -0800100 case GRPC_CLIENT_METADATA_READ:
mlumish34cd1f02015-01-02 13:32:41 -0800101 data_object = grpc_call_create_metadata_array(
mlumishb892a272014-12-09 16:28:23 -0800102 event->data.client_metadata_read.count,
103 event->data.client_metadata_read.elements);
mlumish34cd1f02015-01-02 13:32:41 -0800104 add_property_zval(event_object, "data", data_object);
mlumishb892a272014-12-09 16:28:23 -0800105 break;
106 case GRPC_FINISHED:
mlumish34cd1f02015-01-02 13:32:41 -0800107 MAKE_STD_ZVAL(data_object);
108 object_init(data_object);
109 add_property_long(data_object, "code", event->data.finished.status);
Craig Tillerb5dcec52015-01-13 11:13:42 -0800110 if (event->data.finished.details == NULL) {
mlumish34cd1f02015-01-02 13:32:41 -0800111 add_property_null(data_object, "details");
mlumishb892a272014-12-09 16:28:23 -0800112 } else {
113 detail_len = strlen(event->data.finished.details);
Craig Tillerb5dcec52015-01-13 11:13:42 -0800114 detail_string = ecalloc(detail_len + 1, sizeof(char));
mlumishb892a272014-12-09 16:28:23 -0800115 memcpy(detail_string, event->data.finished.details, detail_len);
Craig Tillerb5dcec52015-01-13 11:13:42 -0800116 add_property_string(data_object, "details", detail_string, true);
mlumishb892a272014-12-09 16:28:23 -0800117 }
Craig Tillerb5dcec52015-01-13 11:13:42 -0800118 add_property_zval(data_object, "metadata",
mlumish34cd1f02015-01-02 13:32:41 -0800119 grpc_call_create_metadata_array(
120 event->data.finished.metadata_count,
121 event->data.finished.metadata_elements));
122 add_property_zval(event_object, "data", data_object);
mlumishb892a272014-12-09 16:28:23 -0800123 break;
124 case GRPC_SERVER_RPC_NEW:
mlumish34cd1f02015-01-02 13:32:41 -0800125 MAKE_STD_ZVAL(data_object);
126 object_init(data_object);
mlumishb892a272014-12-09 16:28:23 -0800127 method_len = strlen(event->data.server_rpc_new.method);
Craig Tillerb5dcec52015-01-13 11:13:42 -0800128 method_string = ecalloc(method_len + 1, sizeof(char));
mlumishb892a272014-12-09 16:28:23 -0800129 memcpy(method_string, event->data.server_rpc_new.method, method_len);
Craig Tillerb5dcec52015-01-13 11:13:42 -0800130 add_property_string(data_object, "method", method_string, false);
mlumishb892a272014-12-09 16:28:23 -0800131 host_len = strlen(event->data.server_rpc_new.host);
Craig Tillerb5dcec52015-01-13 11:13:42 -0800132 host_string = ecalloc(host_len + 1, sizeof(char));
mlumishb892a272014-12-09 16:28:23 -0800133 memcpy(host_string, event->data.server_rpc_new.host, host_len);
Craig Tillerb5dcec52015-01-13 11:13:42 -0800134 add_property_string(data_object, "host", host_string, false);
135 add_property_zval(
136 data_object, "absolute_timeout",
137 grpc_php_wrap_timeval(event->data.server_rpc_new.deadline));
138 add_property_zval(data_object, "metadata",
mlumishb892a272014-12-09 16:28:23 -0800139 grpc_call_create_metadata_array(
140 event->data.server_rpc_new.metadata_count,
141 event->data.server_rpc_new.metadata_elements));
mlumish34cd1f02015-01-02 13:32:41 -0800142 add_property_zval(event_object, "data", data_object);
mlumishb892a272014-12-09 16:28:23 -0800143 break;
Craig Tillerb5dcec52015-01-13 11:13:42 -0800144 default:
145 add_property_null(event_object, "data");
146 break;
mlumishb892a272014-12-09 16:28:23 -0800147 }
mlumish34cd1f02015-01-02 13:32:41 -0800148 grpc_event_finish(event);
149 return event_object;
mlumishb892a272014-12-09 16:28:23 -0800150}