ruburple 0.0.3 → 0.0.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/README +8 -2
- data/ext/ruburple_ext.c +178 -58
- data/lib/ruburple/ruburple.rb +8 -2
- data/tests/ruburple_test.rb +68 -0
- data/tests/test_accounts.rb +7 -0
- data/tests/test_accounts.rb.template +7 -0
- data/tests/test_helper.rb +50 -0
- metadata +9 -4
data/README
CHANGED
@@ -18,15 +18,21 @@ Then, to build, I did:
|
|
18
18
|
|
19
19
|
This is mainly because I dont need any of the disabled features to get ruburple running, and the configure script had big trouble finding the gnutls headers and libs on its own.
|
20
20
|
|
21
|
-
== Usage example (using
|
21
|
+
== Usage example (using almost all methods defined in the ruburple gem):
|
22
22
|
|
23
23
|
require 'ruburple'
|
24
24
|
Ruburple::init
|
25
25
|
Ruburple::subscribe(:received_im_msg, (Proc.new do |a,b,c,d,e| puts "rcv im: #{a}, #{b}, #{c}, #{d}, #{e}" end))
|
26
26
|
Ruburple::subscribe(:signed_on, (Proc.new do |a| puts "signed on: #{a}" end))
|
27
|
-
p = Ruburple::
|
27
|
+
p = Ruburple::get_protocol("MSN")
|
28
28
|
puts "gonna connect to #{p.id}, #{p.name}, #{p.version}, #{p.summary}, #{p.description}, #{p.author}, #{p.homepage}"
|
29
29
|
a = p.get_account("some@msn.account", "some_msn_password")
|
30
30
|
a.connect
|
31
31
|
a.connection.send_im("some_other@msn_account", "some message")
|
32
32
|
a.connection.close
|
33
|
+
|
34
|
+
== It doesnt work!
|
35
|
+
|
36
|
+
Do
|
37
|
+
Ruburple::debug = true
|
38
|
+
and mail me a description of the problem, and Ill see what I can do.
|
data/ext/ruburple_ext.c
CHANGED
@@ -76,6 +76,10 @@ static GMainLoop *main_loop;
|
|
76
76
|
static VALUE call_method_id;
|
77
77
|
static VALUE idle_handler_method_id;
|
78
78
|
static int purple_event_queue[2];
|
79
|
+
static gboolean glib_sleeping;
|
80
|
+
static VALUE gc_save_set;
|
81
|
+
static VALUE add_method_id;
|
82
|
+
static VALUE delete_method_id;
|
79
83
|
|
80
84
|
/*
|
81
85
|
* The UI name for libpurple.
|
@@ -246,25 +250,35 @@ add_single_shot(RuburpleCallFunc function, gpointer data)
|
|
246
250
|
return call;
|
247
251
|
}
|
248
252
|
|
249
|
-
/*
|
253
|
+
/*
|
254
|
+
* Ask glib to run something for us once and wait for the result to be ready.
|
255
|
+
*
|
256
|
+
* If the glib main loop is sleeping due to us we will do it ourselves,
|
257
|
+
* if it is NOT sleeping due to us we will register a single shot call.
|
258
|
+
*/
|
250
259
|
static gpointer
|
251
260
|
call_and_get_result(RuburpleCallFunc function, gpointer data)
|
252
261
|
{
|
253
|
-
RuburpleSingleShotCall *call
|
262
|
+
RuburpleSingleShotCall *call;
|
254
263
|
gpointer return_value;
|
255
264
|
|
256
|
-
|
257
|
-
|
258
|
-
|
259
|
-
|
265
|
+
if (glib_sleeping) {
|
266
|
+
return_value = function(data);
|
267
|
+
} else {
|
268
|
+
call = add_single_shot(function, data);
|
269
|
+
|
270
|
+
g_mutex_lock(call->lock);
|
271
|
+
|
272
|
+
while (!call->run) {
|
273
|
+
g_cond_wait(call->done, call->lock);
|
274
|
+
}
|
275
|
+
|
276
|
+
return_value = call->result;
|
277
|
+
|
278
|
+
g_mutex_unlock(call->lock);
|
279
|
+
|
280
|
+
ruburple_single_shot_call_free(call);
|
260
281
|
}
|
261
|
-
|
262
|
-
return_value = call->result;
|
263
|
-
|
264
|
-
g_mutex_unlock(call->lock);
|
265
|
-
|
266
|
-
ruburple_single_shot_call_free(call);
|
267
|
-
|
268
282
|
return return_value;
|
269
283
|
}
|
270
284
|
|
@@ -489,15 +503,27 @@ rb_ruburple_get_protocols(VALUE self)
|
|
489
503
|
GList *iter;
|
490
504
|
VALUE return_value = rb_ary_new();
|
491
505
|
|
492
|
-
iter = (GList *) call_and_get_result(ruburple_get_protocols, NULL);
|
493
|
-
|
494
|
-
for (iter = purple_plugins_get_protocols(); iter; iter = iter->next) {
|
506
|
+
for (iter = (GList *) call_and_get_result(ruburple_get_protocols, NULL); iter; iter = iter->next) {
|
495
507
|
rb_ary_push(return_value, RB_RUBURPLE_PROTOCOL(iter->data));
|
496
508
|
}
|
497
509
|
|
498
510
|
return return_value;
|
499
511
|
}
|
500
512
|
|
513
|
+
static VALUE
|
514
|
+
rb_ruburple_get_protocol(VALUE self, VALUE name)
|
515
|
+
{
|
516
|
+
GList *iter;
|
517
|
+
VALUE return_value;
|
518
|
+
|
519
|
+
for (iter = (GList *) call_and_get_result(ruburple_get_protocols, NULL); iter; iter = iter->next) {
|
520
|
+
if (strcmp(purple_plugin_get_name((PurplePlugin *) iter->data), RSTRING(name)->ptr) == 0)
|
521
|
+
return RB_RUBURPLE_PROTOCOL(iter->data);
|
522
|
+
}
|
523
|
+
|
524
|
+
return Qnil;
|
525
|
+
}
|
526
|
+
|
501
527
|
static gpointer
|
502
528
|
ruburple_protocol_account_free(gpointer data)
|
503
529
|
{
|
@@ -535,7 +561,7 @@ static VALUE
|
|
535
561
|
rb_ruburple_protocol_get_account(int argc, VALUE *argv, VALUE self)
|
536
562
|
{
|
537
563
|
PurplePlugin *plugin;
|
538
|
-
gpointer
|
564
|
+
gpointer args[3];
|
539
565
|
VALUE return_value;
|
540
566
|
|
541
567
|
if (argc > 2)
|
@@ -548,11 +574,6 @@ rb_ruburple_protocol_get_account(int argc, VALUE *argv, VALUE self)
|
|
548
574
|
|
549
575
|
PURPLE_PLUGIN(self, plugin);
|
550
576
|
|
551
|
-
if (argc == 1)
|
552
|
-
args = g_new(gpointer, 2);
|
553
|
-
else if (argc == 2)
|
554
|
-
args = g_new(gpointer, 3);
|
555
|
-
|
556
577
|
args[0] = (gpointer) RSTRING(argv[0])->ptr;
|
557
578
|
args[1] = (gpointer) plugin->info->id;
|
558
579
|
|
@@ -563,8 +584,6 @@ rb_ruburple_protocol_get_account(int argc, VALUE *argv, VALUE self)
|
|
563
584
|
return_value = RB_RUBURPLE_PROTOCOL_ACCOUNT_gc((PurpleAccount *) call_and_get_result(ruburple_protocol_get_account_and_set_password, args));
|
564
585
|
}
|
565
586
|
|
566
|
-
g_free(args);
|
567
|
-
|
568
587
|
return return_value;
|
569
588
|
}
|
570
589
|
|
@@ -580,7 +599,7 @@ static VALUE
|
|
580
599
|
rb_ruburple_protocol_account_set_password(VALUE self, VALUE password)
|
581
600
|
{
|
582
601
|
PurpleAccount *account;
|
583
|
-
gpointer
|
602
|
+
gpointer args[2];
|
584
603
|
|
585
604
|
Check_Type(password, T_STRING);
|
586
605
|
PURPLE_ACCOUNT(self, account);
|
@@ -589,8 +608,6 @@ rb_ruburple_protocol_account_set_password(VALUE self, VALUE password)
|
|
589
608
|
|
590
609
|
call_and_get_result(ruburple_protocol_account_set_password, args);
|
591
610
|
|
592
|
-
g_free(args);
|
593
|
-
|
594
611
|
return Qnil;
|
595
612
|
}
|
596
613
|
|
@@ -613,6 +630,80 @@ rb_ruburple_protocol_account_connect(VALUE self)
|
|
613
630
|
return Qnil;
|
614
631
|
}
|
615
632
|
|
633
|
+
static gpointer
|
634
|
+
ruburple_protocol_account_get_username(gpointer data)
|
635
|
+
{
|
636
|
+
PurpleAccount *account = (PurpleAccount *) data;
|
637
|
+
return (gpointer) purple_account_get_username(account);
|
638
|
+
}
|
639
|
+
|
640
|
+
static VALUE
|
641
|
+
rb_ruburple_protocol_account_get_username(VALUE self)
|
642
|
+
{
|
643
|
+
PurpleAccount *account;
|
644
|
+
char *rval;
|
645
|
+
PURPLE_ACCOUNT(self, account);
|
646
|
+
rval = (char *) call_and_get_result(ruburple_protocol_account_get_username, (gpointer) account);
|
647
|
+
RETURN_QNIL_IF_NULL(rval);
|
648
|
+
return rb_str_new2(rval);
|
649
|
+
}
|
650
|
+
|
651
|
+
static gpointer
|
652
|
+
ruburple_protocol_account_get_password(gpointer data)
|
653
|
+
{
|
654
|
+
PurpleAccount *account = (PurpleAccount *) data;
|
655
|
+
return (gpointer) purple_account_get_password(account);
|
656
|
+
}
|
657
|
+
|
658
|
+
static VALUE
|
659
|
+
rb_ruburple_protocol_account_get_password(VALUE self)
|
660
|
+
{
|
661
|
+
PurpleAccount *account;
|
662
|
+
char *rval;
|
663
|
+
PURPLE_ACCOUNT(self, account);
|
664
|
+
rval = (char *) call_and_get_result(ruburple_protocol_account_get_password, (gpointer) account);
|
665
|
+
RETURN_QNIL_IF_NULL(rval);
|
666
|
+
return rb_str_new2(rval);
|
667
|
+
}
|
668
|
+
|
669
|
+
static gpointer
|
670
|
+
ruburple_protocol_account_get_alias(gpointer data)
|
671
|
+
{
|
672
|
+
PurpleAccount *account = (PurpleAccount *) data;
|
673
|
+
return (gpointer) purple_account_get_alias(account);
|
674
|
+
}
|
675
|
+
|
676
|
+
static VALUE
|
677
|
+
rb_ruburple_protocol_account_get_alias(VALUE self)
|
678
|
+
{
|
679
|
+
PurpleAccount *account;
|
680
|
+
char *rval;
|
681
|
+
PURPLE_ACCOUNT(self, account);
|
682
|
+
rval = (char *) call_and_get_result(ruburple_protocol_account_get_alias, (gpointer) account);
|
683
|
+
RETURN_QNIL_IF_NULL(rval);
|
684
|
+
return rb_str_new2(rval);
|
685
|
+
}
|
686
|
+
|
687
|
+
static gpointer
|
688
|
+
ruburple_protocol_account_set_alias(gpointer data)
|
689
|
+
{
|
690
|
+
gpointer *args = (gpointer *) data;
|
691
|
+
purple_account_set_alias((PurpleAccount *) args[0], (char *) args[1]);
|
692
|
+
return NULL;
|
693
|
+
}
|
694
|
+
|
695
|
+
static VALUE
|
696
|
+
rb_ruburple_protocol_account_set_alias(VALUE self, VALUE alias)
|
697
|
+
{
|
698
|
+
gpointer args[2];
|
699
|
+
PurpleAccount *account;
|
700
|
+
PURPLE_ACCOUNT(self, account);
|
701
|
+
args[0] = (gpointer) account;
|
702
|
+
args[1] = (gpointer) RSTRING(alias)->ptr;
|
703
|
+
call_and_get_result(ruburple_protocol_account_set_alias, args);
|
704
|
+
return Qnil;
|
705
|
+
}
|
706
|
+
|
616
707
|
static gpointer
|
617
708
|
ruburple_protocol_account_set_savedstatus(gpointer data)
|
618
709
|
{
|
@@ -626,7 +717,7 @@ rb_ruburple_protocol_account_set_savedstatus(VALUE self, VALUE savedstatus_value
|
|
626
717
|
{
|
627
718
|
PurpleAccount *account;
|
628
719
|
PurpleSavedStatus *savedstatus;
|
629
|
-
gpointer
|
720
|
+
gpointer args[2];
|
630
721
|
|
631
722
|
PURPLE_ACCOUNT(self, account);
|
632
723
|
PURPLE_SAVEDSTATUS(savedstatus_value, savedstatus);
|
@@ -636,8 +727,6 @@ rb_ruburple_protocol_account_set_savedstatus(VALUE self, VALUE savedstatus_value
|
|
636
727
|
|
637
728
|
call_and_get_result(ruburple_protocol_account_set_savedstatus, args);
|
638
729
|
|
639
|
-
g_free(args);
|
640
|
-
|
641
730
|
return Qnil;
|
642
731
|
}
|
643
732
|
|
@@ -665,7 +754,7 @@ static VALUE
|
|
665
754
|
rb_ruburple_protocol_account_savedstatus_initialize(VALUE self, VALUE status_constant)
|
666
755
|
{
|
667
756
|
PurpleSavedStatus *savedstatus;
|
668
|
-
gpointer
|
757
|
+
gpointer args[2];
|
669
758
|
|
670
759
|
Check_Type(status_constant, T_FIXNUM);
|
671
760
|
PURPLE_SAVEDSTATUS(self, savedstatus);
|
@@ -675,8 +764,6 @@ rb_ruburple_protocol_account_savedstatus_initialize(VALUE self, VALUE status_con
|
|
675
764
|
|
676
765
|
call_and_get_result(ruburple_protocol_account_savedstatus_initialize, args);
|
677
766
|
|
678
|
-
g_free(args);
|
679
|
-
|
680
767
|
return Qnil;
|
681
768
|
}
|
682
769
|
|
@@ -957,9 +1044,11 @@ ruburple_callback(va_list args, void *data)
|
|
957
1044
|
g_mutex_lock(event.lock);
|
958
1045
|
|
959
1046
|
write(purple_event_queue[1], (char *) &event_pointer, sizeof(IncomingRuburpleEvent *));
|
960
|
-
|
1047
|
+
|
1048
|
+
glib_sleeping = TRUE;
|
961
1049
|
g_cond_wait(event.flag, event.lock);
|
962
|
-
|
1050
|
+
glib_sleeping = FALSE;
|
1051
|
+
|
963
1052
|
g_mutex_unlock(event.lock);
|
964
1053
|
|
965
1054
|
g_mutex_free(event.lock);
|
@@ -1007,7 +1096,7 @@ rb_ruburple_subscribe(VALUE self, VALUE handle_value, VALUE signal_name, VALUE c
|
|
1007
1096
|
|
1008
1097
|
return_value = RB_RUBURPLE_SUBSCRIPTION_gc(handler);
|
1009
1098
|
|
1010
|
-
|
1099
|
+
rb_funcall(gc_save_set, add_method_id, 1, return_value);
|
1011
1100
|
|
1012
1101
|
return return_value;
|
1013
1102
|
}
|
@@ -1028,7 +1117,7 @@ rb_ruburple_subscription_unsubscribe(VALUE self)
|
|
1028
1117
|
|
1029
1118
|
call_and_get_result(ruburple_signal_disconnect, (gpointer) handler);
|
1030
1119
|
|
1031
|
-
|
1120
|
+
rb_funcall(gc_save_set, delete_method_id, 1, self);
|
1032
1121
|
|
1033
1122
|
return Qnil;
|
1034
1123
|
}
|
@@ -1048,9 +1137,8 @@ static gpointer
|
|
1048
1137
|
ruburple_serv_send_im(gpointer data)
|
1049
1138
|
{
|
1050
1139
|
gpointer *args = (gpointer *) data;
|
1051
|
-
int *
|
1052
|
-
|
1053
|
-
return (gpointer) rval;
|
1140
|
+
* (int *) args[4] = serv_send_im((PurpleConnection *) args[0], (char *) args[1], (char *) args[2], * (int *) args[3]);
|
1141
|
+
return NULL;
|
1054
1142
|
}
|
1055
1143
|
|
1056
1144
|
static VALUE
|
@@ -1058,8 +1146,7 @@ rb_ruburple_protocol_connection_send_im(int argc, VALUE *argv, VALUE self)
|
|
1058
1146
|
{
|
1059
1147
|
PurpleConnection *connection;
|
1060
1148
|
int flags = 0;
|
1061
|
-
gpointer
|
1062
|
-
gpointer args[4];
|
1149
|
+
gpointer args[5];
|
1063
1150
|
int rval;
|
1064
1151
|
|
1065
1152
|
if (argc > 3)
|
@@ -1081,10 +1168,9 @@ rb_ruburple_protocol_connection_send_im(int argc, VALUE *argv, VALUE self)
|
|
1081
1168
|
args[1] = (gpointer) RSTRING(argv[0])->ptr;
|
1082
1169
|
args[2] = (gpointer) RSTRING(argv[1])->ptr;
|
1083
1170
|
args[3] = (gpointer) &flags;
|
1171
|
+
args[4] = (gpointer) &rval;
|
1084
1172
|
|
1085
|
-
|
1086
|
-
rval = * (int *) tmp;
|
1087
|
-
g_free(tmp);
|
1173
|
+
call_and_get_result(ruburple_serv_send_im, args);
|
1088
1174
|
|
1089
1175
|
return INT2NUM(rval);
|
1090
1176
|
}
|
@@ -1111,31 +1197,60 @@ rb_ruburple_protocol_connection_close(VALUE self)
|
|
1111
1197
|
static gpointer
|
1112
1198
|
ruburple_protocol_account_is_connected(gpointer data)
|
1113
1199
|
{
|
1114
|
-
|
1115
|
-
gboolean *
|
1116
|
-
|
1117
|
-
return rval;
|
1200
|
+
gpointer *args = (gpointer *) data;
|
1201
|
+
* (gboolean *) args[1] = purple_account_is_connected((PurpleAccount *) args[0]);
|
1202
|
+
return NULL;
|
1118
1203
|
}
|
1119
1204
|
|
1120
1205
|
static VALUE
|
1121
1206
|
rb_ruburple_protocol_account_is_connected(VALUE self)
|
1122
1207
|
{
|
1208
|
+
gpointer args[2];
|
1123
1209
|
PurpleAccount *account;
|
1124
|
-
gboolean
|
1210
|
+
gboolean tmp;
|
1125
1211
|
VALUE rval;
|
1126
1212
|
PURPLE_ACCOUNT(self, account);
|
1127
|
-
|
1128
|
-
|
1129
|
-
|
1213
|
+
args[0] = (gpointer) account;
|
1214
|
+
args[1] = (gpointer) &tmp;
|
1215
|
+
call_and_get_result(ruburple_protocol_account_is_connected, args);
|
1216
|
+
rval = BOOL(tmp);
|
1130
1217
|
return rval;
|
1131
1218
|
}
|
1132
1219
|
|
1220
|
+
static gpointer
|
1221
|
+
ruburple_protocol_connection_get_account(gpointer data)
|
1222
|
+
{
|
1223
|
+
return (gpointer) purple_connection_get_account((PurpleConnection *) data);
|
1224
|
+
}
|
1225
|
+
|
1226
|
+
static VALUE
|
1227
|
+
rb_ruburple_protocol_connection_get_account(VALUE self)
|
1228
|
+
{
|
1229
|
+
PurpleConnection *plugin;
|
1230
|
+
PURPLE_CONNECTION(self, plugin);
|
1231
|
+
return RB_RUBURPLE_PROTOCOL_ACCOUNT((PurpleAccount *) call_and_get_result(ruburple_protocol_connection_get_account, (gpointer) plugin));
|
1232
|
+
}
|
1233
|
+
|
1133
1234
|
#ifdef __cplusplus
|
1134
1235
|
extern "C" {
|
1135
1236
|
#endif
|
1136
1237
|
void Init_ruburple_ext() {
|
1137
1238
|
VALUE io_class = rb_define_class("IO", rb_cObject);
|
1138
1239
|
VALUE new_method = rb_intern("new");
|
1240
|
+
VALUE set_class;
|
1241
|
+
|
1242
|
+
rb_f_require(0, rb_str_new2("set"));
|
1243
|
+
|
1244
|
+
set_class = rb_define_class("Set", rb_cObject);
|
1245
|
+
|
1246
|
+
gc_save_set = rb_funcall(set_class, new_method, 0);
|
1247
|
+
|
1248
|
+
g_thread_init(NULL);
|
1249
|
+
|
1250
|
+
glib_sleeping = FALSE;
|
1251
|
+
|
1252
|
+
add_method_id = rb_intern("add");
|
1253
|
+
delete_method_id = rb_intern("delete");
|
1139
1254
|
|
1140
1255
|
if (pipe(purple_event_queue) == -1)
|
1141
1256
|
rb_raise(rb_eRuntimeError, "error creating event pipe from libpurple to ruby: %s", strerror(errno));
|
@@ -1147,6 +1262,7 @@ extern "C" {
|
|
1147
1262
|
rb_define_singleton_method(rb_ruburple, "quit", rb_ruburple_quit, 0);
|
1148
1263
|
rb_define_singleton_method(rb_ruburple, "debug=", rb_ruburple_set_debug, 1);
|
1149
1264
|
rb_define_singleton_method(rb_ruburple, "protocols", rb_ruburple_get_protocols, 0);
|
1265
|
+
rb_define_singleton_method(rb_ruburple, "get_protocol", rb_ruburple_get_protocol, 1);
|
1150
1266
|
rb_define_singleton_method(rb_ruburple, "init", rb_ruburple_init, 0);
|
1151
1267
|
rb_define_singleton_method(rb_ruburple, "_subscribe", rb_ruburple_subscribe, 3);
|
1152
1268
|
rb_define_singleton_method(rb_ruburple, "_read_event", rb_ruburple_read_event, 0);
|
@@ -1171,6 +1287,8 @@ extern "C" {
|
|
1171
1287
|
rb_define_const(rb_ruburple, "MESSAGE_IMAGES", INT2NUM(PURPLE_MESSAGE_IMAGES)); /**< Message contains images */
|
1172
1288
|
rb_define_const(rb_ruburple, "MESSAGE_NOTIFY", INT2NUM(PURPLE_MESSAGE_NOTIFY)); /**< Message is a notification */
|
1173
1289
|
|
1290
|
+
rb_ruburple_pointer = rb_define_class_under(rb_ruburple, "Pointer", rb_cObject);
|
1291
|
+
|
1174
1292
|
rb_define_const(rb_ruburple, "HANDLE_ACCOUNTS", RB_RUBURPLE_POINTER(purple_accounts_get_handle()));
|
1175
1293
|
rb_define_const(rb_ruburple, "HANDLE_CONNECTIONS", RB_RUBURPLE_POINTER(purple_connections_get_handle()));
|
1176
1294
|
rb_define_const(rb_ruburple, "HANDLE_CONVERSATIONS", RB_RUBURPLE_POINTER(purple_conversations_get_handle()));
|
@@ -1182,7 +1300,8 @@ extern "C" {
|
|
1182
1300
|
rb_define_const(rb_ruburple, "HANDLE_SAVEDSTATUSES", RB_RUBURPLE_POINTER(purple_savedstatuses_get_handle()));
|
1183
1301
|
rb_define_const(rb_ruburple, "HANDLE_XFERS", RB_RUBURPLE_POINTER(purple_xfers_get_handle()));
|
1184
1302
|
rb_define_const(rb_ruburple, "EVENT_INPUT", rb_funcall(io_class, new_method, 1, INT2NUM(purple_event_queue[0])));
|
1185
|
-
|
1303
|
+
rb_define_const(rb_ruburple, "SUBSCRIPTIONS", gc_save_set);
|
1304
|
+
|
1186
1305
|
rb_ruburple_plugin = rb_define_class_under(rb_ruburple, "Plugin", rb_cObject);
|
1187
1306
|
|
1188
1307
|
rb_ruburple_protocol = rb_define_class_under(rb_ruburple, "Protocol", rb_ruburple_plugin);
|
@@ -1201,6 +1320,10 @@ extern "C" {
|
|
1201
1320
|
rb_define_method(rb_ruburple_protocol_account, "savedstatus=", rb_ruburple_protocol_account_set_savedstatus, 1);
|
1202
1321
|
rb_define_method(rb_ruburple_protocol_account, "connection", rb_ruburple_protocol_account_get_connection, 0);
|
1203
1322
|
rb_define_method(rb_ruburple_protocol_account, "connected?", rb_ruburple_protocol_account_is_connected, 0);
|
1323
|
+
rb_define_method(rb_ruburple_protocol_account, "username", rb_ruburple_protocol_account_get_username, 0);
|
1324
|
+
rb_define_method(rb_ruburple_protocol_account, "password", rb_ruburple_protocol_account_get_password, 0);
|
1325
|
+
rb_define_method(rb_ruburple_protocol_account, "alias", rb_ruburple_protocol_account_get_alias, 0);
|
1326
|
+
rb_define_method(rb_ruburple_protocol_account, "alias=", rb_ruburple_protocol_account_set_alias, 1);
|
1204
1327
|
|
1205
1328
|
rb_ruburple_protocol_account_conversation = rb_define_class_under(rb_ruburple_protocol_account, "Conversation", rb_cObject);
|
1206
1329
|
|
@@ -1223,6 +1346,7 @@ extern "C" {
|
|
1223
1346
|
rb_ruburple_protocol_connection = rb_define_class_under(rb_ruburple_protocol, "Connection", rb_cObject);
|
1224
1347
|
rb_define_method(rb_ruburple_protocol_connection, "send_im", rb_ruburple_protocol_connection_send_im, -1);
|
1225
1348
|
rb_define_method(rb_ruburple_protocol_connection, "close", rb_ruburple_protocol_connection_close, 0);
|
1349
|
+
rb_define_method(rb_ruburple_protocol_connection, "account", rb_ruburple_protocol_connection_get_account, 0);
|
1226
1350
|
|
1227
1351
|
rb_ruburple_protocol_account_transfer = rb_define_class_under(rb_ruburple_protocol_account, "Transfer", rb_cObject);
|
1228
1352
|
|
@@ -1249,10 +1373,6 @@ extern "C" {
|
|
1249
1373
|
rb_ruburple_subscription = rb_define_class_under(rb_ruburple, "Subscription", rb_cObject);
|
1250
1374
|
rb_define_method(rb_ruburple_subscription, "unsubscribe", rb_ruburple_subscription_unsubscribe, 0);
|
1251
1375
|
|
1252
|
-
rb_ruburple_pointer = rb_define_class_under(rb_ruburple, "Pointer", rb_cObject);
|
1253
|
-
|
1254
|
-
g_thread_init(NULL);
|
1255
|
-
|
1256
1376
|
}
|
1257
1377
|
#ifdef __cplusplus
|
1258
1378
|
}
|
data/lib/ruburple/ruburple.rb
CHANGED
@@ -16,6 +16,7 @@
|
|
16
16
|
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
17
17
|
|
18
18
|
require 'monitor'
|
19
|
+
require 'pp'
|
19
20
|
|
20
21
|
module Ruburple
|
21
22
|
|
@@ -97,8 +98,13 @@ module Ruburple
|
|
97
98
|
@@event_fetcher.kill if defined?(@@event_fetcher) && @@event_fetcher
|
98
99
|
@@event_fetcher = Thread.new do
|
99
100
|
loop do
|
100
|
-
|
101
|
-
|
101
|
+
begin
|
102
|
+
select([EVENT_INPUT], nil, nil)
|
103
|
+
_read_event
|
104
|
+
rescue Exception => e
|
105
|
+
puts "#{e.class}: #{e}"
|
106
|
+
pp e.backtrace
|
107
|
+
end
|
102
108
|
end
|
103
109
|
end
|
104
110
|
|
@@ -0,0 +1,68 @@
|
|
1
|
+
|
2
|
+
require File.join(File.dirname(__FILE__), 'test_helper')
|
3
|
+
require 'ruburple'
|
4
|
+
|
5
|
+
class RuburpleTest < Test::Unit::TestCase
|
6
|
+
|
7
|
+
accounts_file = Pathname.new(__FILE__).parent.join("test_accounts.rb")
|
8
|
+
die("You have to create a #{accounts_file} looking like #{accounts_file}.template to run #{__FILE__}") unless accounts_file.exist?
|
9
|
+
require accounts_file
|
10
|
+
|
11
|
+
@@events = {}
|
12
|
+
|
13
|
+
Ruburple::init
|
14
|
+
Ruburple::subscribe(:signed_on, (Proc.new do |c|
|
15
|
+
puts "got signed_on from #{c.account.username}"
|
16
|
+
@@events[:signed_on] << c
|
17
|
+
end))
|
18
|
+
Ruburple::subscribe(:received_im_msg, (Proc.new do |account, sender, message, conversation, flags|
|
19
|
+
puts "got received_im_msg from #{sender} to #{account.username}"
|
20
|
+
@@events[:received_im_msg] << [account.username, sender, message]
|
21
|
+
end))
|
22
|
+
|
23
|
+
def setup
|
24
|
+
@@events = {
|
25
|
+
:signed_on => [],
|
26
|
+
:received_im_msg => []
|
27
|
+
}
|
28
|
+
end
|
29
|
+
|
30
|
+
def test_msn
|
31
|
+
test_operations("MSN")
|
32
|
+
end
|
33
|
+
|
34
|
+
private
|
35
|
+
|
36
|
+
def test_operations(protocol)
|
37
|
+
test_accounts = $TEST_ACCOUNTS[protocol]
|
38
|
+
p = Ruburple::get_protocol(protocol)
|
39
|
+
a1 = p.get_account(test_accounts.first.username, test_accounts.first.password)
|
40
|
+
a1.connect
|
41
|
+
a2 = p.get_account(test_accounts.last.username, test_accounts.last.password)
|
42
|
+
a2.connect
|
43
|
+
puts "testing sign on..."
|
44
|
+
assert_within(30) do
|
45
|
+
a1_signed_on = @@events[:signed_on].find do |e|
|
46
|
+
e.account.username == test_accounts.first.username
|
47
|
+
end
|
48
|
+
a2_signed_on = @@events[:signed_on].find do |e|
|
49
|
+
e.account.username == test_accounts.last.username
|
50
|
+
end
|
51
|
+
a1_signed_on && a2_signed_on
|
52
|
+
end
|
53
|
+
puts "testing send im..."
|
54
|
+
a1.connection.send_im(a2.username, "hello a2")
|
55
|
+
a2.connection.send_im(a1.username, "hello a1")
|
56
|
+
assert_within(30) do
|
57
|
+
a1_got_message = @@events[:received_im_msg].find do |recipient, sender, message|
|
58
|
+
recipient == a1.username && sender = a2.username && message =~ /hello a1/
|
59
|
+
end
|
60
|
+
a2_got_message = @@events[:received_im_msg].find do |recipient, sender, message|
|
61
|
+
recipient == a2.username && sender = a1.username && message =~ /hello a2/
|
62
|
+
end
|
63
|
+
a1_got_message && a2_got_message
|
64
|
+
end
|
65
|
+
end
|
66
|
+
|
67
|
+
|
68
|
+
end
|
@@ -0,0 +1,50 @@
|
|
1
|
+
|
2
|
+
home = File.expand_path(File.dirname(__FILE__))
|
3
|
+
$: << File.join(home, "..", "lib")
|
4
|
+
|
5
|
+
require 'pp'
|
6
|
+
require 'test/unit'
|
7
|
+
require 'benchmark'
|
8
|
+
require 'ruburple'
|
9
|
+
require 'pathname'
|
10
|
+
|
11
|
+
def bm(label = "", options = {})
|
12
|
+
n = options[:n] || 1000
|
13
|
+
width = options[:width] || 50
|
14
|
+
Benchmark.benchmark(" " * width + Benchmark::Tms::CAPTION, width, Benchmark::Tms::FMTSTR, "ms/call") do |b|
|
15
|
+
times = b.report("#{n}x#{label}") do
|
16
|
+
n.times do
|
17
|
+
yield
|
18
|
+
end
|
19
|
+
end
|
20
|
+
[times * 1000 / n.to_f]
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
class TestAccount
|
25
|
+
attr_accessor :protocol, :username, :password
|
26
|
+
def initialize(protocol, username, password)
|
27
|
+
@protocol = protocol
|
28
|
+
@username = username
|
29
|
+
@password = password
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
def die(s)
|
34
|
+
puts "*** #{s} ***"
|
35
|
+
exit 1
|
36
|
+
end
|
37
|
+
|
38
|
+
class Test::Unit::TestCase
|
39
|
+
|
40
|
+
def assert_within(timeout, &block)
|
41
|
+
t = Time.new
|
42
|
+
rval = yield
|
43
|
+
while !rval && t > Time.new - timeout
|
44
|
+
rval = yield
|
45
|
+
sleep(0.05)
|
46
|
+
end
|
47
|
+
assert(rval)
|
48
|
+
end
|
49
|
+
|
50
|
+
end
|
metadata
CHANGED
@@ -3,8 +3,8 @@ rubygems_version: 0.9.2
|
|
3
3
|
specification_version: 1
|
4
4
|
name: ruburple
|
5
5
|
version: !ruby/object:Gem::Version
|
6
|
-
version: 0.0.
|
7
|
-
date: 2007-05-
|
6
|
+
version: 0.0.4
|
7
|
+
date: 2007-05-07 00:00:00 +02:00
|
8
8
|
summary: An ruby extension to libpurple.
|
9
9
|
require_paths:
|
10
10
|
- lib
|
@@ -31,12 +31,17 @@ authors:
|
|
31
31
|
files:
|
32
32
|
- lib/ruburple.rb
|
33
33
|
- lib/ruburple/ruburple.rb
|
34
|
+
- tests/ruburple_test.rb
|
35
|
+
- tests/test_accounts.rb
|
36
|
+
- tests/test_accounts.rb.template
|
37
|
+
- tests/test_helper.rb
|
34
38
|
- ext/extconf.rb
|
35
39
|
- ext/ruburple_ext.c
|
36
40
|
- GPL-2
|
37
41
|
- README
|
38
|
-
test_files:
|
39
|
-
|
42
|
+
test_files:
|
43
|
+
- tests/ruburple_test.rb
|
44
|
+
- tests/test_helper.rb
|
40
45
|
rdoc_options:
|
41
46
|
- --line-numbers
|
42
47
|
- --inline-source
|