static void chime_purple_login()

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);
}