static void on_screenshot_insert_as_link_show_cb (GtkWidget * as_link, PidginConversation * gtkconv) { PurpleConversation *conv = gtkconv->active_conv; /* * Depending on which protocol the conv is associated with, * html is supported or not... */ #if GTK_CHECK_VERSION(2,16,0) if (purple_conversation_get_features (conv) & PURPLE_CONNECTION_NO_IMAGES) gtk_menu_item_set_label (GTK_MENU_ITEM (as_link), SEND_AS_HTML_LINK_TXT); else gtk_menu_item_set_label (GTK_MENU_ITEM (as_link), SEND_AS_HTML_URL_TXT); #else if (purple_conversation_get_features (conv) & PURPLE_CONNECTION_NO_IMAGES) gtk_label_set_label (GTK_LABEL (GTK_BIN (as_link)->child), SEND_AS_HTML_LINK_TXT); else gtk_label_set_label (GTK_LABEL (GTK_BIN (as_link)->child), SEND_AS_HTML_URL_TXT); #endif }
/** The user wants to insert a sreenshot. */ static void on_screenshot_insert_menuitem_activate_cb (GtkWidget * screenshot_insert_menuitem, PidginConversation *gtkconv) { PurplePlugin *plugin = purple_plugins_find_with_id (PLUGIN_ID); if (!strcmp (purple_prefs_get_string (PREF_SEND_TYPE), "img-ftp-http")) { PurpleConversation *conv = gtkconv->active_conv; /* Direct IM of image is allowed by current protocol */ if (!(purple_conversation_get_features (conv) & PURPLE_CONNECTION_NO_IMAGES)) { send_as_image (NULL, gtkconv); } else if (strcmp(purple_prefs_get_string (PREF_FTP_REMOTE_URL), "") && strcmp(purple_prefs_get_string (PREF_FTP_USERNAME), "") && strcmp(purple_prefs_get_string (PREF_FTP_PASSWORD), "")) { send_as_ftp_link (NULL, gtkconv); } else if (strcmp (purple_prefs_get_string (PREF_UPLOAD_TO), HOST_DISABLED)) { send_as_link (NULL, gtkconv); } else { purple_notify_error (plugin, PLUGIN_NAME, PLUGIN_ERROR, PLUGIN_CONFIGURE_ERROR); plugin_stop (plugin); } } }
static void attach_to_conv(PurpleConversation *conv, gpointer null) { PidginConversation *gtkconv = PIDGIN_CONVERSATION(conv); GtkWidget *box, *sep, *counter, *menus; GtkIMHtml *imhtml; box = gtkconv->toolbar; imhtml = GTK_IMHTML(gtkconv->imhtml); /* Disable widgets that decorate or add link to composing text * because Twitter cannot receive marked up string. For lean-view * and wide-view, see pidgin/gtkimhtmltoolbar.c. */ menus = g_object_get_data(G_OBJECT(box), "lean-view"); if(menus) { gtk_widget_set_sensitive(GTK_WIDGET(menus), FALSE); } menus = g_object_get_data(G_OBJECT(box), "wide-view"); if(menus) { gtk_widget_set_sensitive(GTK_WIDGET(menus), FALSE); } purple_conversation_set_features( gtkconv->active_conv, purple_conversation_get_features(gtkconv->active_conv) & ~PURPLE_CONNECTION_HTML); /* check if the counter is enabled */ if(!purple_prefs_get_bool(OPT_COUNTER)) return; /* get counter object */ counter = g_object_get_data(G_OBJECT(box), PLUGIN_ID "-counter"); g_return_if_fail(counter == NULL); /* make counter object */ counter = gtk_label_new(NULL); gtk_widget_set_name(counter, "counter_label"); gtk_label_set_text(GTK_LABEL(counter), "0"); gtk_box_pack_end(GTK_BOX(box), counter, FALSE, FALSE, 0); gtk_widget_show_all(counter); g_object_set_data(G_OBJECT(box), PLUGIN_ID "-counter", counter); /* make separator object */ sep = gtk_vseparator_new(); gtk_box_pack_end(GTK_BOX(box), sep, FALSE, FALSE, 0); gtk_widget_show_all(sep); g_object_set_data(G_OBJECT(box), PLUGIN_ID "-sep", sep); /* connect to signals */ g_signal_connect(G_OBJECT(gtkconv->entry_buffer), "insert_text", G_CALLBACK(insert_text_cb), conv); g_signal_connect(G_OBJECT(gtkconv->entry_buffer), "delete_range", G_CALLBACK(delete_text_cb), conv); /* redraw window */ gtk_widget_queue_draw(pidgin_conv_get_window(gtkconv)->window); }
static gboolean _elim_strippable ( PurpleConversation *conv , PurpleMessageFlags flag ) { PurpleConnectionFlags feat = purple_conversation_get_features( conv ); PurpleAccount *acct = purple_conversation_get_account ( conv ); const char *proto = purple_account_get_protocol_id ( acct ); // µblog plugin gets this wrong: if( strstr( (proto ? proto : "") , "-mbpurple-" ) ) feat = feat|PURPLE_CONNECTION_HTML; return ( (feat & PURPLE_CONNECTION_HTML) && //(flag & PURPLE_MESSAGE_RECV ) && !(flag & PURPLE_MESSAGE_RAW ) ) ? TRUE : FALSE; }
/** * A function to send a chat or im message to the specific conversation * without emitting "sending-im" or "sending-chat" signal, which would * cause an infinite loop for this plugin. * * taken from conversation.c with signal emission removed. */ static void splitter_common_send(PurpleConversation *conv, const char *message, PurpleMessageFlags msgflags) { PurpleConversationType type; PurpleAccount *account; PurpleConnection *gc; char *sent = NULL; if (strlen(message) == 0) return; account = purple_conversation_get_account(conv); #if PURPLE_VERSION_CHECK(3,0,0) gc = purple_conversation_get_connection(conv); #else gc = purple_conversation_get_gc(conv); #endif g_return_if_fail(account != NULL); g_return_if_fail(gc != NULL); type = purple_conversation_get_type(conv); if ((purple_conversation_get_features(conv) & PURPLE_CONNECTION_HTML) && !(msgflags & PURPLE_MESSAGE_RAW)) { sent = purple_markup_linkify(message); } else sent = g_strdup(message); msgflags |= PURPLE_MESSAGE_SEND; splitter_injected_message = TRUE; if (type == PURPLE_CONV_TYPE_IM) { if (sent != NULL && sent[0] != '\0') purple_conv_im_send_with_flags(PURPLE_CONV_IM(conv), sent, msgflags); } else { if (sent != NULL && sent[0] != '\0') purple_conv_chat_send_with_flags(PURPLE_CONV_CHAT(conv), sent, msgflags); } splitter_injected_message = FALSE; g_free(sent); }
static void _elim_conv_args ( xmlnode *alist, PurpleConversation *conv ) { PurpleAccount *acct = purple_conversation_get_account( conv ); const char *aname = purple_account_get_username ( acct ); const char *proto = purple_account_get_protocol_id ( acct ); const char *title = purple_conversation_get_title ( conv ); const char *cname = purple_conversation_get_name ( conv ); PurpleConnectionFlags cflag = purple_conversation_get_features( conv ); PurpleConversationType ctype = purple_conversation_get_type ( conv ); fprintf( stderr, "(_elim_conv_args)\n" ); AL_STR ( alist, "account-name" , aname ); AL_STR ( alist, "im-protocol" , proto ); AL_PTR ( alist, "account-uid" , acct ); AL_PTR ( alist, "conv-uid" , conv ); AL_STR ( alist, "conv-name" , cname ); AL_STR ( alist, "conv-title" , title ? title : cname ); AL_ENUM( alist, "conv-type" , ctype , ":conversation-type" ); AL_ENUM( alist, "conv-features", cflag , ":connection-flags" ); }
xmlnode * _h_elim_add_chat( const char *name , const char *id , SEXP_VALUE *args , gpointer data ) { ASSERT_ALISTP( args, id, name ); elim_ping(); const char *aname = ALIST_VAL_STR ( args, "account-name" ); const char *proto = ALIST_VAL_STR ( args, "im-protocol" ); const char *alias = ALIST_VAL_STR ( args, "chat-alias" ); gpointer auid = ALIST_VAL_PTR ( args, "account-uid" ); GHashTable *opts = ALIST_VAL_ALIST( args, "chat-options" ); GHashTable *options = __ghash_str_sexp__str_str( opts ); PurpleAccount *acct = auid ? find_acct_by_uid( auid ) : purple_accounts_find( aname, proto ); if( !acct ) { sexp_val_free( args ); return response_error( ENXIO, id, name, "unknown account" ); } // cook up a chat node. if it's already on our buddy list, uncook it // and use the old one instead (name should be unique per account // so the operation is reasonable - we cannot supply a name as this // parameter can be delegated to the plugin to generate automatically): // this will trigger a new_node call, and possibly a remove call PurpleChat *chat = purple_chat_new( acct, alias, options ); const char *chn = purple_chat_get_name( chat ); PurpleChat *ch_2 = purple_blist_find_chat( acct, chn ); if( ch_2 ) { fprintf( stderr, "(elim-debug chat already exists)\n" ); purple_blist_remove_chat( chat ); chat = ch_2; chn = purple_chat_get_name( chat ); purple_blist_alias_chat( chat, alias ); } fprintf( stderr, "(elim-debug adding chat to blist)\n" ); purple_blist_add_chat( chat, NULL, NULL ); // if we have a conversation already, prod the client to show it fprintf( stderr, "(elim-debug looking for conversation)\n" ); PurpleConversation *conv = purple_find_conversation_with_account( PURPLE_CONV_TYPE_CHAT, chn, acct ); if( conv ) purple_conversation_present( conv ); xmlnode *rval = xnode_new( "alist" ); AL_STR( rval, "account-name", purple_account_get_username (acct) ); AL_STR( rval, "im-protocol" , purple_account_get_protocol_id(acct) ); AL_PTR( rval, "account-uid" , acct ); AL_STR( rval, "chat-name" , chn ); if( conv ) { PurpleConversationType pct = purple_conversation_get_type ( conv ); PurpleConnectionFlags pcf = purple_conversation_get_features( conv ); AL_PTR ( rval, "conv-uid" , conv ); AL_STR ( rval, "conv-name" , purple_conversation_get_name (conv) ); AL_STR ( rval, "conv-title" , purple_conversation_get_title(conv) ); AL_ENUM( rval, "conv-type" , pct, ":conversation-type" ); AL_ENUM( rval, "conv-features", pcf, ":connection-flags" ); } sexp_val_free( args ); return response_value( 0, id, name, rval ); }