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 ); PurpleStatus *as; int flags = 0; 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 ) ); } }
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 ) ); }
void prplcb_conv_new(PurpleConversation *conv) { if (conv->type == PURPLE_CONV_TYPE_CHAT) { struct im_connection *ic = purple_ic_by_pa(conv->account); struct groupchat *gc; gc = bee_chat_by_title(ic->bee, ic, conv->name); if (!gc) { gc = imcb_chat_new(ic, conv->name); if (conv->title != NULL) { imcb_chat_name_hint(gc, conv->title); } } /* don't set the topic if it's just the name */ if (conv->title != NULL && strcmp(conv->name, conv->title) != 0) { 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); } }
void* prplcb_request_input(const char *title, const char *primary, const char *secondary, const char *default_value, gboolean multiline, gboolean masked, gchar *hint, const char *ok_text, GCallback ok_cb, const char *cancel_text, GCallback cancel_cb, PurpleAccount *account, const char *who, PurpleConversation *conv, void *user_data) { struct im_connection *ic = purple_ic_by_pa(account); struct purple_data *pd = ic->proto_data; struct request_input_data *ri = g_new0(struct request_input_data, 1); guint id = pd->next_request_id++; ri->id = id; ri->ic = ic; ri->buddy = g_strdup_printf("%s_%u", PURPLE_REQUEST_HANDLE, id); ri->data_callback = (ri_callback_t) ok_cb; ri->user_data = user_data; g_hash_table_insert(pd->input_requests, GUINT_TO_POINTER(id), ri); imcb_add_buddy(ic, ri->buddy, NULL); if (title && *title) { imcb_buddy_msg(ic, ri->buddy, title, 0, 0); } if (primary && *primary) { imcb_buddy_msg(ic, ri->buddy, primary, 0, 0); } if (secondary && *secondary) { imcb_buddy_msg(ic, ri->buddy, secondary, 0, 0); } return ri; }
static void prplcb_privacy_deny_removed( PurpleAccount *account, const char *name ) { 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 ); }
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 ); PurpleBuddy *buddy; /* ..._SEND means it's an outgoing message, no need to echo those. */ 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 ); }
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 ) return; imcb_add_buddy( ic, bud->name, NULL ); prplcb_blist_update( NULL, node ); } }
void prplcb_conv_new( PurpleConversation *conv ) { 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 ); 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 ); } }
/* Generic handler for IM or chat messages, covers write_chat, write_im and write_conv */ static void handle_conv_msg(PurpleConversation *conv, const char *who, const char *message, guint32 bee_flags, time_t mtime) { struct im_connection *ic = purple_ic_by_pa(conv->account); struct groupchat *gc = conv->ui_data; PurpleBuddy *buddy; buddy = purple_find_buddy(conv->account, who); if (buddy != NULL) { who = purple_buddy_get_name(buddy); } if (conv->type == PURPLE_CONV_TYPE_IM) { imcb_buddy_msg(ic, (char *) who, (char *) message, bee_flags, mtime); } else if (gc) { imcb_chat_msg(gc, who, (char *) message, bee_flags, mtime); } }
static void prplcb_xfer_new(PurpleXfer *xfer) { if (purple_xfer_get_type(xfer) == PURPLE_XFER_RECEIVE) { struct prpl_xfer_data *px = g_new0(struct prpl_xfer_data, 1); xfer->ui_data = px; px->xfer = xfer; px->fn = mktemp(g_strdup("/tmp/bitlbee-purple-ft.XXXXXX")); px->fd = -1; px->ic = purple_ic_by_pa(xfer->account); purple_xfer_set_local_filename(xfer, px->fn); /* Sadly the xfer struct is still empty ATM so come back after the caller is done. */ b_timeout_add(0, prplcb_xfer_new_send_cb, xfer); } else {
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 ); 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 ); return NULL; }
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; int i; char *q; 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" ) ) { pqad->yes = fn; pqad->yes_i = i; } 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 ); return pqad; }
/* No, this is not a ui_op but a signal. */ 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 ) return; im = PURPLE_CONV_IM(conv); switch( purple_conv_im_get_typing_state( im ) ) { case PURPLE_TYPING: state = OPT_TYPING; break; case PURPLE_TYPED: state = OPT_THINKING; break; default: state = 0; } imcb_buddy_typing( purple_ic_by_pa( account ), who, state ); }
static gboolean prplcb_xfer_new_send_cb( gpointer data, gint fd, b_input_condition cond ) { PurpleXfer *xfer = data; struct im_connection *ic = purple_ic_by_pa( xfer->account ); struct prpl_xfer_data *px = g_new0( struct prpl_xfer_data, 1 ); PurpleBuddy *buddy; const char *who; buddy = purple_find_buddy( xfer->account, xfer->who ); who = buddy ? purple_buddy_get_name( buddy ) : xfer->who; /* TODO(wilmer): After spreading some more const goodness in BitlBee, remove the evil cast below. */ px->ft = imcb_file_send_start( ic, (char*) who, xfer->filename, xfer->size ); px->ft->data = px; px->xfer = data; px->xfer->ui_data = px; px->ft->accept = prpl_xfer_accept; px->ft->canceled = prpl_xfer_canceled; px->ft->write_request = prpl_xfer_write_request; return FALSE; }
static struct im_connection *purple_ic_by_gc( PurpleConnection *gc ) { return purple_ic_by_pa( purple_connection_get_account( gc ) ); }