* Added argument info
[m6w6/ext-ircclient] / php_ircclient.c
1 /*
2 +--------------------------------------------------------------------+
3 | PECL :: ircclient |
4 +--------------------------------------------------------------------+
5 | Redistribution and use in source and binary forms, with or without |
6 | modification, are permitted provided that the conditions mentioned |
7 | in the accompanying LICENSE file are met. |
8 +--------------------------------------------------------------------+
9 | Copyright (c) 2011, Michael Wallner <mike@php.net> |
10 +--------------------------------------------------------------------+
11 */
12
13 #ifdef HAVE_CONFIG_H
14 #include "config.h"
15 #endif
16
17 #include <main/php.h>
18 #include <main/php_config.h>
19 #include <main/php_ini.h>
20 #include <main/php_network.h>
21 #include <ext/standard/php_string.h>
22 #include <ext/standard/info.h>
23
24 #include <Zend/zend.h>
25 #include <Zend/zend_constants.h>
26 #include <Zend/zend_interfaces.h>
27
28 #include "php_ircclient.h"
29
30 #include <errno.h>
31 #include <ctype.h>
32 #include <libircclient/libircclient.h>
33
34 PHP_FUNCTION(parse_origin)
35 {
36 char *origin_str;
37 int origin_len;
38
39 if (SUCCESS == zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &origin_str, &origin_len)) {
40 zval *znick, *zuser, *zhost;
41 size_t siz = 0;
42 char *ptr;
43
44 MAKE_STD_ZVAL(znick); ZVAL_NULL(znick);
45 MAKE_STD_ZVAL(zuser); ZVAL_NULL(zuser);
46 MAKE_STD_ZVAL(zhost); ZVAL_NULL(zhost);
47
48 for (ptr = origin_str; *ptr; ptr += siz + 1) {
49 if ((siz = strcspn(ptr, "!@"))) {
50 switch (ptr[siz]) {
51 case '!':
52 ZVAL_STRINGL(znick, ptr, siz, 1);
53 break;
54 case '@':
55 ZVAL_STRINGL(zuser, ptr, siz, 1);
56 break;
57 case '\0':
58 ZVAL_STRINGL(zhost, ptr, siz, 1);
59 goto done;
60 break;
61 default:
62 break;
63 }
64 }
65 }
66 done:
67 array_init(return_value);
68 add_assoc_zval_ex(return_value, ZEND_STRS("nick"), znick);
69 add_assoc_zval_ex(return_value, ZEND_STRS("user"), zuser);
70 add_assoc_zval_ex(return_value, ZEND_STRS("host"), zhost);
71 }
72 }
73
74
75 const zend_function_entry php_ircclient_function_entry[] = {
76 ZEND_NS_FENTRY("irc\\client", parse_origin, ZEND_FN(parse_origin), NULL, 0)
77 {0}
78 };
79
80 PHP_MINIT_FUNCTION(ircclient);
81 PHP_MINFO_FUNCTION(ircclient);
82
83 zend_module_entry ircclient_module_entry = {
84 STANDARD_MODULE_HEADER,
85 "ircclient",
86 php_ircclient_function_entry,
87 PHP_MINIT(ircclient),
88 NULL,
89 NULL,
90 NULL,
91 PHP_MINFO(ircclient),
92 PHP_IRCCLIENT_VERSION,
93 STANDARD_MODULE_PROPERTIES
94 };
95
96
97 #ifdef COMPILE_DL_IRCCLIENT
98 ZEND_GET_MODULE(ircclient)
99 #endif
100
101 static void php_ircclient_event_callback(irc_session_t *session, const char *event, const char *origin, const char **params, unsigned int count);
102 static void php_ircclient_event_code_callback(irc_session_t *session, unsigned int event, const char *origin, const char **params, unsigned int count);
103 static void php_ircclient_event_dcc_chat_callback(irc_session_t *session, const char *nick, const char *addr, irc_dcc_t dccid);
104 static void php_ircclient_event_dcc_send_callback(irc_session_t *session, const char *nick, const char *addr, const char *filename, unsigned long size, irc_dcc_t dccid);
105
106 static irc_callbacks_t php_ircclient_callbacks = {
107 .event_connect = php_ircclient_event_callback,
108 .event_nick = php_ircclient_event_callback,
109 .event_quit = php_ircclient_event_callback,
110 .event_join = php_ircclient_event_callback,
111 .event_part = php_ircclient_event_callback,
112 .event_mode = php_ircclient_event_callback,
113 .event_umode = php_ircclient_event_callback,
114 .event_topic = php_ircclient_event_callback,
115 .event_kick = php_ircclient_event_callback,
116 .event_channel = php_ircclient_event_callback,
117 .event_privmsg = php_ircclient_event_callback,
118 .event_notice = php_ircclient_event_callback,
119 #if PHP_IRCCLIENT_HAVE_EVENT_CHANNEL_NOTICE
120 .event_channel_notice = php_ircclient_event_callback,
121 #endif
122 .event_invite = php_ircclient_event_callback,
123 .event_ctcp_req = php_ircclient_event_callback,
124 .event_ctcp_rep = php_ircclient_event_callback,
125 .event_ctcp_action = php_ircclient_event_callback,
126 .event_unknown = php_ircclient_event_callback,
127 .event_numeric = php_ircclient_event_code_callback,
128 .event_dcc_chat_req = php_ircclient_event_dcc_chat_callback,
129 .event_dcc_send_req = php_ircclient_event_dcc_send_callback
130 };
131
132 typedef struct php_ircclient_session_callback {
133 zval *zfn;
134 zend_fcall_info fci;
135 zend_fcall_info_cache fcc;
136 } php_ircclient_session_callback_t;
137
138 typedef struct php_ircclient_session_object {
139 zend_object zo;
140 zend_object_value ov;
141 irc_session_t *sess;
142 unsigned opts;
143 HashTable cbc;
144 #ifdef ZTS
145 void ***ts;
146 #endif
147 } php_ircclient_session_object_t;
148
149 zend_class_entry *php_ircclient_session_class_entry;
150
151 void php_ircclient_session_object_free(void *object TSRMLS_DC)
152 {
153 php_ircclient_session_object_t *o = (php_ircclient_session_object_t *) object;
154
155 if (o->sess) {
156 irc_destroy_session(o->sess);
157 o->sess = NULL;
158 }
159 zend_hash_destroy(&o->cbc);
160 zend_object_std_dtor((zend_object *) o TSRMLS_CC);
161 efree(o);
162 }
163
164 static void php_ircclient_session_callback_dtor(void *ptr)
165 {
166 php_ircclient_session_callback_t *cb = (php_ircclient_session_callback_t *) ptr;
167
168 zend_fcall_info_args_clear(&cb->fci, 1);
169 zval_ptr_dtor(&cb->zfn);
170 }
171
172 zend_object_value php_ircclient_session_object_create(zend_class_entry *ce TSRMLS_DC)
173 {
174 php_ircclient_session_object_t *obj;
175
176 obj = ecalloc(1, sizeof(*obj));
177 #if PHP_VERSION_ID >= 50399
178 zend_object_std_init((zend_object *) obj, ce TSRMLS_CC);
179 object_properties_init((zend_object *) obj, ce);
180 #else
181 obj->zo.ce = ce;
182 ALLOC_HASHTABLE(obj->zo.properties);
183 zend_hash_init(obj->zo.properties, zend_hash_num_elements(&ce->default_properties), NULL, ZVAL_PTR_DTOR, 0);
184 zend_hash_copy(obj->zo.properties, &ce->default_properties, (copy_ctor_func_t) zval_add_ref, NULL, sizeof(zval *));
185 #endif
186
187 obj->sess = irc_create_session(&php_ircclient_callbacks);
188 irc_set_ctx(obj->sess, obj);
189 zend_hash_init(&obj->cbc, 10, NULL, php_ircclient_session_callback_dtor, 0);
190 TSRMLS_SET_CTX(obj->ts);
191
192 obj->ov.handle = zend_objects_store_put(obj, NULL, php_ircclient_session_object_free, NULL TSRMLS_CC);
193 obj->ov.handlers = zend_get_std_object_handlers();
194
195 return obj->ov;
196 }
197
198 static php_ircclient_session_callback_t *php_ircclient_session_get_callback(php_ircclient_session_object_t *obj, const char *fn_str, size_t fn_len)
199 {
200 zval *zo, *zm;
201 php_ircclient_session_callback_t cb, *cbp = NULL;
202 TSRMLS_FETCH_FROM_CTX(obj->ts);
203
204 if (SUCCESS == zend_hash_find(&obj->cbc, fn_str, fn_len + 1, (void *) &cbp)) {
205 return cbp;
206 }
207
208 MAKE_STD_ZVAL(zo);
209 Z_TYPE_P(zo) = IS_OBJECT;
210 zo->value.obj = obj->ov;
211 zend_objects_store_add_ref(zo TSRMLS_CC);
212
213 MAKE_STD_ZVAL(zm);
214 ZVAL_STRINGL(zm, estrndup(fn_str, fn_len), fn_len, 0);
215
216 MAKE_STD_ZVAL(cb.zfn);
217 array_init_size(cb.zfn, 2);
218 add_next_index_zval(cb.zfn, zo);
219 add_next_index_zval(cb.zfn, zm);
220
221 if (SUCCESS != zend_fcall_info_init(cb.zfn, IS_CALLABLE_STRICT, &cb.fci, &cb.fcc, NULL, NULL TSRMLS_CC)) {
222 zval_ptr_dtor(&cb.zfn);
223 return NULL;
224 }
225
226 if (SUCCESS != zend_hash_add(&obj->cbc, fn_str, fn_len + 1, &cb, sizeof(cb), (void *) &cbp)) {
227 zval_ptr_dtor(&cb.zfn);
228 return NULL;
229 }
230
231 return cbp;
232 }
233
234 static void php_ircclient_event_callback(irc_session_t *session, const char *event, const char *origin, const char **params, unsigned int count)
235 {
236 char *fn_str;
237 int fn_len;
238 php_ircclient_session_callback_t *cb;
239 php_ircclient_session_object_t *obj = irc_get_ctx(session);
240 TSRMLS_FETCH_FROM_CTX(obj->ts);
241
242 fn_str = emalloc(strlen(event) + 2 + 1);
243 fn_str[0] = 'o';
244 fn_str[1] = 'n';
245 fn_len = 2;
246 do {
247 if (*event != '_') {
248 fn_str[fn_len++] = tolower(*event);
249 }
250 } while (*event++);
251
252 if ((cb = php_ircclient_session_get_callback(obj, fn_str, fn_len -1))) {
253 int i;
254 zval *zo, *zp;
255
256 MAKE_STD_ZVAL(zo);
257 if (origin) {
258 ZVAL_STRING(zo, estrdup(origin), 0);
259 } else {
260 ZVAL_NULL(zo);
261 }
262
263 MAKE_STD_ZVAL(zp);
264 array_init(zp);
265 for (i = 0; i < count; ++i) {
266 add_next_index_string(zp, estrdup(params[i]), 0);
267 }
268
269 if (SUCCESS == zend_fcall_info_argn(&cb->fci TSRMLS_CC, 2, &zo, &zp)) {
270 zend_fcall_info_call(&cb->fci, &cb->fcc, NULL, NULL TSRMLS_CC);
271 }
272
273 zval_ptr_dtor(&zo);
274 zval_ptr_dtor(&zp);
275 }
276
277 efree(fn_str);
278 }
279
280 static void php_ircclient_event_code_callback(irc_session_t *session, unsigned int event, const char *origin, const char **params, unsigned int count)
281 {
282 php_ircclient_session_callback_t *cb;
283 php_ircclient_session_object_t *obj = irc_get_ctx(session);
284 TSRMLS_FETCH_FROM_CTX(obj->ts);
285
286
287 if ((cb = php_ircclient_session_get_callback(obj, ZEND_STRL("onNumeric")))) {
288 int i;
289 zval *zo, *ze, *zp;
290
291 MAKE_STD_ZVAL(zo);
292 if (origin) {
293 ZVAL_STRING(zo, estrdup(origin), 0);
294 } else {
295 ZVAL_NULL(zo);
296 }
297
298 MAKE_STD_ZVAL(ze);
299 ZVAL_LONG(ze, event);
300
301 MAKE_STD_ZVAL(zp);
302 array_init(zp);
303 for (i = 0; i < count; ++i) {
304 add_next_index_string(zp, estrdup(params[i]), 0);
305 }
306
307 if (SUCCESS == zend_fcall_info_argn(&cb->fci TSRMLS_CC, 3, &zo, &ze, &zp)) {
308 zend_fcall_info_call(&cb->fci, &cb->fcc, NULL, NULL TSRMLS_CC);
309 }
310
311 zval_ptr_dtor(&zp);
312 zval_ptr_dtor(&ze);
313 zval_ptr_dtor(&zo);
314 }
315 }
316
317 static void php_ircclient_event_dcc_chat_callback(irc_session_t *session, const char *nick, const char *addr, irc_dcc_t dccid)
318 {
319 php_ircclient_session_callback_t *cb;
320 php_ircclient_session_object_t *obj = irc_get_ctx(session);
321 TSRMLS_FETCH_FROM_CTX(obj->ts);
322
323 if ((cb = php_ircclient_session_get_callback(obj, ZEND_STRL("onDccChatReq")))) {
324 zval *zn, *za, *zd;
325
326 MAKE_STD_ZVAL(zn);
327 ZVAL_STRING(zn, estrdup(nick), 0);
328 MAKE_STD_ZVAL(za);
329 ZVAL_STRING(za, estrdup(addr), 0);
330 MAKE_STD_ZVAL(zd);
331 ZVAL_LONG(zd, dccid);
332
333 if (SUCCESS == zend_fcall_info_argn(&cb->fci TSRMLS_CC, 3, &zn, &za, &zd)) {
334 zend_fcall_info_call(&cb->fci, &cb->fcc, NULL, NULL TSRMLS_CC);
335 }
336
337 zval_ptr_dtor(&zd);
338 zval_ptr_dtor(&za);
339 zval_ptr_dtor(&zn);
340 }
341 }
342
343 static void php_ircclient_event_dcc_send_callback(irc_session_t *session, const char *nick, const char *addr, const char *filename, unsigned long size, irc_dcc_t dccid)
344 {
345 php_ircclient_session_callback_t *cb;
346 php_ircclient_session_object_t *obj = irc_get_ctx(session);
347 TSRMLS_FETCH_FROM_CTX(obj->ts);
348
349 if ((cb = php_ircclient_session_get_callback(obj, ZEND_STRL("onDccChatReq")))) {
350 zval *zn, *za, *zf, *zs, *zd;
351
352 MAKE_STD_ZVAL(zn);
353 ZVAL_STRING(zn, estrdup(nick), 0);
354 MAKE_STD_ZVAL(za);
355 ZVAL_STRING(za, estrdup(addr), 0);
356 MAKE_STD_ZVAL(zf);
357 ZVAL_STRING(zf, estrdup(filename), 0);
358 MAKE_STD_ZVAL(zs);
359 ZVAL_LONG(zs, size);
360 MAKE_STD_ZVAL(zd);
361 ZVAL_LONG(zd, dccid);
362
363 if (SUCCESS == zend_fcall_info_argn(&cb->fci TSRMLS_CC, 5, &zn, &za, &zf, &zs, &zd)) {
364 zend_fcall_info_call(&cb->fci, &cb->fcc, NULL, NULL TSRMLS_CC);
365 }
366
367 zval_ptr_dtor(&zd);
368 zval_ptr_dtor(&zs);
369 zval_ptr_dtor(&zf);
370 zval_ptr_dtor(&za);
371 zval_ptr_dtor(&zn);
372 }
373 }
374
375 ZEND_BEGIN_ARG_INFO_EX(ai_Session___construct, 0, 0, 0)
376 ZEND_ARG_INFO(0, nick)
377 ZEND_ARG_INFO(0, user)
378 ZEND_ARG_INFO(0, real)
379 ZEND_END_ARG_INFO()
380 /* {{{ proto void Session::__construct([string nick[, string user[, string real]]]) */
381 PHP_METHOD(Session, __construct)
382 {
383 char *nick_str = NULL, *user_str = NULL, *real_str = NULL;
384 int nick_len = 0, user_len = 0, real_len = 0;
385
386 if (SUCCESS == zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "|s!s!s!", &nick_str, &nick_len, &user_str, &user_len, &real_str, &real_len)) {
387 if (nick_str && nick_len) {
388 zend_update_property_stringl(php_ircclient_session_class_entry, getThis(), ZEND_STRL("nick"), nick_str, nick_len TSRMLS_CC);
389 }
390 if (nick_str && nick_len) {
391 zend_update_property_stringl(php_ircclient_session_class_entry, getThis(), ZEND_STRL("nick"), nick_str, nick_len TSRMLS_CC);
392 }
393 if (real_str && real_len) {
394 zend_update_property_stringl(php_ircclient_session_class_entry, getThis(), ZEND_STRL("real"), real_str, real_len TSRMLS_CC);
395 }
396 }
397 }
398 /* }}} */
399
400 ZEND_BEGIN_ARG_INFO_EX(ai_Session_doConnect, 0, 0, 2)
401 ZEND_ARG_INFO(0, ip6)
402 ZEND_ARG_INFO(0, host)
403 ZEND_ARG_INFO(0, port)
404 ZEND_ARG_INFO(0, password)
405 ZEND_END_ARG_INFO()
406 /* {{{ proto bool Session::doConnect(bool ip6, string host[, int port[, string password]])
407 Returns TRUE when the command was sent successfully. */
408 PHP_METHOD(Session, doConnect)
409 {
410 char *server_str, *passwd_str = NULL;
411 int server_len, passwd_len = 0;
412 long port = 6667;
413 zend_bool ip6;
414
415 if (SUCCESS == zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "bs|ls!", &ip6, &server_str, &server_len, &port, &passwd_str, &passwd_len)) {
416 php_ircclient_session_object_t *obj = zend_object_store_get_object(getThis() TSRMLS_CC);
417 char *nick = NULL, *user = NULL, *real = NULL;
418 zval *znick, *zuser, *zreal, *tmp;
419
420 znick = zend_read_property(php_ircclient_session_class_entry, getThis(), ZEND_STRL("nick"), 0 TSRMLS_CC);
421 SEPARATE_ARG_IF_REF(znick);
422 convert_to_string_ex(&znick);
423 if (Z_STRLEN_P(znick)) {
424 nick = Z_STRVAL_P(znick);
425 }
426 zuser = zend_read_property(php_ircclient_session_class_entry, getThis(), ZEND_STRL("user"), 0 TSRMLS_CC);
427 SEPARATE_ARG_IF_REF(zuser);
428 convert_to_string_ex(&zuser);
429 if (Z_STRLEN_P(zuser)) {
430 user = Z_STRVAL_P(zuser);
431 }
432 zreal = zend_read_property(php_ircclient_session_class_entry, getThis(), ZEND_STRL("real"), 0 TSRMLS_CC);
433 SEPARATE_ARG_IF_REF(zreal);
434 convert_to_string_ex(&zreal);
435 if (Z_STRLEN_P(zreal)) {
436 real = Z_STRVAL_P(zreal);
437 }
438
439 if (ip6) {
440 if (0 != irc_connect6(obj->sess, server_str, port, passwd_str, nick, user, real)) {
441 php_error_docref(NULL TSRMLS_CC, E_WARNING, "%s", irc_strerror(irc_errno(obj->sess)));
442 RETVAL_FALSE;
443 }
444 } else if (0 != irc_connect(obj->sess, server_str, port, passwd_str, nick, user, real)) {
445 php_error_docref(NULL TSRMLS_CC, E_WARNING, "%s", irc_strerror(irc_errno(obj->sess)));
446 RETVAL_FALSE;
447 } else {
448 RETVAL_TRUE;
449 }
450
451 zval_ptr_dtor(&znick);
452 zval_ptr_dtor(&zuser);
453 zval_ptr_dtor(&zreal);
454 }
455 }
456 /* }}} */
457
458 /* {{{ proto bool Session::isConnected() */
459 PHP_METHOD(Session, isConnected)
460 {
461 if (SUCCESS == zend_parse_parameters_none()) {
462 php_ircclient_session_object_t *obj = zend_object_store_get_object(getThis() TSRMLS_CC);
463
464 RETURN_BOOL(irc_is_connected(obj->sess));
465 }
466 }
467 /* }}} */
468
469 /* {{{ proto void Session::disconnect() */
470 PHP_METHOD(Session, disconnect)
471 {
472 if (SUCCESS == zend_parse_parameters_none()) {
473 php_ircclient_session_object_t *obj = zend_object_store_get_object(getThis() TSRMLS_CC);
474
475 irc_disconnect(obj->sess);
476 }
477 }
478 /* }}} */
479
480 ZEND_BEGIN_ARG_INFO_EX(ai_Session_run, 0, 0, 0)
481 ZEND_ARG_INFO(0, read_fd_array_for_select)
482 ZEND_ARG_INFO(0, write_fd_array_for_select)
483 ZEND_ARG_INFO(0, timeout_seconds)
484 ZEND_END_ARG_INFO()
485 /* {{{ proto array Session::run([array read_fds_for_select[, array write_fds_for_select[, double timeout]]])
486 Returns array(array of readable fds, array of writeable fds) or false on error. */
487 PHP_METHOD(Session, run)
488 {
489 HashTable *ifds = NULL, *ofds = NULL;
490 double to = 0.25;
491
492 if (SUCCESS == zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "|H!H!d", &ifds, &ofds, &to)) {
493 php_ircclient_session_object_t *obj = zend_object_store_get_object(getThis() TSRMLS_CC);
494
495 if ((ifds && zend_hash_num_elements(ifds)) || (ofds && zend_hash_num_elements(ofds))) {
496 struct timeval t;
497 fd_set i, o;
498 int m = 0;
499 zval **zfd, *zr, *zw;
500
501 FD_ZERO(&i);
502 FD_ZERO(&o);
503
504 if (0 != irc_add_select_descriptors(obj->sess, &i, &o, &m)) {
505 php_error_docref(NULL TSRMLS_CC, E_WARNING, "%s", irc_strerror(irc_errno(obj->sess)));
506 RETURN_FALSE;
507 }
508 if (ifds) {
509 for ( zend_hash_internal_pointer_reset(ifds);
510 SUCCESS == zend_hash_get_current_data(ifds, (void *) &zfd);
511 zend_hash_move_forward(ifds)
512 ) {
513 if (Z_TYPE_PP(zfd) == IS_RESOURCE) {
514 php_stream *s = NULL;
515 int fd = -1;
516
517 php_stream_from_zval_no_verify(s, zfd);
518
519 if (!s || SUCCESS != php_stream_cast(s, PHP_STREAM_AS_FD_FOR_SELECT, (void *) &fd, 1) || fd == -1) {
520 php_error_docref(NULL TSRMLS_CC, E_NOTICE, "invalid resource");
521 } else {
522 PHP_SAFE_FD_SET(fd, &i);
523 if (m < fd) {
524 m = fd;
525 }
526 }
527 }
528 }
529 }
530 if (ofds) {
531 for ( zend_hash_internal_pointer_reset(ofds);
532 SUCCESS == zend_hash_get_current_data(ofds, (void *) &zfd);
533 zend_hash_move_forward(ofds)
534 ) {
535 if (Z_TYPE_PP(zfd) == IS_RESOURCE) {
536 php_stream *s = NULL;
537 int fd = -1;
538
539 php_stream_from_zval_no_verify(s, zfd);
540
541 if (!s || SUCCESS != php_stream_cast(s, PHP_STREAM_AS_FD_FOR_SELECT|PHP_STREAM_CAST_INTERNAL, (void *) &fd, 1) || fd == -1) {
542 php_error_docref(NULL TSRMLS_CC, E_NOTICE, "invalid resource");
543 } else {
544 PHP_SAFE_FD_SET(fd, &o);
545 if (m < fd) {
546 m = fd;
547 }
548 }
549 }
550 }
551 }
552
553 PHP_SAFE_MAX_FD(m, m);
554
555 t.tv_sec = (time_t) to;
556 t.tv_usec = (suseconds_t) ((to - t.tv_sec) * 1000000.0);
557
558 if (0 > select(m + 1, &i, &o, NULL, &t) && errno != EINTR) {
559 php_error_docref(NULL TSRMLS_CC, E_WARNING, "select() error: %s", strerror(errno));
560 RETURN_FALSE;
561 }
562
563 if (0 != irc_process_select_descriptors(obj->sess, &i, &o)) {
564 int err = irc_errno(obj->sess);
565
566 if (err) {
567 php_error_docref(NULL TSRMLS_CC, E_WARNING, "%s", irc_strerror(err));
568 RETURN_FALSE;
569 }
570 }
571
572 array_init(return_value);
573 MAKE_STD_ZVAL(zr);
574 array_init(zr);
575 MAKE_STD_ZVAL(zw);
576 array_init(zw);
577
578 if (ifds) {
579 for ( zend_hash_internal_pointer_reset(ifds);
580 SUCCESS == zend_hash_get_current_data(ifds, (void *) &zfd);
581 zend_hash_move_forward(ifds)
582 ) {
583 if (Z_TYPE_PP(zfd) == IS_RESOURCE) {
584 php_stream *s = NULL;
585 int fd = -1;
586
587 php_stream_from_zval_no_verify(s, zfd);
588
589 if (s && SUCCESS == php_stream_cast(s, PHP_STREAM_AS_FD_FOR_SELECT|PHP_STREAM_CAST_INTERNAL, (void *) &fd, 1) && fd != -1) {
590 if (PHP_SAFE_FD_ISSET(fd, &i)) {
591 Z_ADDREF_PP(zfd);
592 add_next_index_zval(zr, *zfd);
593 }
594 }
595 }
596 }
597 }
598 if (ofds) {
599 for ( zend_hash_internal_pointer_reset(ofds);
600 SUCCESS == zend_hash_get_current_data(ofds, (void *) &zfd);
601 zend_hash_move_forward(ofds)
602 ) {
603 if (Z_TYPE_PP(zfd) == IS_RESOURCE) {
604 php_stream *s = NULL;
605 int fd = -1;
606
607 php_stream_from_zval_no_verify(s, zfd);
608
609 if (s && SUCCESS == php_stream_cast(s, PHP_STREAM_AS_FD_FOR_SELECT|PHP_STREAM_CAST_INTERNAL, (void *) &fd, 1) && fd != -1) {
610 if (PHP_SAFE_FD_ISSET(fd, &o)) {
611 Z_ADDREF_PP(zfd);
612 add_next_index_zval(zw, *zfd);
613 }
614 }
615 }
616 }
617 }
618
619 add_next_index_zval(return_value, zr);
620 add_next_index_zval(return_value, zw);
621
622 return;
623
624 } else {
625 if (0 != irc_run(obj->sess)) {
626 int err = irc_errno(obj->sess);
627
628 if (err) {
629 php_error_docref(NULL TSRMLS_CC, E_WARNING, "%s", irc_strerror(err));
630 RETURN_FALSE;
631 }
632 }
633 }
634
635 RETURN_TRUE;
636 }
637 }
638 /* }}} */
639
640 ZEND_BEGIN_ARG_INFO_EX(ai_Session_setOption, 0, 0, 1)
641 ZEND_ARG_INFO(0, option)
642 ZEND_ARG_INFO(0, enable)
643 ZEND_END_ARG_INFO()
644 /* {{{ proto void Session::setOption(int option[, bool enable = true]) */
645 PHP_METHOD(Session, setOption)
646 {
647 long opt;
648 zend_bool onoff = 1;
649
650 if (SUCCESS == zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "l|b", &opt, &onoff)) {
651 php_ircclient_session_object_t *obj = zend_object_store_get_object(getThis() TSRMLS_CC);
652
653 if (onoff) {
654 obj->opts |= opt;
655 irc_option_set(obj->sess, opt);
656 } else {
657 obj->opts ^= opt;
658 irc_option_reset(obj->sess, opt);
659 }
660 }
661 }
662 /* }}} */
663
664 ZEND_BEGIN_ARG_INFO_EX(ai_Session_doJoin, 0, 0, 1)
665 ZEND_ARG_INFO(0, channel)
666 ZEND_ARG_INFO(0, password)
667 ZEND_END_ARG_INFO()
668 /* {{{ proto bool Session::doJoin(string channel[, string password])
669 Returns TRUE when the command was successfully sent. */
670 PHP_METHOD(Session, doJoin)
671 {
672 char *chan_str, *key_str = NULL;
673 int chan_len, key_len = 0;
674
675 if (SUCCESS == zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s|s!", &chan_str, &chan_len, &key_str, &key_len)) {
676 php_ircclient_session_object_t *obj = zend_object_store_get_object(getThis() TSRMLS_CC);
677
678 if (0 != irc_cmd_join(obj->sess, chan_str, key_str)) {
679 php_error_docref(NULL TSRMLS_CC, E_WARNING, "%s", irc_strerror(irc_errno(obj->sess)));
680 RETVAL_FALSE;
681 } else {
682 RETVAL_TRUE;
683 }
684 }
685 }
686 /* }}} */
687
688 ZEND_BEGIN_ARG_INFO_EX(ai_Session_doPart, 0, 0, 1)
689 ZEND_ARG_INFO(0, channel)
690 ZEND_END_ARG_INFO()
691 /* {{{ proto bool Session::doPart(string channel)
692 Returns TRUE when the command was successfully sent. */
693 PHP_METHOD(Session, doPart)
694 {
695 char *chan_str;
696 int chan_len;
697
698 if (SUCCESS == zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &chan_str, &chan_len)) {
699 php_ircclient_session_object_t *obj = zend_object_store_get_object(getThis() TSRMLS_CC);
700
701 if (0 != irc_cmd_part(obj->sess, chan_str)) {
702 php_error_docref(NULL TSRMLS_CC, E_WARNING, "%s", irc_strerror(irc_errno(obj->sess)));
703 RETVAL_FALSE;
704 } else {
705 RETVAL_TRUE;
706 }
707 }
708 }
709 /* }}} */
710
711 ZEND_BEGIN_ARG_INFO_EX(ai_Session_doInvite, 0, 0, 2)
712 ZEND_ARG_INFO(0, nick)
713 ZEND_ARG_INFO(0, channel)
714 ZEND_END_ARG_INFO()
715 /* {{{ proto bool Session::doInvite(string nick, string channel)
716 Returns TRUE when the command was sent successfully. */
717 PHP_METHOD(Session, doInvite)
718 {
719 char *chan_str, *nick_str;
720 int chan_len, nick_len;
721
722 if (SUCCESS == zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "ss", &nick_str, &nick_len, &chan_str, &chan_len)) {
723 php_ircclient_session_object_t *obj = zend_object_store_get_object(getThis() TSRMLS_CC);
724
725 if (0 != irc_cmd_invite(obj->sess, nick_str, chan_str)) {
726 php_error_docref(NULL TSRMLS_CC, E_WARNING, "%s", irc_strerror(irc_errno(obj->sess)));
727 RETVAL_FALSE;
728 } else {
729 RETVAL_TRUE;
730 }
731 }
732 }
733 /* }}} */
734
735 ZEND_BEGIN_ARG_INFO_EX(ai_Session_doNames, 0, 0, 1)
736 ZEND_ARG_INFO(0, channel)
737 ZEND_END_ARG_INFO()
738 /* {{{ proto bool Session::doNames(string channel)
739 Returns TRUE when the command was sent successfully. */
740 PHP_METHOD(Session, doNames)
741 {
742 char *chan_str;
743 int chan_len;
744
745 if (SUCCESS == zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &chan_str, &chan_len)) {
746 php_ircclient_session_object_t *obj = zend_object_store_get_object(getThis() TSRMLS_CC);
747
748 if (0 != irc_cmd_names(obj->sess, chan_str)) {
749 php_error_docref(NULL TSRMLS_CC, E_WARNING, "%s", irc_strerror(irc_errno(obj->sess)));
750 RETVAL_FALSE;
751 } else {
752 RETVAL_TRUE;
753 }
754 }
755 }
756 /* }}} */
757
758 ZEND_BEGIN_ARG_INFO_EX(ai_Session_doList, 0, 0, 1)
759 ZEND_ARG_INFO(0, channel)
760 ZEND_END_ARG_INFO()
761 /* {{{ proto bool Session::doList(string channel)
762 Returns TRUE when the command was sent successfully. */
763 PHP_METHOD(Session, doList)
764 {
765 char *chan_str;
766 int chan_len;
767
768 if (SUCCESS == zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &chan_str, &chan_len)) {
769 php_ircclient_session_object_t *obj = zend_object_store_get_object(getThis() TSRMLS_CC);
770
771 if (0 != irc_cmd_list(obj->sess, chan_str)) {
772 php_error_docref(NULL TSRMLS_CC, E_WARNING, "%s", irc_strerror(irc_errno(obj->sess)));
773 RETVAL_FALSE;
774 } else {
775 RETVAL_TRUE;
776 }
777 }
778 }
779 /* }}} */
780
781 ZEND_BEGIN_ARG_INFO_EX(ai_Session_doTopic, 0, 0, 1)
782 ZEND_ARG_INFO(0, channel)
783 ZEND_ARG_INFO(0, topic)
784 ZEND_END_ARG_INFO()
785 /* {{{ proto bool Session::doTopic(string channel[, string topic])
786 Returns TRUE when the command was sent successfully. */
787 PHP_METHOD(Session, doTopic)
788 {
789 char *chan_str, *topic_str = NULL;
790 int chan_len, topic_len;
791
792 if (SUCCESS == zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s|s!", &chan_str, &chan_len, &topic_str, &topic_len)) {
793 php_ircclient_session_object_t *obj = zend_object_store_get_object(getThis() TSRMLS_CC);
794
795 if (0 != irc_cmd_topic(obj->sess, chan_str, topic_str)) {
796 php_error_docref(NULL TSRMLS_CC, E_WARNING, "%s", irc_strerror(irc_errno(obj->sess)));
797 RETVAL_FALSE;
798 } else {
799 RETVAL_TRUE;
800 }
801 }
802 }
803 /* }}} */
804
805 ZEND_BEGIN_ARG_INFO_EX(ai_Session_doChannelMode, 0, 0, 1)
806 ZEND_ARG_INFO(0, channel)
807 ZEND_ARG_INFO(0, mode)
808 ZEND_END_ARG_INFO()
809 /* {{{ proto bool Session::doChannelMode(string channel[, string mode])
810 Returns TRUE when the command was sent successfully. */
811 PHP_METHOD(Session, doChannelMode)
812 {
813 char *chan_str, *mode_str = NULL;
814 int chan_len, mode_len;
815
816 if (SUCCESS == zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s|s!", &chan_str, &chan_len, &mode_str, &mode_len)) {
817 php_ircclient_session_object_t *obj = zend_object_store_get_object(getThis() TSRMLS_CC);
818
819 if (0 != irc_cmd_channel_mode(obj->sess, chan_str, mode_str)) {
820 php_error_docref(NULL TSRMLS_CC, E_WARNING, "%s", irc_strerror(irc_errno(obj->sess)));
821 RETVAL_FALSE;
822 } else {
823 RETVAL_TRUE;
824 }
825 }
826 }
827 /* }}} */
828
829 ZEND_BEGIN_ARG_INFO_EX(ai_Session_doKick, 0, 0, 2)
830 ZEND_ARG_INFO(0, nick)
831 ZEND_ARG_INFO(0, channel)
832 ZEND_ARG_INFO(0, reason)
833 ZEND_END_ARG_INFO()
834 /* {{{ proto bool Session::doKick(string nick, string channel[, string reason])
835 Returns TRUE when the command was sent successfully. */
836 PHP_METHOD(Session, doKick)
837 {
838 char *chan_str, *nick_str, *reason_str = NULL;
839 int chan_len, nick_len, reason_len;
840
841 if (SUCCESS == zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "ss|s!", &nick_str, &nick_len, &chan_str, &chan_len, &reason_str, &reason_len)) {
842 php_ircclient_session_object_t *obj = zend_object_store_get_object(getThis() TSRMLS_CC);
843
844 if (0 != irc_cmd_kick(obj->sess, nick_str, chan_str, reason_str)) {
845 php_error_docref(NULL TSRMLS_CC, E_WARNING, "%s", irc_strerror(irc_errno(obj->sess)));
846 RETVAL_FALSE;
847 } else {
848 RETVAL_TRUE;
849 }
850 }
851 }
852 /* }}} */
853
854 ZEND_BEGIN_ARG_INFO_EX(ai_Session_doMsg, 0, 0, 2)
855 ZEND_ARG_INFO(0, destination)
856 ZEND_ARG_INFO(0, message)
857 ZEND_END_ARG_INFO()
858 /* {{{ proto bool Session::doMsg(string destination, string message)
859 Returns TRUE when the command was sent successfully. */
860 PHP_METHOD(Session, doMsg)
861 {
862 char *dest_str, *msg_str;
863 int dest_len, msg_len;
864
865 if (SUCCESS == zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "ss", &dest_str, &dest_len, &msg_str, &msg_len)) {
866 php_ircclient_session_object_t *obj = zend_object_store_get_object(getThis() TSRMLS_CC);
867
868 if (0 != irc_cmd_msg(obj->sess, dest_str, msg_str)) {
869 php_error_docref(NULL TSRMLS_CC, E_WARNING, "%s", irc_strerror(irc_errno(obj->sess)));
870 RETVAL_FALSE;
871 } else {
872 RETVAL_TRUE;
873 }
874 }
875 }
876 /* }}} */
877
878 ZEND_BEGIN_ARG_INFO_EX(ai_Session_doMe, 0, 0, 2)
879 ZEND_ARG_INFO(0, destination)
880 ZEND_ARG_INFO(0, message)
881 ZEND_END_ARG_INFO()
882 /* {{{ proto bool Session::doMe(string destination, string message)
883 Returns TRUE when the command was sent successfully. */
884 PHP_METHOD(Session, doMe)
885 {
886 char *dest_str, *msg_str;
887 int dest_len, msg_len;
888
889 if (SUCCESS == zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "ss", &dest_str, &dest_len, &msg_str, &msg_len)) {
890 php_ircclient_session_object_t *obj = zend_object_store_get_object(getThis() TSRMLS_CC);
891
892 if (0 != irc_cmd_me(obj->sess, dest_str, msg_str)) {
893 php_error_docref(NULL TSRMLS_CC, E_WARNING, "%s", irc_strerror(irc_errno(obj->sess)));
894 RETVAL_FALSE;
895 } else {
896 RETVAL_TRUE;
897 }
898 }
899 }
900 /* }}} */
901
902 ZEND_BEGIN_ARG_INFO_EX(ai_Session_doNotice, 0, 0, 2)
903 ZEND_ARG_INFO(0, destination)
904 ZEND_ARG_INFO(0, message)
905 ZEND_END_ARG_INFO()
906 /* {{{ proto bool Session::doNotice(string destination, string message)
907 Returns TRUE when the command was sent successfully. */
908 PHP_METHOD(Session, doNotice)
909 {
910 char *dest_str, *msg_str;
911 int dest_len, msg_len;
912
913 if (SUCCESS == zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "ss", &dest_str, &dest_len, &msg_str, &msg_len)) {
914 php_ircclient_session_object_t *obj = zend_object_store_get_object(getThis() TSRMLS_CC);
915
916 if (0 != irc_cmd_notice(obj->sess, dest_str, msg_str)) {
917 php_error_docref(NULL TSRMLS_CC, E_WARNING, "%s", irc_strerror(irc_errno(obj->sess)));
918 RETVAL_FALSE;
919 } else {
920 RETVAL_TRUE;
921 }
922 }
923 }
924 /* }}} */
925
926 ZEND_BEGIN_ARG_INFO_EX(ai_Session_doQuit, 0, 0, 0)
927 ZEND_ARG_INFO(0, reason)
928 ZEND_END_ARG_INFO()
929 /* {{{ proto bool Session::doQuit([string reason])
930 Returns TRUE when the command was sent successfully. */
931 PHP_METHOD(Session, doQuit)
932 {
933 char *reason_str = NULL;
934 int reason_len;
935
936 if (SUCCESS == zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "|s!", &reason_str, &reason_len)) {
937 php_ircclient_session_object_t *obj = zend_object_store_get_object(getThis() TSRMLS_CC);
938
939 if (0 != irc_cmd_quit(obj->sess, reason_str)) {
940 php_error_docref(NULL TSRMLS_CC, E_WARNING, "%s", irc_strerror(irc_errno(obj->sess)));
941 RETVAL_FALSE;
942 } else {
943 RETVAL_TRUE;
944 }
945 }
946 }
947 /* }}} */
948
949 ZEND_BEGIN_ARG_INFO_EX(ai_Session_doUserMode, 0, 0, 0)
950 ZEND_ARG_INFO(0, mode)
951 ZEND_END_ARG_INFO()
952 /* {{{ proto bool Session::doUserMode([string mode])
953 Returns TRUE when the command was sent successfully. */
954 PHP_METHOD(Session, doUserMode)
955 {
956 char *mode_str = NULL;
957 int mode_len;
958
959 if (SUCCESS == zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "|s!", &mode_str, &mode_len)) {
960 php_ircclient_session_object_t *obj = zend_object_store_get_object(getThis() TSRMLS_CC);
961
962 if (0 != irc_cmd_user_mode(obj->sess, mode_str)) {
963 php_error_docref(NULL TSRMLS_CC, E_WARNING, "%s", irc_strerror(irc_errno(obj->sess)));
964 RETVAL_FALSE;
965 } else {
966 RETVAL_TRUE;
967 }
968 }
969 }
970 /* }}} */
971
972 ZEND_BEGIN_ARG_INFO_EX(ai_Session_doNick, 0, 0, 1)
973 ZEND_ARG_INFO(0, nick)
974 ZEND_END_ARG_INFO()
975 /* {{{ proto bool Session::doNick(string nick)
976 Returns TRUE when the command was sent successfully. */
977 PHP_METHOD(Session, doNick)
978 {
979 char *nick_str;
980 int nick_len;
981
982 if (SUCCESS == zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &nick_str, &nick_len)) {
983 php_ircclient_session_object_t *obj = zend_object_store_get_object(getThis() TSRMLS_CC);
984
985 if (0 != irc_cmd_nick(obj->sess, nick_str)) {
986 php_error_docref(NULL TSRMLS_CC, E_WARNING, "%s", irc_strerror(irc_errno(obj->sess)));
987 RETVAL_FALSE;
988 } else {
989 RETVAL_TRUE;
990 }
991 }
992 }
993 /* }}} */
994
995 ZEND_BEGIN_ARG_INFO_EX(ai_Session_doWhois, 0, 0, 0)
996 ZEND_ARG_INFO(0, nick)
997 ZEND_END_ARG_INFO()
998 /* {{{ proto bool Session::doWhois([string nick])
999 Returns TRUE when the command was sent successfully. */
1000 PHP_METHOD(Session, doWhois)
1001 {
1002 char *nick_str = NULL;
1003 int nick_len;
1004
1005 if (SUCCESS == zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "|s!", &nick_str, &nick_len)) {
1006 php_ircclient_session_object_t *obj = zend_object_store_get_object(getThis() TSRMLS_CC);
1007
1008 if (0 != irc_cmd_whois(obj->sess, nick_str)) {
1009 php_error_docref(NULL TSRMLS_CC, E_WARNING, "%s", irc_strerror(irc_errno(obj->sess)));
1010 RETVAL_FALSE;
1011 } else {
1012 RETVAL_TRUE;
1013 }
1014 }
1015 }
1016 /* }}} */
1017
1018 ZEND_BEGIN_ARG_INFO_EX(ai_Session_doCtcpReply, 0, 0, 2)
1019 ZEND_ARG_INFO(0, nick)
1020 ZEND_ARG_INFO(0, reply)
1021 ZEND_END_ARG_INFO()
1022 /* {{{ proto bool Session::doCtcpReply(string nick, string reply)
1023 Returns TRUE when the command was sent successfully. */
1024 PHP_METHOD(Session, doCtcpReply)
1025 {
1026 char *nick_str, *reply_str;
1027 int nick_len, reply_len;
1028
1029 if (SUCCESS == zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "ss", &nick_str, &nick_len, &reply_str, &reply_len)) {
1030 php_ircclient_session_object_t *obj = zend_object_store_get_object(getThis() TSRMLS_CC);
1031
1032 if (0 != irc_cmd_ctcp_reply(obj->sess, nick_str, reply_str)) {
1033 php_error_docref(NULL TSRMLS_CC, E_WARNING, "%s", irc_strerror(irc_errno(obj->sess)));
1034 RETVAL_FALSE;
1035 } else {
1036 RETVAL_TRUE;
1037 }
1038 }
1039 }
1040 /* }}} */
1041
1042 ZEND_BEGIN_ARG_INFO_EX(ai_Session_doCtcpRequest, 0, 0, 2)
1043 ZEND_ARG_INFO(0, nick)
1044 ZEND_ARG_INFO(0, request)
1045 ZEND_END_ARG_INFO()
1046 /* {{{ proto bool Session::doCtcpRequest(string nick, string request)
1047 Returns TRUE when the command was sent successfully. */
1048 PHP_METHOD(Session, doCtcpRequest)
1049 {
1050 char *nick_str, *request_str;
1051 int nick_len, request_len;
1052
1053 if (SUCCESS == zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "ss", &nick_str, &nick_len, &request_str, &request_len)) {
1054 php_ircclient_session_object_t *obj = zend_object_store_get_object(getThis() TSRMLS_CC);
1055
1056 if (0 != irc_cmd_ctcp_request(obj->sess, nick_str, request_str)) {
1057 php_error_docref(NULL TSRMLS_CC, E_WARNING, "%s", irc_strerror(irc_errno(obj->sess)));
1058 RETVAL_FALSE;
1059 } else {
1060 RETVAL_TRUE;
1061 }
1062 }
1063 }
1064 /* }}} */
1065
1066 ZEND_BEGIN_ARG_INFO_EX(ai_Session_doRaw, 0, 0, 1)
1067 ZEND_ARG_INFO(0, message)
1068 ZEND_END_ARG_INFO()
1069 /* {{{ proto bool Session::doRaw(string message)
1070 Returns TRUE when the command was sent successfully. */
1071 PHP_METHOD(Session, doRaw)
1072 {
1073 char *msg_str;
1074 int msg_len;
1075
1076 if (SUCCESS == zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &msg_str, &msg_len)) {
1077 php_ircclient_session_object_t *obj = zend_object_store_get_object(getThis() TSRMLS_CC);
1078
1079 if (0 != irc_send_raw(obj->sess, "%.*s", msg_len, msg_str)) {
1080 php_error_docref(NULL TSRMLS_CC, E_WARNING, "%s", irc_strerror(irc_errno(obj->sess)));
1081 RETVAL_FALSE;
1082 } else {
1083 RETVAL_TRUE;
1084 }
1085 }
1086 }
1087 /* }}} */
1088
1089 /* {{{ event_callbacks */
1090 ZEND_BEGIN_ARG_INFO_EX(ai_Session_event, 0, 0, 2)
1091 ZEND_ARG_INFO(0, origin)
1092 ZEND_ARG_ARRAY_INFO(0, args, 0)
1093 ZEND_END_ARG_INFO()
1094 ZEND_BEGIN_ARG_INFO_EX(ai_Session_event_code, 0, 0, 3)
1095 ZEND_ARG_INFO(0, origin)
1096 ZEND_ARG_INFO(0, event)
1097 ZEND_ARG_ARRAY_INFO(0, args, 0)
1098 ZEND_END_ARG_INFO()
1099 ZEND_BEGIN_ARG_INFO_EX(ai_Session_event_dcc_chat, 0, 0, 3)
1100 ZEND_ARG_INFO(0, nick)
1101 ZEND_ARG_INFO(0, remote_addr)
1102 ZEND_ARG_INFO(0, dccid)
1103 ZEND_END_ARG_INFO()
1104 ZEND_BEGIN_ARG_INFO_EX(ai_Session_event_dcc_send, 0, 0, 5)
1105 ZEND_ARG_INFO(0, nick)
1106 ZEND_ARG_INFO(0, remote_addr)
1107 ZEND_ARG_INFO(0, filename)
1108 ZEND_ARG_INFO(0, size)
1109 ZEND_ARG_INFO(0, dccid)
1110 ZEND_END_ARG_INFO()
1111
1112 static void call_closure(INTERNAL_FUNCTION_PARAMETERS, /* stupid non-const API */ char *prop_str, size_t prop_len)
1113 {
1114 zval **params = ecalloc(ZEND_NUM_ARGS(), sizeof(zval *));
1115 php_ircclient_session_object_t *obj = zend_object_store_get_object(getThis() TSRMLS_CC);
1116
1117 if (obj->opts & LIBIRC_OPTION_DEBUG) {
1118 zval za;
1119
1120 INIT_PZVAL(&za);
1121 array_init(&za);
1122
1123 if (SUCCESS == zend_copy_parameters_array(ZEND_NUM_ARGS(), &za)) {
1124 php_printf("ircclient: %s - ", prop_str);
1125 zend_print_flat_zval_r(&za TSRMLS_CC);
1126 php_printf("\n");
1127 }
1128 zval_dtor(&za);
1129 }
1130
1131 if (SUCCESS == zend_get_parameters_array(ZEND_NUM_ARGS(), ZEND_NUM_ARGS(), params)) {
1132 zval *prop = zend_read_property(Z_OBJCE_P(getThis()), getThis(), prop_str, prop_len, 0 TSRMLS_CC);
1133
1134 if (Z_TYPE_P(prop) != IS_NULL) {
1135 call_user_function(NULL, NULL, prop, return_value, ZEND_NUM_ARGS(), params TSRMLS_CC);
1136 }
1137 }
1138
1139 efree(params);
1140 }
1141
1142 PHP_METHOD(Session, onConnect) { call_closure(INTERNAL_FUNCTION_PARAM_PASSTHRU, ZEND_STRL("onConnect")); }
1143 PHP_METHOD(Session, onNick) { call_closure(INTERNAL_FUNCTION_PARAM_PASSTHRU, ZEND_STRL("onNick")); }
1144 PHP_METHOD(Session, onQuit) { call_closure(INTERNAL_FUNCTION_PARAM_PASSTHRU, ZEND_STRL("onQuit")); }
1145 PHP_METHOD(Session, onJoin) { call_closure(INTERNAL_FUNCTION_PARAM_PASSTHRU, ZEND_STRL("onJoin")); }
1146 PHP_METHOD(Session, onPart) { call_closure(INTERNAL_FUNCTION_PARAM_PASSTHRU, ZEND_STRL("onPart")); }
1147 PHP_METHOD(Session, onMode) { call_closure(INTERNAL_FUNCTION_PARAM_PASSTHRU, ZEND_STRL("onMode")); }
1148 PHP_METHOD(Session, onUmode) { call_closure(INTERNAL_FUNCTION_PARAM_PASSTHRU, ZEND_STRL("onUmode")); }
1149 PHP_METHOD(Session, onTopic) { call_closure(INTERNAL_FUNCTION_PARAM_PASSTHRU, ZEND_STRL("onTopic")); }
1150 PHP_METHOD(Session, onKick) { call_closure(INTERNAL_FUNCTION_PARAM_PASSTHRU, ZEND_STRL("onKick")); }
1151 PHP_METHOD(Session, onChannel) { call_closure(INTERNAL_FUNCTION_PARAM_PASSTHRU, ZEND_STRL("onChannel")); }
1152 PHP_METHOD(Session, onPrivmsg) { call_closure(INTERNAL_FUNCTION_PARAM_PASSTHRU, ZEND_STRL("onPrivmsg")); }
1153 PHP_METHOD(Session, onNotice) { call_closure(INTERNAL_FUNCTION_PARAM_PASSTHRU, ZEND_STRL("onNotice")); }
1154 PHP_METHOD(Session, onChannelNotice) { call_closure(INTERNAL_FUNCTION_PARAM_PASSTHRU, ZEND_STRL("onChannelNotice")); }
1155 PHP_METHOD(Session, onInvite) { call_closure(INTERNAL_FUNCTION_PARAM_PASSTHRU, ZEND_STRL("onInvite")); }
1156 PHP_METHOD(Session, onCtcpReq) { call_closure(INTERNAL_FUNCTION_PARAM_PASSTHRU, ZEND_STRL("onCtcpReq")); }
1157 PHP_METHOD(Session, onCtcpRep) { call_closure(INTERNAL_FUNCTION_PARAM_PASSTHRU, ZEND_STRL("onCtcpRep")); }
1158 PHP_METHOD(Session, onAction) { call_closure(INTERNAL_FUNCTION_PARAM_PASSTHRU, ZEND_STRL("onAction")); }
1159 PHP_METHOD(Session, onUnknown) { call_closure(INTERNAL_FUNCTION_PARAM_PASSTHRU, ZEND_STRL("onUnknown")); }
1160 PHP_METHOD(Session, onNumeric) { call_closure(INTERNAL_FUNCTION_PARAM_PASSTHRU, ZEND_STRL("onNumeric")); }
1161 PHP_METHOD(Session, onDccChatReq) { call_closure(INTERNAL_FUNCTION_PARAM_PASSTHRU, ZEND_STRL("onDccChatReq")); }
1162 PHP_METHOD(Session, onDccSendReq) { call_closure(INTERNAL_FUNCTION_PARAM_PASSTHRU, ZEND_STRL("onDccSendReq")); }
1163 PHP_METHOD(Session, onError) { call_closure(INTERNAL_FUNCTION_PARAM_PASSTHRU, ZEND_STRL("onError")); }
1164 /* }}} */
1165
1166 #define ME(m, ai) PHP_ME(Session, m, ai, ZEND_ACC_PUBLIC)
1167
1168 zend_function_entry php_ircclient_session_method_entry[] = {
1169 ME(__construct, ai_Session___construct)
1170 ME(doConnect, ai_Session_doConnect)
1171 ME(isConnected, NULL)
1172 ME(disconnect, NULL)
1173 ME(run, ai_Session_run)
1174 ME(setOption, ai_Session_setOption)
1175
1176 ME(doJoin, ai_Session_doJoin)
1177 ME(doPart, ai_Session_doPart)
1178 ME(doInvite, ai_Session_doInvite)
1179 ME(doNames, ai_Session_doNames)
1180 ME(doList, ai_Session_doList)
1181 ME(doTopic, ai_Session_doTopic)
1182 ME(doChannelMode, ai_Session_doChannelMode)
1183 ME(doKick, ai_Session_doKick)
1184
1185 ME(doMsg, ai_Session_doMsg)
1186 ME(doMe, ai_Session_doMe)
1187 ME(doNotice, ai_Session_doNotice)
1188
1189 ME(doQuit, ai_Session_doQuit)
1190 ME(doUserMode, ai_Session_doUserMode)
1191 ME(doNick, ai_Session_doNick)
1192 ME(doWhois, ai_Session_doWhois)
1193
1194 ME(doCtcpReply, ai_Session_doCtcpReply)
1195 ME(doCtcpRequest, ai_Session_doCtcpRequest)
1196
1197 ME(doRaw, ai_Session_doRaw)
1198
1199 ME(onConnect, ai_Session_event)
1200 ME(onNick, ai_Session_event)
1201 ME(onQuit, ai_Session_event)
1202 ME(onJoin, ai_Session_event)
1203 ME(onPart, ai_Session_event)
1204 ME(onMode, ai_Session_event)
1205 ME(onUmode, ai_Session_event)
1206 ME(onTopic, ai_Session_event)
1207 ME(onKick, ai_Session_event)
1208 ME(onChannel, ai_Session_event)
1209 ME(onPrivmsg, ai_Session_event)
1210 ME(onNotice, ai_Session_event)
1211 ME(onChannelNotice, ai_Session_event)
1212 ME(onInvite, ai_Session_event)
1213 ME(onCtcpReq, ai_Session_event)
1214 ME(onCtcpRep, ai_Session_event)
1215 ME(onAction, ai_Session_event)
1216 ME(onUnknown, ai_Session_event)
1217 ME(onNumeric, ai_Session_event_code)
1218 ME(onDccChatReq, ai_Session_event_dcc_chat)
1219 ME(onDccSendReq, ai_Session_event_dcc_send)
1220 ME(onError, ai_Session_event)
1221 {0}
1222 };
1223
1224 PHP_MINIT_FUNCTION(ircclient)
1225 {
1226 zend_class_entry ce;
1227
1228 memset(&ce, 0, sizeof(zend_class_entry));
1229 INIT_NS_CLASS_ENTRY(ce, "irc\\client", "Session", php_ircclient_session_method_entry);
1230 ce.create_object = php_ircclient_session_object_create;
1231 php_ircclient_session_class_entry = zend_register_internal_class_ex(&ce, NULL, NULL TSRMLS_CC);
1232
1233 zend_declare_property_null(php_ircclient_session_class_entry, ZEND_STRL("nick"), ZEND_ACC_PUBLIC TSRMLS_CC);
1234 zend_declare_property_null(php_ircclient_session_class_entry, ZEND_STRL("user"), ZEND_ACC_PUBLIC TSRMLS_CC);
1235 zend_declare_property_null(php_ircclient_session_class_entry, ZEND_STRL("real"), ZEND_ACC_PUBLIC TSRMLS_CC);
1236
1237 zend_declare_property_null(php_ircclient_session_class_entry, ZEND_STRL("onConnect"), ZEND_ACC_PUBLIC TSRMLS_CC);
1238 zend_declare_property_null(php_ircclient_session_class_entry, ZEND_STRL("onNick"), ZEND_ACC_PUBLIC TSRMLS_CC);
1239 zend_declare_property_null(php_ircclient_session_class_entry, ZEND_STRL("onQuit"), ZEND_ACC_PUBLIC TSRMLS_CC);
1240 zend_declare_property_null(php_ircclient_session_class_entry, ZEND_STRL("onJoin"), ZEND_ACC_PUBLIC TSRMLS_CC);
1241 zend_declare_property_null(php_ircclient_session_class_entry, ZEND_STRL("onPart"), ZEND_ACC_PUBLIC TSRMLS_CC);
1242 zend_declare_property_null(php_ircclient_session_class_entry, ZEND_STRL("onMode"), ZEND_ACC_PUBLIC TSRMLS_CC);
1243 zend_declare_property_null(php_ircclient_session_class_entry, ZEND_STRL("onUmode"), ZEND_ACC_PUBLIC TSRMLS_CC);
1244 zend_declare_property_null(php_ircclient_session_class_entry, ZEND_STRL("onTopic"), ZEND_ACC_PUBLIC TSRMLS_CC);
1245 zend_declare_property_null(php_ircclient_session_class_entry, ZEND_STRL("onKick"), ZEND_ACC_PUBLIC TSRMLS_CC);
1246 zend_declare_property_null(php_ircclient_session_class_entry, ZEND_STRL("onChannel"), ZEND_ACC_PUBLIC TSRMLS_CC);
1247 zend_declare_property_null(php_ircclient_session_class_entry, ZEND_STRL("onPrivmsg"), ZEND_ACC_PUBLIC TSRMLS_CC);
1248 zend_declare_property_null(php_ircclient_session_class_entry, ZEND_STRL("onNotice"), ZEND_ACC_PUBLIC TSRMLS_CC);
1249 zend_declare_property_null(php_ircclient_session_class_entry, ZEND_STRL("onChannelNotice"), ZEND_ACC_PUBLIC TSRMLS_CC);
1250 zend_declare_property_null(php_ircclient_session_class_entry, ZEND_STRL("onInvite"), ZEND_ACC_PUBLIC TSRMLS_CC);
1251 zend_declare_property_null(php_ircclient_session_class_entry, ZEND_STRL("onCtcpReq"), ZEND_ACC_PUBLIC TSRMLS_CC);
1252 zend_declare_property_null(php_ircclient_session_class_entry, ZEND_STRL("onCtcpRep"), ZEND_ACC_PUBLIC TSRMLS_CC);
1253 zend_declare_property_null(php_ircclient_session_class_entry, ZEND_STRL("onAction"), ZEND_ACC_PUBLIC TSRMLS_CC);
1254 zend_declare_property_null(php_ircclient_session_class_entry, ZEND_STRL("onUnknown"), ZEND_ACC_PUBLIC TSRMLS_CC);
1255 zend_declare_property_null(php_ircclient_session_class_entry, ZEND_STRL("onNumeric"), ZEND_ACC_PUBLIC TSRMLS_CC);
1256 zend_declare_property_null(php_ircclient_session_class_entry, ZEND_STRL("onDccChatReq"), ZEND_ACC_PUBLIC TSRMLS_CC);
1257 zend_declare_property_null(php_ircclient_session_class_entry, ZEND_STRL("onDccSendReq"), ZEND_ACC_PUBLIC TSRMLS_CC);
1258 zend_declare_property_null(php_ircclient_session_class_entry, ZEND_STRL("onError"), ZEND_ACC_PUBLIC TSRMLS_CC);
1259
1260 REGISTER_NS_LONG_CONSTANT("irc\\client", "RPL_WELCOME", 001, CONST_CS|CONST_PERSISTENT);
1261 REGISTER_NS_LONG_CONSTANT("irc\\client", "RPL_YOURHOST", 002, CONST_CS|CONST_PERSISTENT);
1262 REGISTER_NS_LONG_CONSTANT("irc\\client", "RPL_CREATED", 003, CONST_CS|CONST_PERSISTENT);
1263 REGISTER_NS_LONG_CONSTANT("irc\\client", "RPL_MYINFO", 004, CONST_CS|CONST_PERSISTENT);
1264 REGISTER_NS_LONG_CONSTANT("irc\\client", "RPL_BOUNCE", 005, CONST_CS|CONST_PERSISTENT);
1265 REGISTER_NS_LONG_CONSTANT("irc\\client", "RPL_USERHOST", 302, CONST_CS|CONST_PERSISTENT);
1266 REGISTER_NS_LONG_CONSTANT("irc\\client", "RPL_ISON", 303, CONST_CS|CONST_PERSISTENT);
1267 REGISTER_NS_LONG_CONSTANT("irc\\client", "RPL_AWAY", 301, CONST_CS|CONST_PERSISTENT);
1268 REGISTER_NS_LONG_CONSTANT("irc\\client", "RPL_UNAWAY", 305, CONST_CS|CONST_PERSISTENT);
1269 REGISTER_NS_LONG_CONSTANT("irc\\client", "RPL_NOWAWAY", 306, CONST_CS|CONST_PERSISTENT);
1270 REGISTER_NS_LONG_CONSTANT("irc\\client", "RPL_WHOISUSER", 311, CONST_CS|CONST_PERSISTENT);
1271 REGISTER_NS_LONG_CONSTANT("irc\\client", "RPL_WHOISSERVER", 312, CONST_CS|CONST_PERSISTENT);
1272 REGISTER_NS_LONG_CONSTANT("irc\\client", "RPL_WHOISOPERATOR", 313, CONST_CS|CONST_PERSISTENT);
1273 REGISTER_NS_LONG_CONSTANT("irc\\client", "RPL_WHOISIDLE", 317, CONST_CS|CONST_PERSISTENT);
1274 REGISTER_NS_LONG_CONSTANT("irc\\client", "RPL_ENDOFWHOIS", 318, CONST_CS|CONST_PERSISTENT);
1275 REGISTER_NS_LONG_CONSTANT("irc\\client", "RPL_WHOISCHANNELS", 319, CONST_CS|CONST_PERSISTENT);
1276 REGISTER_NS_LONG_CONSTANT("irc\\client", "RPL_WHOWASUSER", 314, CONST_CS|CONST_PERSISTENT);
1277 REGISTER_NS_LONG_CONSTANT("irc\\client", "RPL_ENDOFWHOWAS", 369, CONST_CS|CONST_PERSISTENT);
1278 REGISTER_NS_LONG_CONSTANT("irc\\client", "RPL_LIST", 322, CONST_CS|CONST_PERSISTENT);
1279 REGISTER_NS_LONG_CONSTANT("irc\\client", "RPL_LISTEND", 323, CONST_CS|CONST_PERSISTENT);
1280 REGISTER_NS_LONG_CONSTANT("irc\\client", "RPL_UNIQOPIS", 325, CONST_CS|CONST_PERSISTENT);
1281 REGISTER_NS_LONG_CONSTANT("irc\\client", "RPL_CHANNELMODEIS", 324, CONST_CS|CONST_PERSISTENT);
1282 REGISTER_NS_LONG_CONSTANT("irc\\client", "RPL_NOTOPIC", 331, CONST_CS|CONST_PERSISTENT);
1283 REGISTER_NS_LONG_CONSTANT("irc\\client", "RPL_TOPIC", 332, CONST_CS|CONST_PERSISTENT);
1284 REGISTER_NS_LONG_CONSTANT("irc\\client", "RPL_INVITING", 341, CONST_CS|CONST_PERSISTENT);
1285 REGISTER_NS_LONG_CONSTANT("irc\\client", "RPL_SUMMONING", 342, CONST_CS|CONST_PERSISTENT);
1286 REGISTER_NS_LONG_CONSTANT("irc\\client", "RPL_INVITELIST", 346, CONST_CS|CONST_PERSISTENT);
1287 REGISTER_NS_LONG_CONSTANT("irc\\client", "RPL_ENDOFINVITELIST", 347, CONST_CS|CONST_PERSISTENT);
1288 REGISTER_NS_LONG_CONSTANT("irc\\client", "RPL_EXCEPTLIST", 348, CONST_CS|CONST_PERSISTENT);
1289 REGISTER_NS_LONG_CONSTANT("irc\\client", "RPL_ENDOFEXCEPTLIST", 349, CONST_CS|CONST_PERSISTENT);
1290 REGISTER_NS_LONG_CONSTANT("irc\\client", "RPL_VERSION", 351, CONST_CS|CONST_PERSISTENT);
1291 REGISTER_NS_LONG_CONSTANT("irc\\client", "RPL_WHOREPLY", 352, CONST_CS|CONST_PERSISTENT);
1292 REGISTER_NS_LONG_CONSTANT("irc\\client", "RPL_ENDOFWHO", 315, CONST_CS|CONST_PERSISTENT);
1293 REGISTER_NS_LONG_CONSTANT("irc\\client", "RPL_NAMREPLY", 353, CONST_CS|CONST_PERSISTENT);
1294 REGISTER_NS_LONG_CONSTANT("irc\\client", "RPL_ENDOFNAMES", 366, CONST_CS|CONST_PERSISTENT);
1295 REGISTER_NS_LONG_CONSTANT("irc\\client", "RPL_LINKS", 364, CONST_CS|CONST_PERSISTENT);
1296 REGISTER_NS_LONG_CONSTANT("irc\\client", "RPL_ENDOFLINKS", 365, CONST_CS|CONST_PERSISTENT);
1297 REGISTER_NS_LONG_CONSTANT("irc\\client", "RPL_BANLIST", 367, CONST_CS|CONST_PERSISTENT);
1298 REGISTER_NS_LONG_CONSTANT("irc\\client", "RPL_ENDOFBANLIST", 368, CONST_CS|CONST_PERSISTENT);
1299 REGISTER_NS_LONG_CONSTANT("irc\\client", "RPL_INFO", 371, CONST_CS|CONST_PERSISTENT);
1300 REGISTER_NS_LONG_CONSTANT("irc\\client", "RPL_ENDOFINFO", 374, CONST_CS|CONST_PERSISTENT);
1301 REGISTER_NS_LONG_CONSTANT("irc\\client", "RPL_MOTDSTART", 375, CONST_CS|CONST_PERSISTENT);
1302 REGISTER_NS_LONG_CONSTANT("irc\\client", "RPL_MOTD", 372, CONST_CS|CONST_PERSISTENT);
1303 REGISTER_NS_LONG_CONSTANT("irc\\client", "RPL_ENDOFMOTD", 376, CONST_CS|CONST_PERSISTENT);
1304 REGISTER_NS_LONG_CONSTANT("irc\\client", "RPL_YOUREOPER", 381, CONST_CS|CONST_PERSISTENT);
1305 REGISTER_NS_LONG_CONSTANT("irc\\client", "RPL_REHASHING", 382, CONST_CS|CONST_PERSISTENT);
1306 REGISTER_NS_LONG_CONSTANT("irc\\client", "RPL_YOURESERVICE", 383, CONST_CS|CONST_PERSISTENT);
1307 REGISTER_NS_LONG_CONSTANT("irc\\client", "RPL_TIME", 391, CONST_CS|CONST_PERSISTENT);
1308 REGISTER_NS_LONG_CONSTANT("irc\\client", "RPL_USERSSTART", 392, CONST_CS|CONST_PERSISTENT);
1309 REGISTER_NS_LONG_CONSTANT("irc\\client", "RPL_USERS", 393, CONST_CS|CONST_PERSISTENT);
1310 REGISTER_NS_LONG_CONSTANT("irc\\client", "RPL_ENDOFUSERS", 394, CONST_CS|CONST_PERSISTENT);
1311 REGISTER_NS_LONG_CONSTANT("irc\\client", "RPL_NOUSERS", 395, CONST_CS|CONST_PERSISTENT);
1312 REGISTER_NS_LONG_CONSTANT("irc\\client", "RPL_TRACELINK", 200, CONST_CS|CONST_PERSISTENT);
1313 REGISTER_NS_LONG_CONSTANT("irc\\client", "RPL_TRACECONNECTING", 201, CONST_CS|CONST_PERSISTENT);
1314 REGISTER_NS_LONG_CONSTANT("irc\\client", "RPL_TRACEHANDSHAKE", 202, CONST_CS|CONST_PERSISTENT);
1315 REGISTER_NS_LONG_CONSTANT("irc\\client", "RPL_TRACEUNKNOWN", 203, CONST_CS|CONST_PERSISTENT);
1316 REGISTER_NS_LONG_CONSTANT("irc\\client", "RPL_TRACEOPERATOR", 204, CONST_CS|CONST_PERSISTENT);
1317 REGISTER_NS_LONG_CONSTANT("irc\\client", "RPL_TRACEUSER", 205, CONST_CS|CONST_PERSISTENT);
1318 REGISTER_NS_LONG_CONSTANT("irc\\client", "RPL_TRACESERVER", 206, CONST_CS|CONST_PERSISTENT);
1319 REGISTER_NS_LONG_CONSTANT("irc\\client", "RPL_TRACESERVICE", 207, CONST_CS|CONST_PERSISTENT);
1320 REGISTER_NS_LONG_CONSTANT("irc\\client", "RPL_TRACENEWTYPE", 208, CONST_CS|CONST_PERSISTENT);
1321 REGISTER_NS_LONG_CONSTANT("irc\\client", "RPL_TRACECLASS", 209, CONST_CS|CONST_PERSISTENT);
1322 REGISTER_NS_LONG_CONSTANT("irc\\client", "RPL_TRACELOG", 261, CONST_CS|CONST_PERSISTENT);
1323 REGISTER_NS_LONG_CONSTANT("irc\\client", "RPL_TRACEEND", 262, CONST_CS|CONST_PERSISTENT);
1324 REGISTER_NS_LONG_CONSTANT("irc\\client", "RPL_STATSLINKINFO", 211, CONST_CS|CONST_PERSISTENT);
1325 REGISTER_NS_LONG_CONSTANT("irc\\client", "RPL_STATSCOMMANDS", 212, CONST_CS|CONST_PERSISTENT);
1326 REGISTER_NS_LONG_CONSTANT("irc\\client", "RPL_ENDOFSTATS", 219, CONST_CS|CONST_PERSISTENT);
1327 REGISTER_NS_LONG_CONSTANT("irc\\client", "RPL_STATSUPTIME", 242, CONST_CS|CONST_PERSISTENT);
1328 REGISTER_NS_LONG_CONSTANT("irc\\client", "RPL_STATSOLINE", 243, CONST_CS|CONST_PERSISTENT);
1329 REGISTER_NS_LONG_CONSTANT("irc\\client", "RPL_UMODEIS", 221, CONST_CS|CONST_PERSISTENT);
1330 REGISTER_NS_LONG_CONSTANT("irc\\client", "RPL_SERVLIST", 234, CONST_CS|CONST_PERSISTENT);
1331 REGISTER_NS_LONG_CONSTANT("irc\\client", "RPL_SERVLISTEND", 235, CONST_CS|CONST_PERSISTENT);
1332 REGISTER_NS_LONG_CONSTANT("irc\\client", "RPL_LUSERCLIENT", 251, CONST_CS|CONST_PERSISTENT);
1333 REGISTER_NS_LONG_CONSTANT("irc\\client", "RPL_LUSEROP", 252, CONST_CS|CONST_PERSISTENT);
1334 REGISTER_NS_LONG_CONSTANT("irc\\client", "RPL_LUSERUNKNOWN", 253, CONST_CS|CONST_PERSISTENT);
1335 REGISTER_NS_LONG_CONSTANT("irc\\client", "RPL_LUSERCHANNELS", 254, CONST_CS|CONST_PERSISTENT);
1336 REGISTER_NS_LONG_CONSTANT("irc\\client", "RPL_LUSERME", 255, CONST_CS|CONST_PERSISTENT);
1337 REGISTER_NS_LONG_CONSTANT("irc\\client", "RPL_ADMINME", 256, CONST_CS|CONST_PERSISTENT);
1338 REGISTER_NS_LONG_CONSTANT("irc\\client", "RPL_ADMINLOC1", 257, CONST_CS|CONST_PERSISTENT);
1339 REGISTER_NS_LONG_CONSTANT("irc\\client", "RPL_ADMINLOC2", 258, CONST_CS|CONST_PERSISTENT);
1340 REGISTER_NS_LONG_CONSTANT("irc\\client", "RPL_ADMINEMAIL", 259, CONST_CS|CONST_PERSISTENT);
1341 REGISTER_NS_LONG_CONSTANT("irc\\client", "RPL_TRYAGAIN", 263, CONST_CS|CONST_PERSISTENT);
1342 REGISTER_NS_LONG_CONSTANT("irc\\client", "ERR_NOSUCHNICK", 401, CONST_CS|CONST_PERSISTENT);
1343 REGISTER_NS_LONG_CONSTANT("irc\\client", "ERR_NOSUCHSERVER", 402, CONST_CS|CONST_PERSISTENT);
1344 REGISTER_NS_LONG_CONSTANT("irc\\client", "ERR_NOSUCHCHANNEL", 403, CONST_CS|CONST_PERSISTENT);
1345 REGISTER_NS_LONG_CONSTANT("irc\\client", "ERR_CANNOTSENDTOCHAN", 404, CONST_CS|CONST_PERSISTENT);
1346 REGISTER_NS_LONG_CONSTANT("irc\\client", "ERR_TOOMANYCHANNELS", 405, CONST_CS|CONST_PERSISTENT);
1347 REGISTER_NS_LONG_CONSTANT("irc\\client", "ERR_WASNOSUCHNICK", 406, CONST_CS|CONST_PERSISTENT);
1348 REGISTER_NS_LONG_CONSTANT("irc\\client", "ERR_TOOMANYTARGETS", 407, CONST_CS|CONST_PERSISTENT);
1349 REGISTER_NS_LONG_CONSTANT("irc\\client", "ERR_NOSUCHSERVICE", 408, CONST_CS|CONST_PERSISTENT);
1350 REGISTER_NS_LONG_CONSTANT("irc\\client", "ERR_NOORIGIN", 409, CONST_CS|CONST_PERSISTENT);
1351 REGISTER_NS_LONG_CONSTANT("irc\\client", "ERR_NORECIPIENT", 411, CONST_CS|CONST_PERSISTENT);
1352 REGISTER_NS_LONG_CONSTANT("irc\\client", "ERR_NOTEXTTOSEND", 412, CONST_CS|CONST_PERSISTENT);
1353 REGISTER_NS_LONG_CONSTANT("irc\\client", "ERR_NOTOPLEVEL", 413, CONST_CS|CONST_PERSISTENT);
1354 REGISTER_NS_LONG_CONSTANT("irc\\client", "ERR_WILDTOPLEVEL", 414, CONST_CS|CONST_PERSISTENT);
1355 REGISTER_NS_LONG_CONSTANT("irc\\client", "ERR_BADMASK", 415, CONST_CS|CONST_PERSISTENT);
1356 REGISTER_NS_LONG_CONSTANT("irc\\client", "ERR_UNKNOWNCOMMAND", 421, CONST_CS|CONST_PERSISTENT);
1357 REGISTER_NS_LONG_CONSTANT("irc\\client", "ERR_NOMOTD", 422, CONST_CS|CONST_PERSISTENT);
1358 REGISTER_NS_LONG_CONSTANT("irc\\client", "ERR_NOADMININFO", 423, CONST_CS|CONST_PERSISTENT);
1359 REGISTER_NS_LONG_CONSTANT("irc\\client", "ERR_FILEERROR", 424, CONST_CS|CONST_PERSISTENT);
1360 REGISTER_NS_LONG_CONSTANT("irc\\client", "ERR_NONICKNAMEGIVEN", 431, CONST_CS|CONST_PERSISTENT);
1361 REGISTER_NS_LONG_CONSTANT("irc\\client", "ERR_ERRONEUSNICKNAME", 432, CONST_CS|CONST_PERSISTENT);
1362 REGISTER_NS_LONG_CONSTANT("irc\\client", "ERR_NICKNAMEINUSE", 433, CONST_CS|CONST_PERSISTENT);
1363 REGISTER_NS_LONG_CONSTANT("irc\\client", "ERR_NICKCOLLISION", 436, CONST_CS|CONST_PERSISTENT);
1364 REGISTER_NS_LONG_CONSTANT("irc\\client", "ERR_UNAVAILRESOURCE", 437, CONST_CS|CONST_PERSISTENT);
1365 REGISTER_NS_LONG_CONSTANT("irc\\client", "ERR_USERNOTINCHANNEL", 441, CONST_CS|CONST_PERSISTENT);
1366 REGISTER_NS_LONG_CONSTANT("irc\\client", "ERR_NOTONCHANNEL", 442, CONST_CS|CONST_PERSISTENT);
1367 REGISTER_NS_LONG_CONSTANT("irc\\client", "ERR_USERONCHANNEL", 443, CONST_CS|CONST_PERSISTENT);
1368 REGISTER_NS_LONG_CONSTANT("irc\\client", "ERR_NOLOGIN", 444, CONST_CS|CONST_PERSISTENT);
1369 REGISTER_NS_LONG_CONSTANT("irc\\client", "ERR_SUMMONDISABLED", 445, CONST_CS|CONST_PERSISTENT);
1370 REGISTER_NS_LONG_CONSTANT("irc\\client", "ERR_USERSDISABLED", 446, CONST_CS|CONST_PERSISTENT);
1371 REGISTER_NS_LONG_CONSTANT("irc\\client", "ERR_NOTREGISTERED", 451, CONST_CS|CONST_PERSISTENT);
1372 REGISTER_NS_LONG_CONSTANT("irc\\client", "ERR_NEEDMOREPARAMS", 461, CONST_CS|CONST_PERSISTENT);
1373 REGISTER_NS_LONG_CONSTANT("irc\\client", "ERR_ALREADYREGISTRED", 462, CONST_CS|CONST_PERSISTENT);
1374 REGISTER_NS_LONG_CONSTANT("irc\\client", "ERR_NOPERMFORHOST", 463, CONST_CS|CONST_PERSISTENT);
1375 REGISTER_NS_LONG_CONSTANT("irc\\client", "ERR_PASSWDMISMATCH", 464, CONST_CS|CONST_PERSISTENT);
1376 REGISTER_NS_LONG_CONSTANT("irc\\client", "ERR_YOUREBANNEDCREEP", 465, CONST_CS|CONST_PERSISTENT);
1377 REGISTER_NS_LONG_CONSTANT("irc\\client", "ERR_YOUWILLBEBANNED", 466, CONST_CS|CONST_PERSISTENT);
1378 REGISTER_NS_LONG_CONSTANT("irc\\client", "ERR_KEYSET", 467, CONST_CS|CONST_PERSISTENT);
1379 REGISTER_NS_LONG_CONSTANT("irc\\client", "ERR_CHANNELISFULL", 471, CONST_CS|CONST_PERSISTENT);
1380 REGISTER_NS_LONG_CONSTANT("irc\\client", "ERR_UNKNOWNMODE", 472, CONST_CS|CONST_PERSISTENT);
1381 REGISTER_NS_LONG_CONSTANT("irc\\client", "ERR_INVITEONLYCHAN", 473, CONST_CS|CONST_PERSISTENT);
1382 REGISTER_NS_LONG_CONSTANT("irc\\client", "ERR_BANNEDFROMCHAN", 474, CONST_CS|CONST_PERSISTENT);
1383 REGISTER_NS_LONG_CONSTANT("irc\\client", "ERR_BADCHANNELKEY", 475, CONST_CS|CONST_PERSISTENT);
1384 REGISTER_NS_LONG_CONSTANT("irc\\client", "ERR_BADCHANMASK", 476, CONST_CS|CONST_PERSISTENT);
1385 REGISTER_NS_LONG_CONSTANT("irc\\client", "ERR_NOCHANMODES", 477, CONST_CS|CONST_PERSISTENT);
1386 REGISTER_NS_LONG_CONSTANT("irc\\client", "ERR_BANLISTFULL", 478, CONST_CS|CONST_PERSISTENT);
1387 REGISTER_NS_LONG_CONSTANT("irc\\client", "ERR_NOPRIVILEGES", 481, CONST_CS|CONST_PERSISTENT);
1388 REGISTER_NS_LONG_CONSTANT("irc\\client", "ERR_CHANOPRIVSNEEDED", 482, CONST_CS|CONST_PERSISTENT);
1389 REGISTER_NS_LONG_CONSTANT("irc\\client", "ERR_CANTKILLSERVER", 483, CONST_CS|CONST_PERSISTENT);
1390 REGISTER_NS_LONG_CONSTANT("irc\\client", "ERR_RESTRICTED", 484, CONST_CS|CONST_PERSISTENT);
1391 REGISTER_NS_LONG_CONSTANT("irc\\client", "ERR_UNIQOPPRIVSNEEDED", 485, CONST_CS|CONST_PERSISTENT);
1392 REGISTER_NS_LONG_CONSTANT("irc\\client", "ERR_NOOPERHOST", 491, CONST_CS|CONST_PERSISTENT);
1393 REGISTER_NS_LONG_CONSTANT("irc\\client", "ERR_UMODEUNKNOWNFLAG", 501, CONST_CS|CONST_PERSISTENT);
1394 REGISTER_NS_LONG_CONSTANT("irc\\client", "ERR_USERSDONTMATCH", 502, CONST_CS|CONST_PERSISTENT);
1395
1396 return SUCCESS;
1397 }
1398
1399 PHP_MINFO_FUNCTION(ircclient)
1400 {
1401 unsigned int high, low;
1402 char *version[2];
1403
1404 irc_get_version(&high, &low);
1405 spprintf(&version[1], 0, "%u.%u", high, low);
1406 spprintf(&version[0], 0, "%u.%u", PHP_IRCCLIENT_LIBIRCCLIENT_VERSION_HIGH, PHP_IRCCLIENT_LIBIRCCLIENT_VERSION_LOW);
1407
1408 php_info_print_table_start();
1409 php_info_print_table_header(2, "IRC client support", "enabled");
1410 php_info_print_table_row(2, "Version", PHP_IRCCLIENT_VERSION);
1411 php_info_print_table_end();
1412
1413 php_info_print_table_start();
1414 php_info_print_table_header(3, "Used Library", "compiled", "linked");
1415 php_info_print_table_row(3,
1416 "libircclient",
1417 version[0],
1418 version[1]
1419 );
1420 php_info_print_table_end();
1421
1422 efree(version[0]);
1423 efree(version[1]);
1424 }
1425
1426
1427
1428
1429