1 #include "internal.h"  // #defines needed for Gaim headers
2 
3 #include <blist.h>
4 #include <debug.h>
5 #include <gtkutils.h>
6 
7 #include "pe_blist.h"
8 #include "state.h"
9 #include "nls.h"
10 
PE_get_buddy_default_autoencrypt(const PurpleAccount * account,const char * buddyname)11 gboolean PE_get_buddy_default_autoencrypt(const PurpleAccount* account, const char* buddyname) {
12    PurpleBuddy *buddy;
13    gboolean retval;
14 
15    purple_debug(PURPLE_DEBUG_MISC, "pidgin-encryption",
16               "get_buddy_default_autoencrypt for %p:%s\n", account, buddyname);
17 
18    if (!account) return FALSE;
19 
20    buddy = purple_find_buddy((PurpleAccount*)account, buddyname);
21 
22    if (buddy) {
23       if (!buddy->node.settings) {
24          /* Some users have been getting a crash because buddy->node.settings is/was
25             null.  I can't replicate the problem on my system...  So we sanity check
26             until the bug in Gaim is found/fixed */
27          purple_debug(PURPLE_DEBUG_MISC, "pidgin-encryption",
28                     "Bad buddy settings for %s\n", buddyname);
29          return FALSE;
30       }
31 
32       retval = purple_blist_node_get_bool(&buddy->node, "PE_Auto_Encrypt");
33       purple_debug(PURPLE_DEBUG_MISC, "pidgin-encryption", "Found buddy:%s:%d\n", buddyname, retval);
34 
35       return retval;
36    }
37 
38    purple_debug(PURPLE_DEBUG_MISC, "pidgin-encryption", "No setting found for buddy:%s\n", buddyname);
39    return FALSE;
40 }
41 
buddy_autoencrypt_callback(PurpleBuddy * buddy,gpointer data)42 static void buddy_autoencrypt_callback(PurpleBuddy* buddy, gpointer data) {
43    gboolean setting;
44 
45    purple_debug(PURPLE_DEBUG_INFO, "pidgin-encryption",
46               "encrypt callback hit (%p) %s\n", buddy, buddy->name);
47 
48    setting = purple_blist_node_get_bool(&buddy->node, "PE_Auto_Encrypt");
49    purple_blist_node_set_bool(&buddy->node, "PE_Auto_Encrypt", !setting);
50 
51    /* could iterate through conversations to set encryption status */
52    /* PE_set_tx_encryption(buddy->account, buddy->name, !setting); */
53 }
54 
PE_buddy_menu_cb(PurpleBlistNode * node,GList ** menu,void * data)55 void PE_buddy_menu_cb(PurpleBlistNode* node, GList **menu, void* data) {
56    PurpleMenuAction *action;
57    PurpleBuddy* buddy;
58    gboolean setting;
59 
60    if (!PURPLE_BLIST_NODE_IS_BUDDY(node)) return;
61    /* else upcast to the buddy that we know it is: */
62    buddy = (PurpleBuddy*) node;
63 
64    setting = purple_blist_node_get_bool(node, "PE_Auto_Encrypt");
65 
66    if (setting) {
67       action = purple_menu_action_new(_("Turn Auto-Encrypt Off"), /* it is now turned on */
68                                           PURPLE_CALLBACK(buddy_autoencrypt_callback), buddy->account->gc, 0);
69    } else {
70       action = purple_menu_action_new(_("Turn Auto-Encrypt On"),  /* it is now turned off */
71                                           PURPLE_CALLBACK(buddy_autoencrypt_callback), buddy->account->gc, 0);
72    }
73    *menu = g_list_append(*menu, action);
74 }
75