diff options
Diffstat (limited to 'protocols/purple/purple.c')
-rw-r--r-- | protocols/purple/purple.c | 1391 |
1 files changed, 696 insertions, 695 deletions
diff --git a/protocols/purple/purple.c b/protocols/purple/purple.c index e1f2c2be..aefd353b 100644 --- a/protocols/purple/purple.c +++ b/protocols/purple/purple.c @@ -36,43 +36,49 @@ GSList *purple_connections; libpurple in daemon mode anyway. */ static bee_t *local_bee; -static char *set_eval_display_name( set_t *set, char *value ); +static char *set_eval_display_name(set_t *set, char *value); -struct im_connection *purple_ic_by_pa( PurpleAccount *pa ) +struct im_connection *purple_ic_by_pa(PurpleAccount *pa) { GSList *i; - - for( i = purple_connections; i; i = i->next ) - if( ((struct im_connection *)i->data)->proto_data == pa ) + + for (i = purple_connections; i; i = i->next) { + if (((struct im_connection *) i->data)->proto_data == pa) { return i->data; - + } + } + return NULL; } -static struct im_connection *purple_ic_by_gc( PurpleConnection *gc ) +static struct im_connection *purple_ic_by_gc(PurpleConnection *gc) { - return purple_ic_by_pa( purple_connection_get_account( gc ) ); + return purple_ic_by_pa(purple_connection_get_account(gc)); } -static gboolean purple_menu_cmp( const char *a, const char *b ) +static gboolean purple_menu_cmp(const char *a, const char *b) { - while( *a && *b ) - { - while( *a == '_' ) a ++; - while( *b == '_' ) b ++; - if( g_ascii_tolower( *a ) != g_ascii_tolower( *b ) ) + while (*a && *b) { + while (*a == '_') { + a++; + } + while (*b == '_') { + b++; + } + if (g_ascii_tolower(*a) != g_ascii_tolower(*b)) { return FALSE; - - a ++; - b ++; + } + + a++; + b++; } - - return ( *a == '\0' && *b == '\0' ); + + return (*a == '\0' && *b == '\0'); } -static void purple_init( account_t *acc ) +static void purple_init(account_t *acc) { - PurplePlugin *prpl = purple_plugins_find_with_id( (char*) acc->prpl->data ); + PurplePlugin *prpl = purple_plugins_find_with_id((char *) acc->prpl->data); PurplePluginProtocolInfo *pi = prpl->info->extra_info; PurpleAccount *pa; GList *i, *st; @@ -80,45 +86,43 @@ static void purple_init( account_t *acc ) char help_title[64]; GString *help; static gboolean dir_fixed = FALSE; - + /* Layer violation coming up: Making an exception for libpurple here. Dig in the IRC state a bit to get a username. Ideally we should check if s/he identified but this info doesn't seem *that* important. It's just that fecking libpurple can't *not* store this shit. - + Remember that libpurple is not really meant to be used on public servers anyway! */ - if( !dir_fixed ) - { + if (!dir_fixed) { irc_t *irc = acc->bee->ui_data; char *dir; - - dir = g_strdup_printf( "%s/purple/%s", global.conf->configdir, irc->user->nick ); - purple_util_set_user_dir( dir ); - g_free( dir ); - + + dir = g_strdup_printf("%s/purple/%s", global.conf->configdir, irc->user->nick); + purple_util_set_user_dir(dir); + g_free(dir); + purple_blist_load(); purple_prefs_load(); dir_fixed = TRUE; } - - help = g_string_new( "" ); - g_string_printf( help, "BitlBee libpurple module %s (%s).\n\nSupported settings:", - (char*) acc->prpl->name, prpl->info->name ); - - if( pi->user_splits ) - { + + help = g_string_new(""); + g_string_printf(help, "BitlBee libpurple module %s (%s).\n\nSupported settings:", + (char *) acc->prpl->name, prpl->info->name); + + if (pi->user_splits) { GList *l; - g_string_append_printf( help, "\n* username: Username" ); - for( l = pi->user_splits; l; l = l->next ) - g_string_append_printf( help, "%c%s", - purple_account_user_split_get_separator( l->data ), - purple_account_user_split_get_text( l->data ) ); + g_string_append_printf(help, "\n* username: Username"); + for (l = pi->user_splits; l; l = l->next) { + g_string_append_printf(help, "%c%s", + purple_account_user_split_get_separator(l->data), + purple_account_user_split_get_text(l->data)); + } } - + /* Convert all protocol_options into per-account setting variables. */ - for( i = pi->protocol_options; i; i = i->next ) - { + for (i = pi->protocol_options; i; i = i->next) { PurpleAccountOption *o = i->data; const char *name; char *def = NULL; @@ -126,422 +130,413 @@ static void purple_init( account_t *acc ) void *eval_data = NULL; GList *io = NULL; GSList *opts = NULL; - - name = purple_account_option_get_setting( o ); - - switch( purple_account_option_get_type( o ) ) - { + + name = purple_account_option_get_setting(o); + + switch (purple_account_option_get_type(o)) { case PURPLE_PREF_STRING: - def = g_strdup( purple_account_option_get_default_string( o ) ); - - g_string_append_printf( help, "\n* %s (%s), %s, default: %s", - name, purple_account_option_get_text( o ), - "string", def ); - + def = g_strdup(purple_account_option_get_default_string(o)); + + g_string_append_printf(help, "\n* %s (%s), %s, default: %s", + name, purple_account_option_get_text(o), + "string", def); + break; - + case PURPLE_PREF_INT: - def = g_strdup_printf( "%d", purple_account_option_get_default_int( o ) ); + def = g_strdup_printf("%d", purple_account_option_get_default_int(o)); eval = set_eval_int; - - g_string_append_printf( help, "\n* %s (%s), %s, default: %s", - name, purple_account_option_get_text( o ), - "integer", def ); - + + g_string_append_printf(help, "\n* %s (%s), %s, default: %s", + name, purple_account_option_get_text(o), + "integer", def); + break; - + case PURPLE_PREF_BOOLEAN: - if( purple_account_option_get_default_bool( o ) ) - def = g_strdup( "true" ); - else - def = g_strdup( "false" ); + if (purple_account_option_get_default_bool(o)) { + def = g_strdup("true"); + } else { + def = g_strdup("false"); + } eval = set_eval_bool; - - g_string_append_printf( help, "\n* %s (%s), %s, default: %s", - name, purple_account_option_get_text( o ), - "boolean", def ); - + + g_string_append_printf(help, "\n* %s (%s), %s, default: %s", + name, purple_account_option_get_text(o), + "boolean", def); + break; - + case PURPLE_PREF_STRING_LIST: - def = g_strdup( purple_account_option_get_default_list_value( o ) ); - - g_string_append_printf( help, "\n* %s (%s), %s, default: %s", - name, purple_account_option_get_text( o ), - "list", def ); - g_string_append( help, "\n Possible values: " ); - - for( io = purple_account_option_get_list( o ); io; io = io->next ) - { + def = g_strdup(purple_account_option_get_default_list_value(o)); + + g_string_append_printf(help, "\n* %s (%s), %s, default: %s", + name, purple_account_option_get_text(o), + "list", def); + g_string_append(help, "\n Possible values: "); + + for (io = purple_account_option_get_list(o); io; io = io->next) { PurpleKeyValuePair *kv = io->data; - opts = g_slist_append( opts, kv->value ); + opts = g_slist_append(opts, kv->value); /* TODO: kv->value is not a char*, WTF? */ - if( strcmp( kv->value, kv->key ) != 0 ) - g_string_append_printf( help, "%s (%s), ", (char*) kv->value, kv->key ); - else - g_string_append_printf( help, "%s, ", (char*) kv->value ); + if (strcmp(kv->value, kv->key) != 0) { + g_string_append_printf(help, "%s (%s), ", (char *) kv->value, kv->key); + } else { + g_string_append_printf(help, "%s, ", (char *) kv->value); + } } - g_string_truncate( help, help->len - 2 ); + g_string_truncate(help, help->len - 2); eval = set_eval_list; eval_data = opts; - + break; - + default: /** No way to talk to the user right now, invent one when this becomes important. irc_rootmsg( acc->irc, "Setting with unknown type: %s (%d) Expect stuff to break..\n", name, purple_account_option_get_type( o ) ); */ - g_string_append_printf( help, "\n* [%s] UNSUPPORTED (type %d)", - name, purple_account_option_get_type( o ) ); + g_string_append_printf(help, "\n* [%s] UNSUPPORTED (type %d)", + name, purple_account_option_get_type(o)); name = NULL; } - - if( name != NULL ) - { - s = set_add( &acc->set, name, def, eval, acc ); + + if (name != NULL) { + s = set_add(&acc->set, name, def, eval, acc); s->flags |= ACC_SET_OFFLINE_ONLY; s->eval_data = eval_data; - g_free( def ); + g_free(def); } } - - g_snprintf( help_title, sizeof( help_title ), "purple %s", (char*) acc->prpl->name ); - help_add_mem( &global.help, help_title, help->str ); - g_string_free( help, TRUE ); - - s = set_add( &acc->set, "display_name", NULL, set_eval_display_name, acc ); + + g_snprintf(help_title, sizeof(help_title), "purple %s", (char *) acc->prpl->name); + help_add_mem(&global.help, help_title, help->str); + g_string_free(help, TRUE); + + s = set_add(&acc->set, "display_name", NULL, set_eval_display_name, acc); s->flags |= ACC_SET_ONLINE_ONLY; - - if( pi->options & OPT_PROTO_MAIL_CHECK ) - { - s = set_add( &acc->set, "mail_notifications", "false", set_eval_bool, acc ); + + if (pi->options & OPT_PROTO_MAIL_CHECK) { + s = set_add(&acc->set, "mail_notifications", "false", set_eval_bool, acc); s->flags |= ACC_SET_OFFLINE_ONLY; } - - if( strcmp( prpl->info->name, "Gadu-Gadu" ) == 0 ) - s = set_add( &acc->set, "gg_sync_contacts", "true", set_eval_bool, acc ); - + + if (strcmp(prpl->info->name, "Gadu-Gadu") == 0) { + s = set_add(&acc->set, "gg_sync_contacts", "true", set_eval_bool, acc); + } + /* Go through all away states to figure out if away/status messages are possible. */ - pa = purple_account_new( acc->user, (char*) acc->prpl->data ); - for( st = purple_account_get_status_types( pa ); st; st = st->next ) - { - PurpleStatusPrimitive prim = purple_status_type_get_primitive( st->data ); - - if( prim == PURPLE_STATUS_AVAILABLE ) - { - if( purple_status_type_get_attr( st->data, "message" ) ) + pa = purple_account_new(acc->user, (char *) acc->prpl->data); + for (st = purple_account_get_status_types(pa); st; st = st->next) { + PurpleStatusPrimitive prim = purple_status_type_get_primitive(st->data); + + if (prim == PURPLE_STATUS_AVAILABLE) { + if (purple_status_type_get_attr(st->data, "message")) { acc->flags |= ACC_FLAG_STATUS_MESSAGE; - } - else if( prim != PURPLE_STATUS_OFFLINE ) - { - if( purple_status_type_get_attr( st->data, "message" ) ) + } + } else if (prim != PURPLE_STATUS_OFFLINE) { + if (purple_status_type_get_attr(st->data, "message")) { acc->flags |= ACC_FLAG_AWAY_MESSAGE; + } } } - purple_accounts_remove( pa ); + purple_accounts_remove(pa); } -static void purple_sync_settings( account_t *acc, PurpleAccount *pa ) +static void purple_sync_settings(account_t *acc, PurpleAccount *pa) { - PurplePlugin *prpl = purple_plugins_find_with_id( pa->protocol_id ); + PurplePlugin *prpl = purple_plugins_find_with_id(pa->protocol_id); PurplePluginProtocolInfo *pi = prpl->info->extra_info; GList *i; - - for( i = pi->protocol_options; i; i = i->next ) - { + + for (i = pi->protocol_options; i; i = i->next) { PurpleAccountOption *o = i->data; const char *name; set_t *s; - - name = purple_account_option_get_setting( o ); - s = set_find( &acc->set, name ); - if( s->value == NULL ) + + name = purple_account_option_get_setting(o); + s = set_find(&acc->set, name); + if (s->value == NULL) { continue; - - switch( purple_account_option_get_type( o ) ) - { + } + + switch (purple_account_option_get_type(o)) { case PURPLE_PREF_STRING: case PURPLE_PREF_STRING_LIST: - purple_account_set_string( pa, name, set_getstr( &acc->set, name ) ); + purple_account_set_string(pa, name, set_getstr(&acc->set, name)); break; - + case PURPLE_PREF_INT: - purple_account_set_int( pa, name, set_getint( &acc->set, name ) ); + purple_account_set_int(pa, name, set_getint(&acc->set, name)); break; - + case PURPLE_PREF_BOOLEAN: - purple_account_set_bool( pa, name, set_getbool( &acc->set, name ) ); + purple_account_set_bool(pa, name, set_getbool(&acc->set, name)); break; - + default: break; } } - - if( pi->options & OPT_PROTO_MAIL_CHECK ) - purple_account_set_check_mail( pa, set_getbool( &acc->set, "mail_notifications" ) ); + + if (pi->options & OPT_PROTO_MAIL_CHECK) { + purple_account_set_check_mail(pa, set_getbool(&acc->set, "mail_notifications")); + } } -static void purple_login( account_t *acc ) +static void purple_login(account_t *acc) { - struct im_connection *ic = imcb_new( acc ); + struct im_connection *ic = imcb_new(acc); PurpleAccount *pa; - - if( ( local_bee != NULL && local_bee != acc->bee ) || - ( global.conf->runmode == RUNMODE_DAEMON && !getenv( "BITLBEE_DEBUG" ) ) ) - { - imcb_error( ic, "Daemon mode detected. Do *not* try to use libpurple in daemon mode! " - "Please use inetd or ForkDaemon mode instead." ); - imc_logout( ic, FALSE ); + + if ((local_bee != NULL && local_bee != acc->bee) || + (global.conf->runmode == RUNMODE_DAEMON && !getenv("BITLBEE_DEBUG"))) { + imcb_error(ic, "Daemon mode detected. Do *not* try to use libpurple in daemon mode! " + "Please use inetd or ForkDaemon mode instead."); + imc_logout(ic, FALSE); return; } local_bee = acc->bee; - + /* For now this is needed in the _connected() handlers if using GLib event handling, to make sure we're not handling events on dead connections. */ - purple_connections = g_slist_prepend( purple_connections, ic ); - - ic->proto_data = pa = purple_account_new( acc->user, (char*) acc->prpl->data ); - purple_account_set_password( pa, acc->pass ); - purple_sync_settings( acc, pa ); - - purple_account_set_enabled( pa, "BitlBee", TRUE ); + purple_connections = g_slist_prepend(purple_connections, ic); + + ic->proto_data = pa = purple_account_new(acc->user, (char *) acc->prpl->data); + purple_account_set_password(pa, acc->pass); + purple_sync_settings(acc, pa); + + purple_account_set_enabled(pa, "BitlBee", TRUE); } -static void purple_logout( struct im_connection *ic ) +static void purple_logout(struct im_connection *ic) { PurpleAccount *pa = ic->proto_data; - - purple_account_set_enabled( pa, "BitlBee", FALSE ); - purple_connections = g_slist_remove( purple_connections, ic ); - purple_accounts_remove( pa ); + + purple_account_set_enabled(pa, "BitlBee", FALSE); + purple_connections = g_slist_remove(purple_connections, ic); + purple_accounts_remove(pa); } -static int purple_buddy_msg( struct im_connection *ic, char *who, char *message, int flags ) +static int purple_buddy_msg(struct im_connection *ic, char *who, char *message, int flags) { PurpleConversation *conv; - - if( ( conv = purple_find_conversation_with_account( PURPLE_CONV_TYPE_IM, - who, ic->proto_data ) ) == NULL ) - { - conv = purple_conversation_new( PURPLE_CONV_TYPE_IM, - ic->proto_data, who ); + + if ((conv = purple_find_conversation_with_account(PURPLE_CONV_TYPE_IM, + who, ic->proto_data)) == NULL) { + conv = purple_conversation_new(PURPLE_CONV_TYPE_IM, + ic->proto_data, who); } - - purple_conv_im_send( purple_conversation_get_im_data( conv ), message ); - + + purple_conv_im_send(purple_conversation_get_im_data(conv), message); + return 1; } -static GList *purple_away_states( struct im_connection *ic ) +static GList *purple_away_states(struct im_connection *ic) { PurpleAccount *pa = ic->proto_data; GList *st, *ret = NULL; - - for( st = purple_account_get_status_types( pa ); st; st = st->next ) - { - PurpleStatusPrimitive prim = purple_status_type_get_primitive( st->data ); - if( prim != PURPLE_STATUS_AVAILABLE && prim != PURPLE_STATUS_OFFLINE ) - ret = g_list_append( ret, (void*) purple_status_type_get_name( st->data ) ); + + for (st = purple_account_get_status_types(pa); st; st = st->next) { + PurpleStatusPrimitive prim = purple_status_type_get_primitive(st->data); + if (prim != PURPLE_STATUS_AVAILABLE && prim != PURPLE_STATUS_OFFLINE) { + ret = g_list_append(ret, (void *) purple_status_type_get_name(st->data)); + } } - + return ret; } -static void purple_set_away( struct im_connection *ic, char *state_txt, char *message ) +static void purple_set_away(struct im_connection *ic, char *state_txt, char *message) { PurpleAccount *pa = ic->proto_data; - GList *status_types = purple_account_get_status_types( pa ), *st; + GList *status_types = purple_account_get_status_types(pa), *st; PurpleStatusType *pst = NULL; GList *args = NULL; - - for( st = status_types; st; st = st->next ) - { + + for (st = status_types; st; st = st->next) { pst = st->data; - - if( state_txt == NULL && - purple_status_type_get_primitive( pst ) == PURPLE_STATUS_AVAILABLE ) + + if (state_txt == NULL && + purple_status_type_get_primitive(pst) == PURPLE_STATUS_AVAILABLE) { break; + } - if( state_txt != NULL && - g_strcasecmp( state_txt, purple_status_type_get_name( pst ) ) == 0 ) + if (state_txt != NULL && + g_strcasecmp(state_txt, purple_status_type_get_name(pst)) == 0) { break; + } } - - if( message && purple_status_type_get_attr( pst, "message" ) ) - { - args = g_list_append( args, "message" ); - args = g_list_append( args, message ); + + if (message && purple_status_type_get_attr(pst, "message")) { + args = g_list_append(args, "message"); + args = g_list_append(args, message); } - - purple_account_set_status_list( pa, st ? purple_status_type_get_id( pst ) : "away", - TRUE, args ); - g_list_free( args ); + purple_account_set_status_list(pa, st ? purple_status_type_get_id(pst) : "away", + TRUE, args); + + g_list_free(args); } -static char *set_eval_display_name( set_t *set, char *value ) +static char *set_eval_display_name(set_t *set, char *value) { account_t *acc = set->data; struct im_connection *ic = acc->ic; - - if( ic ) - imcb_log( ic, "Changing display_name not currently supported with libpurple!" ); - + + if (ic) { + imcb_log(ic, "Changing display_name not currently supported with libpurple!"); + } + return NULL; } /* Bad bad gadu-gadu, not saving buddy list by itself */ -static void purple_gg_buddylist_export( PurpleConnection *gc ) +static void purple_gg_buddylist_export(PurpleConnection *gc) { - struct im_connection *ic = purple_ic_by_gc( gc ); - - if( set_getstr( &ic->acc->set, "gg_sync_contacts" ) ) - { - GList *actions = gc->prpl->info->actions( gc->prpl, gc ); + struct im_connection *ic = purple_ic_by_gc(gc); + + if (set_getstr(&ic->acc->set, "gg_sync_contacts")) { + GList *actions = gc->prpl->info->actions(gc->prpl, gc); GList *p; - for( p = g_list_first(actions); p; p = p->next ) - { - if( ((PurplePluginAction*)p->data) && - purple_menu_cmp( ((PurplePluginAction*)p->data)->label, "Upload buddylist to Server" ) == 0) - { + for (p = g_list_first(actions); p; p = p->next) { + if (((PurplePluginAction *) p->data) && + purple_menu_cmp(((PurplePluginAction *) p->data)->label, + "Upload buddylist to Server") == 0) { PurplePluginAction action; action.plugin = gc->prpl; action.context = gc; action.user_data = NULL; - ((PurplePluginAction*)p->data)->callback(&action); + ((PurplePluginAction *) p->data)->callback(&action); break; } } - g_list_free( actions ); + g_list_free(actions); } } -static void purple_gg_buddylist_import( PurpleConnection *gc ) +static void purple_gg_buddylist_import(PurpleConnection *gc) { - struct im_connection *ic = purple_ic_by_gc( gc ); - - if( set_getstr( &ic->acc->set, "gg_sync_contacts" ) ) - { - GList *actions = gc->prpl->info->actions( gc->prpl, gc ); + struct im_connection *ic = purple_ic_by_gc(gc); + + if (set_getstr(&ic->acc->set, "gg_sync_contacts")) { + GList *actions = gc->prpl->info->actions(gc->prpl, gc); GList *p; - for( p = g_list_first(actions); p; p = p->next ) - { - if( ((PurplePluginAction*)p->data) && - purple_menu_cmp( ((PurplePluginAction*)p->data)->label, "Download buddylist from Server" ) == 0 ) - { + for (p = g_list_first(actions); p; p = p->next) { + if (((PurplePluginAction *) p->data) && + purple_menu_cmp(((PurplePluginAction *) p->data)->label, + "Download buddylist from Server") == 0) { PurplePluginAction action; action.plugin = gc->prpl; action.context = gc; action.user_data = NULL; - ((PurplePluginAction*)p->data)->callback(&action); + ((PurplePluginAction *) p->data)->callback(&action); break; } } - g_list_free( actions ); + g_list_free(actions); } } -static void purple_add_buddy( struct im_connection *ic, char *who, char *group ) +static void purple_add_buddy(struct im_connection *ic, char *who, char *group) { PurpleBuddy *pb; PurpleGroup *pg = NULL; - - if( group && !( pg = purple_find_group( group ) ) ) - { - pg = purple_group_new( group ); - purple_blist_add_group( pg, NULL ); + + if (group && !(pg = purple_find_group(group))) { + pg = purple_group_new(group); + purple_blist_add_group(pg, NULL); } - - pb = purple_buddy_new( (PurpleAccount*) ic->proto_data, who, NULL ); - purple_blist_add_buddy( pb, NULL, pg, NULL ); - purple_account_add_buddy( (PurpleAccount*) ic->proto_data, pb ); - purple_gg_buddylist_export( ((PurpleAccount*)ic->proto_data)->gc ); + pb = purple_buddy_new((PurpleAccount *) ic->proto_data, who, NULL); + purple_blist_add_buddy(pb, NULL, pg, NULL); + purple_account_add_buddy((PurpleAccount *) ic->proto_data, pb); + + purple_gg_buddylist_export(((PurpleAccount *) ic->proto_data)->gc); } -static void purple_remove_buddy( struct im_connection *ic, char *who, char *group ) +static void purple_remove_buddy(struct im_connection *ic, char *who, char *group) { PurpleBuddy *pb; - - pb = purple_find_buddy( (PurpleAccount*) ic->proto_data, who ); - if( pb != NULL ) - { + + pb = purple_find_buddy((PurpleAccount *) ic->proto_data, who); + if (pb != NULL) { PurpleGroup *group; - - group = purple_buddy_get_group( pb ); - purple_account_remove_buddy( (PurpleAccount*) ic->proto_data, pb, group ); - - purple_blist_remove_buddy( pb ); + + group = purple_buddy_get_group(pb); + purple_account_remove_buddy((PurpleAccount *) ic->proto_data, pb, group); + + purple_blist_remove_buddy(pb); } - purple_gg_buddylist_export( ((PurpleAccount*)ic->proto_data)->gc ); + purple_gg_buddylist_export(((PurpleAccount *) ic->proto_data)->gc); } -static void purple_add_permit( struct im_connection *ic, char *who ) +static void purple_add_permit(struct im_connection *ic, char *who) { PurpleAccount *pa = ic->proto_data; - - purple_privacy_permit_add( pa, who, FALSE ); + + purple_privacy_permit_add(pa, who, FALSE); } -static void purple_add_deny( struct im_connection *ic, char *who ) +static void purple_add_deny(struct im_connection *ic, char *who) { PurpleAccount *pa = ic->proto_data; - - purple_privacy_deny_add( pa, who, FALSE ); + + purple_privacy_deny_add(pa, who, FALSE); } -static void purple_rem_permit( struct im_connection *ic, char *who ) +static void purple_rem_permit(struct im_connection *ic, char *who) { PurpleAccount *pa = ic->proto_data; - - purple_privacy_permit_remove( pa, who, FALSE ); + + purple_privacy_permit_remove(pa, who, FALSE); } -static void purple_rem_deny( struct im_connection *ic, char *who ) +static void purple_rem_deny(struct im_connection *ic, char *who) { PurpleAccount *pa = ic->proto_data; - - purple_privacy_deny_remove( pa, who, FALSE ); + + purple_privacy_deny_remove(pa, who, FALSE); } -static void purple_get_info( struct im_connection *ic, char *who ) +static void purple_get_info(struct im_connection *ic, char *who) { - serv_get_info( purple_account_get_connection( ic->proto_data ), who ); + serv_get_info(purple_account_get_connection(ic->proto_data), who); } -static void purple_keepalive( struct im_connection *ic ) +static void purple_keepalive(struct im_connection *ic) { } -static int purple_send_typing( struct im_connection *ic, char *who, int flags ) +static int purple_send_typing(struct im_connection *ic, char *who, int flags) { PurpleTypingState state = PURPLE_NOT_TYPING; PurpleAccount *pa = ic->proto_data; - - if( flags & OPT_TYPING ) + + if (flags & OPT_TYPING) { state = PURPLE_TYPING; - else if( flags & OPT_THINKING ) + } else if (flags & OPT_THINKING) { state = PURPLE_TYPED; - - serv_send_typing( purple_account_get_connection( pa ), who, state ); - + } + + serv_send_typing(purple_account_get_connection(pa), who, state); + return 1; } -static void purple_chat_msg( struct groupchat *gc, char *message, int flags ) +static void purple_chat_msg(struct groupchat *gc, char *message, int flags) { PurpleConversation *pc = gc->data; - - purple_conv_chat_send( purple_conversation_get_chat_data( pc ), message ); + + purple_conv_chat_send(purple_conversation_get_chat_data(pc), message); } -struct groupchat *purple_chat_with( struct im_connection *ic, char *who ) +struct groupchat *purple_chat_with(struct im_connection *ic, char *who) { /* No, "of course" this won't work this way. Or in fact, it almost does, but it only lets you send msgs to it, you won't receive @@ -550,133 +545,137 @@ struct groupchat *purple_chat_with( struct im_connection *ic, char *who ) PurpleConversation *pc; PurpleConvChat *pcc; struct groupchat *gc; - + gc = imcb_chat_new( ic, "BitlBee-libpurple groupchat" ); gc->data = pc = purple_conversation_new( PURPLE_CONV_TYPE_CHAT, pa, "BitlBee-libpurple groupchat" ); pc->ui_data = gc; - + pcc = PURPLE_CONV_CHAT( pc ); purple_conv_chat_add_user( pcc, ic->acc->user, "", 0, TRUE ); purple_conv_chat_invite_user( pcc, who, "Please join my chat", FALSE ); //purple_conv_chat_add_user( pcc, who, "", 0, TRUE ); */ - + /* There went my nice afternoon. :-( */ - + PurpleAccount *pa = ic->proto_data; - PurplePlugin *prpl = purple_plugins_find_with_id( pa->protocol_id ); + PurplePlugin *prpl = purple_plugins_find_with_id(pa->protocol_id); PurplePluginProtocolInfo *pi = prpl->info->extra_info; - PurpleBuddy *pb = purple_find_buddy( (PurpleAccount*) ic->proto_data, who ); + PurpleBuddy *pb = purple_find_buddy((PurpleAccount *) ic->proto_data, who); PurpleMenuAction *mi; GList *menu; + void (*callback)(PurpleBlistNode *, gpointer); /* FFFFFFFFFFFFFUUUUUUUUUUUUUU */ - - if( !pb || !pi || !pi->blist_node_menu ) + + if (!pb || !pi || !pi->blist_node_menu) { return NULL; - - menu = pi->blist_node_menu( &pb->node ); - while( menu ) - { + } + + menu = pi->blist_node_menu(&pb->node); + while (menu) { mi = menu->data; - if( purple_menu_cmp( mi->label, "initiate chat" ) || - purple_menu_cmp( mi->label, "initiate conference" ) ) + if (purple_menu_cmp(mi->label, "initiate chat") || + purple_menu_cmp(mi->label, "initiate conference")) { break; + } menu = menu->next; } - - if( menu == NULL ) + + if (menu == NULL) { return NULL; - + } + /* Call the fucker. */ - callback = (void*) mi->callback; - callback( &pb->node, menu->data ); - + callback = (void *) mi->callback; + callback(&pb->node, menu->data); + return NULL; } -void purple_chat_invite( struct groupchat *gc, char *who, char *message ) +void purple_chat_invite(struct groupchat *gc, char *who, char *message) { PurpleConversation *pc = gc->data; - PurpleConvChat *pcc = PURPLE_CONV_CHAT( pc ); - - serv_chat_invite( purple_account_get_connection( gc->ic->proto_data ), - purple_conv_chat_get_id( pcc ), - message && *message ? message : "Please join my chat", - who ); + PurpleConvChat *pcc = PURPLE_CONV_CHAT(pc); + + serv_chat_invite(purple_account_get_connection(gc->ic->proto_data), + purple_conv_chat_get_id(pcc), + message && *message ? message : "Please join my chat", + who); } -void purple_chat_kick( struct groupchat *gc, char *who, const char *message ) +void purple_chat_kick(struct groupchat *gc, char *who, const char *message) { PurpleConversation *pc = gc->data; - char *str = g_strdup_printf( "kick %s %s", who, message ); - purple_conversation_do_command( pc, str, NULL, NULL ); - g_free( str ); + char *str = g_strdup_printf("kick %s %s", who, message); + + purple_conversation_do_command(pc, str, NULL, NULL); + g_free(str); } -void purple_chat_leave( struct groupchat *gc ) +void purple_chat_leave(struct groupchat *gc) { PurpleConversation *pc = gc->data; - - purple_conversation_destroy( pc ); + + purple_conversation_destroy(pc); } -struct groupchat *purple_chat_join( struct im_connection *ic, const char *room, const char *nick, const char *password, set_t **sets ) +struct groupchat *purple_chat_join(struct im_connection *ic, const char *room, const char *nick, const char *password, + set_t **sets) { PurpleAccount *pa = ic->proto_data; - PurplePlugin *prpl = purple_plugins_find_with_id( pa->protocol_id ); + PurplePlugin *prpl = purple_plugins_find_with_id(pa->protocol_id); PurplePluginProtocolInfo *pi = prpl->info->extra_info; GHashTable *chat_hash; PurpleConversation *conv; GList *info, *l; - - if( !pi->chat_info || !pi->chat_info_defaults || - !( info = pi->chat_info( purple_account_get_connection( pa ) ) ) ) - { - imcb_error( ic, "Joining chatrooms not supported by this protocol" ); + + if (!pi->chat_info || !pi->chat_info_defaults || + !(info = pi->chat_info(purple_account_get_connection(pa)))) { + imcb_error(ic, "Joining chatrooms not supported by this protocol"); return NULL; } - - if( ( conv = purple_find_conversation_with_account( PURPLE_CONV_TYPE_CHAT, room, pa ) ) ) - purple_conversation_destroy( conv ); - - chat_hash = pi->chat_info_defaults( purple_account_get_connection( pa ), room ); - - for( l = info; l; l = l->next ) - { + + if ((conv = purple_find_conversation_with_account(PURPLE_CONV_TYPE_CHAT, room, pa))) { + purple_conversation_destroy(conv); + } + + chat_hash = pi->chat_info_defaults(purple_account_get_connection(pa), room); + + for (l = info; l; l = l->next) { struct proto_chat_entry *pce = l->data; - - if( strcmp( pce->identifier, "handle" ) == 0 ) - g_hash_table_replace( chat_hash, "handle", g_strdup( nick ) ); - else if( strcmp( pce->identifier, "password" ) == 0 ) - g_hash_table_replace( chat_hash, "password", g_strdup( password ) ); - else if( strcmp( pce->identifier, "passwd" ) == 0 ) - g_hash_table_replace( chat_hash, "passwd", g_strdup( password ) ); + + if (strcmp(pce->identifier, "handle") == 0) { + g_hash_table_replace(chat_hash, "handle", g_strdup(nick)); + } else if (strcmp(pce->identifier, "password") == 0) { + g_hash_table_replace(chat_hash, "password", g_strdup(password)); + } else if (strcmp(pce->identifier, "passwd") == 0) { + g_hash_table_replace(chat_hash, "passwd", g_strdup(password)); + } } - - serv_join_chat( purple_account_get_connection( pa ), chat_hash ); - + + serv_join_chat(purple_account_get_connection(pa), chat_hash); + return NULL; } -void purple_transfer_request( struct im_connection *ic, file_transfer_t *ft, char *handle ); +void purple_transfer_request(struct im_connection *ic, file_transfer_t *ft, char *handle); static void purple_ui_init(); GHashTable *prplcb_ui_info() { static GHashTable *ret; - - if( ret == NULL ) - { + + if (ret == NULL) { ret = g_hash_table_new(g_str_hash, g_str_equal); - g_hash_table_insert( ret, "name", "BitlBee" ); - g_hash_table_insert( ret, "version", BITLBEE_VERSION ); + g_hash_table_insert(ret, "name", "BitlBee"); + g_hash_table_insert(ret, "version", BITLBEE_VERSION); } - + return ret; } -static PurpleCoreUiOps bee_core_uiops = +static PurpleCoreUiOps bee_core_uiops = { NULL, NULL, @@ -685,61 +684,62 @@ static PurpleCoreUiOps bee_core_uiops = prplcb_ui_info, }; -static void prplcb_conn_progress( PurpleConnection *gc, const char *text, size_t step, size_t step_count ) +static void prplcb_conn_progress(PurpleConnection *gc, const char *text, size_t step, size_t step_count) { - struct im_connection *ic = purple_ic_by_gc( gc ); - - imcb_log( ic, "%s", text ); + struct im_connection *ic = purple_ic_by_gc(gc); + + imcb_log(ic, "%s", text); } -static void prplcb_conn_connected( PurpleConnection *gc ) +static void prplcb_conn_connected(PurpleConnection *gc) { - struct im_connection *ic = purple_ic_by_gc( gc ); + struct im_connection *ic = purple_ic_by_gc(gc); const char *dn; set_t *s; - - imcb_connected( ic ); - - if( ( dn = purple_connection_get_display_name( gc ) ) && - ( s = set_find( &ic->acc->set, "display_name" ) ) ) - { - g_free( s->value ); - s->value = g_strdup( dn ); + + imcb_connected(ic); + + if ((dn = purple_connection_get_display_name(gc)) && + (s = set_find(&ic->acc->set, "display_name"))) { + g_free(s->value); + s->value = g_strdup(dn); } // user list needs to be requested for Gadu-Gadu - purple_gg_buddylist_import( gc ); - - if( gc->flags & PURPLE_CONNECTION_HTML ) + purple_gg_buddylist_import(gc); + + if (gc->flags & PURPLE_CONNECTION_HTML) { ic->flags |= OPT_DOES_HTML; + } } -static void prplcb_conn_disconnected( PurpleConnection *gc ) +static void prplcb_conn_disconnected(PurpleConnection *gc) { - struct im_connection *ic = purple_ic_by_gc( gc ); - - if( ic != NULL ) - { - imc_logout( ic, !gc->wants_to_die ); + struct im_connection *ic = purple_ic_by_gc(gc); + + if (ic != NULL) { + imc_logout(ic, !gc->wants_to_die); } } -static void prplcb_conn_notice( PurpleConnection *gc, const char *text ) +static void prplcb_conn_notice(PurpleConnection *gc, const char *text) { - struct im_connection *ic = purple_ic_by_gc( gc ); - - if( ic != NULL ) - imcb_log( ic, "%s", text ); + struct im_connection *ic = purple_ic_by_gc(gc); + + if (ic != NULL) { + imcb_log(ic, "%s", text); + } } -static void prplcb_conn_report_disconnect_reason( PurpleConnection *gc, PurpleConnectionError reason, const char *text ) +static void prplcb_conn_report_disconnect_reason(PurpleConnection *gc, PurpleConnectionError reason, const char *text) { - struct im_connection *ic = purple_ic_by_gc( gc ); - + struct im_connection *ic = purple_ic_by_gc(gc); + /* PURPLE_CONNECTION_ERROR_NAME_IN_USE means concurrent login, should probably handle that. */ - if( ic != NULL ) - imcb_error( ic, "%s", text ); + if (ic != NULL) { + imcb_error(ic, "%s", text); + } } static PurpleConnectionUiOps bee_conn_uiops = @@ -754,71 +754,73 @@ static PurpleConnectionUiOps bee_conn_uiops = prplcb_conn_report_disconnect_reason, }; -static void prplcb_blist_update( PurpleBuddyList *list, PurpleBlistNode *node ) +static void prplcb_blist_update(PurpleBuddyList *list, PurpleBlistNode *node) { - if( node->type == PURPLE_BLIST_BUDDY_NODE ) - { - PurpleBuddy *bud = (PurpleBuddy*) node; - PurpleGroup *group = purple_buddy_get_group( bud ); - struct im_connection *ic = purple_ic_by_pa( bud->account ); + if (node->type == PURPLE_BLIST_BUDDY_NODE) { + PurpleBuddy *bud = (PurpleBuddy *) node; + PurpleGroup *group = purple_buddy_get_group(bud); + struct im_connection *ic = purple_ic_by_pa(bud->account); PurpleStatus *as; int flags = 0; - - if( ic == NULL ) + + if (ic == NULL) { return; - - if( bud->server_alias ) - imcb_rename_buddy( ic, bud->name, bud->server_alias ); - else if( bud->alias ) - imcb_rename_buddy( ic, bud->name, bud->alias ); - - if( group ) - imcb_add_buddy( ic, bud->name, purple_group_get_name( group ) ); - - flags |= purple_presence_is_online( bud->presence ) ? OPT_LOGGED_IN : 0; - flags |= purple_presence_is_available( bud->presence ) ? 0 : OPT_AWAY; - - as = purple_presence_get_active_status( bud->presence ); - - imcb_buddy_status( ic, bud->name, flags, purple_status_get_name( as ), - purple_status_get_attr_string( as, "message" ) ); - - imcb_buddy_times( ic, bud->name, - purple_presence_get_login_time( bud->presence ), - purple_presence_get_idle_time( bud->presence ) ); + } + + if (bud->server_alias) { + imcb_rename_buddy(ic, bud->name, bud->server_alias); + } else if (bud->alias) { + imcb_rename_buddy(ic, bud->name, bud->alias); + } + + if (group) { + imcb_add_buddy(ic, bud->name, purple_group_get_name(group)); + } + + flags |= purple_presence_is_online(bud->presence) ? OPT_LOGGED_IN : 0; + flags |= purple_presence_is_available(bud->presence) ? 0 : OPT_AWAY; + + as = purple_presence_get_active_status(bud->presence); + + imcb_buddy_status(ic, bud->name, flags, purple_status_get_name(as), + purple_status_get_attr_string(as, "message")); + + imcb_buddy_times(ic, bud->name, + purple_presence_get_login_time(bud->presence), + purple_presence_get_idle_time(bud->presence)); } } -static void prplcb_blist_new( PurpleBlistNode *node ) +static void prplcb_blist_new(PurpleBlistNode *node) { - if( node->type == PURPLE_BLIST_BUDDY_NODE ) - { - PurpleBuddy *bud = (PurpleBuddy*) node; - struct im_connection *ic = purple_ic_by_pa( bud->account ); - - if( ic == NULL ) + if (node->type == PURPLE_BLIST_BUDDY_NODE) { + PurpleBuddy *bud = (PurpleBuddy *) node; + struct im_connection *ic = purple_ic_by_pa(bud->account); + + if (ic == NULL) { return; - - imcb_add_buddy( ic, bud->name, NULL ); - - prplcb_blist_update( NULL, node ); + } + + imcb_add_buddy(ic, bud->name, NULL); + + prplcb_blist_update(NULL, node); } } -static void prplcb_blist_remove( PurpleBuddyList *list, PurpleBlistNode *node ) +static void prplcb_blist_remove(PurpleBuddyList *list, PurpleBlistNode *node) { /* - PurpleBuddy *bud = (PurpleBuddy*) node; - - if( node->type == PURPLE_BLIST_BUDDY_NODE ) - { - struct im_connection *ic = purple_ic_by_pa( bud->account ); - - if( ic == NULL ) - return; - - imcb_remove_buddy( ic, bud->name, NULL ); - } + PurpleBuddy *bud = (PurpleBuddy*) node; + + if( node->type == PURPLE_BLIST_BUDDY_NODE ) + { + struct im_connection *ic = purple_ic_by_pa( bud->account ); + + if( ic == NULL ) + return; + + imcb_remove_buddy( ic, bud->name, NULL ); + } */ } @@ -831,104 +833,108 @@ static PurpleBlistUiOps bee_blist_uiops = prplcb_blist_remove, }; -void prplcb_conv_new( PurpleConversation *conv ) +void prplcb_conv_new(PurpleConversation *conv) { - if( conv->type == PURPLE_CONV_TYPE_CHAT ) - { - struct im_connection *ic = purple_ic_by_pa( conv->account ); + if (conv->type == PURPLE_CONV_TYPE_CHAT) { + struct im_connection *ic = purple_ic_by_pa(conv->account); struct groupchat *gc; - - gc = imcb_chat_new( ic, conv->name ); - if( conv->title != NULL ) - { - imcb_chat_name_hint( gc, conv->title ); - imcb_chat_topic( gc, NULL, conv->title, 0 ); + + gc = imcb_chat_new(ic, conv->name); + if (conv->title != NULL) { + imcb_chat_name_hint(gc, conv->title); + imcb_chat_topic(gc, NULL, conv->title, 0); } conv->ui_data = gc; gc->data = conv; - + /* libpurple brokenness: Whatever. Show that we join right away, there's no clear "This is you!" signaling in _add_users so don't even try. */ - imcb_chat_add_buddy( gc, gc->ic->acc->user ); + imcb_chat_add_buddy(gc, gc->ic->acc->user); } } -void prplcb_conv_free( PurpleConversation *conv ) +void prplcb_conv_free(PurpleConversation *conv) { struct groupchat *gc = conv->ui_data; - - imcb_chat_free( gc ); + + imcb_chat_free(gc); } -void prplcb_conv_add_users( PurpleConversation *conv, GList *cbuddies, gboolean new_arrivals ) +void prplcb_conv_add_users(PurpleConversation *conv, GList *cbuddies, gboolean new_arrivals) { struct groupchat *gc = conv->ui_data; GList *b; - - for( b = cbuddies; b; b = b->next ) - { + + for (b = cbuddies; b; b = b->next) { PurpleConvChatBuddy *pcb = b->data; - - imcb_chat_add_buddy( gc, pcb->name ); + + imcb_chat_add_buddy(gc, pcb->name); } } -void prplcb_conv_del_users( PurpleConversation *conv, GList *cbuddies ) +void prplcb_conv_del_users(PurpleConversation *conv, GList *cbuddies) { struct groupchat *gc = conv->ui_data; GList *b; - - for( b = cbuddies; b; b = b->next ) - imcb_chat_remove_buddy( gc, b->data, "" ); + + for (b = cbuddies; b; b = b->next) { + imcb_chat_remove_buddy(gc, b->data, ""); + } } -void prplcb_conv_chat_msg( PurpleConversation *conv, const char *who, const char *message, PurpleMessageFlags flags, time_t mtime ) +void prplcb_conv_chat_msg(PurpleConversation *conv, const char *who, const char *message, PurpleMessageFlags flags, + time_t mtime) { struct groupchat *gc = conv->ui_data; PurpleBuddy *buddy; - + /* ..._SEND means it's an outgoing message, no need to echo those. */ - if( flags & PURPLE_MESSAGE_SEND ) + if (flags & PURPLE_MESSAGE_SEND) { return; - - buddy = purple_find_buddy( conv->account, who ); - if( buddy != NULL ) - who = purple_buddy_get_name( buddy ); - - imcb_chat_msg( gc, who, (char*) message, 0, mtime ); + } + + buddy = purple_find_buddy(conv->account, who); + if (buddy != NULL) { + who = purple_buddy_get_name(buddy); + } + + imcb_chat_msg(gc, who, (char *) message, 0, mtime); } -static void prplcb_conv_im( PurpleConversation *conv, const char *who, const char *message, PurpleMessageFlags flags, time_t mtime ) +static void prplcb_conv_im(PurpleConversation *conv, const char *who, const char *message, PurpleMessageFlags flags, + time_t mtime) { - struct im_connection *ic = purple_ic_by_pa( conv->account ); + struct im_connection *ic = purple_ic_by_pa(conv->account); PurpleBuddy *buddy; - + /* ..._SEND means it's an outgoing message, no need to echo those. */ - if( flags & PURPLE_MESSAGE_SEND ) + if (flags & PURPLE_MESSAGE_SEND) { return; - - buddy = purple_find_buddy( conv->account, who ); - if( buddy != NULL ) - who = purple_buddy_get_name( buddy ); - - imcb_buddy_msg( ic, (char*) who, (char*) message, 0, mtime ); + } + + buddy = purple_find_buddy(conv->account, who); + if (buddy != NULL) { + who = purple_buddy_get_name(buddy); + } + + imcb_buddy_msg(ic, (char *) who, (char *) message, 0, mtime); } /* No, this is not a ui_op but a signal. */ -static void prplcb_buddy_typing( PurpleAccount *account, const char *who, gpointer null ) +static void prplcb_buddy_typing(PurpleAccount *account, const char *who, gpointer null) { PurpleConversation *conv; PurpleConvIm *im; int state; - - if( ( conv = purple_find_conversation_with_account( PURPLE_CONV_TYPE_IM, who, account ) ) == NULL ) + + if ((conv = purple_find_conversation_with_account(PURPLE_CONV_TYPE_IM, who, account)) == NULL) { return; - + } + im = PURPLE_CONV_IM(conv); - switch( purple_conv_im_get_typing_state( im ) ) - { + switch (purple_conv_im_get_typing_state(im)) { case PURPLE_TYPING: state = OPT_TYPING; break; @@ -938,11 +944,11 @@ static void prplcb_buddy_typing( PurpleAccount *account, const char *who, gpoint default: state = 0; } - - imcb_buddy_typing( purple_ic_by_pa( account ), who, state ); + + imcb_buddy_typing(purple_ic_by_pa(account), who, state); } -static PurpleConversationUiOps bee_conv_uiops = +static PurpleConversationUiOps bee_conv_uiops = { prplcb_conv_new, /* create_conversation */ prplcb_conv_free, /* destroy_conversation */ @@ -961,78 +967,75 @@ static PurpleConversationUiOps bee_conv_uiops = NULL, /* send_confirm */ }; -struct prplcb_request_action_data -{ +struct prplcb_request_action_data { void *user_data, *bee_data; PurpleRequestActionCb yes, no; int yes_i, no_i; }; -static void prplcb_request_action_yes( void *data ) +static void prplcb_request_action_yes(void *data) { struct prplcb_request_action_data *pqad = data; - - if( pqad->yes ) - pqad->yes( pqad->user_data, pqad->yes_i ); - g_free( pqad ); + + if (pqad->yes) { + pqad->yes(pqad->user_data, pqad->yes_i); + } + g_free(pqad); } -static void prplcb_request_action_no( void *data ) +static void prplcb_request_action_no(void *data) { struct prplcb_request_action_data *pqad = data; - - if( pqad->no ) - pqad->no( pqad->user_data, pqad->no_i ); - g_free( pqad ); + + if (pqad->no) { + pqad->no(pqad->user_data, pqad->no_i); + } + g_free(pqad); } -static void *prplcb_request_action( const char *title, const char *primary, const char *secondary, - int default_action, PurpleAccount *account, const char *who, - PurpleConversation *conv, void *user_data, size_t action_count, - va_list actions ) +static void *prplcb_request_action(const char *title, const char *primary, const char *secondary, + int default_action, PurpleAccount *account, const char *who, + PurpleConversation *conv, void *user_data, size_t action_count, + va_list actions) { - struct prplcb_request_action_data *pqad; + struct prplcb_request_action_data *pqad; int i; char *q; - - pqad = g_new0( struct prplcb_request_action_data, 1 ); - - for( i = 0; i < action_count; i ++ ) - { + + pqad = g_new0(struct prplcb_request_action_data, 1); + + for (i = 0; i < action_count; i++) { char *caption; void *fn; - - caption = va_arg( actions, char* ); - fn = va_arg( actions, void* ); - - if( strstr( caption, "Accept" ) || strstr( caption, "OK" ) ) - { + + caption = va_arg(actions, char*); + fn = va_arg(actions, void*); + + if (strstr(caption, "Accept") || strstr(caption, "OK")) { pqad->yes = fn; pqad->yes_i = i; - } - else if( strstr( caption, "Reject" ) || strstr( caption, "Cancel" ) ) - { + } else if (strstr(caption, "Reject") || strstr(caption, "Cancel")) { pqad->no = fn; pqad->no_i = i; } } - + pqad->user_data = user_data; - + /* TODO: IRC stuff here :-( */ - q = g_strdup_printf( "Request: %s\n\n%s\n\n%s", title, primary, secondary ); - pqad->bee_data = query_add( local_bee->ui_data, purple_ic_by_pa( account ), q, - prplcb_request_action_yes, prplcb_request_action_no, g_free, pqad ); - - g_free( q ); - + q = g_strdup_printf("Request: %s\n\n%s\n\n%s", title, primary, secondary); + pqad->bee_data = query_add(local_bee->ui_data, purple_ic_by_pa(account), q, + prplcb_request_action_yes, prplcb_request_action_no, g_free, pqad); + + g_free(q); + return pqad; } /* static void prplcb_request_test() { - fprintf( stderr, "bla\n" ); + fprintf( stderr, "bla\n" ); } */ @@ -1047,38 +1050,40 @@ static PurpleRequestUiOps bee_request_uiops = NULL, }; -static void prplcb_privacy_permit_added( PurpleAccount *account, const char *name ) +static void prplcb_privacy_permit_added(PurpleAccount *account, const char *name) { - struct im_connection *ic = purple_ic_by_pa( account ); - - if( !g_slist_find_custom( ic->permit, name, (GCompareFunc) ic->acc->prpl->handle_cmp ) ) - ic->permit = g_slist_prepend( ic->permit, g_strdup( name ) ); + struct im_connection *ic = purple_ic_by_pa(account); + + if (!g_slist_find_custom(ic->permit, name, (GCompareFunc) ic->acc->prpl->handle_cmp)) { + ic->permit = g_slist_prepend(ic->permit, g_strdup(name)); + } } -static void prplcb_privacy_permit_removed( PurpleAccount *account, const char *name ) +static void prplcb_privacy_permit_removed(PurpleAccount *account, const char *name) { - struct im_connection *ic = purple_ic_by_pa( account ); + struct im_connection *ic = purple_ic_by_pa(account); void *n; - - n = g_slist_find_custom( ic->permit, name, (GCompareFunc) ic->acc->prpl->handle_cmp ); - ic->permit = g_slist_remove( ic->permit, n ); + + n = g_slist_find_custom(ic->permit, name, (GCompareFunc) ic->acc->prpl->handle_cmp); + ic->permit = g_slist_remove(ic->permit, n); } -static void prplcb_privacy_deny_added( PurpleAccount *account, const char *name ) +static void prplcb_privacy_deny_added(PurpleAccount *account, const char *name) { - struct im_connection *ic = purple_ic_by_pa( account ); - - if( !g_slist_find_custom( ic->deny, name, (GCompareFunc) ic->acc->prpl->handle_cmp ) ) - ic->deny = g_slist_prepend( ic->deny, g_strdup( name ) ); + struct im_connection *ic = purple_ic_by_pa(account); + + if (!g_slist_find_custom(ic->deny, name, (GCompareFunc) ic->acc->prpl->handle_cmp)) { + ic->deny = g_slist_prepend(ic->deny, g_strdup(name)); + } } -static void prplcb_privacy_deny_removed( PurpleAccount *account, const char *name ) +static void prplcb_privacy_deny_removed(PurpleAccount *account, const char *name) { - struct im_connection *ic = purple_ic_by_pa( account ); + struct im_connection *ic = purple_ic_by_pa(account); void *n; - - n = g_slist_find_custom( ic->deny, name, (GCompareFunc) ic->acc->prpl->handle_cmp ); - ic->deny = g_slist_remove( ic->deny, n ); + + n = g_slist_find_custom(ic->deny, name, (GCompareFunc) ic->acc->prpl->handle_cmp); + ic->deny = g_slist_remove(ic->deny, n); } static PurplePrivacyUiOps bee_privacy_uiops = @@ -1089,9 +1094,9 @@ static PurplePrivacyUiOps bee_privacy_uiops = prplcb_privacy_deny_removed, }; -static void prplcb_debug_print( PurpleDebugLevel level, const char *category, const char *arg_s ) +static void prplcb_debug_print(PurpleDebugLevel level, const char *category, const char *arg_s) { - fprintf( stderr, "DEBUG %s: %s", category, arg_s ); + fprintf(stderr, "DEBUG %s: %s", category, arg_s); } static PurpleDebugUiOps bee_debug_uiops = @@ -1099,23 +1104,23 @@ static PurpleDebugUiOps bee_debug_uiops = prplcb_debug_print, }; -static guint prplcb_ev_timeout_add( guint interval, GSourceFunc func, gpointer udata ) +static guint prplcb_ev_timeout_add(guint interval, GSourceFunc func, gpointer udata) { - return b_timeout_add( interval, (b_event_handler) func, udata ); + return b_timeout_add(interval, (b_event_handler) func, udata); } -static guint prplcb_ev_input_add( int fd, PurpleInputCondition cond, PurpleInputFunction func, gpointer udata ) +static guint prplcb_ev_input_add(int fd, PurpleInputCondition cond, PurpleInputFunction func, gpointer udata) { - return b_input_add( fd, cond | B_EV_FLAG_FORCE_REPEAT, (b_event_handler) func, udata ); + return b_input_add(fd, cond | B_EV_FLAG_FORCE_REPEAT, (b_event_handler) func, udata); } -static gboolean prplcb_ev_remove( guint id ) +static gboolean prplcb_ev_remove(guint id) { - b_event_remove( (gint) id ); + b_event_remove((gint) id); return TRUE; } -static PurpleEventLoopUiOps glib_eventloops = +static PurpleEventLoopUiOps glib_eventloops = { prplcb_ev_timeout_add, prplcb_ev_remove, @@ -1123,95 +1128,94 @@ static PurpleEventLoopUiOps glib_eventloops = prplcb_ev_remove, }; -static void *prplcb_notify_email( PurpleConnection *gc, const char *subject, const char *from, - const char *to, const char *url ) +static void *prplcb_notify_email(PurpleConnection *gc, const char *subject, const char *from, + const char *to, const char *url) { - struct im_connection *ic = purple_ic_by_gc( gc ); - - imcb_log( ic, "Received e-mail from %s for %s: %s <%s>", from, to, subject, url ); - + struct im_connection *ic = purple_ic_by_gc(gc); + + imcb_log(ic, "Received e-mail from %s for %s: %s <%s>", from, to, subject, url); + return NULL; } -static void *prplcb_notify_userinfo( PurpleConnection *gc, const char *who, PurpleNotifyUserInfo *user_info ) +static void *prplcb_notify_userinfo(PurpleConnection *gc, const char *who, PurpleNotifyUserInfo *user_info) { - struct im_connection *ic = purple_ic_by_gc( gc ); - GString *info = g_string_new( "" ); - GList *l = purple_notify_user_info_get_entries( user_info ); + struct im_connection *ic = purple_ic_by_gc(gc); + GString *info = g_string_new(""); + GList *l = purple_notify_user_info_get_entries(user_info); char *key; const char *value; int n; - - while( l ) - { + + while (l) { PurpleNotifyUserInfoEntry *e = l->data; - - switch( purple_notify_user_info_entry_get_type( e ) ) - { + + switch (purple_notify_user_info_entry_get_type(e)) { case PURPLE_NOTIFY_USER_INFO_ENTRY_PAIR: case PURPLE_NOTIFY_USER_INFO_ENTRY_SECTION_HEADER: - key = g_strdup( purple_notify_user_info_entry_get_label( e ) ); - value = purple_notify_user_info_entry_get_value( e ); - - if( key ) - { - strip_html( key ); - g_string_append_printf( info, "%s: ", key ); - - if( value ) - { - n = strlen( value ) - 1; - while( g_ascii_isspace( value[n] ) ) - n --; - g_string_append_len( info, value, n + 1 ); + key = g_strdup(purple_notify_user_info_entry_get_label(e)); + value = purple_notify_user_info_entry_get_value(e); + + if (key) { + strip_html(key); + g_string_append_printf(info, "%s: ", key); + + if (value) { + n = strlen(value) - 1; + while (g_ascii_isspace(value[n])) { + n--; + } + g_string_append_len(info, value, n + 1); } - g_string_append_c( info, '\n' ); - g_free( key ); + g_string_append_c(info, '\n'); + g_free(key); } - + break; case PURPLE_NOTIFY_USER_INFO_ENTRY_SECTION_BREAK: - g_string_append( info, "------------------------\n" ); + g_string_append(info, "------------------------\n"); break; } - + l = l->next; } - - imcb_log( ic, "User %s info:\n%s", who, info->str ); - g_string_free( info, TRUE ); - + + imcb_log(ic, "User %s info:\n%s", who, info->str); + g_string_free(info, TRUE); + return NULL; } static PurpleNotifyUiOps bee_notify_uiops = { - NULL, - prplcb_notify_email, - NULL, - NULL, - NULL, - NULL, - prplcb_notify_userinfo, + NULL, + prplcb_notify_email, + NULL, + NULL, + NULL, + NULL, + prplcb_notify_userinfo, }; -static void *prplcb_account_request_authorize( PurpleAccount *account, const char *remote_user, - const char *id, const char *alias, const char *message, gboolean on_list, - PurpleAccountRequestAuthorizationCb authorize_cb, PurpleAccountRequestAuthorizationCb deny_cb, void *user_data ) +static void *prplcb_account_request_authorize(PurpleAccount *account, const char *remote_user, + const char *id, const char *alias, const char *message, gboolean on_list, + PurpleAccountRequestAuthorizationCb authorize_cb, + PurpleAccountRequestAuthorizationCb deny_cb, void *user_data) { - struct im_connection *ic = purple_ic_by_pa( account ); + struct im_connection *ic = purple_ic_by_pa(account); char *q; - - if( alias ) - q = g_strdup_printf( "%s (%s) wants to add you to his/her contact " - "list. (%s)", alias, remote_user, message ); - else - q = g_strdup_printf( "%s wants to add you to his/her contact " - "list. (%s)", remote_user, message ); - - imcb_ask_with_free( ic, q, user_data, authorize_cb, deny_cb, NULL ); - g_free( q ); - + + if (alias) { + q = g_strdup_printf("%s (%s) wants to add you to his/her contact " + "list. (%s)", alias, remote_user, message); + } else { + q = g_strdup_printf("%s wants to add you to his/her contact " + "list. (%s)", remote_user, message); + } + + imcb_ask_with_free(ic, q, user_data, authorize_cb, deny_cb, NULL); + g_free(q); + return NULL; } @@ -1228,17 +1232,18 @@ extern PurpleXferUiOps bee_xfer_uiops; static void purple_ui_init() { - purple_connections_set_ui_ops( &bee_conn_uiops ); - purple_blist_set_ui_ops( &bee_blist_uiops ); - purple_conversations_set_ui_ops( &bee_conv_uiops ); - purple_request_set_ui_ops( &bee_request_uiops ); - purple_privacy_set_ui_ops( &bee_privacy_uiops ); - purple_notify_set_ui_ops( &bee_notify_uiops ); - purple_accounts_set_ui_ops( &bee_account_uiops ); - purple_xfers_set_ui_ops( &bee_xfer_uiops ); - - if( getenv( "BITLBEE_DEBUG" ) ) - purple_debug_set_ui_ops( &bee_debug_uiops ); + purple_connections_set_ui_ops(&bee_conn_uiops); + purple_blist_set_ui_ops(&bee_blist_uiops); + purple_conversations_set_ui_ops(&bee_conv_uiops); + purple_request_set_ui_ops(&bee_request_uiops); + purple_privacy_set_ui_ops(&bee_privacy_uiops); + purple_notify_set_ui_ops(&bee_notify_uiops); + purple_accounts_set_ui_ops(&bee_account_uiops); + purple_xfers_set_ui_ops(&bee_xfer_uiops); + + if (getenv("BITLBEE_DEBUG")) { + purple_debug_set_ui_ops(&bee_debug_uiops); + } } void purple_initmodule() @@ -1247,61 +1252,57 @@ void purple_initmodule() GList *prots; GString *help; char *dir; - - if( B_EV_IO_READ != PURPLE_INPUT_READ || - B_EV_IO_WRITE != PURPLE_INPUT_WRITE ) - { + + if (B_EV_IO_READ != PURPLE_INPUT_READ || + B_EV_IO_WRITE != PURPLE_INPUT_WRITE) { /* FIXME FIXME FIXME FIXME FIXME :-) */ - exit( 1 ); + exit(1); } - - dir = g_strdup_printf( "%s/purple", global.conf->configdir ); - purple_util_set_user_dir( dir ); - g_free( dir ); - - purple_debug_set_enabled( FALSE ); - purple_core_set_ui_ops( &bee_core_uiops ); - purple_eventloop_set_ui_ops( &glib_eventloops ); - if( !purple_core_init( "BitlBee") ) - { + + dir = g_strdup_printf("%s/purple", global.conf->configdir); + purple_util_set_user_dir(dir); + g_free(dir); + + purple_debug_set_enabled(FALSE); + purple_core_set_ui_ops(&bee_core_uiops); + purple_eventloop_set_ui_ops(&glib_eventloops); + if (!purple_core_init("BitlBee")) { /* Initializing the core failed. Terminate. */ - fprintf( stderr, "libpurple initialization failed.\n" ); + fprintf(stderr, "libpurple initialization failed.\n"); abort(); } - - if( proxytype != PROXY_NONE ) - { + + if (proxytype != PROXY_NONE) { PurpleProxyInfo *pi = purple_global_proxy_get_info(); - switch( proxytype ) - { + switch (proxytype) { case PROXY_SOCKS4: - purple_proxy_info_set_type( pi, PURPLE_PROXY_SOCKS4 ); + purple_proxy_info_set_type(pi, PURPLE_PROXY_SOCKS4); break; case PROXY_SOCKS5: - purple_proxy_info_set_type( pi, PURPLE_PROXY_SOCKS5 ); + purple_proxy_info_set_type(pi, PURPLE_PROXY_SOCKS5); break; case PROXY_HTTP: - purple_proxy_info_set_type( pi, PURPLE_PROXY_HTTP ); + purple_proxy_info_set_type(pi, PURPLE_PROXY_HTTP); break; - } - purple_proxy_info_set_host( pi, proxyhost ); - purple_proxy_info_set_port( pi, proxyport ); - purple_proxy_info_set_username( pi, proxyuser ); - purple_proxy_info_set_password( pi, proxypass ); + } + purple_proxy_info_set_host(pi, proxyhost); + purple_proxy_info_set_port(pi, proxyport); + purple_proxy_info_set_username(pi, proxyuser); + purple_proxy_info_set_password(pi, proxypass); } - - purple_set_blist( purple_blist_new() ); - + + purple_set_blist(purple_blist_new()); + /* No, really. So far there were ui_ops for everything, but now suddenly one needs to use signals for typing notification stuff. :-( */ - purple_signal_connect( purple_conversations_get_handle(), "buddy-typing", - &funcs, PURPLE_CALLBACK(prplcb_buddy_typing), NULL ); - purple_signal_connect( purple_conversations_get_handle(), "buddy-typed", - &funcs, PURPLE_CALLBACK(prplcb_buddy_typing), NULL ); - purple_signal_connect( purple_conversations_get_handle(), "buddy-typing-stopped", - &funcs, PURPLE_CALLBACK(prplcb_buddy_typing), NULL ); - - memset( &funcs, 0, sizeof( funcs ) ); + purple_signal_connect(purple_conversations_get_handle(), "buddy-typing", + &funcs, PURPLE_CALLBACK(prplcb_buddy_typing), NULL); + purple_signal_connect(purple_conversations_get_handle(), "buddy-typed", + &funcs, PURPLE_CALLBACK(prplcb_buddy_typing), NULL); + purple_signal_connect(purple_conversations_get_handle(), "buddy-typing-stopped", + &funcs, PURPLE_CALLBACK(prplcb_buddy_typing), NULL); + + memset(&funcs, 0, sizeof(funcs)); funcs.login = purple_login; funcs.init = purple_init; funcs.logout = purple_logout; @@ -1326,46 +1327,46 @@ void purple_initmodule() funcs.chat_leave = purple_chat_leave; funcs.chat_join = purple_chat_join; funcs.transfer_request = purple_transfer_request; - - help = g_string_new( "BitlBee libpurple module supports the following IM protocols:\n" ); - + + help = g_string_new("BitlBee libpurple module supports the following IM protocols:\n"); + /* Add a protocol entry to BitlBee's structures for every protocol - supported by this libpurple instance. */ - for( prots = purple_plugins_get_protocols(); prots; prots = prots->next ) - { + supported by this libpurple instance. */ + for (prots = purple_plugins_get_protocols(); prots; prots = prots->next) { PurplePlugin *prot = prots->data; struct prpl *ret; - + /* If we already have this one (as a native module), don't add a libpurple duplicate. */ - if( find_protocol( prot->info->id ) ) + if (find_protocol(prot->info->id)) { continue; - - ret = g_memdup( &funcs, sizeof( funcs ) ); + } + + ret = g_memdup(&funcs, sizeof(funcs)); ret->name = ret->data = prot->info->id; - if( strncmp( ret->name, "prpl-", 5 ) == 0 ) + if (strncmp(ret->name, "prpl-", 5) == 0) { ret->name += 5; - register_protocol( ret ); - - g_string_append_printf( help, "\n* %s (%s)", ret->name, prot->info->name ); - + } + register_protocol(ret); + + g_string_append_printf(help, "\n* %s (%s)", ret->name, prot->info->name); + /* libpurple doesn't define a protocol called OSCAR, but we need it to be compatible with normal BitlBee. */ - if( g_strcasecmp( prot->info->id, "prpl-aim" ) == 0 ) - { - ret = g_memdup( &funcs, sizeof( funcs ) ); + if (g_strcasecmp(prot->info->id, "prpl-aim") == 0) { + ret = g_memdup(&funcs, sizeof(funcs)); ret->name = "oscar"; ret->data = prot->info->id; - register_protocol( ret ); + register_protocol(ret); } } - - g_string_append( help, "\n\nFor used protocols, more information about available " - "settings can be found using \x02help purple <protocol name>\x02 " - "(create an account using that protocol first!)" ); - + + g_string_append(help, "\n\nFor used protocols, more information about available " + "settings can be found using \x02help purple <protocol name>\x02 " + "(create an account using that protocol first!)"); + /* Add a simple dynamically-generated help item listing all the supported protocols. */ - help_add_mem( &global.help, "purple", help->str ); - g_string_free( help, TRUE ); + help_add_mem(&global.help, "purple", help->str); + g_string_free(help, TRUE); } |