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 #ifdef HAVE_CONFIG_H
24 #include "config.h"
25 #endif
26
27 #include "php.h"
28 #include "php_ini.h"
29 #include "ext/standard/info.h"
30 #include "zend_exceptions.h"
31
32 #ifdef PHP_WIN32
33 # include "win32/php_stdint.h"
34 # include "win32/signal.h"
35 #else
36
37 # include <signal.h>
38 # include <stdint.h>
39
40 #endif
41
42 #include <amqp.h>
43 #include <amqp_framing.h>
44
45 #ifdef PHP_WIN32
46 # include "win32/unistd.h"
47 #else
48
49 # include <unistd.h>
50
51 #endif
52
53 #include "amqp_envelope.h"
54 #include "amqp_basic_properties.h"
55 #include "php_amqp.h"
56
57 zend_class_entry *amqp_envelope_class_entry;
58 #define this_ce amqp_envelope_class_entry
59
60
convert_amqp_envelope_to_zval(amqp_envelope_t * amqp_envelope,zval * envelope TSRMLS_DC)61 void convert_amqp_envelope_to_zval(amqp_envelope_t *amqp_envelope, zval *envelope TSRMLS_DC)
62 {
63 /* Build the envelope */
64 object_init_ex(envelope, this_ce);
65
66
67 amqp_basic_properties_t *p = &amqp_envelope->message.properties;
68 amqp_message_t *message = &amqp_envelope->message;
69
70 zend_update_property_stringl(this_ce, envelope, ZEND_STRL("body"), (const char *) message->body.bytes, (PHP5to7_param_str_len_type_t) message->body.len TSRMLS_CC);
71
72 zend_update_property_stringl(this_ce, envelope, ZEND_STRL("consumer_tag"), (const char *) amqp_envelope->consumer_tag.bytes, (PHP5to7_param_str_len_type_t) amqp_envelope->consumer_tag.len TSRMLS_CC);
73 zend_update_property_long(this_ce, envelope, ZEND_STRL("delivery_tag"), (PHP5to7_param_long_type_t) amqp_envelope->delivery_tag TSRMLS_CC);
74 zend_update_property_bool(this_ce, envelope, ZEND_STRL("is_redelivery"), (PHP5to7_param_long_type_t) amqp_envelope->redelivered TSRMLS_CC);
75 zend_update_property_stringl(this_ce, envelope, ZEND_STRL("exchange_name"), (const char *) amqp_envelope->exchange.bytes, (PHP5to7_param_str_len_type_t) amqp_envelope->exchange.len TSRMLS_CC);
76 zend_update_property_stringl(this_ce, envelope, ZEND_STRL("routing_key"), (const char *) amqp_envelope->routing_key.bytes, (PHP5to7_param_str_len_type_t) amqp_envelope->routing_key.len TSRMLS_CC);
77
78 php_amqp_basic_properties_extract(p, envelope TSRMLS_CC);
79 }
80
81 /* {{{ proto AMQPEnvelope::__construct() */
PHP_METHOD(amqp_envelope_class,__construct)82 static PHP_METHOD(amqp_envelope_class, __construct) {
83 PHP_AMQP_NOPARAMS();
84
85 /* BC */
86 php_amqp_basic_properties_set_empty_headers(getThis() TSRMLS_CC);
87 }
88 /* }}} */
89
90
91 /* {{{ proto AMQPEnvelope::getBody()*/
PHP_METHOD(amqp_envelope_class,getBody)92 static PHP_METHOD(amqp_envelope_class, getBody) {
93 PHP5to7_READ_PROP_RV_PARAM_DECL;
94
95 PHP_AMQP_NOPARAMS();
96
97 zval* zv = PHP_AMQP_READ_THIS_PROP("body");
98
99 if (Z_STRLEN_P(zv) == 0) {
100 /* BC */
101 RETURN_FALSE;
102 }
103
104 RETURN_ZVAL(zv, 1, 0);
105 }
106 /* }}} */
107
108 /* {{{ proto AMQPEnvelope::getRoutingKey() */
PHP_METHOD(amqp_envelope_class,getRoutingKey)109 static PHP_METHOD(amqp_envelope_class, getRoutingKey) {
110 PHP5to7_READ_PROP_RV_PARAM_DECL;
111 PHP_AMQP_NOPARAMS();
112 PHP_AMQP_RETURN_THIS_PROP("routing_key");
113 }
114 /* }}} */
115
116 /* {{{ proto AMQPEnvelope::getDeliveryTag() */
PHP_METHOD(amqp_envelope_class,getDeliveryTag)117 static PHP_METHOD(amqp_envelope_class, getDeliveryTag) {
118 PHP5to7_READ_PROP_RV_PARAM_DECL;
119 PHP_AMQP_NOPARAMS();
120 PHP_AMQP_RETURN_THIS_PROP("delivery_tag");
121 }
122 /* }}} */
123
124 /* {{{ proto AMQPEnvelope::getConsumerTag() */
PHP_METHOD(amqp_envelope_class,getConsumerTag)125 static PHP_METHOD(amqp_envelope_class, getConsumerTag) {
126 PHP5to7_READ_PROP_RV_PARAM_DECL;
127 PHP_AMQP_NOPARAMS();
128 PHP_AMQP_RETURN_THIS_PROP("consumer_tag");
129 }
130 /* }}} */
131
132 /* {{{ proto AMQPEnvelope::getExchangeName() */
PHP_METHOD(amqp_envelope_class,getExchangeName)133 static PHP_METHOD(amqp_envelope_class, getExchangeName) {
134 PHP5to7_READ_PROP_RV_PARAM_DECL;
135 PHP_AMQP_NOPARAMS();
136 PHP_AMQP_RETURN_THIS_PROP("exchange_name");
137 }
138 /* }}} */
139
140 /* {{{ proto AMQPEnvelope::isRedelivery() */
PHP_METHOD(amqp_envelope_class,isRedelivery)141 static PHP_METHOD(amqp_envelope_class, isRedelivery) {
142 PHP5to7_READ_PROP_RV_PARAM_DECL;
143 PHP_AMQP_NOPARAMS();
144 PHP_AMQP_RETURN_THIS_PROP("is_redelivery");
145 }
146 /* }}} */
147
148
149 /* {{{ proto AMQPEnvelope::getHeader(string name) */
PHP_METHOD(amqp_envelope_class,getHeader)150 static PHP_METHOD(amqp_envelope_class, getHeader) {
151 PHP5to7_READ_PROP_RV_PARAM_DECL;
152
153 char *key; PHP5to7_param_str_len_type_t key_len;
154 PHP5to7_zval_t *tmp = NULL;
155
156 if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &key, &key_len) == FAILURE) {
157 return;
158 }
159
160 zval* zv = PHP_AMQP_READ_THIS_PROP_CE("headers", amqp_basic_properties_class_entry);
161 //zval* zv = PHP_AMQP_READ_THIS_PROP("headers");
162
163 /* Look for the hash key */
164 if (!PHP5to7_ZEND_HASH_FIND(HASH_OF(zv), key, key_len + 1, tmp)) {
165 RETURN_FALSE;
166 }
167
168 RETURN_ZVAL(PHP5to7_MAYBE_DEREF(tmp), 1, 0);
169 }
170 /* }}} */
171
172
173 /* {{{ proto AMQPEnvelope::hasHeader(string name) */
PHP_METHOD(amqp_envelope_class,hasHeader)174 static PHP_METHOD(amqp_envelope_class, hasHeader) {
175 PHP5to7_READ_PROP_RV_PARAM_DECL;
176
177 char *key; PHP5to7_param_str_len_type_t key_len;
178 PHP5to7_zval_t *tmp = NULL;
179
180 if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &key, &key_len) == FAILURE) {
181 return;
182 }
183
184 zval* zv = PHP_AMQP_READ_THIS_PROP_CE("headers", amqp_basic_properties_class_entry);
185 //zval* zv = PHP_AMQP_READ_THIS_PROP("headers");
186
187 /* Look for the hash key */
188 if (!PHP5to7_ZEND_HASH_FIND(HASH_OF(zv), key, key_len + 1, tmp)) {
189 RETURN_FALSE;
190 }
191
192 RETURN_TRUE;
193 }
194 /* }}} */
195
196
197 /* amqp_envelope_class ARG_INFO definition */
198 ZEND_BEGIN_ARG_INFO_EX(arginfo_amqp_envelope_class__construct, ZEND_SEND_BY_VAL, ZEND_RETURN_VALUE, 0)
199 ZEND_END_ARG_INFO()
200
201 ZEND_BEGIN_ARG_INFO_EX(arginfo_amqp_envelope_class_getBody, ZEND_SEND_BY_VAL, ZEND_RETURN_VALUE, 0)
202 ZEND_END_ARG_INFO()
203
204 ZEND_BEGIN_ARG_INFO_EX(arginfo_amqp_envelope_class_getRoutingKey, ZEND_SEND_BY_VAL, ZEND_RETURN_VALUE, 0)
205 ZEND_END_ARG_INFO()
206
207 ZEND_BEGIN_ARG_INFO_EX(arginfo_amqp_envelope_class_getConsumerTag, ZEND_SEND_BY_VAL, ZEND_RETURN_VALUE, 0)
208 ZEND_END_ARG_INFO()
209
210 ZEND_BEGIN_ARG_INFO_EX(arginfo_amqp_envelope_class_getDeliveryTag, ZEND_SEND_BY_VAL, ZEND_RETURN_VALUE, 0)
211 ZEND_END_ARG_INFO()
212
213 ZEND_BEGIN_ARG_INFO_EX(arginfo_amqp_envelope_class_getExchangeName, ZEND_SEND_BY_VAL, ZEND_RETURN_VALUE, 0)
214 ZEND_END_ARG_INFO()
215
216 ZEND_BEGIN_ARG_INFO_EX(arginfo_amqp_envelope_class_isRedelivery, ZEND_SEND_BY_VAL, ZEND_RETURN_VALUE, 0)
217 ZEND_END_ARG_INFO()
218
219 ZEND_BEGIN_ARG_INFO_EX(arginfo_amqp_envelope_class_getHeader, ZEND_SEND_BY_VAL, ZEND_RETURN_VALUE, 1)
220 ZEND_ARG_INFO(0, name)
221 ZEND_END_ARG_INFO()
222
223 ZEND_BEGIN_ARG_INFO_EX(arginfo_amqp_envelope_class_hasHeader, ZEND_SEND_BY_VAL, ZEND_RETURN_VALUE, 1)
224 ZEND_ARG_INFO(0, name)
225 ZEND_END_ARG_INFO()
226
227
228 zend_function_entry amqp_envelope_class_functions[] = {
229 PHP_ME(amqp_envelope_class, __construct, arginfo_amqp_envelope_class__construct, ZEND_ACC_PUBLIC | ZEND_ACC_CTOR)
230
231 PHP_ME(amqp_envelope_class, getBody, arginfo_amqp_envelope_class_getBody, ZEND_ACC_PUBLIC)
232
233 PHP_ME(amqp_envelope_class, getRoutingKey, arginfo_amqp_envelope_class_getRoutingKey, ZEND_ACC_PUBLIC)
234 PHP_ME(amqp_envelope_class, getConsumerTag, arginfo_amqp_envelope_class_getConsumerTag, ZEND_ACC_PUBLIC)
235 PHP_ME(amqp_envelope_class, getDeliveryTag, arginfo_amqp_envelope_class_getDeliveryTag, ZEND_ACC_PUBLIC)
236 PHP_ME(amqp_envelope_class, getExchangeName, arginfo_amqp_envelope_class_getExchangeName, ZEND_ACC_PUBLIC)
237 PHP_ME(amqp_envelope_class, isRedelivery, arginfo_amqp_envelope_class_isRedelivery, ZEND_ACC_PUBLIC)
238
239 PHP_ME(amqp_envelope_class, getHeader, arginfo_amqp_envelope_class_getHeader, ZEND_ACC_PUBLIC)
240 PHP_ME(amqp_envelope_class, hasHeader, arginfo_amqp_envelope_class_hasHeader, ZEND_ACC_PUBLIC)
241
242 {NULL, NULL, NULL}
243 };
244
245
PHP_MINIT_FUNCTION(amqp_envelope)246 PHP_MINIT_FUNCTION (amqp_envelope) {
247 zend_class_entry ce;
248
249 INIT_CLASS_ENTRY(ce, "AMQPEnvelope", amqp_envelope_class_functions);
250 this_ce = zend_register_internal_class_ex(&ce, amqp_basic_properties_class_entry PHP5to7_PARENT_CLASS_NAME_C(NULL) TSRMLS_CC);
251
252 zend_declare_property_null(this_ce, ZEND_STRL("body"), ZEND_ACC_PRIVATE TSRMLS_CC);
253
254 zend_declare_property_null(this_ce, ZEND_STRL("consumer_tag"), ZEND_ACC_PRIVATE TSRMLS_CC);
255 zend_declare_property_null(this_ce, ZEND_STRL("delivery_tag"), ZEND_ACC_PRIVATE TSRMLS_CC);
256 zend_declare_property_null(this_ce, ZEND_STRL("is_redelivery"), ZEND_ACC_PRIVATE TSRMLS_CC);
257 zend_declare_property_null(this_ce, ZEND_STRL("exchange_name"), ZEND_ACC_PRIVATE TSRMLS_CC);
258 zend_declare_property_null(this_ce, ZEND_STRL("routing_key"), ZEND_ACC_PRIVATE TSRMLS_CC);
259
260 return SUCCESS;
261 }
262
263
264 /*
265 *Local variables:
266 *tab-width: 4
267 *c-basic-offset: 4
268 *End:
269 *vim600: noet sw=4 ts=4 fdm=marker
270 *vim<600: noet sw=4 ts=4
271 */
272