in prpl/chime.c [201:260]
static void chime_purple_login(PurpleAccount *account)
{
PurpleConnection *conn = purple_account_get_connection(account);
load_seen_plugin();
const gchar *devtoken = purple_account_get_string(account, "devtoken", NULL);
/* Generate a stable device-id based on on the host identity and account name.
* This helps prevent an explosion of separate "devices" being tracked on
* the Chime service side, as we delete and recreate accounts. */
if (!devtoken || !devtoken[0]) {
unsigned char machine_id[16];
get_machine_id(machine_id, sizeof(machine_id));
GChecksum *sum = g_checksum_new(G_CHECKSUM_SHA1);
g_checksum_update(sum, machine_id, sizeof(machine_id));
const char *user = purple_account_get_username(account);
g_checksum_update(sum, (void *)user, strlen(user));
purple_account_set_string(account, "devtoken", g_checksum_get_string(sum));
g_checksum_free(sum);
devtoken = purple_account_get_string(account, "devtoken", NULL);
}
const gchar *server = purple_account_get_string(account, "server", NULL);
const gchar *token = purple_account_get_string(account, "token", NULL);
purple_connection_update_progress(conn, _("Connecting..."), 0, 100);
struct purple_chime *pc = g_new0(struct purple_chime, 1);
purple_connection_set_protocol_data(conn, pc);
purple_chime_init_meetings(conn);
purple_chime_init_conversations(conn);
purple_chime_init_chats(conn);
purple_chime_init_messages(conn);
pc->cxn = chime_connection_new(purple_account_get_username(account),
server, devtoken, token);
g_signal_connect(pc->cxn, "notify::session-token",
G_CALLBACK(on_session_token_changed), conn);
g_signal_connect(pc->cxn, "authenticate",
G_CALLBACK(on_chime_authenticate), conn);
g_signal_connect(pc->cxn, "connected",
G_CALLBACK(on_chime_connected), conn);
g_signal_connect(pc->cxn, "disconnected",
G_CALLBACK(on_chime_disconnected), conn);
g_signal_connect(pc->cxn, "progress",
G_CALLBACK(on_chime_progress), conn);
g_signal_connect(pc->cxn, "new-conversation",
G_CALLBACK(on_chime_new_conversation), conn);
g_signal_connect(pc->cxn, "new-meeting",
G_CALLBACK(on_chime_new_meeting), conn);
/* We don't use 'conn' for this one as we don't want it disconnected
on close, and it doesn't use it anyway. */
g_signal_connect(pc->cxn, "log-message",
G_CALLBACK(on_chime_log_message), NULL);
chime_connection_connect(pc->cxn);
}