* fix build on PHP 5.3
[m6w6/ext-ircclient] / php_ircclient.c
1 /*
2 +----------------------------------------------------------------------+
3 | PHP Version 5 |
4 +----------------------------------------------------------------------+
5 | Copyright (c) 1997-2011 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: |
16 +----------------------------------------------------------------------+
17 */
18
19 /* $Id: header 310447 2011-04-23 21:14:10Z bjori $ */
20
21 #ifdef HAVE_CONFIG_H
22 #include "config.h"
23 #endif
24
25 #include "php.h"
26 #include "php_ini.h"
27 #include "ext/standard/php_string.h"
28 #include "ext/standard/info.h"
29
30 #include "zend_interfaces.h"
31
32 #include "php_ircclient.h"
33
34 #include <ctype.h>
35 #include <libircclient/libircclient.h>
36
37 PHP_FUNCTION(parse_origin)
38 {
39 char *origin_str;
40 int origin_len;
41
42 if (SUCCESS == zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &origin_str, &origin_len)) {
43 zval *znick, *zuser, *zhost;
44 size_t siz = 0;
45 char *ptr;
46
47 MAKE_STD_ZVAL(znick); ZVAL_NULL(znick);
48 MAKE_STD_ZVAL(zuser); ZVAL_NULL(zuser);
49 MAKE_STD_ZVAL(zhost); ZVAL_NULL(zhost);
50
51 for (ptr = origin_str; *ptr; ptr += siz + 1) {
52 if ((siz = strcspn(ptr, "!@"))) {
53 switch (ptr[siz]) {
54 case '!':
55 ZVAL_STRINGL(znick, ptr, siz, 1);
56 break;
57 case '@':
58 ZVAL_STRINGL(zuser, ptr, siz, 1);
59 break;
60 case '\0':
61 ZVAL_STRINGL(zhost, ptr, siz, 1);
62 goto done;
63 break;
64 default:
65 break;
66 }
67 }
68 }
69 done:
70 array_init(return_value);
71 add_assoc_zval_ex(return_value, ZEND_STRS("nick"), znick);
72 add_assoc_zval_ex(return_value, ZEND_STRS("user"), zuser);
73 add_assoc_zval_ex(return_value, ZEND_STRS("host"), zhost);
74 }
75 }
76
77
78 const zend_function_entry php_ircclient_function_entry[] = {
79 ZEND_NS_FENTRY("irc\\client", parse_origin, ZEND_FN(parse_origin), NULL, 0)
80 PHP_FE_END
81 };
82
83 zend_module_entry ircclient_module_entry = {
84 STANDARD_MODULE_HEADER,
85 "ircclient",
86 php_ircclient_function_entry,
87 PHP_MINIT(ircclient),
88 PHP_MSHUTDOWN(ircclient),
89 PHP_RINIT(ircclient),
90 PHP_RSHUTDOWN(ircclient),
91 PHP_MINFO(ircclient),
92 "0.1.0",
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 /* .event_channel_notice = php_ircclient_event_callback, */
120 .event_invite = php_ircclient_event_callback,
121 .event_ctcp_req = php_ircclient_event_callback,
122 .event_ctcp_rep = php_ircclient_event_callback,
123 .event_ctcp_action = php_ircclient_event_callback,
124 .event_unknown = php_ircclient_event_callback,
125 .event_numeric = php_ircclient_event_code_callback,
126 .event_dcc_chat_req = php_ircclient_event_dcc_chat_callback,
127 .event_dcc_send_req = php_ircclient_event_dcc_send_callback
128 };
129
130 typedef struct php_ircclient_session_object {
131 zend_object zo;
132 zend_object_value ov;
133 irc_session_t *sess;
134 #ifdef ZTS
135 void ***ts;
136 #endif
137 } php_ircclient_session_object_t;
138
139 zend_class_entry *php_ircclient_session_class_entry;
140
141 void php_ircclient_session_object_free(void *object TSRMLS_DC)
142 {
143 php_ircclient_session_object_t *o = (php_ircclient_session_object_t *) object;
144
145 if (o->sess) {
146 irc_destroy_session(o->sess);
147 o->sess = NULL;
148 }
149 zend_object_std_dtor((zend_object *) o TSRMLS_CC);
150 efree(o);
151 }
152
153 zend_object_value php_ircclient_session_object_create(zend_class_entry *ce TSRMLS_DC)
154 {
155 php_ircclient_session_object_t *obj;
156
157 obj = ecalloc(1, sizeof(*obj));
158 #ifdef ZEND_ENGINE_2_4
159 zend_object_std_init((zend_object *) obj, ce TSRMLS_CC);
160 object_properties_init((zend_object *) obj, ce);
161 #else
162 obj->zo.ce = ce;
163 ALLOC_HASHTABLE(obj->zo.properties);
164 zend_hash_init(obj->zo.properties, zend_hash_num_elements(&ce->default_properties), NULL, ZVAL_PTR_DTOR, 0);
165 zend_hash_copy(obj->zo.properties, &ce->default_properties, (copy_ctor_func_t) zval_add_ref, NULL, sizeof(zval *));
166 #endif
167
168 obj->sess = irc_create_session(&php_ircclient_callbacks);
169 irc_set_ctx(obj->sess, obj);
170 TSRMLS_SET_CTX(obj->ts);
171
172 obj->ov.handle = zend_objects_store_put(obj, NULL, php_ircclient_session_object_free, NULL TSRMLS_CC);
173 obj->ov.handlers = zend_get_std_object_handlers();
174
175 return obj->ov;
176 }
177
178 static void php_ircclient_event_callback(irc_session_t *session, const char *event, const char *origin, const char **params, unsigned int count)
179 {
180 char *fn_str;
181 int i, fn_len;
182 zval *zo, *zr, *za;
183 php_ircclient_session_object_t *obj = irc_get_ctx(session);
184 TSRMLS_FETCH_FROM_CTX(obj->ts);
185
186 fn_str = emalloc(strlen(event) + 2 + 1);
187 fn_str[0] = 'o';
188 fn_str[1] = 'n';
189 fn_len = 2;
190 do {
191 if (*event != '_') {
192 fn_str[fn_len++] = tolower(*event);
193 }
194 } while (*event++);
195
196 MAKE_STD_ZVAL(zo);
197 Z_TYPE_P(zo) = IS_OBJECT;
198 zo->value.obj = obj->ov;
199 zend_objects_store_add_ref(zo TSRMLS_CC);
200
201 MAKE_STD_ZVAL(zr);
202 if (origin) {
203 ZVAL_STRING(zr, estrdup(origin), 0);
204 } else {
205 ZVAL_NULL(zr);
206 }
207
208 MAKE_STD_ZVAL(za);
209 array_init(za);
210 for (i = 0; i < count; ++i) {
211 add_next_index_string(za, estrdup(params[i]), 0);
212 }
213
214 zend_call_method(&zo, NULL, NULL, fn_str, fn_len - 1, NULL, 2, zr, za TSRMLS_CC);
215
216 zval_ptr_dtor(&za);
217 zval_ptr_dtor(&zr);
218 zval_ptr_dtor(&zo);
219
220 efree(fn_str);
221 }
222
223 static void php_ircclient_event_code_callback(irc_session_t *session, unsigned int event, const char *origin, const char **params, unsigned int count)
224 {
225 int i;
226 zval *zo, *zr, *zp, *za;
227 php_ircclient_session_object_t *obj = irc_get_ctx(session);
228 TSRMLS_FETCH_FROM_CTX(obj->ts);
229
230 MAKE_STD_ZVAL(zo);
231 Z_TYPE_P(zo) = IS_OBJECT;
232 zo->value.obj = obj->ov;
233 zend_objects_store_add_ref(zo TSRMLS_CC);
234
235 MAKE_STD_ZVAL(zr);
236 if (origin) {
237 ZVAL_STRING(zr, estrdup(origin), 0);
238 } else {
239 ZVAL_NULL(zr);
240 }
241
242 MAKE_STD_ZVAL(za);
243 array_init(za);
244 add_assoc_long_ex(za, ZEND_STRS("event"), event);
245
246 MAKE_STD_ZVAL(zp);
247 array_init(zp);
248 for (i = 0; i < count; ++i) {
249 add_next_index_string(zp, estrdup(params[i]), 0);
250 }
251 add_assoc_zval_ex(za, ZEND_STRS("params"), zp);
252
253 zend_call_method(&zo, NULL, NULL, ZEND_STRL("onnumeric"), NULL, 2, zr, za TSRMLS_CC);
254
255 zval_ptr_dtor(&zp);
256 zval_ptr_dtor(&za);
257 zval_ptr_dtor(&zr);
258 zval_ptr_dtor(&zo);
259
260 }
261
262 static void php_ircclient_event_dcc_chat_callback(irc_session_t *session, const char *nick, const char *addr, irc_dcc_t dccid)
263 {
264 zval *zo, *zp;
265 php_ircclient_session_object_t *obj = irc_get_ctx(session);
266 TSRMLS_FETCH_FROM_CTX(obj->ts);
267
268 MAKE_STD_ZVAL(zo);
269 Z_TYPE_P(zo) = IS_OBJECT;
270 zo->value.obj = obj->ov;
271 zend_objects_store_add_ref(zo TSRMLS_CC);
272
273 MAKE_STD_ZVAL(zp);
274 array_init(zp);
275 add_assoc_string_ex(zp, ZEND_STRS("nick"), estrdup(nick), 0);
276 add_assoc_string_ex(zp, ZEND_STRS("remote_addr"), estrdup(addr), 0);
277 add_assoc_long_ex(zp, ZEND_STRS("dccid"), dccid);
278
279 zend_call_method(&zo, NULL, NULL, ZEND_STRS("ondccchatreq"), NULL, 1, zp, NULL TSRMLS_CC);
280
281 zval_ptr_dtor(&zp);
282 zval_ptr_dtor(&zo);
283 }
284
285 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)
286 {
287 zval *zo, *zp;
288 php_ircclient_session_object_t *obj = irc_get_ctx(session);
289 TSRMLS_FETCH_FROM_CTX(obj->ts);
290
291 MAKE_STD_ZVAL(zo);
292 Z_TYPE_P(zo) = IS_OBJECT;
293 zo->value.obj = obj->ov;
294 zend_objects_store_add_ref(zo TSRMLS_CC);
295
296 MAKE_STD_ZVAL(zp);
297 array_init(zp);
298 add_assoc_string_ex(zp, ZEND_STRS("nick"), estrdup(nick), 0);
299 add_assoc_string_ex(zp, ZEND_STRS("remote_addr"), estrdup(addr), 0);
300 add_assoc_string_ex(zp, ZEND_STRS("filename"), estrdup(filename), 0);
301 add_assoc_long_ex(zp, ZEND_STRS("filesize"), size);
302 add_assoc_long_ex(zp, ZEND_STRS("dccid"), dccid);
303
304 zend_call_method(&zo, NULL, NULL, ZEND_STRL("ondccsendreq"), NULL, 1, zp, NULL TSRMLS_CC);
305
306 zval_ptr_dtor(&zp);
307 zval_ptr_dtor(&zo);
308 }
309
310 PHP_METHOD(Session, __construct)
311 {
312 char *nick_str = NULL, *user_str = NULL, *real_str = NULL;
313 int nick_len = 0, user_len = 0, real_len = 0;
314
315 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)) {
316 if (nick_str && nick_len) {
317 zend_update_property_stringl(php_ircclient_session_class_entry, getThis(), ZEND_STRL("nick"), nick_str, nick_len TSRMLS_CC);
318 }
319 if (nick_str && nick_len) {
320 zend_update_property_stringl(php_ircclient_session_class_entry, getThis(), ZEND_STRL("nick"), nick_str, nick_len TSRMLS_CC);
321 }
322 if (real_str && real_len) {
323 zend_update_property_stringl(php_ircclient_session_class_entry, getThis(), ZEND_STRL("real"), real_str, real_len TSRMLS_CC);
324 }
325 }
326 }
327
328 PHP_METHOD(Session, doConnect)
329 {
330 char *server_str, *passwd_str = NULL;
331 int server_len, passwd_len = 0;
332 long port = 6667;
333 zend_bool ip6;
334
335 if (SUCCESS == zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "bs|ls!", &ip6, &server_str, &server_len, &port, &passwd_str, &passwd_len)) {
336 php_ircclient_session_object_t *obj = zend_object_store_get_object(getThis() TSRMLS_CC);
337 char *nick = NULL, *user = NULL, *real = NULL;
338 zval *znick, *zuser, *zreal, *tmp;
339
340 znick = zend_read_property(php_ircclient_session_class_entry, getThis(), ZEND_STRL("nick"), 0 TSRMLS_CC);
341 SEPARATE_ARG_IF_REF(znick);
342 convert_to_string_ex(&znick);
343 if (Z_STRLEN_P(znick)) {
344 nick = Z_STRVAL_P(znick);
345 }
346 zuser = zend_read_property(php_ircclient_session_class_entry, getThis(), ZEND_STRL("user"), 0 TSRMLS_CC);
347 SEPARATE_ARG_IF_REF(zuser);
348 convert_to_string_ex(&zuser);
349 if (Z_STRLEN_P(zuser)) {
350 user = Z_STRVAL_P(zuser);
351 }
352 zreal = zend_read_property(php_ircclient_session_class_entry, getThis(), ZEND_STRL("real"), 0 TSRMLS_CC);
353 SEPARATE_ARG_IF_REF(zreal);
354 convert_to_string_ex(&zreal);
355 if (Z_STRLEN_P(zreal)) {
356 real = Z_STRVAL_P(zreal);
357 }
358
359 if (ip6) {
360 if (0 != irc_connect6(obj->sess, server_str, port, passwd_str, nick, user, real)) {
361 php_error_docref(NULL TSRMLS_CC, E_WARNING, "%s", irc_strerror(irc_errno(obj->sess)));
362 RETVAL_FALSE;
363 }
364 } else if (0 != irc_connect(obj->sess, server_str, port, passwd_str, nick, user, real)) {
365 php_error_docref(NULL TSRMLS_CC, E_WARNING, "%s", irc_strerror(irc_errno(obj->sess)));
366 RETVAL_FALSE;
367 } else {
368 RETVAL_TRUE;
369 }
370
371 zval_ptr_dtor(&znick);
372 zval_ptr_dtor(&zuser);
373 zval_ptr_dtor(&zreal);
374 }
375 }
376
377 PHP_METHOD(Session, isConnected)
378 {
379 if (SUCCESS == zend_parse_parameters_none()) {
380 php_ircclient_session_object_t *obj = zend_object_store_get_object(getThis() TSRMLS_CC);
381
382 RETURN_BOOL(irc_is_connected(obj->sess));
383 }
384 }
385
386 PHP_METHOD(Session, disconnect)
387 {
388 if (SUCCESS == zend_parse_parameters_none()) {
389 php_ircclient_session_object_t *obj = zend_object_store_get_object(getThis() TSRMLS_CC);
390
391 irc_disconnect(obj->sess);
392 }
393 }
394
395 PHP_METHOD(Session, run)
396 {
397 if (SUCCESS == zend_parse_parameters_none()) {
398 php_ircclient_session_object_t *obj = zend_object_store_get_object(getThis() TSRMLS_CC);
399
400 if (0 != irc_run(obj->sess)) {
401 int err = irc_errno(obj->sess);
402
403 if (err) {
404 php_error_docref(NULL TSRMLS_CC, E_WARNING, "%s", irc_strerror(err));
405 }
406 }
407 }
408 }
409
410 PHP_METHOD(Session, setOption)
411 {
412 long opt;
413 zend_bool onoff = 1;
414
415 if (SUCCESS == zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "l|b", &opt, &onoff)) {
416 php_ircclient_session_object_t *obj = zend_object_store_get_object(getThis() TSRMLS_CC);
417
418 if (onoff) {
419 irc_option_set(obj->sess, opt);
420 } else {
421 irc_option_reset(obj->sess, opt);
422 }
423 }
424 }
425
426 PHP_METHOD(Session, doJoin)
427 {
428 char *chan_str, *key_str = NULL;
429 int chan_len, key_len = 0;
430
431 if (SUCCESS == zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s|s!", &chan_str, &chan_len, &key_str, &key_len)) {
432 php_ircclient_session_object_t *obj = zend_object_store_get_object(getThis() TSRMLS_CC);
433
434 if (0 != irc_cmd_join(obj->sess, chan_str, key_str)) {
435 php_error_docref(NULL TSRMLS_CC, E_WARNING, "%s", irc_strerror(irc_errno(obj->sess)));
436 RETVAL_FALSE;
437 } else {
438 RETVAL_TRUE;
439 }
440 }
441 }
442
443 PHP_METHOD(Session, doPart)
444 {
445 char *chan_str;
446 int chan_len;
447
448 if (SUCCESS == zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &chan_str, &chan_len)) {
449 php_ircclient_session_object_t *obj = zend_object_store_get_object(getThis() TSRMLS_CC);
450
451 if (0 != irc_cmd_part(obj->sess, chan_str)) {
452 php_error_docref(NULL TSRMLS_CC, E_WARNING, "%s", irc_strerror(irc_errno(obj->sess)));
453 RETVAL_FALSE;
454 } else {
455 RETVAL_TRUE;
456 }
457 }
458 }
459
460 PHP_METHOD(Session, doInvite)
461 {
462 char *chan_str, *nick_str;
463 int chan_len, nick_len;
464
465 if (SUCCESS == zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "ss", &nick_str, &nick_len, &chan_str, &chan_len)) {
466 php_ircclient_session_object_t *obj = zend_object_store_get_object(getThis() TSRMLS_CC);
467
468 if (0 != irc_cmd_invite(obj->sess, nick_str, chan_str)) {
469 php_error_docref(NULL TSRMLS_CC, E_WARNING, "%s", irc_strerror(irc_errno(obj->sess)));
470 RETVAL_FALSE;
471 } else {
472 RETVAL_TRUE;
473 }
474 }
475 }
476
477 PHP_METHOD(Session, doNames)
478 {
479 char *chan_str;
480 int chan_len;
481
482 if (SUCCESS == zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &chan_str, &chan_len)) {
483 php_ircclient_session_object_t *obj = zend_object_store_get_object(getThis() TSRMLS_CC);
484
485 if (0 != irc_cmd_names(obj->sess, chan_str)) {
486 php_error_docref(NULL TSRMLS_CC, E_WARNING, "%s", irc_strerror(irc_errno(obj->sess)));
487 RETVAL_FALSE;
488 } else {
489 RETVAL_TRUE;
490 }
491 }
492 }
493
494 PHP_METHOD(Session, doList)
495 {
496 char *chan_str;
497 int chan_len;
498
499 if (SUCCESS == zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &chan_str, &chan_len)) {
500 php_ircclient_session_object_t *obj = zend_object_store_get_object(getThis() TSRMLS_CC);
501
502 if (0 != irc_cmd_list(obj->sess, chan_str)) {
503 php_error_docref(NULL TSRMLS_CC, E_WARNING, "%s", irc_strerror(irc_errno(obj->sess)));
504 RETVAL_FALSE;
505 } else {
506 RETVAL_TRUE;
507 }
508 }
509 }
510
511 PHP_METHOD(Session, doTopic)
512 {
513 char *chan_str, *topic_str = NULL;
514 int chan_len, topic_len;
515
516 if (SUCCESS == zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s|s!", &chan_str, &chan_len, &topic_str, &topic_len)) {
517 php_ircclient_session_object_t *obj = zend_object_store_get_object(getThis() TSRMLS_CC);
518
519 if (0 != irc_cmd_topic(obj->sess, chan_str, topic_str)) {
520 php_error_docref(NULL TSRMLS_CC, E_WARNING, "%s", irc_strerror(irc_errno(obj->sess)));
521 RETVAL_FALSE;
522 } else {
523 RETVAL_TRUE;
524 }
525 }
526 }
527
528 PHP_METHOD(Session, doChannelMode)
529 {
530 char *chan_str, *mode_str = NULL;
531 int chan_len, mode_len;
532
533 if (SUCCESS == zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s|s!", &chan_str, &chan_len, &mode_str, &mode_len)) {
534 php_ircclient_session_object_t *obj = zend_object_store_get_object(getThis() TSRMLS_CC);
535
536 if (0 != irc_cmd_topic(obj->sess, chan_str, mode_str)) {
537 php_error_docref(NULL TSRMLS_CC, E_WARNING, "%s", irc_strerror(irc_errno(obj->sess)));
538 RETVAL_FALSE;
539 } else {
540 RETVAL_TRUE;
541 }
542 }
543 }
544
545 PHP_METHOD(Session, doKick)
546 {
547 char *chan_str, *nick_str, *reason_str = NULL;
548 int chan_len, nick_len, reason_len;
549
550 if (SUCCESS == zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "ss|s!", &nick_str, &nick_len, &chan_str, &chan_len, &reason_str, &reason_len)) {
551 php_ircclient_session_object_t *obj = zend_object_store_get_object(getThis() TSRMLS_CC);
552
553 if (0 != irc_cmd_kick(obj->sess, nick_str, chan_str, reason_str)) {
554 php_error_docref(NULL TSRMLS_CC, E_WARNING, "%s", irc_strerror(irc_errno(obj->sess)));
555 RETVAL_FALSE;
556 } else {
557 RETVAL_TRUE;
558 }
559 }
560 }
561
562 PHP_METHOD(Session, doMsg)
563 {
564 char *dest_str, *msg_str;
565 int dest_len, msg_len;
566
567 if (SUCCESS == zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "ss", &dest_str, &dest_len, &msg_str, &msg_len)) {
568 php_ircclient_session_object_t *obj = zend_object_store_get_object(getThis() TSRMLS_CC);
569
570 if (0 != irc_cmd_msg(obj->sess, dest_str, msg_str)) {
571 php_error_docref(NULL TSRMLS_CC, E_WARNING, "%s", irc_strerror(irc_errno(obj->sess)));
572 RETVAL_FALSE;
573 } else {
574 RETVAL_TRUE;
575 }
576 }
577 }
578
579 PHP_METHOD(Session, doMe)
580 {
581 char *dest_str, *msg_str;
582 int dest_len, msg_len;
583
584 if (SUCCESS == zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "ss", &dest_str, &dest_len, &msg_str, &msg_len)) {
585 php_ircclient_session_object_t *obj = zend_object_store_get_object(getThis() TSRMLS_CC);
586
587 if (0 != irc_cmd_me(obj->sess, dest_str, msg_str)) {
588 php_error_docref(NULL TSRMLS_CC, E_WARNING, "%s", irc_strerror(irc_errno(obj->sess)));
589 RETVAL_FALSE;
590 } else {
591 RETVAL_TRUE;
592 }
593 }
594 }
595
596 PHP_METHOD(Session, doNotice)
597 {
598 char *dest_str, *msg_str;
599 int dest_len, msg_len;
600
601 if (SUCCESS == zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "ss", &dest_str, &dest_len, &msg_str, &msg_len)) {
602 php_ircclient_session_object_t *obj = zend_object_store_get_object(getThis() TSRMLS_CC);
603
604 if (0 != irc_cmd_notice(obj->sess, dest_str, msg_str)) {
605 php_error_docref(NULL TSRMLS_CC, E_WARNING, "%s", irc_strerror(irc_errno(obj->sess)));
606 RETVAL_FALSE;
607 } else {
608 RETVAL_TRUE;
609 }
610 }
611 }
612
613 PHP_METHOD(Session, doQuit)
614 {
615 char *reason_str = NULL;
616 int reason_len;
617
618 if (SUCCESS == zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "|s!", &reason_str, &reason_len)) {
619 php_ircclient_session_object_t *obj = zend_object_store_get_object(getThis() TSRMLS_CC);
620
621 if (0 != irc_cmd_quit(obj->sess, reason_str)) {
622 php_error_docref(NULL TSRMLS_CC, E_WARNING, "%s", irc_strerror(irc_errno(obj->sess)));
623 RETVAL_FALSE;
624 } else {
625 RETVAL_TRUE;
626 }
627 }
628 }
629
630 PHP_METHOD(Session, doUserMode)
631 {
632 char *mode_str = NULL;
633 int mode_len;
634
635 if (SUCCESS == zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "|s!", &mode_str, &mode_len)) {
636 php_ircclient_session_object_t *obj = zend_object_store_get_object(getThis() TSRMLS_CC);
637
638 if (0 != irc_cmd_user_mode(obj->sess, mode_str)) {
639 php_error_docref(NULL TSRMLS_CC, E_WARNING, "%s", irc_strerror(irc_errno(obj->sess)));
640 RETVAL_FALSE;
641 } else {
642 RETVAL_TRUE;
643 }
644 }
645 }
646
647 PHP_METHOD(Session, doNick)
648 {
649 char *nick_str;
650 int nick_len;
651
652 if (SUCCESS == zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &nick_str, &nick_len)) {
653 php_ircclient_session_object_t *obj = zend_object_store_get_object(getThis() TSRMLS_CC);
654
655 if (0 != irc_cmd_nick(obj->sess, nick_str)) {
656 php_error_docref(NULL TSRMLS_CC, E_WARNING, "%s", irc_strerror(irc_errno(obj->sess)));
657 RETVAL_FALSE;
658 } else {
659 RETVAL_TRUE;
660 }
661 }
662 }
663
664 PHP_METHOD(Session, doWhois)
665 {
666 char *nick_str = NULL;
667 int nick_len;
668
669 if (SUCCESS == zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "|s!", &nick_str, &nick_len)) {
670 php_ircclient_session_object_t *obj = zend_object_store_get_object(getThis() TSRMLS_CC);
671
672 if (0 != irc_cmd_whois(obj->sess, nick_str)) {
673 php_error_docref(NULL TSRMLS_CC, E_WARNING, "%s", irc_strerror(irc_errno(obj->sess)));
674 RETVAL_FALSE;
675 } else {
676 RETVAL_TRUE;
677 }
678 }
679 }
680
681 PHP_METHOD(Session, doCtcpReply)
682 {
683 char *nick_str, *reply_str;
684 int nick_len, reply_len;
685
686 if (SUCCESS == zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "ss", &nick_str, &nick_len, &reply_str, &reply_len)) {
687 php_ircclient_session_object_t *obj = zend_object_store_get_object(getThis() TSRMLS_CC);
688
689 if (0 != irc_cmd_ctcp_reply(obj->sess, nick_str, reply_str)) {
690 php_error_docref(NULL TSRMLS_CC, E_WARNING, "%s", irc_strerror(irc_errno(obj->sess)));
691 RETVAL_FALSE;
692 } else {
693 RETVAL_TRUE;
694 }
695 }
696 }
697
698 PHP_METHOD(Session, doCtcpRequest)
699 {
700 char *nick_str, *request_str;
701 int nick_len, request_len;
702
703 if (SUCCESS == zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "ss", &nick_str, &nick_len, &request_str, &request_len)) {
704 php_ircclient_session_object_t *obj = zend_object_store_get_object(getThis() TSRMLS_CC);
705
706 if (0 != irc_cmd_ctcp_request(obj->sess, nick_str, request_str)) {
707 php_error_docref(NULL TSRMLS_CC, E_WARNING, "%s", irc_strerror(irc_errno(obj->sess)));
708 RETVAL_FALSE;
709 } else {
710 RETVAL_TRUE;
711 }
712 }
713 }
714
715
716
717 PHP_METHOD(Session, onConnect) {}
718 PHP_METHOD(Session, onNick) {}
719 PHP_METHOD(Session, onQuit) {}
720 PHP_METHOD(Session, onJoin) {}
721 PHP_METHOD(Session, onPart) {}
722 PHP_METHOD(Session, onMode) {}
723 PHP_METHOD(Session, onUmode) {}
724 PHP_METHOD(Session, onTopic) {}
725 PHP_METHOD(Session, onKick) {}
726 PHP_METHOD(Session, onChannel) {}
727 PHP_METHOD(Session, onPrivmsg) {}
728 PHP_METHOD(Session, onNotice) {}
729 PHP_METHOD(Session, onChannelNotice) {}
730 PHP_METHOD(Session, onInvite) {}
731 PHP_METHOD(Session, onCtcpReq) {}
732 PHP_METHOD(Session, onCtcpRep) {}
733 PHP_METHOD(Session, onAction) {}
734 PHP_METHOD(Session, onUnknown) {}
735 PHP_METHOD(Session, onNumeric) {}
736 PHP_METHOD(Session, onDccChatReq) {}
737 PHP_METHOD(Session, onDccSendReq) {}
738
739 #define ME(m) PHP_ME(Session, m, NULL, ZEND_ACC_PUBLIC)
740
741 zend_function_entry php_ircclient_session_method_entry[] = {
742 ME(__construct)
743 ME(doConnect)
744 ME(isConnected)
745 ME(disconnect)
746 ME(run)
747 ME(setOption)
748
749 ME(doJoin)
750 ME(doPart)
751 ME(doInvite)
752 ME(doNames)
753 ME(doList)
754 ME(doTopic)
755 ME(doChannelMode)
756 ME(doKick)
757
758 ME(doMsg)
759 ME(doMe)
760 ME(doNotice)
761
762 ME(doQuit)
763 ME(doUserMode)
764 ME(doNick)
765 ME(doWhois)
766
767 ME(doCtcpReply)
768 ME(doCtcpRequest)
769
770 ME(onConnect)
771 ME(onNick)
772 ME(onQuit)
773 ME(onJoin)
774 ME(onPart)
775 ME(onMode)
776 ME(onUmode)
777 ME(onTopic)
778 ME(onKick)
779 ME(onChannel)
780 ME(onPrivmsg)
781 ME(onNotice)
782 ME(onChannelNotice)
783 ME(onInvite)
784 ME(onCtcpReq)
785 ME(onCtcpRep)
786 ME(onAction)
787 ME(onUnknown)
788 ME(onNumeric)
789 ME(onDccChatReq)
790 ME(onDccSendReq)
791 PHP_FE_END
792 };
793
794 PHP_MINIT_FUNCTION(ircclient)
795 {
796 zend_class_entry ce;
797
798 memset(&ce, 0, sizeof(zend_class_entry));
799 INIT_NS_CLASS_ENTRY(ce, "irc\\client", "Session", php_ircclient_session_method_entry);
800 ce.create_object = php_ircclient_session_object_create;
801 php_ircclient_session_class_entry = zend_register_internal_class_ex(&ce, NULL, NULL TSRMLS_CC);
802
803 zend_declare_property_null(php_ircclient_session_class_entry, ZEND_STRL("nick"), ZEND_ACC_PUBLIC TSRMLS_CC);
804 zend_declare_property_null(php_ircclient_session_class_entry, ZEND_STRL("user"), ZEND_ACC_PUBLIC TSRMLS_CC);
805 zend_declare_property_null(php_ircclient_session_class_entry, ZEND_STRL("real"), ZEND_ACC_PUBLIC TSRMLS_CC);
806
807 return SUCCESS;
808 }
809
810
811 PHP_MSHUTDOWN_FUNCTION(ircclient)
812 {
813 return SUCCESS;
814 }
815
816
817
818 PHP_RINIT_FUNCTION(ircclient)
819 {
820 return SUCCESS;
821 }
822
823
824
825 PHP_RSHUTDOWN_FUNCTION(ircclient)
826 {
827 return SUCCESS;
828 }
829
830
831 PHP_MINFO_FUNCTION(ircclient)
832 {
833 php_info_print_table_start();
834 php_info_print_table_header(2, "ircclient support", "enabled");
835 php_info_print_table_end();
836
837 }
838
839
840
841
842