Mercurial > pidgin
annotate plugins/crazychat/cc_gaim_plugin.c @ 13253:87a7c3077c19
[gaim-migrate @ 15619]
More cleaning up of oscar. Renamed some functions to be more clear.
Got rid of some stuff that wasn't used. Inlined some small things
in conn.c that were only used once.
The goals of all this are
1. Non-blocking I/O for all connections
2. p2p stuff won't use the same struct as oscar connections, because
that's stupid
3. The oscar PRPL should be less scary
committer: Tailor Script <tailor@pidgin.im>
| author | Mark Doliner <mark@kingant.net> |
|---|---|
| date | Sun, 12 Feb 2006 21:27:04 +0000 |
| parents | f09c6e8df82c |
| children |
| rev | line source |
|---|---|
| 11232 | 1 #include <stdio.h> |
| 2 #include <assert.h> | |
| 3 | |
| 4 #include "internal.h" | |
| 5 #include "plugin.h" | |
| 6 #include "gtkplugin.h" | |
| 7 #include "gtkblist.h" | |
| 8 #include "gtkutils.h" | |
| 9 #include "connection.h" | |
| 10 #include "conversation.h" | |
| 11 #include "network.h" | |
| 12 | |
| 13 #include <gtk/gtkgl.h> | |
| 14 #include <GL/gl.h> | |
| 15 #include <GL/glu.h> | |
| 16 | |
| 17 #include "crazychat.h" | |
| 18 #include "cc_network.h" | |
| 19 #include "cc_interface.h" | |
| 20 #include "cc_gtk_gl.h" | |
| 21 #include "util.h" | |
| 22 | |
| 23 /* --- begin type and global variable definitions --- */ | |
| 24 | |
| 25 static struct crazychat cc_info; | |
| 26 | |
| 27 /* --- begin function declarations --- */ | |
| 28 | |
| 29 /** | |
| 30 * Called by gaim plugin to start CrazyChat | |
| 31 * @param cc the crazychat struct | |
| 32 */ | |
| 33 static void cc_init(struct crazychat *cc); | |
| 34 | |
| 35 /** | |
| 36 * Called by gaim plugin to destroy CrazyChat | |
| 37 * @param cc the crazychat struct | |
| 38 */ | |
| 39 static void cc_destroy(struct crazychat *cc); | |
| 40 | |
| 41 | |
| 42 /** | |
| 43 * Buddy menu drawing callback. Adds a CrazyChat menuitem. | |
| 44 * @param menu the buddy menu widget | |
| 45 * @param b the buddy whose menu this is | |
| 46 */ | |
| 47 static gboolean cc_buddy_menu(GtkWidget *menu, GaimBuddy *b); | |
| 48 | |
| 49 /** | |
| 50 * Buddy menu callback. Initiates the CrazyChat session. | |
| 51 * @param item the gtk buddy menu item | |
| 52 * @param b the buddy whose menu the item was in | |
| 53 */ | |
| 54 static void cc_menu_cb(GtkMenuItem *item, GaimBuddy *b); | |
| 55 | |
| 56 /** | |
| 57 * IM callback. Handles receiving a CrazyChat session request. | |
| 58 * @param account the account we received the IM on | |
| 59 * @param sender the buddy who we received the message from | |
| 60 * @param message the message we received | |
| 61 * @param flags IM flags | |
| 62 * @param data user data | |
| 63 */ | |
| 64 static gboolean receive_im_cb(GaimAccount *account, char **sender, | |
| 65 char **message, int *flags, void *data); | |
| 66 | |
| 67 /** | |
| 68 * Displaying IM callback. Drops CrazyChat messages from IM window. | |
| 69 * @param account the account we are displaying the IM on | |
| 70 * @param conv the conversation we are displaying the IM on | |
| 71 * @param message the message we are displaying | |
| 72 * @param data user data | |
| 73 */ | |
|
13233
f09c6e8df82c
[gaim-migrate @ 15598]
Richard Laager <rlaager@wiktel.com>
parents:
11232
diff
changeset
|
74 static gboolean display_im_cb(GaimAccount *account, const char *who, char **message, |
|
f09c6e8df82c
[gaim-migrate @ 15598]
Richard Laager <rlaager@wiktel.com>
parents:
11232
diff
changeset
|
75 GaimConnection *conv, GaimMessageFlags flags, void *data); |
| 11232 | 76 |
| 77 /** | |
| 78 * Callback for CrazyChat plugin configuration frame | |
| 79 * @param plugin the plugin data | |
| 80 * @return the configuration frame | |
| 81 */ | |
| 82 static GtkWidget *get_config_frame(GaimPlugin *plugin); | |
| 83 | |
| 84 /** | |
| 85 * TCP port callback. Changes the port used to listen for new CC sessions | |
| 86 * @param spin the spinner button whose value changed | |
| 87 * @param data user data | |
| 88 */ | |
| 89 static void tcp_port_cb(GtkSpinButton *spin, struct crazychat *cc); | |
| 90 | |
| 91 /** | |
| 92 * UDP port callback. Changes the port used to send/recv CC session frames | |
| 93 * @param spin the spinner button whose value changed | |
| 94 * @param data user data | |
| 95 */ | |
| 96 static void udp_port_cb(GtkSpinButton *spin, struct crazychat *cc); | |
| 97 | |
| 98 /** | |
| 99 * Features enabling/disabling callback. Initializes the input processing | |
| 100 * or shuts it down. | |
| 101 * @param data user data | |
| 102 */ | |
| 103 static void features_enable_cb(struct crazychat *cc); | |
| 104 | |
| 105 /** | |
| 106 * User signed on callback. Now we have a buddy list to connect a signal | |
| 107 * handler to. | |
| 108 * @param gc the gaim connection we are signed on | |
| 109 * @param plugin our plugin struct | |
| 110 */ | |
| 111 static gboolean cc_signed_on(GaimConnection *gc, void *plugin); | |
| 112 | |
| 113 /** | |
| 114 * Plugin loading callback. If a buddy list exists, connect our buddy menu | |
| 115 * drawing callback to the signal handler, otherwise, connect a signed on | |
| 116 * signal handler so we know when we get a buddy list. | |
| 117 * @param plugin our plugin struct | |
| 118 */ | |
| 119 static gboolean plugin_load(GaimPlugin *plugin); | |
| 120 | |
| 121 /** | |
| 122 * Plugin unloading callback. Disconnect all handlers and free data. | |
| 123 * @param plugin our plugin struct | |
| 124 */ | |
| 125 static gboolean plugin_unload(GaimPlugin *plugin); | |
| 126 | |
| 127 | |
| 128 /* --- end function declarations --- */ | |
| 129 | |
| 130 | |
| 131 #define CRAZYCHAT_PLUGIN_ID "gtk-crazychat" | |
| 132 | |
| 133 static GaimGtkPluginUiInfo ui_info = { | |
| 134 get_config_frame /**< get_config_frame */ | |
| 135 }; | |
| 136 | |
| 137 static GaimPluginInfo info = { | |
| 138 2, /**< api_version */ | |
| 139 GAIM_PLUGIN_STANDARD, /**< type */ | |
| 140 GAIM_GTK_PLUGIN_TYPE, /**< ui_requirement */ | |
| 141 0, /**< flags */ | |
| 142 NULL, /**< dependencies */ | |
| 143 GAIM_PRIORITY_DEFAULT, /**< priority */ | |
| 144 | |
| 145 CRAZYCHAT_PLUGIN_ID, /**< id */ | |
| 146 N_("Crazychat"), /**< name */ | |
| 147 VERSION, /**< version */ | |
| 148 /** summary */ | |
| 149 N_("Plugin to establish a Crazychat session."), | |
| 150 /** description */ | |
| 151 N_("Uses Gaim to obtain buddy ips to connect for a Crazychat session"), | |
| 152 "\n" | |
| 153 "William Chan <chanman@stanford.edu>\n" | |
| 154 "Ian Spiro <ispiro@stanford.edu>\n" | |
| 155 "Charlie Stockman<stockman@stanford.edu>\n" | |
| 156 "Steve Yelderman<scy@stanford.edu>", /**< author */ | |
| 157 GAIM_WEBSITE, /**< homepage */ | |
| 158 | |
| 159 plugin_load, /**< load */ | |
| 160 plugin_unload, /**< unload */ | |
| 161 NULL, /**< destroy */ | |
| 162 | |
| 163 &ui_info, /**< ui_info */ | |
| 164 &cc_info /**< extra_info */ | |
| 165 }; | |
| 166 | |
| 167 /* --- end plugin struct definition --- */ | |
| 168 | |
| 169 static void cc_init(struct crazychat *cc) | |
| 170 { | |
| 171 /* initialize main crazychat thread */ | |
| 172 | |
| 173 assert(cc); | |
| 174 memset(cc, 0, sizeof(*cc)); | |
| 175 | |
| 176 /* initialize network configuration */ | |
| 177 cc->tcp_port = DEFAULT_CC_PORT; | |
| 178 cc->udp_port = DEFAULT_CC_PORT; | |
| 179 | |
| 180 /* disable input subsystem */ | |
| 181 //cc->features_state = 0; | |
| 182 | |
| 183 /* initialize input subsystem */ | |
| 184 cc->features_state = 1; | |
| 185 cc->input_data = init_input(cc); | |
| 186 } | |
| 187 | |
| 188 static void cc_destroy(struct crazychat *cc) | |
| 189 { | |
| 190 assert(cc); | |
| 191 | |
| 192 if (cc->features_state) { | |
| 193 destroy_input(cc->input_data); | |
| 194 } | |
| 195 memset(cc, 0, sizeof(*cc)); | |
| 196 } | |
| 197 | |
| 198 static gboolean cc_buddy_menu(GtkWidget *menu, GaimBuddy *b) | |
| 199 { | |
| 200 GtkWidget *menuitem; | |
| 201 | |
| 202 menuitem = gtk_menu_item_new_with_mnemonic("CrazyChat"); | |
| 203 g_signal_connect(G_OBJECT(menuitem), "activate", | |
| 204 G_CALLBACK(cc_menu_cb), b); | |
| 205 gtk_menu_shell_append(GTK_MENU_SHELL(menu), menuitem); | |
| 206 return FALSE; | |
| 207 } | |
| 208 | |
| 209 static void cc_menu_cb(GtkMenuItem *item, GaimBuddy *b) | |
| 210 { | |
| 211 assert(item); | |
| 212 assert(b); | |
| 213 | |
| 214 /* send the invite */ | |
| 215 cc_net_send_invite(&cc_info, b->name, b->account); | |
| 216 } | |
| 217 | |
| 218 static gboolean receive_im_cb(GaimAccount *account, char **sender, | |
| 219 char **message, int *flags, void *data) | |
| 220 { | |
| 221 struct crazychat *cc; | |
| 222 | |
| 223 cc = (struct crazychat*)data; | |
| 224 assert(cc); | |
| 225 if (!strncmp(*message, CRAZYCHAT_INVITE_CODE, | |
| 226 strlen(CRAZYCHAT_INVITE_CODE))) { | |
| 227 Debug(*message); | |
| 228 char *split = strchr(*message, '!'); | |
| 229 assert(split); | |
| 230 *split = 0; | |
| 231 split++; | |
| 232 cc_net_recv_invite(account, cc, *sender, | |
| 233 &(*message)[strlen(CRAZYCHAT_INVITE_CODE)], | |
| 234 split); | |
| 235 return TRUE; | |
| 236 } else if (!strncmp(*message, CRAZYCHAT_ACCEPT_CODE, | |
| 237 strlen(CRAZYCHAT_ACCEPT_CODE))) { | |
| 238 cc_net_recv_accept(account, cc, *sender, | |
| 239 &(*message)[strlen(CRAZYCHAT_ACCEPT_CODE)]); | |
| 240 return TRUE; | |
| 241 } else if (!strncmp(*message, CRAZYCHAT_READY_CODE, | |
| 242 strlen(CRAZYCHAT_READY_CODE))) { | |
| 243 cc_net_recv_ready(account, cc, *sender); | |
| 244 return TRUE; | |
| 245 } | |
| 246 | |
| 247 return FALSE; | |
| 248 } | |
| 249 | |
| 250 static gboolean display_im_cb(GaimAccount *account, GaimConversation *conv, | |
| 251 char **message, void *data) | |
| 252 { | |
| 253 struct crazychat *cc; | |
| 254 | |
| 255 cc = (struct crazychat*)data; | |
| 256 assert(cc); | |
| 257 if (!strncmp(*message, CRAZYCHAT_INVITE_CODE, | |
| 258 strlen(CRAZYCHAT_INVITE_CODE))) { | |
| 259 return TRUE; | |
| 260 } else if (!strncmp(*message, CRAZYCHAT_ACCEPT_CODE, | |
| 261 strlen(CRAZYCHAT_ACCEPT_CODE))) { | |
| 262 return TRUE; | |
| 263 } else if (!strncmp(*message, CRAZYCHAT_READY_CODE, | |
| 264 strlen(CRAZYCHAT_READY_CODE))) { | |
| 265 return TRUE; | |
| 266 } | |
| 267 | |
| 268 return FALSE; | |
| 269 } | |
| 270 | |
| 271 static GtkWidget *get_config_frame(GaimPlugin *plugin) | |
| 272 { | |
| 273 GtkWidget *ret; | |
| 274 GtkWidget *frame; | |
| 275 GtkWidget *vbox, *hbox; | |
| 276 GtkWidget *drawing_area; | |
| 277 GtkWidget *label; | |
| 278 GtkAdjustment *adj; | |
| 279 GtkWidget *spinner; | |
| 280 GtkWidget *button, *button1, *button2; | |
| 281 GSList *group; | |
| 282 struct draw_info *info; | |
| 283 struct crazychat *cc; | |
| 284 | |
| 285 cc = (struct crazychat*)plugin->info->extra_info; | |
| 286 assert(cc); | |
| 287 | |
| 288 /* create widgets */ | |
| 289 | |
| 290 /* creating the config frame */ | |
| 291 ret = gtk_vbox_new(FALSE, 18); | |
| 292 gtk_container_set_border_width(GTK_CONTAINER(ret), 12); | |
| 293 | |
| 294 /* make the network configuration frame */ | |
| 295 frame = gaim_gtk_make_frame(ret, _("Network Configuration")); | |
| 296 gtk_widget_show(frame); | |
| 297 | |
| 298 /* add boxes for packing purposes */ | |
| 299 vbox = gtk_vbox_new(FALSE, 0); | |
| 300 gtk_box_pack_start(GTK_BOX(frame), vbox, TRUE, TRUE, 0); | |
| 301 gtk_widget_show(vbox); | |
| 302 | |
| 303 /* add widgets to row 1 */ | |
| 304 hbox = gtk_hbox_new(FALSE, 0); | |
| 305 gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 0); | |
| 306 gtk_widget_show(hbox); | |
| 307 label = gtk_label_new(_("TCP port")); | |
| 308 gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 15); | |
| 309 gtk_widget_show(label); | |
| 310 adj = (GtkAdjustment*)gtk_adjustment_new(DEFAULT_CC_PORT, 1, | |
| 311 G_MAXUSHORT, 1, 1000, 0); | |
| 312 spinner = gtk_spin_button_new(adj, 1, 0); | |
| 313 g_signal_connect(G_OBJECT(spinner), "value_changed", | |
| 314 G_CALLBACK(tcp_port_cb), cc); | |
| 315 gtk_box_pack_start(GTK_BOX(hbox), spinner, FALSE, FALSE, 0); | |
| 316 gtk_widget_show(spinner); | |
| 317 label = gtk_label_new(_("UDP port")); | |
| 318 gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 15); | |
| 319 gtk_widget_show(label); | |
| 320 adj = (GtkAdjustment*)gtk_adjustment_new(DEFAULT_CC_PORT, 1, | |
| 321 G_MAXUSHORT, 1, 1000, 0); | |
| 322 spinner = gtk_spin_button_new(adj, 1, 0); | |
| 323 g_signal_connect(G_OBJECT(spinner), "value_changed", | |
| 324 G_CALLBACK(udp_port_cb), cc); | |
| 325 gtk_box_pack_start(GTK_BOX(hbox), spinner, FALSE, FALSE, 0); | |
| 326 gtk_widget_show(spinner); | |
| 327 | |
| 328 /* make the feature configuration frame */ | |
| 329 frame = gaim_gtk_make_frame(ret, _("Feature Calibration")); | |
| 330 gtk_widget_show(frame); | |
| 331 | |
| 332 /* add hbox for packing purposes */ | |
| 333 hbox = gtk_hbox_new(TRUE, 40); | |
| 334 gtk_box_pack_start(GTK_BOX(frame), hbox, TRUE, TRUE, 0); | |
| 335 gtk_widget_show(hbox); | |
| 336 | |
| 337 /* add feature calibration options */ | |
| 338 | |
| 339 /* add vbox for packing purposes */ | |
| 340 vbox = gtk_vbox_new(TRUE, 0); | |
| 341 gtk_box_pack_start(GTK_BOX(hbox), vbox, TRUE, TRUE, 0); | |
| 342 gtk_widget_show(vbox); | |
| 343 | |
| 344 /* add enabled / disabled */ | |
| 345 button1 = gtk_radio_button_new_with_label(NULL, _("Enabled")); | |
| 346 gtk_box_pack_start(GTK_BOX(vbox), button1, TRUE, TRUE, 0); | |
| 347 gtk_widget_show(button1); | |
| 348 | |
| 349 group = gtk_radio_button_get_group(GTK_RADIO_BUTTON(button1)); | |
| 350 button2 = gtk_radio_button_new_with_label(group, _("Disabled")); | |
| 351 gtk_box_pack_start(GTK_BOX(vbox), button2, TRUE, TRUE, 0); | |
| 352 gtk_widget_show(button2); | |
| 353 | |
| 354 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(button1), | |
| 355 cc->features_state); | |
| 356 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(button2), | |
| 357 !cc->features_state); | |
| 358 g_signal_connect_swapped(G_OBJECT(button1), "toggled", | |
| 359 G_CALLBACK(features_enable_cb), cc); | |
| 360 | |
| 361 /* add vbox for packing purposes */ | |
| 362 vbox = gtk_vbox_new(TRUE, 0); | |
| 363 gtk_box_pack_end(GTK_BOX(hbox), vbox, TRUE, TRUE, 0); | |
| 364 gtk_widget_show(vbox); | |
| 365 | |
| 366 /* add calibrate button */ | |
| 367 button = gtk_button_new_with_label("Calibrate"); | |
| 368 gtk_box_pack_start(GTK_BOX(vbox), button, TRUE, FALSE, 0); | |
| 369 gtk_widget_show(button); | |
| 370 | |
| 371 gtk_widget_show(ret); | |
| 372 | |
| 373 return ret; | |
| 374 } | |
| 375 | |
| 376 static void tcp_port_cb(GtkSpinButton *spin, struct crazychat *cc) | |
| 377 { | |
| 378 assert(spin); | |
| 379 assert(cc); | |
| 380 cc->tcp_port = gtk_spin_button_get_value_as_int(spin); | |
| 381 Debug("New tcp port: %d\n", cc->tcp_port); | |
| 382 } | |
| 383 | |
| 384 static void udp_port_cb(GtkSpinButton *spin, struct crazychat *cc) | |
| 385 { | |
| 386 assert(spin); | |
| 387 assert(cc); | |
| 388 cc->udp_port = gtk_spin_button_get_value_as_int(spin); | |
| 389 Debug("New udp port: %d\n", cc->udp_port); | |
| 390 } | |
| 391 | |
| 392 static void features_enable_cb(struct crazychat *cc) | |
| 393 { | |
| 394 Debug("Changing features state\n"); | |
| 395 cc->features_state = !cc->features_state; | |
| 396 if (cc->features_state) { | |
| 397 cc->input_data = init_input(cc); | |
| 398 } else { | |
| 399 if (cc->input_data) { | |
| 400 gtk_widget_destroy(cc->input_data->widget); | |
| 401 } | |
| 402 } | |
| 403 } | |
| 404 | |
| 405 static gboolean cc_signed_on(GaimConnection *gc, void *plugin) | |
| 406 { | |
| 407 struct crazychat *extra; | |
| 408 void *conv_handle; | |
| 409 | |
| 410 assert(plugin); | |
| 411 extra = (struct crazychat*)((GaimPlugin*)plugin)->info->extra_info; | |
| 412 gaim_signal_disconnect | |
| 413 (gaim_connections_get_handle(), "signed-on", | |
| 414 plugin, GAIM_CALLBACK(cc_signed_on)); | |
| 415 gaim_signal_connect(GAIM_GTK_BLIST | |
| 416 (gaim_get_blist()), | |
| 417 "drawing-menu", plugin, | |
| 418 GAIM_CALLBACK(cc_buddy_menu), NULL); | |
| 419 conv_handle = gaim_conversations_get_handle(); | |
| 420 gaim_signal_connect(conv_handle, "received-im-msg", plugin, | |
| 421 GAIM_CALLBACK(receive_im_cb), extra); | |
| 422 gaim_signal_connect(conv_handle, "displaying-im-msg", plugin, | |
| 423 GAIM_CALLBACK(display_im_cb), extra); | |
| 424 return FALSE; | |
| 425 } | |
| 426 | |
| 427 static gboolean plugin_load(GaimPlugin *plugin) | |
| 428 { | |
| 429 GaimBuddyList *buddy_list; | |
| 430 void *conv_handle; | |
| 431 | |
| 432 if (cc_init_gtk_gl()) | |
| 433 return FALSE; | |
| 434 | |
| 435 cc_init(&cc_info); | |
| 436 buddy_list = gaim_get_blist(); | |
| 437 if (buddy_list) { | |
| 438 gaim_signal_connect(GAIM_GTK_BLIST | |
| 439 (buddy_list), | |
| 440 "drawing-menu", plugin, | |
| 441 GAIM_CALLBACK(cc_buddy_menu), NULL); | |
| 442 conv_handle = gaim_conversations_get_handle(); | |
| 443 gaim_signal_connect(conv_handle, "received-im-msg", plugin, | |
| 444 GAIM_CALLBACK(receive_im_cb), &cc_info); | |
| 445 gaim_signal_connect(conv_handle, "displaying-im-msg", plugin, | |
| 446 GAIM_CALLBACK(display_im_cb), &cc_info); | |
| 447 } else { | |
| 448 gaim_signal_connect | |
| 449 (gaim_connections_get_handle(), "signed-on", | |
| 450 plugin, GAIM_CALLBACK(cc_signed_on), plugin); | |
| 451 } | |
| 452 | |
| 453 Debug("CrazyChat plugin loaded.\n"); | |
| 454 | |
| 455 return TRUE; | |
| 456 } | |
| 457 | |
| 458 static gboolean plugin_unload(GaimPlugin *plugin) | |
| 459 { | |
| 460 void *conv_handle; | |
| 461 struct crazychat *extra; | |
| 462 assert(plugin); | |
| 463 extra = (struct crazychat*) plugin->info->extra_info; | |
| 464 cc_destroy(extra); | |
| 465 conv_handle = gaim_conversations_get_handle(); | |
| 466 gaim_signal_disconnect(GAIM_GTK_BLIST | |
| 467 (gaim_get_blist()), | |
| 468 "drawing-menu", plugin, | |
| 469 GAIM_CALLBACK(cc_buddy_menu)); | |
| 470 gaim_signal_disconnect(conv_handle, "received-im", plugin, | |
| 471 GAIM_CALLBACK(receive_im_cb)); | |
| 472 gaim_signal_disconnect(conv_handle, "displaying-im-msg", plugin, | |
| 473 GAIM_CALLBACK(display_im_cb)); | |
| 474 Debug("CrazyChat plugin unloaded.\n"); | |
| 475 return TRUE; | |
| 476 } | |
| 477 | |
| 478 static void init_plugin(GaimPlugin *plugin) | |
| 479 { | |
| 480 gtk_gl_init(NULL, NULL); | |
| 481 memset(&cc_info, 0, sizeof(cc_info)); | |
| 482 Debug("CrazyChat plugin initialized\n"); | |
| 483 } | |
| 484 | |
| 485 GAIM_INIT_PLUGIN(crazychat, init_plugin, info) |
