Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • protocols/purple/purple.c

    rb38f655 rba7618d  
    113113           servers anyway! */
    114114        if (!dir_fixed) {
     115                PurpleCertificatePool *pool;
    115116                irc_t *irc = acc->bee->ui_data;
    116117                char *dir;
     
    122123                purple_blist_load();
    123124                purple_prefs_load();
     125
     126                if (proxytype == PROXY_SOCKS4A) {
     127                        /* do this here after loading prefs. yes, i know, it sucks */
     128                        purple_prefs_set_bool("/purple/proxy/socks4_remotedns", TRUE);
     129                }
     130
     131                /* re-create the certificate cache directory */
     132                pool = purple_certificate_find_pool("x509", "tls_peers");
     133                dir = purple_certificate_pool_mkpath(pool, NULL);
     134                purple_build_dir(dir, 0700);
     135                g_free(dir);
     136
    124137                dir_fixed = TRUE;
    125138        }
     
    347360        if (!pd) {
    348361                return;
     362        }
     363
     364        while (ic->groupchats) {
     365                imcb_chat_free(ic->groupchats->data);
    349366        }
    350367
     
    634651        /* Call the fucker. */
    635652        callback = (void *) mi->callback;
    636         callback(&pb->node, menu->data);
     653        callback(&pb->node, mi->data);
    637654
    638655        return NULL;
     
    702719                        g_hash_table_replace(chat_hash, "passwd", g_strdup(password));
    703720                }
    704         }
     721
     722                g_free(pce);
     723        }
     724
     725        g_list_free(info);
    705726
    706727        serv_join_chat(purple_account_get_connection(pd->account), chat_hash);
    707728
    708         return NULL;
     729        g_hash_table_destroy(chat_hash);
     730
     731        return imcb_chat_new(ic, room);
    709732}
    710733
     
    728751static PurpleCoreUiOps bee_core_uiops =
    729752{
    730         NULL,
    731         NULL,
    732         purple_ui_init,
    733         NULL,
    734         prplcb_ui_info,
     753        NULL,                      /* ui_prefs_init */
     754        NULL,                      /* debug_ui_init */
     755        purple_ui_init,            /* ui_init */
     756        NULL,                      /* quit */
     757        prplcb_ui_info,            /* get_ui_info */
    735758};
    736759
     
    759782        purple_gg_buddylist_import(gc);
    760783
    761         if (gc->flags & PURPLE_CONNECTION_HTML) {
    762                 ic->flags |= OPT_DOES_HTML;
    763         }
     784        ic->flags |= OPT_DOES_HTML;
    764785}
    765786
     
    795816static PurpleConnectionUiOps bee_conn_uiops =
    796817{
    797         prplcb_conn_progress,
    798         prplcb_conn_connected,
    799         prplcb_conn_disconnected,
    800         prplcb_conn_notice,
    801         NULL,
    802         NULL,
    803         NULL,
    804         prplcb_conn_report_disconnect_reason,
     818        prplcb_conn_progress,                    /* connect_progress */
     819        prplcb_conn_connected,                   /* connected */
     820        prplcb_conn_disconnected,                /* disconnected */
     821        prplcb_conn_notice,                      /* notice */
     822        NULL,                                    /* report_disconnect */
     823        NULL,                                    /* network_connected */
     824        NULL,                                    /* network_disconnected */
     825        prplcb_conn_report_disconnect_reason,    /* report_disconnect_reason */
    805826};
    806827
     
    877898static PurpleBlistUiOps bee_blist_uiops =
    878899{
    879         NULL,
    880         prplcb_blist_new,
    881         NULL,
    882         prplcb_blist_update,
    883         prplcb_blist_remove,
     900        NULL,                      /* new_list */
     901        prplcb_blist_new,          /* new_node */
     902        NULL,                      /* show */
     903        prplcb_blist_update,       /* update */
     904        prplcb_blist_remove,       /* remove */
    884905};
    885906
     
    890911                struct groupchat *gc;
    891912
    892                 gc = imcb_chat_new(ic, conv->name);
    893                 if (conv->title != NULL) {
    894                         imcb_chat_name_hint(gc, conv->title);
     913                gc = bee_chat_by_title(ic->bee, ic, conv->name);
     914
     915                if (!gc) {
     916                        gc = imcb_chat_new(ic, conv->name);
     917                        if (conv->title != NULL) {
     918                                imcb_chat_name_hint(gc, conv->title);
     919                        }
     920                }
     921
     922                /* don't set the topic if it's just the name */
     923                if (conv->title != NULL && strcmp(conv->name, conv->title) != 0) {
    895924                        imcb_chat_topic(gc, NULL, conv->title, 0);
    896925                }
     
    935964}
    936965
    937 void prplcb_conv_chat_msg(PurpleConversation *conv, const char *who, const char *message, PurpleMessageFlags flags,
    938                           time_t mtime)
    939 {
     966/* Generic handler for IM or chat messages, covers write_chat, write_im and write_conv */
     967static void handle_conv_msg(PurpleConversation *conv, const char *who, const char *message, guint32 bee_flags, time_t mtime)
     968{
     969        struct im_connection *ic = purple_ic_by_pa(conv->account);
    940970        struct groupchat *gc = conv->ui_data;
    941971        PurpleBuddy *buddy;
    942 
    943         /* ..._SEND means it's an outgoing message, no need to echo those. */
    944         if (flags & PURPLE_MESSAGE_SEND) {
    945                 return;
    946         }
    947972
    948973        buddy = purple_find_buddy(conv->account, who);
     
    951976        }
    952977
    953         imcb_chat_msg(gc, who, (char *) message, 0, mtime);
    954 }
    955 
    956 static void prplcb_conv_im(PurpleConversation *conv, const char *who, const char *message, PurpleMessageFlags flags,
    957                            time_t mtime)
    958 {
    959         struct im_connection *ic = purple_ic_by_pa(conv->account);
    960         PurpleBuddy *buddy;
    961 
    962         /* ..._SEND means it's an outgoing message, no need to echo those. */
     978        if (conv->type == PURPLE_CONV_TYPE_IM) {
     979                imcb_buddy_msg(ic, (char *) who, (char *) message, bee_flags, mtime);
     980        } else if (gc) {
     981                imcb_chat_msg(gc, who, (char *) message, bee_flags, mtime);
     982        }
     983}
     984
     985/* Handles write_im and write_chat. Removes echoes of locally sent messages */
     986static void prplcb_conv_msg(PurpleConversation *conv, const char *who, const char *message, PurpleMessageFlags flags, time_t mtime)
     987{
     988        if (!(flags & PURPLE_MESSAGE_SEND)) {
     989                handle_conv_msg(conv, who, message, 0, mtime);
     990        }
     991}
     992
     993/* Handles write_conv. Only passes self messages from other locations through.
     994 * That is, only writes of PURPLE_MESSAGE_SEND.
     995 * There are more events which might be handled in the future, but some are tricky.
     996 * (images look like <img id="123">, what do i do with that?) */
     997static void prplcb_conv_write(PurpleConversation *conv, const char *who, const char *alias, const char *message,
     998                              PurpleMessageFlags flags, time_t mtime)
     999{
    9631000        if (flags & PURPLE_MESSAGE_SEND) {
    964                 return;
    965         }
    966 
    967         buddy = purple_find_buddy(conv->account, who);
    968         if (buddy != NULL) {
    969                 who = purple_buddy_get_name(buddy);
    970         }
    971 
    972         imcb_buddy_msg(ic, (char *) who, (char *) message, 0, mtime);
     1001                handle_conv_msg(conv, who, message, OPT_SELFMESSAGE, mtime);
     1002        }
    9731003}
    9741004
     
    10031033        prplcb_conv_new,           /* create_conversation  */
    10041034        prplcb_conv_free,          /* destroy_conversation */
    1005         prplcb_conv_chat_msg,      /* write_chat           */
    1006         prplcb_conv_im,            /* write_im             */
    1007         NULL,                      /* write_conv           */
     1035        prplcb_conv_msg,           /* write_chat           */
     1036        prplcb_conv_msg,           /* write_im             */
     1037        prplcb_conv_write,         /* write_conv           */
    10081038        prplcb_conv_add_users,     /* chat_add_users       */
    10091039        NULL,                      /* chat_rename_user     */
     
    11701200static PurpleRequestUiOps bee_request_uiops =
    11711201{
    1172         prplcb_request_input,
    1173         NULL,
    1174         prplcb_request_action,
    1175         NULL,
    1176         NULL,
    1177         prplcb_close_request,
    1178         NULL,
     1202        prplcb_request_input,      /* request_input */
     1203        NULL,                      /* request_choice */
     1204        prplcb_request_action,     /* request_action */
     1205        NULL,                      /* request_fields */
     1206        NULL,                      /* request_file */
     1207        prplcb_close_request,      /* close_request */
     1208        NULL,                      /* request_folder */
    11791209};
    11801210
     
    12171247static PurplePrivacyUiOps bee_privacy_uiops =
    12181248{
    1219         prplcb_privacy_permit_added,
    1220         prplcb_privacy_permit_removed,
    1221         prplcb_privacy_deny_added,
    1222         prplcb_privacy_deny_removed,
     1249        prplcb_privacy_permit_added,       /* permit_added */
     1250        prplcb_privacy_permit_removed,     /* permit_removed */
     1251        prplcb_privacy_deny_added,         /* deny_added */
     1252        prplcb_privacy_deny_removed,       /* deny_removed */
    12231253};
    12241254
     
    12301260static PurpleDebugUiOps bee_debug_uiops =
    12311261{
    1232         prplcb_debug_print,
     1262        prplcb_debug_print,        /* print */
    12331263};
    12341264
     
    12511281static PurpleEventLoopUiOps glib_eventloops =
    12521282{
    1253         prplcb_ev_timeout_add,
    1254         prplcb_ev_remove,
    1255         prplcb_ev_input_add,
    1256         prplcb_ev_remove,
     1283        prplcb_ev_timeout_add,     /* timeout_add */
     1284        prplcb_ev_remove,          /* timeout_remove */
     1285        prplcb_ev_input_add,       /* input_add */
     1286        prplcb_ev_remove,          /* input_remove */
    12571287};
     1288
     1289/* Absolutely no connection context at all. Thanks purple! brb crying */
     1290static void *prplcb_notify_message(PurpleNotifyMsgType type, const char *title,
     1291                                   const char *primary, const char *secondary)
     1292{
     1293        char *text = g_strdup_printf("%s%s - %s%s%s",
     1294                (type == PURPLE_NOTIFY_MSG_ERROR) ? "Error: " : "",
     1295                title,
     1296                primary ?: "",
     1297                (primary && secondary) ? " - " : "",
     1298                secondary ?: ""
     1299        );
     1300
     1301        if (local_bee->ui->log) {
     1302                local_bee->ui->log(local_bee, "purple", text);
     1303        }
     1304
     1305        g_free(text);
     1306
     1307        return NULL;
     1308}
    12581309
    12591310static void *prplcb_notify_email(PurpleConnection *gc, const char *subject, const char *from,
     
    13171368static PurpleNotifyUiOps bee_notify_uiops =
    13181369{
    1319         NULL,
    1320         prplcb_notify_email,
    1321         NULL,
    1322         NULL,
    1323         NULL,
    1324         NULL,
    1325         prplcb_notify_userinfo,
     1370        prplcb_notify_message,     /* notify_message */
     1371        prplcb_notify_email,       /* notify_email */
     1372        NULL,                      /* notify_emails */
     1373        NULL,                      /* notify_formatted */
     1374        NULL,                      /* notify_searchresults */
     1375        NULL,                      /* notify_searchresults_new_rows */
     1376        prplcb_notify_userinfo,    /* notify_userinfo */
    13261377};
    13271378
     
    13501401static PurpleAccountUiOps bee_account_uiops =
    13511402{
    1352         NULL,
    1353         NULL,
    1354         NULL,
    1355         prplcb_account_request_authorize,
    1356         NULL,
     1403        NULL,                              /* notify_added */
     1404        NULL,                              /* status_changed */
     1405        NULL,                              /* request_add */
     1406        prplcb_account_request_authorize,  /* request_authorize */
     1407        NULL,                              /* close_account_request */
    13571408};
    13581409
     
    13821433        char *dir;
    13831434
    1384         if (B_EV_IO_READ != PURPLE_INPUT_READ ||
    1385             B_EV_IO_WRITE != PURPLE_INPUT_WRITE) {
    1386                 /* FIXME FIXME FIXME FIXME FIXME :-) */
    1387                 exit(1);
    1388         }
     1435        g_assert((int) B_EV_IO_READ == (int) PURPLE_INPUT_READ);
     1436        g_assert((int) B_EV_IO_WRITE == (int) PURPLE_INPUT_WRITE);
    13891437
    13901438        dir = g_strdup_printf("%s/purple", global.conf->configdir);
     
    14041452                PurpleProxyInfo *pi = purple_global_proxy_get_info();
    14051453                switch (proxytype) {
     1454                case PROXY_SOCKS4A:
    14061455                case PROXY_SOCKS4:
    14071456                        purple_proxy_info_set_type(pi, PURPLE_PROXY_SOCKS4);
Note: See TracChangeset for help on using the changeset viewer.