initial ci
[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 zend_object_std_init((zend_object *) obj, ce TSRMLS_CC);
159 object_properties_init((zend_object *) obj, ce);
160
161 obj->sess = irc_create_session(&php_ircclient_callbacks);
162 irc_set_ctx(obj->sess, obj);
163 TSRMLS_SET_CTX(obj->ts);
164
165 obj->ov.handle = zend_objects_store_put(obj, NULL, php_ircclient_session_object_free, NULL TSRMLS_CC);
166 obj->ov.handlers = zend_get_std_object_handlers();
167
168 return obj->ov;
169 }
170
171 static void php_ircclient_event_callback(irc_session_t *session, const char *event, const char *origin, const char **params, unsigned int count)
172 {
173 char *fn_str;
174 int i, fn_len;
175 zval *zo, *zr, *za;
176 php_ircclient_session_object_t *obj = irc_get_ctx(session);
177 TSRMLS_FETCH_FROM_CTX(obj->ts);
178
179 fn_str = emalloc(strlen(event) + 2 + 1);
180 fn_str[0] = 'o';
181 fn_str[1] = 'n';
182 fn_len = 2;
183 do {
184 if (*event != '_') {
185 fn_str[fn_len++] = tolower(*event);
186 }
187 } while (*event++);
188
189 MAKE_STD_ZVAL(zo);
190 Z_TYPE_P(zo) = IS_OBJECT;
191 zo->value.obj = obj->ov;
192 zend_objects_store_add_ref(zo TSRMLS_CC);
193
194 MAKE_STD_ZVAL(zr);
195 if (origin) {
196 ZVAL_STRING(zr, estrdup(origin), 0);
197 } else {
198 ZVAL_NULL(zr);
199 }
200
201 MAKE_STD_ZVAL(za);
202 array_init(za);
203 for (i = 0; i < count; ++i) {
204 add_next_index_string(za, estrdup(params[i]), 0);
205 }
206
207 zend_call_method(&zo, NULL, NULL, fn_str, fn_len - 1, NULL, 2, zr, za TSRMLS_CC);
208
209 zval_ptr_dtor(&za);
210 zval_ptr_dtor(&zr);
211 zval_ptr_dtor(&zo);
212
213 efree(fn_str);
214 }
215
216 static void php_ircclient_event_code_callback(irc_session_t *session, unsigned int event, const char *origin, const char **params, unsigned int count)
217 {
218 int i;
219 zval *zo, *zr, *zp, *za;
220 php_ircclient_session_object_t *obj = irc_get_ctx(session);
221 TSRMLS_FETCH_FROM_CTX(obj->ts);
222
223 MAKE_STD_ZVAL(zo);
224 Z_TYPE_P(zo) = IS_OBJECT;
225 zo->value.obj = obj->ov;
226 zend_objects_store_add_ref(zo TSRMLS_CC);
227
228 MAKE_STD_ZVAL(zr);
229 if (origin) {
230 ZVAL_STRING(zr, estrdup(origin), 0);
231 } else {
232 ZVAL_NULL(zr);
233 }
234
235 MAKE_STD_ZVAL(za);
236 array_init(za);
237 add_assoc_long_ex(za, ZEND_STRS("event"), event);
238
239 MAKE_STD_ZVAL(zp);
240 array_init(zp);
241 for (i = 0; i < count; ++i) {
242 add_next_index_string(zp, estrdup(params[i]), 0);
243 }
244 add_assoc_zval_ex(za, ZEND_STRS("params"), zp);
245
246 zend_call_method(&zo, NULL, NULL, ZEND_STRL("onnumeric"), NULL, 2, zr, za TSRMLS_CC);
247
248 zval_ptr_dtor(&zp);
249 zval_ptr_dtor(&za);
250 zval_ptr_dtor(&zr);
251 zval_ptr_dtor(&zo);
252
253 }
254
255 static void php_ircclient_event_dcc_chat_callback(irc_session_t *session, const char *nick, const char *addr, irc_dcc_t dccid)
256 {
257 zval *zo, *zp;
258 php_ircclient_session_object_t *obj = irc_get_ctx(session);
259 TSRMLS_FETCH_FROM_CTX(obj->ts);
260
261 MAKE_STD_ZVAL(zo);
262 Z_TYPE_P(zo) = IS_OBJECT;
263 zo->value.obj = obj->ov;
264 zend_objects_store_add_ref(zo TSRMLS_CC);
265
266 MAKE_STD_ZVAL(zp);
267 array_init(zp);
268 add_assoc_string_ex(zp, ZEND_STRS("nick"), estrdup(nick), 0);
269 add_assoc_string_ex(zp, ZEND_STRS("remote_addr"), estrdup(addr), 0);
270 add_assoc_long_ex(zp, ZEND_STRS("dccid"), dccid);
271
272 zend_call_method(&zo, NULL, NULL, ZEND_STRS("ondccchatreq"), NULL, 1, zp, NULL TSRMLS_CC);
273
274 zval_ptr_dtor(&zp);
275 zval_ptr_dtor(&zo);
276 }
277
278 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)
279 {
280 zval *zo, *zp;
281 php_ircclient_session_object_t *obj = irc_get_ctx(session);
282 TSRMLS_FETCH_FROM_CTX(obj->ts);
283
284 MAKE_STD_ZVAL(zo);
285 Z_TYPE_P(zo) = IS_OBJECT;
286 zo->value.obj = obj->ov;
287 zend_objects_store_add_ref(zo TSRMLS_CC);
288
289 MAKE_STD_ZVAL(zp);
290 array_init(zp);
291 add_assoc_string_ex(zp, ZEND_STRS("nick"), estrdup(nick), 0);
292 add_assoc_string_ex(zp, ZEND_STRS("remote_addr"), estrdup(addr), 0);
293 add_assoc_string_ex(zp, ZEND_STRS("filename"), estrdup(filename), 0);
294 add_assoc_long_ex(zp, ZEND_STRS("filesize"), size);
295 add_assoc_long_ex(zp, ZEND_STRS("dccid"), dccid);
296
297 zend_call_method(&zo, NULL, NULL, ZEND_STRL("ondccsendreq"), NULL, 1, zp, NULL TSRMLS_CC);
298
299 zval_ptr_dtor(&zp);
300 zval_ptr_dtor(&zo);
301 }
302
303 PHP_METHOD(Session, __construct)
304 {
305 char *nick_str = NULL, *user_str = NULL, *real_str = NULL;
306 int nick_len = 0, user_len = 0, real_len = 0;
307
308 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)) {
309 if (nick_str && nick_len) {
310 zend_update_property_stringl(php_ircclient_session_class_entry, getThis(), ZEND_STRL("nick"), nick_str, nick_len TSRMLS_CC);
311 }
312 if (nick_str && nick_len) {
313 zend_update_property_stringl(php_ircclient_session_class_entry, getThis(), ZEND_STRL("nick"), nick_str, nick_len TSRMLS_CC);
314 }
315 if (real_str && real_len) {
316 zend_update_property_stringl(php_ircclient_session_class_entry, getThis(), ZEND_STRL("real"), real_str, real_len TSRMLS_CC);
317 }
318 }
319 }
320
321 PHP_METHOD(Session, doConnect)
322 {
323 char *server_str, *passwd_str = NULL;
324 int server_len, passwd_len = 0;
325 long port = 6667;
326 zend_bool ip6;
327
328 if (SUCCESS == zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "bs|ls!", &ip6, &server_str, &server_len, &port, &passwd_str, &passwd_len)) {
329 php_ircclient_session_object_t *obj = zend_object_store_get_object(getThis() TSRMLS_CC);
330 char *nick = NULL, *user = NULL, *real = NULL;
331 zval *znick, *zuser, *zreal, *tmp;
332
333 znick = zend_read_property(php_ircclient_session_class_entry, getThis(), ZEND_STRL("nick"), 0 TSRMLS_CC);
334 SEPARATE_ARG_IF_REF(znick);
335 convert_to_string_ex(&znick);
336 if (Z_STRLEN_P(znick)) {
337 nick = Z_STRVAL_P(znick);
338 }
339 zuser = zend_read_property(php_ircclient_session_class_entry, getThis(), ZEND_STRL("user"), 0 TSRMLS_CC);
340 SEPARATE_ARG_IF_REF(zuser);
341 convert_to_string_ex(&zuser);
342 if (Z_STRLEN_P(zuser)) {
343 user = Z_STRVAL_P(zuser);
344 }
345 zreal = zend_read_property(php_ircclient_session_class_entry, getThis(), ZEND_STRL("real"), 0 TSRMLS_CC);
346 SEPARATE_ARG_IF_REF(zreal);
347 convert_to_string_ex(&zreal);
348 if (Z_STRLEN_P(zreal)) {
349 real = Z_STRVAL_P(zreal);
350 }
351
352 if (ip6) {
353 if (0 != irc_connect6(obj->sess, server_str, port, passwd_str, nick, user, real)) {
354 php_error_docref(NULL TSRMLS_CC, E_WARNING, "%s", irc_strerror(irc_errno(obj->sess)));
355 RETVAL_FALSE;
356 }
357 } else if (0 != irc_connect(obj->sess, server_str, port, passwd_str, nick, user, real)) {
358 php_error_docref(NULL TSRMLS_CC, E_WARNING, "%s", irc_strerror(irc_errno(obj->sess)));
359 RETVAL_FALSE;
360 } else {
361 RETVAL_TRUE;
362 }
363
364 zval_ptr_dtor(&znick);
365 zval_ptr_dtor(&zuser);
366 zval_ptr_dtor(&zreal);
367 }
368 }
369
370 PHP_METHOD(Session, isConnected)
371 {
372 if (SUCCESS == zend_parse_parameters_none()) {
373 php_ircclient_session_object_t *obj = zend_object_store_get_object(getThis() TSRMLS_CC);
374
375 RETURN_BOOL(irc_is_connected(obj->sess));
376 }
377 }
378
379 PHP_METHOD(Session, disconnect)
380 {
381 if (SUCCESS == zend_parse_parameters_none()) {
382 php_ircclient_session_object_t *obj = zend_object_store_get_object(getThis() TSRMLS_CC);
383
384 irc_disconnect(obj->sess);
385 }
386 }
387
388 PHP_METHOD(Session, run)
389 {
390 if (SUCCESS == zend_parse_parameters_none()) {
391 php_ircclient_session_object_t *obj = zend_object_store_get_object(getThis() TSRMLS_CC);
392
393 if (0 != irc_run(obj->sess)) {
394 int err = irc_errno(obj->sess);
395
396 if (err) {
397 php_error_docref(NULL TSRMLS_CC, E_WARNING, "%s", irc_strerror(err));
398 }
399 }
400 }
401 }
402
403 PHP_METHOD(Session, setOption)
404 {
405 long opt;
406 zend_bool onoff = 1;
407
408 if (SUCCESS == zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "l|b", &opt, &onoff)) {
409 php_ircclient_session_object_t *obj = zend_object_store_get_object(getThis() TSRMLS_CC);
410
411 if (onoff) {
412 irc_option_set(obj->sess, opt);
413 } else {
414 irc_option_reset(obj->sess, opt);
415 }
416 }
417 }
418
419 PHP_METHOD(Session, doJoin)
420 {
421 char *chan_str, *key_str = NULL;
422 int chan_len, key_len = 0;
423
424 if (SUCCESS == zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s|s!", &chan_str, &chan_len, &key_str, &key_len)) {
425 php_ircclient_session_object_t *obj = zend_object_store_get_object(getThis() TSRMLS_CC);
426
427 if (0 != irc_cmd_join(obj->sess, chan_str, key_str)) {
428 php_error_docref(NULL TSRMLS_CC, E_WARNING, "%s", irc_strerror(irc_errno(obj->sess)));
429 RETVAL_FALSE;
430 } else {
431 RETVAL_TRUE;
432 }
433 }
434 }
435
436 PHP_METHOD(Session, doPart)
437 {
438 char *chan_str;
439 int chan_len;
440
441 if (SUCCESS == zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &chan_str, &chan_len)) {
442 php_ircclient_session_object_t *obj = zend_object_store_get_object(getThis() TSRMLS_CC);
443
444 if (0 != irc_cmd_part(obj->sess, chan_str)) {
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 }
452
453 PHP_METHOD(Session, doInvite)
454 {
455 char *chan_str, *nick_str;
456 int chan_len, nick_len;
457
458 if (SUCCESS == zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "ss", &nick_str, &nick_len, &chan_str, &chan_len)) {
459 php_ircclient_session_object_t *obj = zend_object_store_get_object(getThis() TSRMLS_CC);
460
461 if (0 != irc_cmd_invite(obj->sess, nick_str, chan_str)) {
462 php_error_docref(NULL TSRMLS_CC, E_WARNING, "%s", irc_strerror(irc_errno(obj->sess)));
463 RETVAL_FALSE;
464 } else {
465 RETVAL_TRUE;
466 }
467 }
468 }
469
470 PHP_METHOD(Session, doNames)
471 {
472 char *chan_str;
473 int chan_len;
474
475 if (SUCCESS == zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &chan_str, &chan_len)) {
476 php_ircclient_session_object_t *obj = zend_object_store_get_object(getThis() TSRMLS_CC);
477
478 if (0 != irc_cmd_names(obj->sess, chan_str)) {
479 php_error_docref(NULL TSRMLS_CC, E_WARNING, "%s", irc_strerror(irc_errno(obj->sess)));
480 RETVAL_FALSE;
481 } else {
482 RETVAL_TRUE;
483 }
484 }
485 }
486
487 PHP_METHOD(Session, doList)
488 {
489 char *chan_str;
490 int chan_len;
491
492 if (SUCCESS == zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &chan_str, &chan_len)) {
493 php_ircclient_session_object_t *obj = zend_object_store_get_object(getThis() TSRMLS_CC);
494
495 if (0 != irc_cmd_list(obj->sess, chan_str)) {
496 php_error_docref(NULL TSRMLS_CC, E_WARNING, "%s", irc_strerror(irc_errno(obj->sess)));
497 RETVAL_FALSE;
498 } else {
499 RETVAL_TRUE;
500 }
501 }
502 }
503
504 PHP_METHOD(Session, doTopic)
505 {
506 char *chan_str, *topic_str = NULL;
507 int chan_len, topic_len;
508
509 if (SUCCESS == zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s|s!", &chan_str, &chan_len, &topic_str, &topic_len)) {
510 php_ircclient_session_object_t *obj = zend_object_store_get_object(getThis() TSRMLS_CC);
511
512 if (0 != irc_cmd_topic(obj->sess, chan_str, topic_str)) {
513 php_error_docref(NULL TSRMLS_CC, E_WARNING, "%s", irc_strerror(irc_errno(obj->sess)));
514 RETVAL_FALSE;
515 } else {
516 RETVAL_TRUE;
517 }
518 }
519 }
520
521 PHP_METHOD(Session, doChannelMode)
522 {
523 char *chan_str, *mode_str = NULL;
524 int chan_len, mode_len;
525
526 if (SUCCESS == zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s|s!", &chan_str, &chan_len, &mode_str, &mode_len)) {
527 php_ircclient_session_object_t *obj = zend_object_store_get_object(getThis() TSRMLS_CC);
528
529 if (0 != irc_cmd_topic(obj->sess, chan_str, mode_str)) {
530 php_error_docref(NULL TSRMLS_CC, E_WARNING, "%s", irc_strerror(irc_errno(obj->sess)));
531 RETVAL_FALSE;
532 } else {
533 RETVAL_TRUE;
534 }
535 }
536 }
537
538 PHP_METHOD(Session, doKick)
539 {
540 char *chan_str, *nick_str, *reason_str = NULL;
541 int chan_len, nick_len, reason_len;
542
543 if (SUCCESS == zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "ss|s!", &nick_str, &nick_len, &chan_str, &chan_len, &reason_str, &reason_len)) {
544 php_ircclient_session_object_t *obj = zend_object_store_get_object(getThis() TSRMLS_CC);
545
546 if (0 != irc_cmd_kick(obj->sess, nick_str, chan_str, reason_str)) {
547 php_error_docref(NULL TSRMLS_CC, E_WARNING, "%s", irc_strerror(irc_errno(obj->sess)));
548 RETVAL_FALSE;
549 } else {
550 RETVAL_TRUE;
551 }
552 }
553 }
554
555 PHP_METHOD(Session, doMsg)
556 {
557 char *dest_str, *msg_str;
558 int dest_len, msg_len;
559
560 if (SUCCESS == zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "ss", &dest_str, &dest_len, &msg_str, &msg_len)) {
561 php_ircclient_session_object_t *obj = zend_object_store_get_object(getThis() TSRMLS_CC);
562
563 if (0 != irc_cmd_msg(obj->sess, dest_str, msg_str)) {
564 php_error_docref(NULL TSRMLS_CC, E_WARNING, "%s", irc_strerror(irc_errno(obj->sess)));
565 RETVAL_FALSE;
566 } else {
567 RETVAL_TRUE;
568 }
569 }
570 }
571
572 PHP_METHOD(Session, doMe)
573 {
574 char *dest_str, *msg_str;
575 int dest_len, msg_len;
576
577 if (SUCCESS == zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "ss", &dest_str, &dest_len, &msg_str, &msg_len)) {
578 php_ircclient_session_object_t *obj = zend_object_store_get_object(getThis() TSRMLS_CC);
579
580 if (0 != irc_cmd_me(obj->sess, dest_str, msg_str)) {
581 php_error_docref(NULL TSRMLS_CC, E_WARNING, "%s", irc_strerror(irc_errno(obj->sess)));
582 RETVAL_FALSE;
583 } else {
584 RETVAL_TRUE;
585 }
586 }
587 }
588
589 PHP_METHOD(Session, doNotice)
590 {
591 char *dest_str, *msg_str;
592 int dest_len, msg_len;
593
594 if (SUCCESS == zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "ss", &dest_str, &dest_len, &msg_str, &msg_len)) {
595 php_ircclient_session_object_t *obj = zend_object_store_get_object(getThis() TSRMLS_CC);
596
597 if (0 != irc_cmd_notice(obj->sess, dest_str, msg_str)) {
598 php_error_docref(NULL TSRMLS_CC, E_WARNING, "%s", irc_strerror(irc_errno(obj->sess)));
599 RETVAL_FALSE;
600 } else {
601 RETVAL_TRUE;
602 }
603 }
604 }
605
606 PHP_METHOD(Session, doQuit)
607 {
608 char *reason_str = NULL;
609 int reason_len;
610
611 if (SUCCESS == zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "|s!", &reason_str, &reason_len)) {
612 php_ircclient_session_object_t *obj = zend_object_store_get_object(getThis() TSRMLS_CC);
613
614 if (0 != irc_cmd_quit(obj->sess, reason_str)) {
615 php_error_docref(NULL TSRMLS_CC, E_WARNING, "%s", irc_strerror(irc_errno(obj->sess)));
616 RETVAL_FALSE;
617 } else {
618 RETVAL_TRUE;
619 }
620 }
621 }
622
623 PHP_METHOD(Session, doUserMode)
624 {
625 char *mode_str = NULL;
626 int mode_len;
627
628 if (SUCCESS == zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "|s!", &mode_str, &mode_len)) {
629 php_ircclient_session_object_t *obj = zend_object_store_get_object(getThis() TSRMLS_CC);
630
631 if (0 != irc_cmd_user_mode(obj->sess, mode_str)) {
632 php_error_docref(NULL TSRMLS_CC, E_WARNING, "%s", irc_strerror(irc_errno(obj->sess)));
633 RETVAL_FALSE;
634 } else {
635 RETVAL_TRUE;
636 }
637 }
638 }
639
640 PHP_METHOD(Session, doNick)
641 {
642 char *nick_str;
643 int nick_len;
644
645 if (SUCCESS == zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &nick_str, &nick_len)) {
646 php_ircclient_session_object_t *obj = zend_object_store_get_object(getThis() TSRMLS_CC);
647
648 if (0 != irc_cmd_nick(obj->sess, nick_str)) {
649 php_error_docref(NULL TSRMLS_CC, E_WARNING, "%s", irc_strerror(irc_errno(obj->sess)));
650 RETVAL_FALSE;
651 } else {
652 RETVAL_TRUE;
653 }
654 }
655 }
656
657 PHP_METHOD(Session, doWhois)
658 {
659 char *nick_str = NULL;
660 int nick_len;
661
662 if (SUCCESS == zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "|s!", &nick_str, &nick_len)) {
663 php_ircclient_session_object_t *obj = zend_object_store_get_object(getThis() TSRMLS_CC);
664
665 if (0 != irc_cmd_whois(obj->sess, nick_str)) {
666 php_error_docref(NULL TSRMLS_CC, E_WARNING, "%s", irc_strerror(irc_errno(obj->sess)));
667 RETVAL_FALSE;
668 } else {
669 RETVAL_TRUE;
670 }
671 }
672 }
673
674 PHP_METHOD(Session, doCtcpReply)
675 {
676 char *nick_str, *reply_str;
677 int nick_len, reply_len;
678
679 if (SUCCESS == zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "ss", &nick_str, &nick_len, &reply_str, &reply_len)) {
680 php_ircclient_session_object_t *obj = zend_object_store_get_object(getThis() TSRMLS_CC);
681
682 if (0 != irc_cmd_ctcp_reply(obj->sess, nick_str, reply_str)) {
683 php_error_docref(NULL TSRMLS_CC, E_WARNING, "%s", irc_strerror(irc_errno(obj->sess)));
684 RETVAL_FALSE;
685 } else {
686 RETVAL_TRUE;
687 }
688 }
689 }
690
691 PHP_METHOD(Session, doCtcpRequest)
692 {
693 char *nick_str, *request_str;
694 int nick_len, request_len;
695
696 if (SUCCESS == zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "ss", &nick_str, &nick_len, &request_str, &request_len)) {
697 php_ircclient_session_object_t *obj = zend_object_store_get_object(getThis() TSRMLS_CC);
698
699 if (0 != irc_cmd_ctcp_request(obj->sess, nick_str, request_str)) {
700 php_error_docref(NULL TSRMLS_CC, E_WARNING, "%s", irc_strerror(irc_errno(obj->sess)));
701 RETVAL_FALSE;
702 } else {
703 RETVAL_TRUE;
704 }
705 }
706 }
707
708
709
710 PHP_METHOD(Session, onConnect) {}
711 PHP_METHOD(Session, onNick) {}
712 PHP_METHOD(Session, onQuit) {}
713 PHP_METHOD(Session, onJoin) {}
714 PHP_METHOD(Session, onPart) {}
715 PHP_METHOD(Session, onMode) {}
716 PHP_METHOD(Session, onUmode) {}
717 PHP_METHOD(Session, onTopic) {}
718 PHP_METHOD(Session, onKick) {}
719 PHP_METHOD(Session, onChannel) {}
720 PHP_METHOD(Session, onPrivmsg) {}
721 PHP_METHOD(Session, onNOTICE) {}
722 PHP_METHOD(Session, onChannelNotice) {}
723 PHP_METHOD(Session, onInvite) {}
724 PHP_METHOD(Session, onCtcpReq) {}
725 PHP_METHOD(Session, onCtcpRep) {}
726 PHP_METHOD(Session, onCtcpAction) {}
727 PHP_METHOD(Session, onUnknown) {}
728 PHP_METHOD(Session, onNumeric) {}
729 PHP_METHOD(Session, onDccChatReq) {}
730 PHP_METHOD(Session, onDccSendReq) {}
731
732 #define ME(m) PHP_ME(Session, m, NULL, ZEND_ACC_PUBLIC)
733
734 zend_function_entry php_ircclient_session_method_entry[] = {
735 ME(__construct)
736 ME(doConnect)
737 ME(isConnected)
738 ME(disconnect)
739 ME(run)
740 ME(setOption)
741
742 ME(doJoin)
743 ME(doPart)
744 ME(doInvite)
745 ME(doNames)
746 ME(doList)
747 ME(doTopic)
748 ME(doChannelMode)
749 ME(doKick)
750
751 ME(doMsg)
752 ME(doMe)
753 ME(doNotice)
754
755 ME(doQuit)
756 ME(doUserMode)
757 ME(doNick)
758 ME(doWhois)
759
760 ME(doCtcpReply)
761 ME(doCtcpRequest)
762
763 ME(onConnect)
764 ME(onNick)
765 ME(onQuit)
766 ME(onJoin)
767 ME(onPart)
768 ME(onMode)
769 ME(onUmode)
770 ME(onTopic)
771 ME(onKick)
772 ME(onChannel)
773 ME(onPrivmsg)
774 ME(onNOTICE)
775 ME(onChannelNotice)
776 ME(onInvite)
777 ME(onCtcpReq)
778 ME(onCtcpRep)
779 ME(onCtcpAction)
780 ME(onUnknown)
781 ME(onNumeric)
782 ME(onDccChatReq)
783 ME(onDccSendReq)
784 PHP_FE_END
785 };
786
787 PHP_MINIT_FUNCTION(ircclient)
788 {
789 zend_class_entry ce;
790
791 memset(&ce, 0, sizeof(zend_class_entry));
792 INIT_NS_CLASS_ENTRY(ce, "irc\\client", "Session", php_ircclient_session_method_entry);
793 ce.create_object = php_ircclient_session_object_create;
794 php_ircclient_session_class_entry = zend_register_internal_class_ex(&ce, NULL, NULL TSRMLS_CC);
795
796 zend_declare_property_null(php_ircclient_session_class_entry, ZEND_STRL("nick"), ZEND_ACC_PUBLIC TSRMLS_CC);
797 zend_declare_property_null(php_ircclient_session_class_entry, ZEND_STRL("user"), ZEND_ACC_PUBLIC TSRMLS_CC);
798 zend_declare_property_null(php_ircclient_session_class_entry, ZEND_STRL("real"), ZEND_ACC_PUBLIC TSRMLS_CC);
799
800 return SUCCESS;
801 }
802
803
804 PHP_MSHUTDOWN_FUNCTION(ircclient)
805 {
806 return SUCCESS;
807 }
808
809
810
811 PHP_RINIT_FUNCTION(ircclient)
812 {
813 return SUCCESS;
814 }
815
816
817
818 PHP_RSHUTDOWN_FUNCTION(ircclient)
819 {
820 return SUCCESS;
821 }
822
823
824 PHP_MINFO_FUNCTION(ircclient)
825 {
826 php_info_print_table_start();
827 php_info_print_table_header(2, "ircclient support", "enabled");
828 php_info_print_table_end();
829
830 }
831
832
833
834
835