1 /*
2   +----------------------------------------------------------------------+
3   | PHP Version 5                                                        |
4   +----------------------------------------------------------------------+
5   | Copyright (c) 1997-2007 The PHP Group                                |
6   +----------------------------------------------------------------------+
7   | This source file is subject to version 3.01 of the PHP license,      |
8   | that is bundled with this package in the file LICENSE, and is        |
9   | available through the world-wide-web at the following url:           |
10   | http://www.php.net/license/3_01.txt                                  |
11   | If you did not receive a copy of the PHP license and are unable to   |
12   | obtain it through the world-wide-web, please send a note to          |
13   | license@php.net so we can mail you a copy immediately.               |
14   +----------------------------------------------------------------------+
15   | Author: Alexandre Kalendarev akalend@mail.ru Copyright (c) 2009-2010 |
16   | Lead:                                                                |
17   | - Pieter de Zwart                                                    |
18   | Maintainers:                                                         |
19   | - Brad Rodriguez                                                     |
20   | - Jonathan Tansavatdi                                                |
21   +----------------------------------------------------------------------+
22 */
23 
24 #ifdef HAVE_CONFIG_H
25 #include "config.h"
26 #endif
27 
28 #include "php.h"
29 #include "php_ini.h"
30 #include "ext/standard/info.h"
31 #include "zend_exceptions.h"
32 #include "Zend/zend_interfaces.h"
33 
34 #include <amqp.h>
35 #include <amqp_framing.h>
36 
37 #ifdef PHP_WIN32
38 # include "win32/unistd.h"
39 # include "win32/php_stdint.h"
40 # include "win32/signal.h"
41 #else
42 # include <signal.h>
43 # include <stdint.h>
44 # include <unistd.h>
45 #endif
46 
47 #if HAVE_INTTYPES_H
48 # include <inttypes.h>
49 #endif
50 
51 #include "amqp_basic_properties.h"
52 #include "php_amqp.h"
53 #include "amqp_timestamp.h"
54 #include "amqp_decimal.h"
55 
56 zend_class_entry *amqp_basic_properties_class_entry;
57 #define this_ce amqp_basic_properties_class_entry
58 
59 
php_amqp_basic_properties_convert_to_zval(amqp_basic_properties_t * props,zval * obj TSRMLS_DC)60 void php_amqp_basic_properties_convert_to_zval(amqp_basic_properties_t *props, zval *obj TSRMLS_DC)
61 {
62     object_init_ex(obj, this_ce);
63 
64     php_amqp_basic_properties_extract(props, obj TSRMLS_CC);
65 }
66 
php_amqp_basic_properties_set_empty_headers(zval * obj TSRMLS_DC)67 void php_amqp_basic_properties_set_empty_headers(zval *obj TSRMLS_DC) {
68     PHP5to7_zval_t headers PHP5to7_MAYBE_SET_TO_NULL;
69 
70     PHP5to7_MAYBE_INIT(headers);
71     PHP5to7_ARRAY_INIT(headers);
72 
73     zend_update_property(this_ce, obj, ZEND_STRL("headers"), PHP5to7_MAYBE_PTR(headers) TSRMLS_CC);
74 
75     PHP5to7_MAYBE_DESTROY(headers);
76 }
77 
78 
79 /* {{{ proto AMQPBasicProperties::__construct() */
PHP_METHOD(AMQPBasicProperties,__construct)80 static PHP_METHOD(AMQPBasicProperties, __construct) {
81 
82     char *content_type = NULL;      PHP5to7_param_str_len_type_t content_type_len = 0;
83     char *content_encoding = NULL;  PHP5to7_param_str_len_type_t content_encoding_len = 0;
84 
85     zval *headers = NULL;
86 
87     PHP5to7_param_long_type_t delivery_mode = AMQP_DELIVERY_NONPERSISTENT;
88     PHP5to7_param_long_type_t priority = 0;
89 
90     char *correlation_id = NULL;    PHP5to7_param_str_len_type_t correlation_id_len = 0;
91     char *reply_to = NULL;          PHP5to7_param_str_len_type_t reply_to_len = 0;
92     char *expiration = NULL;        PHP5to7_param_str_len_type_t expiration_len = 0;
93     char *message_id = NULL;        PHP5to7_param_str_len_type_t message_id_len = 0;
94 
95     PHP5to7_param_long_type_t timestamp = 0;
96 
97     char *type = NULL;          PHP5to7_param_str_len_type_t type_len = 0;
98     char *user_id = NULL;       PHP5to7_param_str_len_type_t user_id_len = 0;
99     char *app_id = NULL;        PHP5to7_param_str_len_type_t app_id_len = 0;
100     char *cluster_id = NULL;    PHP5to7_param_str_len_type_t cluster_id_len = 0;
101 
102 
103     if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "|ssallsssslssss",
104                               /* s */ &content_type, &content_type_len,
105                               /* s */ &content_encoding, &content_encoding_len,
106                               /* a */ &headers,
107                               /* l */ &delivery_mode,
108                               /* l */ &priority,
109                               /* s */ &correlation_id, &correlation_id_len,
110                               /* s */ &reply_to, &reply_to_len,
111                               /* s */ &expiration, &expiration_len,
112                               /* s */ &message_id, &message_id_len,
113                               /* l */ &timestamp,
114                               /* s */ &type, &type_len,
115                               /* s */ &user_id, &user_id_len,
116                               /* s */ &app_id, &app_id_len,
117                               /* s */ &cluster_id, &cluster_id_len
118                              ) == FAILURE) {
119         return;
120     }
121     zend_update_property_stringl(this_ce, getThis(), ZEND_STRL("content_type"), content_type, content_type_len TSRMLS_CC);
122     zend_update_property_stringl(this_ce, getThis(), ZEND_STRL("content_encoding"), content_encoding, content_encoding_len TSRMLS_CC);
123 
124     if (headers != NULL) {
125         zend_update_property(this_ce, getThis(), ZEND_STRL("headers"), headers TSRMLS_CC);
126     } else {
127         php_amqp_basic_properties_set_empty_headers(getThis() TSRMLS_CC);
128     }
129 
130     zend_update_property_long(this_ce, getThis(), ZEND_STRL("delivery_mode"), delivery_mode TSRMLS_CC);
131     zend_update_property_long(this_ce, getThis(), ZEND_STRL("priority"), priority TSRMLS_CC);
132 
133     zend_update_property_stringl(this_ce, getThis(), ZEND_STRL("correlation_id"), correlation_id, correlation_id_len TSRMLS_CC);
134     zend_update_property_stringl(this_ce, getThis(), ZEND_STRL("reply_to"), reply_to, reply_to_len TSRMLS_CC);
135     zend_update_property_stringl(this_ce, getThis(), ZEND_STRL("expiration"), expiration, expiration_len TSRMLS_CC);
136     zend_update_property_stringl(this_ce, getThis(), ZEND_STRL("message_id"), message_id, message_id_len TSRMLS_CC);
137 
138     zend_update_property_long(this_ce, getThis(), ZEND_STRL("timestamp"), timestamp TSRMLS_CC);
139 
140     zend_update_property_stringl(this_ce, getThis(), ZEND_STRL("type"), type, type_len TSRMLS_CC);
141     zend_update_property_stringl(this_ce, getThis(), ZEND_STRL("user_id"), user_id, user_id_len TSRMLS_CC);
142     zend_update_property_stringl(this_ce, getThis(), ZEND_STRL("app_id"), app_id, app_id_len TSRMLS_CC);
143     zend_update_property_stringl(this_ce, getThis(), ZEND_STRL("cluster_id"), cluster_id, cluster_id_len TSRMLS_CC);
144 }
145 /* }}} */
146 
147 /* {{{ proto AMQPBasicProperties::getContentType() */
PHP_METHOD(AMQPBasicProperties,getContentType)148 static PHP_METHOD(AMQPBasicProperties, getContentType) {
149     PHP5to7_READ_PROP_RV_PARAM_DECL;
150     PHP_AMQP_NOPARAMS();
151     PHP_AMQP_RETURN_THIS_PROP("content_type");
152 }
153 /* }}} */
154 
155 /* {{{ proto AMQPBasicProperties::getContentEncoding() */
PHP_METHOD(AMQPBasicProperties,getContentEncoding)156 static PHP_METHOD(AMQPBasicProperties, getContentEncoding) {
157     PHP5to7_READ_PROP_RV_PARAM_DECL;
158     PHP_AMQP_NOPARAMS();
159     PHP_AMQP_RETURN_THIS_PROP("content_encoding");
160 }
161 /* }}} */
162 
163 /* {{{ proto AMQPBasicProperties::getCorrelationId() */
PHP_METHOD(AMQPBasicProperties,getHeaders)164 static PHP_METHOD(AMQPBasicProperties, getHeaders) {
165     PHP5to7_READ_PROP_RV_PARAM_DECL;
166     PHP_AMQP_NOPARAMS();
167     PHP_AMQP_RETURN_THIS_PROP("headers");
168 }
169 /* }}} */
170 
171 /* {{{ proto AMQPBasicProperties::getDeliveryMode() */
PHP_METHOD(AMQPBasicProperties,getDeliveryMode)172 static PHP_METHOD(AMQPBasicProperties, getDeliveryMode) {
173     PHP5to7_READ_PROP_RV_PARAM_DECL;
174     PHP_AMQP_NOPARAMS();
175     PHP_AMQP_RETURN_THIS_PROP("delivery_mode");
176 }
177 /* }}} */
178 
179 /* {{{ proto AMQPBasicProperties::getPriority() */
PHP_METHOD(AMQPBasicProperties,getPriority)180 static PHP_METHOD(AMQPBasicProperties, getPriority) {
181     PHP5to7_READ_PROP_RV_PARAM_DECL;
182     PHP_AMQP_NOPARAMS();
183     PHP_AMQP_RETURN_THIS_PROP("priority");
184 }
185 /* }}} */
186 
187 /* {{{ proto AMQPBasicProperties::getCorrelationId() */
PHP_METHOD(AMQPBasicProperties,getCorrelationId)188 static PHP_METHOD(AMQPBasicProperties, getCorrelationId) {
189     PHP5to7_READ_PROP_RV_PARAM_DECL;
190     PHP_AMQP_NOPARAMS();
191     PHP_AMQP_RETURN_THIS_PROP("correlation_id");
192 }
193 /* }}} */
194 
195 /* {{{ proto AMQPBasicProperties::getReplyTo() */
PHP_METHOD(AMQPBasicProperties,getReplyTo)196 static PHP_METHOD(AMQPBasicProperties, getReplyTo) {
197     PHP5to7_READ_PROP_RV_PARAM_DECL;
198     PHP_AMQP_NOPARAMS();
199     PHP_AMQP_RETURN_THIS_PROP("reply_to");
200 }
201 /* }}} */
202 
203 /* {{{ proto AMQPBasicProperties::getExpiration()
204 check amqp envelope */
PHP_METHOD(AMQPBasicProperties,getExpiration)205 static PHP_METHOD(AMQPBasicProperties, getExpiration) {
206     PHP5to7_READ_PROP_RV_PARAM_DECL;
207     PHP_AMQP_NOPARAMS();
208     PHP_AMQP_RETURN_THIS_PROP("expiration");
209 }
210 /* }}} */
211 
212 /* {{{ proto AMQPBasicProperties::getMessageId() */
PHP_METHOD(AMQPBasicProperties,getMessageId)213 static PHP_METHOD(AMQPBasicProperties, getMessageId) {
214     PHP5to7_READ_PROP_RV_PARAM_DECL;
215     PHP_AMQP_NOPARAMS();
216     PHP_AMQP_RETURN_THIS_PROP("message_id");
217 }
218 /* }}} */
219 
220 /* {{{ proto AMQPBasicProperties::getTimestamp() */
PHP_METHOD(AMQPBasicProperties,getTimestamp)221 static PHP_METHOD(AMQPBasicProperties, getTimestamp) {
222     PHP5to7_READ_PROP_RV_PARAM_DECL;
223     PHP_AMQP_NOPARAMS();
224     PHP_AMQP_RETURN_THIS_PROP("timestamp");
225 }
226 /* }}} */
227 
228 /* {{{ proto AMQPBasicProperties::getType() */
PHP_METHOD(AMQPBasicProperties,getType)229 static PHP_METHOD(AMQPBasicProperties, getType) {
230     PHP5to7_READ_PROP_RV_PARAM_DECL;
231     PHP_AMQP_NOPARAMS();
232     PHP_AMQP_RETURN_THIS_PROP("type");
233 }
234 /* }}} */
235 
236 /* {{{ proto AMQPBasicProperties::getUserId() */
PHP_METHOD(AMQPBasicProperties,getUserId)237 static PHP_METHOD(AMQPBasicProperties, getUserId) {
238     PHP5to7_READ_PROP_RV_PARAM_DECL;
239     PHP_AMQP_NOPARAMS();
240     PHP_AMQP_RETURN_THIS_PROP("user_id");
241 }
242 /* }}} */
243 
244 /* {{{ proto AMQPBasicProperties::getAppId() */
PHP_METHOD(AMQPBasicProperties,getAppId)245 static PHP_METHOD(AMQPBasicProperties, getAppId) {
246     PHP5to7_READ_PROP_RV_PARAM_DECL;
247     PHP_AMQP_NOPARAMS();
248     PHP_AMQP_RETURN_THIS_PROP("app_id");
249 }
250 /* }}} */
251 
252 /* {{{ proto AMQPBasicProperties::getClusterId() */
PHP_METHOD(AMQPBasicProperties,getClusterId)253 static PHP_METHOD(AMQPBasicProperties, getClusterId) {
254     PHP5to7_READ_PROP_RV_PARAM_DECL;
255     PHP_AMQP_NOPARAMS();
256     PHP_AMQP_RETURN_THIS_PROP("cluster_id");
257 }
258 /* }}} */
259 
260 ZEND_BEGIN_ARG_INFO_EX(arginfo_amqp_basic_properties_class__construct, ZEND_SEND_BY_VAL, ZEND_RETURN_VALUE, 0)
261 ZEND_END_ARG_INFO()
262 
263 ZEND_BEGIN_ARG_INFO_EX(arginfo_amqp_basic_properties_class_getContentType, ZEND_SEND_BY_VAL, ZEND_RETURN_VALUE, 0)
264 ZEND_END_ARG_INFO()
265 
266 ZEND_BEGIN_ARG_INFO_EX(arginfo_amqp_basic_properties_class_getContentEncoding, ZEND_SEND_BY_VAL, ZEND_RETURN_VALUE, 0)
267 ZEND_END_ARG_INFO()
268 
269 ZEND_BEGIN_ARG_INFO_EX(arginfo_amqp_basic_properties_class_getHeaders, ZEND_SEND_BY_VAL, ZEND_RETURN_VALUE, 0)
270 ZEND_END_ARG_INFO()
271 
272 ZEND_BEGIN_ARG_INFO_EX(arginfo_amqp_basic_properties_class_getDeliveryMode, ZEND_SEND_BY_VAL, ZEND_RETURN_VALUE, 0)
273 ZEND_END_ARG_INFO()
274 
275 ZEND_BEGIN_ARG_INFO_EX(arginfo_amqp_basic_properties_class_getPriority, ZEND_SEND_BY_VAL, ZEND_RETURN_VALUE, 0)
276 ZEND_END_ARG_INFO()
277 
278 ZEND_BEGIN_ARG_INFO_EX(arginfo_amqp_basic_properties_class_getCorrelationId, ZEND_SEND_BY_VAL, ZEND_RETURN_VALUE, 0)
279 ZEND_END_ARG_INFO()
280 
281 ZEND_BEGIN_ARG_INFO_EX(arginfo_amqp_basic_properties_class_getReplyTo, ZEND_SEND_BY_VAL, ZEND_RETURN_VALUE, 0)
282 ZEND_END_ARG_INFO()
283 
284 ZEND_BEGIN_ARG_INFO_EX(arginfo_amqp_basic_properties_class_getExpiration, ZEND_SEND_BY_VAL, ZEND_RETURN_VALUE, 0)
285 ZEND_END_ARG_INFO()
286 
287 ZEND_BEGIN_ARG_INFO_EX(arginfo_amqp_basic_properties_class_getMessageId, ZEND_SEND_BY_VAL, ZEND_RETURN_VALUE, 0)
288 ZEND_END_ARG_INFO()
289 
290 ZEND_BEGIN_ARG_INFO_EX(arginfo_amqp_basic_properties_class_getTimestamp, ZEND_SEND_BY_VAL, ZEND_RETURN_VALUE, 0)
291 ZEND_END_ARG_INFO()
292 
293 ZEND_BEGIN_ARG_INFO_EX(arginfo_amqp_basic_properties_class_getType, ZEND_SEND_BY_VAL, ZEND_RETURN_VALUE, 0)
294 ZEND_END_ARG_INFO()
295 
296 ZEND_BEGIN_ARG_INFO_EX(arginfo_amqp_basic_properties_class_getUserId, ZEND_SEND_BY_VAL, ZEND_RETURN_VALUE, 0)
297 ZEND_END_ARG_INFO()
298 
299 ZEND_BEGIN_ARG_INFO_EX(arginfo_amqp_basic_properties_class_getAppId, ZEND_SEND_BY_VAL, ZEND_RETURN_VALUE, 0)
300 ZEND_END_ARG_INFO()
301 
302 ZEND_BEGIN_ARG_INFO_EX(arginfo_amqp_basic_properties_class_getClusterId, ZEND_SEND_BY_VAL, ZEND_RETURN_VALUE, 0)
303 ZEND_END_ARG_INFO()
304 
305 
306 zend_function_entry amqp_basic_properties_class_functions[] = {
307         PHP_ME(AMQPBasicProperties, __construct, arginfo_amqp_basic_properties_class__construct, ZEND_ACC_PUBLIC | ZEND_ACC_CTOR)
308 
309         PHP_ME(AMQPBasicProperties, getContentType, arginfo_amqp_basic_properties_class_getContentType, ZEND_ACC_PUBLIC)
310         PHP_ME(AMQPBasicProperties, getContentEncoding, arginfo_amqp_basic_properties_class_getContentEncoding, ZEND_ACC_PUBLIC)
311 
312         PHP_ME(AMQPBasicProperties, getHeaders, arginfo_amqp_basic_properties_class_getHeaders, ZEND_ACC_PUBLIC)
313 
314         PHP_ME(AMQPBasicProperties, getDeliveryMode, arginfo_amqp_basic_properties_class_getDeliveryMode, ZEND_ACC_PUBLIC)
315         PHP_ME(AMQPBasicProperties, getPriority, arginfo_amqp_basic_properties_class_getPriority, ZEND_ACC_PUBLIC)
316 
317         PHP_ME(AMQPBasicProperties, getCorrelationId, arginfo_amqp_basic_properties_class_getCorrelationId, ZEND_ACC_PUBLIC)
318         PHP_ME(AMQPBasicProperties, getReplyTo, arginfo_amqp_basic_properties_class_getReplyTo, ZEND_ACC_PUBLIC)
319         PHP_ME(AMQPBasicProperties, getExpiration, arginfo_amqp_basic_properties_class_getExpiration, ZEND_ACC_PUBLIC)
320         PHP_ME(AMQPBasicProperties, getMessageId, arginfo_amqp_basic_properties_class_getMessageId, ZEND_ACC_PUBLIC)
321 
322         PHP_ME(AMQPBasicProperties, getTimestamp, arginfo_amqp_basic_properties_class_getTimestamp, ZEND_ACC_PUBLIC)
323 
324         PHP_ME(AMQPBasicProperties, getType, arginfo_amqp_basic_properties_class_getType, ZEND_ACC_PUBLIC)
325         PHP_ME(AMQPBasicProperties, getUserId, arginfo_amqp_basic_properties_class_getUserId, ZEND_ACC_PUBLIC)
326         PHP_ME(AMQPBasicProperties, getAppId, arginfo_amqp_basic_properties_class_getAppId, ZEND_ACC_PUBLIC)
327         PHP_ME(AMQPBasicProperties, getClusterId, arginfo_amqp_basic_properties_class_getClusterId, ZEND_ACC_PUBLIC)
328 
329         {NULL, NULL, NULL}
330 };
331 
332 
PHP_MINIT_FUNCTION(amqp_basic_properties)333 PHP_MINIT_FUNCTION (amqp_basic_properties) {
334     zend_class_entry ce;
335 
336     INIT_CLASS_ENTRY(ce, "AMQPBasicProperties", amqp_basic_properties_class_functions);
337     this_ce = zend_register_internal_class(&ce TSRMLS_CC);
338 
339     zend_declare_property_stringl(this_ce, ZEND_STRL("content_type"), "", 0, ZEND_ACC_PRIVATE TSRMLS_CC);
340     zend_declare_property_stringl(this_ce, ZEND_STRL("content_encoding"), "", 0, ZEND_ACC_PRIVATE TSRMLS_CC);
341 
342     zend_declare_property_null(this_ce, ZEND_STRL("headers"), ZEND_ACC_PRIVATE TSRMLS_CC);
343 
344     zend_declare_property_long(this_ce, ZEND_STRL("delivery_mode"), AMQP_DELIVERY_NONPERSISTENT, ZEND_ACC_PRIVATE TSRMLS_CC);
345     zend_declare_property_long(this_ce, ZEND_STRL("priority"), 0, ZEND_ACC_PRIVATE TSRMLS_CC);
346 
347     zend_declare_property_stringl(this_ce, ZEND_STRL("correlation_id"), "", 0, ZEND_ACC_PRIVATE TSRMLS_CC);
348     zend_declare_property_stringl(this_ce, ZEND_STRL("reply_to"), "", 0, ZEND_ACC_PRIVATE TSRMLS_CC);
349     zend_declare_property_stringl(this_ce, ZEND_STRL("expiration"), "", 0, ZEND_ACC_PRIVATE TSRMLS_CC);
350     zend_declare_property_stringl(this_ce, ZEND_STRL("message_id"), "", 0, ZEND_ACC_PRIVATE TSRMLS_CC);
351 
352     zend_declare_property_long(this_ce, ZEND_STRL("timestamp"), 0, ZEND_ACC_PRIVATE TSRMLS_CC);
353 
354     zend_declare_property_stringl(this_ce, ZEND_STRL("type"), "", 0, ZEND_ACC_PRIVATE TSRMLS_CC);
355     zend_declare_property_stringl(this_ce, ZEND_STRL("user_id"), "", 0,  ZEND_ACC_PRIVATE TSRMLS_CC);
356     zend_declare_property_stringl(this_ce, ZEND_STRL("app_id"), "", 0,  ZEND_ACC_PRIVATE TSRMLS_CC);
357     zend_declare_property_stringl(this_ce, ZEND_STRL("cluster_id"), "", 0, ZEND_ACC_PRIVATE TSRMLS_CC);
358 
359     return SUCCESS;
360 }
361 
362 
parse_amqp_table(amqp_table_t * table,zval * result TSRMLS_DC)363 void parse_amqp_table(amqp_table_t *table, zval *result TSRMLS_DC) {
364     int i;
365     zend_bool has_value = 0;
366 
367     PHP5to7_zval_t value PHP5to7_MAYBE_SET_TO_NULL;
368 
369     assert(Z_TYPE_P(result) == IS_ARRAY);
370 
371     for (i = 0; i < table->num_entries; i++) {
372         PHP5to7_MAYBE_INIT(value);
373         has_value = 1;
374 
375         amqp_table_entry_t *entry = &(table->entries[i]);
376         switch (entry->value.kind) {
377             case AMQP_FIELD_KIND_BOOLEAN:
378                 ZVAL_BOOL(PHP5to7_MAYBE_PTR(value), entry->value.value.boolean);
379                 break;
380             case AMQP_FIELD_KIND_I8:
381                 ZVAL_LONG(PHP5to7_MAYBE_PTR(value), entry->value.value.i8);
382                 break;
383             case AMQP_FIELD_KIND_U8:
384                 ZVAL_LONG(PHP5to7_MAYBE_PTR(value), entry->value.value.u8);
385                 break;
386             case AMQP_FIELD_KIND_I16:
387                 ZVAL_LONG(PHP5to7_MAYBE_PTR(value), entry->value.value.i16);
388                 break;
389             case AMQP_FIELD_KIND_U16:
390                 ZVAL_LONG(PHP5to7_MAYBE_PTR(value), entry->value.value.u16);
391                 break;
392             case AMQP_FIELD_KIND_I32:
393                 ZVAL_LONG(PHP5to7_MAYBE_PTR(value), entry->value.value.i32);
394                 break;
395             case AMQP_FIELD_KIND_U32:
396                 ZVAL_LONG(PHP5to7_MAYBE_PTR(value), entry->value.value.u32);
397                 break;
398             case AMQP_FIELD_KIND_I64:
399                 ZVAL_LONG(PHP5to7_MAYBE_PTR(value), entry->value.value.i64);
400                 break;
401             case AMQP_FIELD_KIND_U64:
402                 if (entry->value.value.u64 > LONG_MAX) {
403                     ZVAL_DOUBLE(PHP5to7_MAYBE_PTR(value), entry->value.value.u64);
404                 } else {
405                     ZVAL_LONG(PHP5to7_MAYBE_PTR(value), entry->value.value.u64);
406                 }
407                 break;
408             case AMQP_FIELD_KIND_F32:
409                 ZVAL_DOUBLE(PHP5to7_MAYBE_PTR(value), entry->value.value.f32);
410                 break;
411             case AMQP_FIELD_KIND_F64:
412                 ZVAL_DOUBLE(PHP5to7_MAYBE_PTR(value), entry->value.value.f64);
413                 break;
414             case AMQP_FIELD_KIND_UTF8:
415             case AMQP_FIELD_KIND_BYTES:
416                 PHP5to7_ZVAL_STRINGL_DUP(PHP5to7_MAYBE_PTR(value), entry->value.value.bytes.bytes, entry->value.value.bytes.len);
417                 break;
418             case AMQP_FIELD_KIND_ARRAY: {
419                 int j;
420                 array_init(PHP5to7_MAYBE_PTR(value));
421                 for (j = 0; j < entry->value.value.array.num_entries; ++j) {
422                     switch (entry->value.value.array.entries[j].kind) {
423                         case AMQP_FIELD_KIND_UTF8:
424                             PHP5to7_ADD_NEXT_INDEX_STRINGL_DUP(
425                                     PHP5to7_MAYBE_PTR(value),
426                                     entry->value.value.array.entries[j].value.bytes.bytes,
427                                     (unsigned) entry->value.value.array.entries[j].value.bytes.len
428                             );
429                             break;
430                         case AMQP_FIELD_KIND_TABLE: {
431                             PHP5to7_zval_t subtable PHP5to7_MAYBE_SET_TO_NULL;
432                             PHP5to7_MAYBE_INIT(subtable);
433                             PHP5to7_ARRAY_INIT(subtable);
434 
435                             parse_amqp_table(
436                                     &(entry->value.value.array.entries[j].value.table),
437                                     PHP5to7_MAYBE_PTR(subtable) TSRMLS_CC
438                             );
439                             add_next_index_zval(PHP5to7_MAYBE_PTR(value), PHP5to7_MAYBE_PTR(subtable));
440                         }
441                             break;
442                         default:
443                             break;
444                     }
445                 }
446             }
447                 break;
448             case AMQP_FIELD_KIND_TABLE:
449                 PHP5to7_ARRAY_INIT(value);
450                 parse_amqp_table(&(entry->value.value.table), PHP5to7_MAYBE_PTR(value) TSRMLS_CC);
451                 break;
452 
453             case AMQP_FIELD_KIND_TIMESTAMP: {
454 				char timestamp_str[20];
455 				PHP5to7_zval_t timestamp PHP5to7_MAYBE_SET_TO_NULL;
456 				PHP5to7_MAYBE_INIT(timestamp);
457 
458 				int length = snprintf(timestamp_str, sizeof(timestamp_str), ZEND_ULONG_FMT, entry->value.value.u64);
459                 PHP5to7_ZVAL_STRINGL_DUP(PHP5to7_MAYBE_PTR(timestamp), (char *)timestamp_str, length);
460 				object_init_ex(PHP5to7_MAYBE_PTR(value), amqp_timestamp_class_entry);
461 
462 				zend_call_method_with_1_params(
463 						&value,
464 						amqp_timestamp_class_entry,
465 						NULL,
466 						"__construct",
467 						NULL,
468 						PHP5to7_MAYBE_PTR(timestamp)
469 				);
470 
471                 PHP5to7_MAYBE_DESTROY(timestamp);
472 				break;
473 			}
474 
475             case AMQP_FIELD_KIND_VOID:
476                 ZVAL_NULL(PHP5to7_MAYBE_PTR(value));
477                 break;
478             case AMQP_FIELD_KIND_DECIMAL: {
479 
480                 PHP5to7_zval_t e PHP5to7_MAYBE_SET_TO_NULL;
481                 PHP5to7_zval_t n PHP5to7_MAYBE_SET_TO_NULL;
482                 PHP5to7_MAYBE_INIT(e);
483                 PHP5to7_MAYBE_INIT(n);
484 
485                 ZVAL_LONG(PHP5to7_MAYBE_PTR(e), entry->value.value.decimal.decimals);
486                 ZVAL_LONG(PHP5to7_MAYBE_PTR(n), entry->value.value.decimal.value);
487 
488                 object_init_ex(PHP5to7_MAYBE_PTR(value), amqp_decimal_class_entry);
489 
490                 zend_call_method_with_2_params(
491                         &value,
492                         amqp_decimal_class_entry,
493                         NULL,
494                         "__construct",
495                         NULL,
496                         PHP5to7_MAYBE_PTR(e),
497                         PHP5to7_MAYBE_PTR(n)
498                 );
499 
500                 PHP5to7_MAYBE_DESTROY(e);
501                 PHP5to7_MAYBE_DESTROY(n);
502                 break;
503             }
504             default:
505                 has_value = 0;
506                 break;
507         }
508 
509         if (has_value) {
510             char *key = estrndup(entry->key.bytes, (unsigned) entry->key.len);
511             add_assoc_zval(result, key, PHP5to7_MAYBE_PTR(value));
512             efree(key);
513         } else {
514             PHP5to7_MAYBE_DESTROY(value);
515         }
516     }
517     return;
518 }
519 
php_amqp_basic_properties_extract(amqp_basic_properties_t * p,zval * obj TSRMLS_DC)520 void php_amqp_basic_properties_extract(amqp_basic_properties_t *p, zval *obj TSRMLS_DC)
521 {
522     PHP5to7_zval_t headers PHP5to7_MAYBE_SET_TO_NULL;
523 
524     PHP5to7_MAYBE_INIT(headers);
525     PHP5to7_ARRAY_INIT(headers);
526 
527     if (p->_flags & AMQP_BASIC_CONTENT_TYPE_FLAG) {
528         zend_update_property_stringl(this_ce, obj, ZEND_STRL("content_type"), (const char *) p->content_type.bytes, (PHP5to7_param_str_len_type_t) p->content_type.len TSRMLS_CC);
529     } else {
530         /* BC */
531         zend_update_property_stringl(this_ce, obj, ZEND_STRL("content_type"), "", 0 TSRMLS_CC);
532     }
533 
534     if (p->_flags & AMQP_BASIC_CONTENT_ENCODING_FLAG) {
535         zend_update_property_stringl(this_ce, obj, ZEND_STRL("content_encoding"), (const char *) p->content_encoding.bytes, (PHP5to7_param_str_len_type_t) p->content_encoding.len TSRMLS_CC);
536     } else {
537         /* BC */
538         zend_update_property_stringl(this_ce, obj, ZEND_STRL("content_encoding"), "", 0 TSRMLS_CC);
539     }
540 
541     if (p->_flags & AMQP_BASIC_HEADERS_FLAG) {
542         parse_amqp_table(&(p->headers), PHP5to7_MAYBE_PTR(headers) TSRMLS_CC);
543     }
544 
545     zend_update_property(this_ce, obj, ZEND_STRL("headers"), PHP5to7_MAYBE_PTR(headers) TSRMLS_CC);
546 
547     if (p->_flags & AMQP_BASIC_DELIVERY_MODE_FLAG) {
548         zend_update_property_long(this_ce, obj, ZEND_STRL("delivery_mode"), (PHP5to7_param_long_type_t) p->delivery_mode TSRMLS_CC);
549     } else {
550         /* BC */
551         zend_update_property_long(this_ce, obj, ZEND_STRL("delivery_mode"), AMQP_DELIVERY_NONPERSISTENT TSRMLS_CC);
552     }
553 
554     if (p->_flags & AMQP_BASIC_PRIORITY_FLAG) {
555         zend_update_property_long(this_ce, obj, ZEND_STRL("priority"), (PHP5to7_param_long_type_t) p->priority TSRMLS_CC);
556     } else {
557         /* BC */
558         zend_update_property_long(this_ce, obj, ZEND_STRL("priority"), 0 TSRMLS_CC);
559     }
560 
561     if (p->_flags & AMQP_BASIC_CORRELATION_ID_FLAG) {
562         zend_update_property_stringl(this_ce, obj, ZEND_STRL("correlation_id"), (const char *) p->correlation_id.bytes, (PHP5to7_param_str_len_type_t) p->correlation_id.len TSRMLS_CC);
563     } else {
564         /* BC */
565         zend_update_property_stringl(this_ce, obj, ZEND_STRL("correlation_id"), "", 0 TSRMLS_CC);
566     }
567 
568     if (p->_flags & AMQP_BASIC_REPLY_TO_FLAG) {
569         zend_update_property_stringl(this_ce, obj, ZEND_STRL("reply_to"), (const char *) p->reply_to.bytes, (PHP5to7_param_str_len_type_t) p->reply_to.len TSRMLS_CC);
570     } else {
571         /* BC */
572         zend_update_property_stringl(this_ce, obj, ZEND_STRL("reply_to"), "", 0 TSRMLS_CC);
573     }
574 
575     if (p->_flags & AMQP_BASIC_EXPIRATION_FLAG) {
576         zend_update_property_stringl(this_ce, obj, ZEND_STRL("expiration"), (const char *) p->expiration.bytes, (PHP5to7_param_str_len_type_t) p->expiration.len TSRMLS_CC);
577     } else {
578         /* BC */
579         zend_update_property_stringl(this_ce, obj, ZEND_STRL("expiration"), "", 0 TSRMLS_CC);
580     }
581 
582     if (p->_flags & AMQP_BASIC_MESSAGE_ID_FLAG) {
583         zend_update_property_stringl(this_ce, obj, ZEND_STRL("message_id"), (const char *) p->message_id.bytes, (PHP5to7_param_str_len_type_t) p->message_id.len TSRMLS_CC);
584     } else {
585         /* BC */
586         zend_update_property_stringl(this_ce, obj, ZEND_STRL("message_id"), "", 0 TSRMLS_CC);
587     }
588 
589     if (p->_flags & AMQP_BASIC_TIMESTAMP_FLAG) {
590         zend_update_property_long(this_ce, obj, ZEND_STRL("timestamp"), (PHP5to7_param_long_type_t) p->timestamp TSRMLS_CC);
591     } else {
592         /* BC */
593         zend_update_property_long(this_ce, obj, ZEND_STRL("timestamp"), 0 TSRMLS_CC);
594     }
595 
596     if (p->_flags & AMQP_BASIC_TYPE_FLAG) {
597         zend_update_property_stringl(this_ce, obj, ZEND_STRL("type"), (const char *) p->type.bytes, (PHP5to7_param_str_len_type_t) p->type.len TSRMLS_CC);
598     } else {
599         /* BC */
600         zend_update_property_stringl(this_ce, obj, ZEND_STRL("type"), "", 0 TSRMLS_CC);
601     }
602 
603     if (p->_flags & AMQP_BASIC_USER_ID_FLAG) {
604         zend_update_property_stringl(this_ce, obj, ZEND_STRL("user_id"), (const char *) p->user_id.bytes, (PHP5to7_param_str_len_type_t) p->user_id.len TSRMLS_CC);
605     } else {
606         /* BC */
607         zend_update_property_stringl(this_ce, obj, ZEND_STRL("user_id"), "", 0 TSRMLS_CC);
608     }
609 
610     if (p->_flags & AMQP_BASIC_APP_ID_FLAG) {
611         zend_update_property_stringl(this_ce, obj, ZEND_STRL("app_id"), (const char *) p->app_id.bytes, (PHP5to7_param_str_len_type_t) p->app_id.len TSRMLS_CC);
612     } else {
613         /* BC */
614         zend_update_property_stringl(this_ce, obj, ZEND_STRL("app_id"), "", 0 TSRMLS_CC);
615     }
616 
617     PHP5to7_MAYBE_DESTROY(headers);
618 }
619 
620 
621 /*
622 *Local variables:
623 *tab-width: 4
624 *c-basic-offset: 4
625 *End:
626 *vim600: noet sw=4 ts=4 fdm=marker
627 *vim<600: noet sw=4 ts=4
628 */
629