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