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 */ ×tamp,
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