Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/EionRobb/skype4pidgin.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'skype_events.c')
-rw-r--r--skype_events.c1467
1 files changed, 0 insertions, 1467 deletions
diff --git a/skype_events.c b/skype_events.c
deleted file mode 100644
index f413eb6..0000000
--- a/skype_events.c
+++ /dev/null
@@ -1,1467 +0,0 @@
-/*
- * Skype plugin for libpurple/Pidgin/Adium
- * Written by: Eion Robb <eionrobb@gmail.com>
- *
- * This plugin uses the Skype API to show your contacts in libpurple, and send/receive
- * chat messages.
- * It requires the Skype program to be running.
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-
-#ifndef INCLUDED_LIBSKYPE_C
-# error "Don't compile this file directly. Just compile libskype.c instead."
-#endif
-
-#include <ft.h>
-
-void skype_auth_allow(gpointer sender);
-void skype_auth_deny(gpointer sender);
-static gboolean skype_handle_received_message(char *message);
-gint skype_find_filetransfer(PurpleXfer *transfer, char *skypeid);
-void skype_accept_transfer(PurpleXfer *transfer);
-void skype_decline_transfer(PurpleXfer *transfer);
-static SkypeChat *skype_find_chat(const gchar *chat_id, PurpleAccount *this_account);
-gint skype_find_chat_compare_func(PurpleConversation *conv, char *chat_id);
-static void purple_xfer_set_status(PurpleXfer *xfer, PurpleXferStatusType status);
-void skype_chat_password_cb(SkypeChat *chat, const gchar *entry);
-void skype_call_accept_cb(gchar *call);
-void skype_call_accept_video_cb(gchar *call);
-void skype_call_reject_cb(gchar *call);
-void skype_call_ignore_cb(gchar *call);
-void skype_call_voicemail_cb(gchar *call);
-void skype_call_forward_cb(gchar *call);
-gboolean skype_sync_skype_close(PurpleConnection *gc);
-gboolean handle_complete_message(int messagenumber);
-
-gboolean skype_update_buddy_status(PurpleBuddy *buddy);
-void skype_update_buddy_alias(PurpleBuddy *buddy);
-void skype_update_buddy_icon(PurpleBuddy *buddy);
-static PurpleAccount *skype_get_account(PurpleAccount *account);
-const char *skype_get_account_username(PurpleAccount *acct);
-gchar *skype_get_user_info(const gchar *username, const gchar *property);
-gchar *skype_strdup_withhtml(const gchar *src);
-void skype_put_buddies_in_groups();
-void skype_get_chatmessage_info(int message);
-void set_skype_buddy_attribute(SkypeBuddy *sbuddy, const gchar *skype_buddy_property, const gchar *value);
-SkypeBuddy *skype_buddy_new(PurpleBuddy *buddy);
-
-char *skype_send_message(char *message, ...);
-//dont use this unless you know what you're doing:
-void skype_send_message_nowait(char *message, ...);
-
-static time_t last_pong = 0;
-static GHashTable *messages_table = NULL;
-static GHashTable *groups_table = NULL;
-
-typedef enum _SkypeMessageType {
- SKYPE_MESSAGE_UNSET = 0,
- SKYPE_MESSAGE_OTHER,
- SKYPE_MESSAGE_TEXT,
- SKYPE_MESSAGE_EMOTE,
- SKYPE_MESSAGE_ADD,
- SKYPE_MESSAGE_LEFT,
- SKYPE_MESSAGE_KICKED,
- SKYPE_MESSAGE_TOPIC,
- SKYPE_MESSAGE_EDITED
-} SkypeMessageType;
-
-typedef struct _SkypeMessage {
- //Required properties
- PurpleAccount *account;
- SkypeMessageType type;
- PurpleMessageFlags flags; //send or recv
- gchar *chatname;
-
- //Optional properties
- gchar *body; //topic, text, emote
- gchar *from_handle; //topic, text, emote, left
- gint timestamp; //text, emote
- gchar **users; //add, kicked
- gchar *leavereason; //left
-} SkypeMessage;
-
-/*
- This function must only be called from the main loop, using purple_timeout_add
-*/
-static gboolean
-skype_handle_received_message(char *message)
-{
- char command[255];
- char **string_parts = NULL;
- PurpleAccount *this_account;
- PurpleConnection *gc;
- const char *my_username;
- PurpleBuddy *buddy;
- SkypeBuddy *sbuddy;
- SkypeChat *chat;
- char *body;
- char *body_html;
- char *msg_num;
- char *sender;
- char *type;
- int mtime;
- char *chatname;
- char *temp;
- //char *chat_type;
- char **chatusers = NULL;
- PurpleXfer *transfer = NULL;
- PurpleConversation *conv = NULL;
- GList *glist_temp = NULL;
- int i;
- PurpleGroup *temp_group;
- //PurpleStatusPrimitive primitive;
- SkypeMessage *skypemessage;
-
- sscanf(message, "%s ", command);
- this_account = skype_get_account(NULL);
- if (this_account == NULL)
- return FALSE;
- gc = purple_account_get_connection(this_account);
- my_username = skype_get_account_username(this_account);
- string_parts = g_strsplit(message, " ", 4);
-
- if (g_str_equal(command, "PONG"))
- {
- last_pong = time(NULL);
- } else if (g_str_equal(command, "USERSTATUS"))
- {
-
- } else if (g_str_equal(command, "CONNSTATUS"))
- {
- if (g_str_equal(string_parts[1], "LOGGEDOUT"))
- {
- //need to make this synchronous :(
- if (gc != NULL)
- purple_connection_error_reason(gc, PURPLE_CONNECTION_ERROR_NETWORK_ERROR, _("\nSkype program closed"));
- //purple_timeout_add(0, (GSourceFunc)skype_sync_skype_close, gc);
- }
- } else if (g_str_equal(command, "USER"))
- {
- buddy = purple_find_buddy(this_account, string_parts[1]);
- if (buddy != NULL)
- {
- sbuddy = buddy->proto_data;
- if (g_str_equal(string_parts[2], "ONLINESTATUS"))
- {
- //the status 'id' is in string_parts[3]
-
- //special cases:
- if (g_str_equal(string_parts[3], "SKYPEOUT"))
- {
- set_skype_buddy_attribute(sbuddy, "MOOD_TEXT", _("SkypeOut"));
- }
- if (g_str_equal(string_parts[3], "UNKNOWN"))
- {
- //user doesn't exist
- purple_blist_remove_buddy(buddy);
- purple_notify_error(gc, "Error", "User does not exist", "The user does not exist in Skype");
- buddy = NULL;
- } else {
- PurpleStatus *status = purple_presence_get_active_status(purple_buddy_get_presence(buddy));
- //Dont say we got their status unless its changed
- if (!status || !g_str_equal(purple_status_get_id(status), string_parts[3]))
- {
- purple_prpl_got_user_status(this_account, string_parts[1], string_parts[3], NULL);
- }
- //dont update buddy icon/mood for offline/skypeout users
- if (!g_str_equal(string_parts[3], "OFFLINE") && !g_str_equal(string_parts[3], "SKYPEOUT"))
- {
- skype_send_message_nowait("GET USER %s MOOD_TEXT", string_parts[1]);
- skype_update_buddy_icon(buddy);
- }
- }
- } else if (g_str_equal(string_parts[2], "DISPLAYNAME"))
- {
- if (strlen(g_strstrip(string_parts[3])))
- purple_blist_server_alias_buddy(buddy, string_parts[3]);
- } else if (g_str_equal(string_parts[2], "FULLNAME"))
- {
- if (strlen(g_strstrip(string_parts[3])) && (!purple_buddy_get_server_alias(buddy) || !strlen(purple_buddy_get_server_alias(buddy))))
- purple_blist_server_alias_buddy(buddy, string_parts[3]);
- set_skype_buddy_attribute(sbuddy, "FULLNAME", string_parts[3]);
- } else if ((g_str_equal(string_parts[2], "BUDDYSTATUS")) &&
- (g_str_equal(string_parts[3], "1")))
- {
- purple_blist_remove_buddy(buddy);
- } else if (g_str_equal(string_parts[2], "MOOD_TEXT"))
- {
- if (sbuddy && (!sbuddy->mood || !g_str_equal(sbuddy->mood, string_parts[3])))
- {
- set_skype_buddy_attribute(sbuddy, string_parts[2], string_parts[3]);
- }
- } else {
- set_skype_buddy_attribute(sbuddy, string_parts[2], string_parts[3]);
- }
- } else if (g_str_equal(string_parts[2], "BUDDYSTATUS"))
- {
- if (g_str_equal(string_parts[3], "3"))
- {
- skype_debug_info("skype", "Buddy %s just got added\n", string_parts[1]);
- //buddy just got added.. handle it
- if (purple_find_buddy(this_account, string_parts[1]) == NULL)
- {
- skype_debug_info("skype", "Buddy not in list\n");
- buddy = purple_buddy_new(this_account, g_strdup(string_parts[1]), NULL);
- skype_buddy_new(buddy);
- if (string_parts[1][0] == '+')
- {
- temp_group = purple_find_group("SkypeOut");
- if (temp_group == NULL)
- {
- temp_group = purple_group_new("SkypeOut");
- purple_blist_add_group(temp_group, NULL);
- }
- } else {
- temp_group = purple_find_group("Skype");
- if (temp_group == NULL)
- {
- temp_group = purple_group_new("Skype");
- purple_blist_add_group(temp_group, NULL);
- }
- }
- purple_blist_add_buddy(buddy, NULL, temp_group, NULL);
- skype_update_buddy_status(buddy);
- skype_update_buddy_alias(buddy);
- purple_prpl_got_user_idle(this_account, buddy->name, FALSE, 0);
- skype_update_buddy_icon(buddy);
- skype_put_buddies_in_groups();
- }
- }
- } else if (g_str_equal(string_parts[2], "RECEIVEDAUTHREQUEST"))
- {
- if (purple_account_get_bool(this_account, "reject_all_auths", FALSE))
- {
- skype_auth_deny(g_strdup(string_parts[1]));
- } else {
- //this event can be fired directly after authorising someone
- temp = skype_get_user_info(string_parts[1], "ISAUTHORIZED");
- if (!g_str_equal(temp, "TRUE") && string_parts[3])
- {
- skype_debug_info("skype", "User %s requested authorisation\n", string_parts[1]);
- purple_account_request_authorization(this_account, string_parts[1], NULL, skype_get_user_info(string_parts[1], "FULLNAME"),
- string_parts[3], (purple_find_buddy(this_account, string_parts[1]) != NULL),
- skype_auth_allow, skype_auth_deny, (gpointer)g_strdup(string_parts[1]));
- }
- g_free(temp);
- }
- }
- } else if (g_str_equal(command, "MESSAGE"))
- {
- if (g_str_equal(string_parts[3], "RECEIVED"))
- {
- msg_num = string_parts[1];
- temp = skype_send_message("GET MESSAGE %s TYPE", msg_num);
- type = g_strdup(&temp[14+strlen(msg_num)]);
- g_free(temp);
- if (g_str_equal(type, "TEXT") ||
- g_str_equal(type, "AUTHREQUEST"))
- {
- temp = skype_send_message("GET MESSAGE %s PARTNER_HANDLE", msg_num);
- sender = g_strdup(&temp[24+strlen(msg_num)]);
- g_free(temp);
- temp = skype_send_message("GET MESSAGE %s BODY", msg_num);
- body = g_strdup(&temp[14+strlen(msg_num)]);
- g_free(temp);
- temp = skype_send_message("GET MESSAGE %s TIMESTAMP", msg_num);
- mtime = atoi(&temp[19+strlen(msg_num)]);
- g_free(temp);
-
- /* Escape the body to HTML */
- body_html = skype_strdup_withhtml(body);
- g_free(body);
-
- if (g_str_equal(type, "TEXT"))
- {
- if (g_str_equal(sender, my_username))
- {
- temp = skype_send_message("GET CHATMESSAGE %s CHATNAME", msg_num);
- chatname = g_strdup(&temp[18+strlen(msg_num)]);
- g_free(temp);
- //skype_debug_info("skype", "Chatname: '%s'\n", chatname);
- chatusers = g_strsplit_set(chatname, "/;", 3);
- if (g_str_equal(&chatusers[0][1], my_username))
- sender = &chatusers[1][1];
- else
- sender = &chatusers[0][1];
- serv_got_im(gc, sender, body_html, PURPLE_MESSAGE_SEND, mtime);
- g_strfreev(chatusers);
- } else {
- serv_got_im(gc, sender, body_html, PURPLE_MESSAGE_RECV, mtime);
- }
- }/* else if (g_str_equal(type, "AUTHREQUEST") && !g_str_equal(sender, my_username))
- {
- skype_debug_info("User %s requested alternate authorisation\n", sender);
- purple_account_request_authorization(this_account, sender, NULL, skype_get_user_info(sender, "FULLNAME"),
- body, (purple_find_buddy(this_account, sender) != NULL),
- skype_auth_allow, skype_auth_deny, (gpointer)g_strdup(sender));
- }*/
-
- skype_send_message("SET MESSAGE %s SEEN", msg_num);
- }
- } else if (g_str_equal(string_parts[3], "SENT"))
- {
- /* mark it as seen, to remove notification from skype ui */
-
- /* dont async this -> infinite loop */
- skype_send_message("SET MESSAGE %s SEEN", string_parts[1]);
-
- temp = skype_send_message("GET MESSAGE %s PARTNER_HANDLE", string_parts[1]);
- sender = g_strdup(&temp[24+strlen(string_parts[1])]);
- g_free(temp);
- purple_signal_emit(purple_conversations_get_handle(), "received-im-ack",
- this_account, sender, string_parts[1]);
- g_free(sender);
- }
- } else if (g_str_equal(command, "CHATMESSAGE"))
- {
- if ((g_str_equal(string_parts[3], "RECEIVED"))
- || (g_str_equal(string_parts[3], "SENT"))
- )
- {
- if (messages_table == NULL)
- {
- messages_table = g_hash_table_new(NULL, NULL);
- }
- skypemessage = g_new0(SkypeMessage, 1);
- skypemessage->account = this_account;
- if (g_str_equal(string_parts[3], "RECEIVED"))
- skypemessage->flags = PURPLE_MESSAGE_RECV;
- else if (g_str_equal(string_parts[3], "SENT"))
- skypemessage->flags = PURPLE_MESSAGE_SEND;
- g_hash_table_insert(messages_table, GINT_TO_POINTER(atoi(string_parts[1])), skypemessage);
-// printf("Message %s has int %d (%d)\n", string_parts[1], atoi(string_parts[1]), GINT_TO_POINTER(atoi(string_parts[1])));
- skype_get_chatmessage_info(atoi(string_parts[1]));
- } else if (g_str_equal(string_parts[2], "TYPE"))
- {
- skypemessage = g_hash_table_lookup(messages_table, GINT_TO_POINTER(atoi(string_parts[1])));
- if (skypemessage != NULL)
- {
- //try to keep these in order of most likely to least likely
- if (g_str_equal(string_parts[3], "SAID") ||
- g_str_equal(string_parts[3], "TEXT"))
- {
- skypemessage->type = SKYPE_MESSAGE_TEXT;
- } else if (g_str_equal(string_parts[3], "EMOTED"))
- {
- skypemessage->type = SKYPE_MESSAGE_EMOTE;
- } else if (g_str_equal(string_parts[3], "ADDEDMEMBERS"))
- {
- skypemessage->type = SKYPE_MESSAGE_ADD;
- } else if (g_str_equal(string_parts[3], "LEFT"))
- {
- skypemessage->type = SKYPE_MESSAGE_LEFT;
- } else if (g_str_equal(string_parts[3], "KICKED") ||
- g_str_equal(string_parts[3], "KICKBANNED"))
- {
- skypemessage->type = SKYPE_MESSAGE_KICKED;
- } else if (g_str_equal(string_parts[3], "SETTOPIC"))
- {
- skypemessage->type = SKYPE_MESSAGE_TOPIC;
- } else {
- skypemessage->type = SKYPE_MESSAGE_OTHER;
- }
- } else {
- skype_debug_info("skype", "Skype message %s not in hashtable\n", string_parts[1]);
- }
- } else if (g_str_equal(string_parts[2], "CHATNAME"))
- {
- skypemessage = g_hash_table_lookup(messages_table, GINT_TO_POINTER(atoi(string_parts[1])));
- if (skypemessage != NULL)
- {
- skypemessage->chatname = g_strdup(string_parts[3]);
- } else {
- skype_debug_info("skype", "Skype message %s not in hashtable\n", string_parts[1]);
- }
- } else if (g_str_equal(string_parts[2], "BODY"))
- {
- skypemessage = g_hash_table_lookup(messages_table, GINT_TO_POINTER(atoi(string_parts[1])));
- if (skypemessage != NULL)
- {
- skypemessage->body = g_strdup(string_parts[3]);
- } else {
- // Could be a message that's been edited
- skype_send_message_nowait("GET CHATMESSAGE %s EDITED_TIMESTAMP", string_parts[1]);
- skype_send_message_nowait("GET CHATMESSAGE %s EDITED_BY", string_parts[1]);
- }
- } else if (g_str_equal(string_parts[2], "FROM_HANDLE"))
- {
- skypemessage = g_hash_table_lookup(messages_table, GINT_TO_POINTER(atoi(string_parts[1])));
- if (skypemessage != NULL)
- {
- skypemessage->from_handle = g_strdup(string_parts[3]);
- } else {
- skype_debug_info("skype", "Skype message %s not in hashtable\n", string_parts[1]);
- }
- } else if (g_str_equal(string_parts[2], "USERS"))
- {
- skypemessage = g_hash_table_lookup(messages_table, GINT_TO_POINTER(atoi(string_parts[1])));
- if (skypemessage != NULL)
- {
- skypemessage->users = g_strsplit(string_parts[3], " ", -1);
- } else {
- skype_debug_info("skype", "Skype message %s not in hashtable\n", string_parts[1]);
- }
- } else if (g_str_equal(string_parts[2], "LEAVEREASON"))
- {
- skypemessage = g_hash_table_lookup(messages_table, GINT_TO_POINTER(atoi(string_parts[1])));
- if (skypemessage != NULL)
- {
- skypemessage->leavereason = g_strdup(string_parts[3]);
- } else {
- skype_debug_info("skype", "Skype message %s not in hashtable\n", string_parts[1]);
- }
- } else if (g_str_equal(string_parts[2], "TIMESTAMP"))
- {
- skypemessage = g_hash_table_lookup(messages_table, GINT_TO_POINTER(atoi(string_parts[1])));
- if (skypemessage != NULL)
- {
- skypemessage->timestamp = atoi(string_parts[3]);
- } else {
- skype_debug_info("skype", "Skype message %s not in hashtable\n", string_parts[1]);
- }
- } else if (g_str_equal(string_parts[2], "EDITED_BY") ||
- g_str_equal(string_parts[2], "EDITED_TIMESTAMP"))
- {
- skypemessage = g_hash_table_lookup(messages_table, GINT_TO_POINTER(atoi(string_parts[1])));
- if (skypemessage == NULL)
- {
- if (messages_table == NULL)
- {
- messages_table = g_hash_table_new(NULL, NULL);
- }
- skypemessage = g_new0(SkypeMessage, 1);
- skypemessage->account = this_account;
- skypemessage->flags = PURPLE_MESSAGE_SYSTEM;
- skypemessage->type = SKYPE_MESSAGE_EDITED;
- g_hash_table_insert(messages_table, GINT_TO_POINTER(atoi(string_parts[1])), skypemessage);
- skype_send_message_nowait("GET CHATMESSAGE %s CHATNAME", string_parts[1]);
- }
-
- if (g_str_equal(string_parts[2], "EDITED_TIMESTAMP"))
- {
- skypemessage->timestamp = atoi(string_parts[3]);
- skype_send_message_nowait("GET CHATMESSAGE %s EDITED_BY", string_parts[1]);
- }
- else if (g_str_equal(string_parts[2], "EDITED_BY"))
- {
- skypemessage->from_handle = g_strdup(string_parts[3]);
- }
- }
-
- handle_complete_message(atoi(string_parts[1]));
- } else if (g_str_equal(command, "CHAT"))
- {
- //find the matching chat to update
- chat = skype_find_chat(string_parts[1], this_account);
- if (g_str_equal(string_parts[2], "STATUS") || g_str_equal(string_parts[2], "TYPE"))
- {
- if (g_str_equal(string_parts[3], "DIALOG") || g_str_equal(string_parts[3], "LEGACY_DIALOG"))
- {
- chat->type = PURPLE_CONV_TYPE_IM;
- } else {
- chat->type = PURPLE_CONV_TYPE_CHAT;
- }
- } else if (g_str_equal(string_parts[2], "MEMBERS"))
- {
- chatusers = g_strsplit(string_parts[3], " ", 0);
- if (chat->members)
- g_strfreev(chat->members);
- chat->members = chatusers;
- if (chat->type == PURPLE_CONV_TYPE_CHAT)
- {
- purple_conv_chat_clear_users(PURPLE_CONV_CHAT(chat->conv));
- for (i=0; chatusers[i]; i++)
- {
- purple_conv_chat_add_user(PURPLE_CONV_CHAT(chat->conv), chatusers[i], NULL, PURPLE_CBFLAGS_NONE, FALSE);
- }
- }
- } else if (chat->conv && g_str_equal(string_parts[2], "FRIENDLYNAME"))
- {
- if (chat->type == PURPLE_CONV_TYPE_CHAT)
- {
- purple_conversation_set_title(chat->conv, string_parts[3]);
- purple_conversation_update(chat->conv, PURPLE_CONV_UPDATE_TITLE);
- }
- } else if (chat->conv && g_str_equal(string_parts[2], "TOPIC"))
- {
- if (chat->type == PURPLE_CONV_TYPE_CHAT)
- {
- purple_conv_chat_set_topic(PURPLE_CONV_CHAT(chat->conv), my_username, string_parts[3]);
- purple_conversation_update(chat->conv, PURPLE_CONV_UPDATE_TOPIC);
- }
- } else if (chat->conv && g_str_equal(string_parts[2], "MEMBEROBJECTS"))
- {
- if (chat->type == PURPLE_CONV_TYPE_CHAT)
- {
- chatusers = g_strsplit(string_parts[3], ", ", 0);
- for (i=0; chatusers[i]; i++)
- {
- temp = skype_send_message("GET CHATMEMBER %s IDENTITY", chatusers[i]);
- sender = g_strdup(&temp[21 + strlen(chatusers[i])]);
- g_free(temp);
- temp = skype_send_message("GET CHATMEMBER %s ROLE", chatusers[i]);
- type = g_strdup(&temp[17 + strlen(chatusers[i])]);
- g_free(temp);
-
- if (g_str_equal(type, "USER")) {
- purple_conv_chat_user_set_flags(PURPLE_CONV_CHAT(chat->conv), sender, PURPLE_CBFLAGS_VOICE);
- } else if (g_str_equal(type, "HELPER")) {
- purple_conv_chat_user_set_flags(PURPLE_CONV_CHAT(chat->conv), sender, PURPLE_CBFLAGS_HALFOP);
- } else if (g_str_equal(type, "MASTER")) {
- purple_conv_chat_user_set_flags(PURPLE_CONV_CHAT(chat->conv), sender, PURPLE_CBFLAGS_OP);
- } else if (g_str_equal(type, "CREATOR")) {
- purple_conv_chat_user_set_flags(PURPLE_CONV_CHAT(chat->conv), sender, PURPLE_CBFLAGS_FOUNDER);
- } else {
- purple_conv_chat_user_set_flags(PURPLE_CONV_CHAT(chat->conv), sender, PURPLE_CBFLAGS_NONE);
- }
-
- g_free(sender);
- g_free(type);
- }
- }
- } else if (chat->name && g_str_equal(string_parts[2], "MYSTATUS") && g_str_equal(string_parts[3], "PASSWORD_REQUIRED"))
- {
- purple_request_input(gc, _("Incorrect password"), _("Password"), chat->name, "", FALSE,
- TRUE, NULL, _("OK"), G_CALLBACK(skype_chat_password_cb), _("Cancel"), NULL,
- this_account, NULL, chat->conv, chat);
- }
- chat = skype_find_chat(string_parts[1], this_account);
- } else if (g_str_equal(command, "FILETRANSFER"))
- {
- //lookup current file transfers to see if there's already one there
- glist_temp = g_list_find_custom(purple_xfers_get_all(),
- string_parts[1],
- (GCompareFunc)skype_find_filetransfer);
- if (glist_temp == NULL && g_str_equal(string_parts[2], "TYPE"))
- {
- temp = skype_send_message("GET FILETRANSFER %s PARTNER_HANDLE", string_parts[1]);
- sender = g_strdup(&temp[29+strlen(string_parts[1])]);
- g_free(temp);
- if (g_str_equal(string_parts[3], "INCOMING"))
- {
- transfer = purple_xfer_new(this_account, PURPLE_XFER_RECEIVE, sender);
- } else {
- transfer = purple_xfer_new(this_account, PURPLE_XFER_SEND, sender);
- }
- transfer->data = g_strdup(string_parts[1]);
- purple_xfer_set_init_fnc(transfer, skype_accept_transfer);
- purple_xfer_set_request_denied_fnc(transfer, skype_decline_transfer);
- temp = skype_send_message("GET FILETRANSFER %s FILENAME", string_parts[1]);
- skype_debug_info("skype", "Filename: '%s'\n", &temp[23+strlen(string_parts[1])]);
- purple_xfer_set_filename(transfer, g_strdup(&temp[23+strlen(string_parts[1])]));
- g_free(temp);
- temp = skype_send_message("GET FILETRANSFER %s FILEPATH", string_parts[1]);
- if (strlen(&temp[23+strlen(string_parts[1])]))
- purple_xfer_set_local_filename(transfer, g_strdup(&temp[23+strlen(string_parts[1])]));
- else
- purple_xfer_set_local_filename(transfer, purple_xfer_get_filename(transfer));
- g_free(temp);
- temp = skype_send_message("GET FILETRANSFER %s FILESIZE", string_parts[1]);
- purple_xfer_set_size(transfer, atol(&temp[23+strlen(string_parts[1])]));
- g_free(temp);
- purple_xfer_add(transfer);
- } else if (glist_temp != NULL) {
- transfer = glist_temp->data;
- }
- if (transfer != NULL)
- {
- /*if (g_str_equal(string_parts[2], "TYPE"))
- {
- if (g_str_equal(string_parts[3], "INCOMING"))
- {
- transfer->type = PURPLE_XFER_RECEIVE;
- } else {
- transfer->type = PURPLE_XFER_SEND;
- }
- } else if (g_str_equal(string_parts[2], "PARTNER_HANDLE"))
- {
- transfer->who = g_strdup(string_parts[3]);
- } else*/ if (g_str_equal(string_parts[2], "FILENAME"))
- {
- purple_xfer_set_filename(transfer, string_parts[3]);
- } else if (g_str_equal(string_parts[2], "FILEPATH"))
- {
- if (strlen(string_parts[3]))
- purple_xfer_set_local_filename(transfer, string_parts[3]);
- } else if (g_str_equal(string_parts[2], "STATUS"))
- {
- if (g_str_equal(string_parts[3], "NEW") ||
- g_str_equal(string_parts[3], "WAITING_FOR_ACCEPT"))
- {
- //Skype API doesn't let us accept transfers
- //purple_xfer_request(transfer);
- if (purple_xfer_get_type(transfer) == PURPLE_XFER_RECEIVE)
- {
-# ifndef __APPLE__
- skype_send_message_nowait("OPEN FILETRANSFER");
-# else
- purple_notify_info(this_account, _("File Transfers"), g_strdup_printf(_("%s wants to send you a file"), purple_xfer_get_remote_user(transfer)), NULL);
-# endif
- purple_xfer_conversation_write(transfer, g_strdup_printf(_("%s wants to send you a file"), purple_xfer_get_remote_user(transfer)), FALSE);
- }
- purple_xfer_set_status(transfer, PURPLE_XFER_STATUS_NOT_STARTED);
- } else if (g_str_equal(string_parts[3], "COMPLETED"))
- {
- purple_xfer_set_completed(transfer, TRUE);
- } else if (g_str_equal(string_parts[3], "CONNECTING") ||
- g_str_equal(string_parts[3], "TRANSFERRING") ||
- g_str_equal(string_parts[3], "TRANSFERRING_OVER_RELAY"))
- {
- purple_xfer_set_status(transfer, PURPLE_XFER_STATUS_STARTED);
- transfer->start_time = time(NULL);
- } else if (g_str_equal(string_parts[3], "CANCELLED"))
- {
- //transfer->end_time = time(NULL);
- //transfer->bytes_remaining = 0;
- //purple_xfer_set_status(transfer, PURPLE_XFER_STATUS_CANCEL_LOCAL);
- purple_xfer_cancel_local(transfer);
- }/* else if (g_str_equal(string_parts[3], "FAILED"))
- {
- //transfer->end_time = time(NULL);
- //purple_xfer_set_status(transfer, PURPLE_XFER_STATUS_CANCEL_REMOTE);
- purple_xfer_cancel_remote(transfer);
- }*/
- purple_xfer_update_progress(transfer);
- } else if (g_str_equal(string_parts[2], "STARTTIME"))
- {
- transfer->start_time = atol(string_parts[3]);
- purple_xfer_update_progress(transfer);
- /*} else if (g_str_equal(string_parts[2], "FINISHTIME"))
- {
- if (!g_str_equal(string_parts[3], "0"))
- transfer->end_time = atol(string_parts[3]);
- purple_xfer_update_progress(transfer);*/
- } else if (g_str_equal(string_parts[2], "BYTESTRANSFERRED"))
- {
- purple_xfer_set_bytes_sent(transfer, atol(string_parts[3]));
- purple_xfer_update_progress(transfer);
- } else if (g_str_equal(string_parts[2], "FILESIZE"))
- {
- purple_xfer_set_size(transfer, atol(string_parts[3]));
- } else if (g_str_equal(string_parts[2], "FAILUREREASON") &&
- !g_str_equal(string_parts[3], "UNKNOWN"))
- {
- temp = NULL;
- if (g_str_equal(string_parts[3], "SENDER_NOT_AUTHORIZED"))
- {
- temp = g_strdup(_("Not Authorized"));
- } else if (g_str_equal(string_parts[3], "REMOTELY_CANCELLED"))
- {
- purple_xfer_cancel_remote(transfer);
- purple_xfer_update_progress(transfer);
- } else if (g_str_equal(string_parts[3], "FAILED_READ"))
- {
- temp = g_strdup(_("Read error"));
- } else if (g_str_equal(string_parts[3], "FAILED_REMOTE_READ"))
- {
- temp = g_strdup(_("Read error"));
- } else if (g_str_equal(string_parts[3], "FAILED_WRITE"))
- {
- temp = g_strdup(_("Write error"));
- } else if (g_str_equal(string_parts[3], "FAILED_REMOTE_WRITE"))
- {
- temp = g_strdup(_("Write error"));
- } else if (g_str_equal(string_parts[3], "REMOTE_DOES_NOT_SUPPORT_FT"))
- {
- temp = g_strdup_printf(_("Unable to send file to %s, user does not support file transfers"), transfer->who);
- } else if (g_str_equal(string_parts[3], "REMOTE_OFFLINE_FOR_TOO_LONG"))
- {
- temp = g_strdup(_("Recipient Unavailable"));
- }
- if (temp && strlen(temp))
- {
- purple_xfer_error(transfer->type, this_account, transfer->who, temp);
- }
- g_free(temp);
- }
- }
- } else if (g_str_equal(command, "WINDOWSTATE"))
- {
- if (g_str_equal(string_parts[1], "HIDDEN"))
- {
- skype_send_message_nowait("SET SILENT_MODE ON");
- }
- } else if (g_str_equal(command, "PROFILE"))
- {
- if (g_str_equal(string_parts[1], "FULLNAME"))
- {
- temp = g_strconcat(string_parts[2], " ", string_parts[3], NULL);
- //this is the full name of the logged in user... useful for the account name
- g_free(temp);
- }
- } else if (g_str_equal(command, "CURRENTUSERHANDLE"))
- {
- //the currently logged in username is at string_parts[1]
- } else if (g_str_equal(command, "GROUPS"))
- {
- if (groups_table == NULL)
- groups_table = g_hash_table_new(NULL, NULL);
- chatusers = g_strsplit(strchr(message, ' ')+1, ", ", 0);
- for(i = 0; chatusers[i]; i++)
- {
- skype_send_message_nowait("GET GROUP %s DISPLAYNAME", chatusers[i]);
- }
- g_strfreev(chatusers);
- } else if (g_str_equal(command, "GROUP"))
- {
- if (groups_table == NULL)
- groups_table = g_hash_table_new(NULL, NULL);
- //TODO Handle Group stuff:
- // Messages from skype to move users in to/out of a group
- if (g_str_equal(string_parts[2], "DISPLAYNAME"))
- {
- if (string_parts[3] && *string_parts[3])
- {
- temp_group = purple_find_group(string_parts[3]);
- if (!temp_group)
- {
- temp_group = purple_group_new(string_parts[3]);
- skype_debug_info("skype", "Creating group %s\n", string_parts[3]);
- purple_blist_add_group(temp_group, NULL);
- }
- purple_blist_node_set_int(&temp_group->node, "skype_group_number", atoi(string_parts[1]));
- g_hash_table_insert(groups_table, GINT_TO_POINTER(atoi(string_parts[1])), temp_group);
- skype_send_message_nowait("GET GROUP %s USERS", string_parts[1]);
- } else {
- // Remove blank groups
- skype_send_message_nowait("DELETE GROUP %s", string_parts[1]);
- }
- } else if (g_str_equal(string_parts[2], "USERS"))
- {
- temp_group = g_hash_table_lookup(groups_table, GINT_TO_POINTER(atoi(string_parts[1])));
- if (temp_group)
- {
- if (string_parts[3] && *string_parts[3])
- {
- chatusers = g_strsplit(string_parts[3], ", ", -1);
- for (i = 0; chatusers[i]; i++)
- {
- buddy = purple_find_buddy(this_account, chatusers[i]);
- if (buddy && temp_group != purple_buddy_get_group(buddy))
- purple_blist_add_buddy(buddy, NULL, temp_group, NULL);
- }
- g_strfreev(chatusers);
- } else {
- // Remove empty groups
- skype_send_message_nowait("DELETE GROUP %s", string_parts[1]);
- }
- } else {
- skype_send_message_nowait("GET GROUP %s DISPLAYNAME", string_parts[1]);
- }
- }
- } else if (g_str_equal(command, "APPLICATION") &&
- g_str_equal(string_parts[1], "libpurple_typing"))
- {
- if (g_str_equal(string_parts[2], "DATAGRAM"))
- {
- chatusers = g_strsplit_set(string_parts[3], ": ", 3);
- sender = chatusers[0];
- temp = chatusers[2];
- if (sender != NULL && temp != NULL)
- {
- sender = g_strdup(sender);
- temp = g_strdup(temp);
- if (g_str_equal(temp, "PURPLE_NOT_TYPING"))
- serv_got_typing(gc, sender, 10, PURPLE_NOT_TYPING);
- else if (g_str_equal(temp, "PURPLE_TYPING"))
- serv_got_typing(gc, sender, 10, PURPLE_TYPING);
- else if (g_str_equal(temp, "PURPLE_TYPED"))
- serv_got_typing(gc, sender, 10, PURPLE_TYPED);
- g_free(sender);
- g_free(temp);
- }
- g_strfreev(chatusers);
- } else if (g_str_equal(string_parts[2], "STREAMS"))
- {
- chatusers = g_strsplit_set(string_parts[3], ": ", -1);
- for(i=0; chatusers[i] && chatusers[i+1]; i+=2)
- {
- temp = g_strconcat("stream-", chatusers[i], NULL);
- purple_account_set_string(this_account, temp, chatusers[i+1]);
- g_free(temp);
- }
- g_strfreev(chatusers);
- }
-#ifndef INSTANTBIRD
- } else if (purple_media_manager_get() && g_str_equal(command, "CALL"))
- {
- if (g_str_equal(string_parts[2], "STATUS"))
- {
- if (g_str_equal(string_parts[3], "RINGING"))
- {
- temp = skype_send_message("GET CALL %s TYPE", string_parts[1]);
- type = g_new0(gchar, 9);
- sscanf(temp, "CALL %*s TYPE %[^_]", type);
- g_free(temp);
- if (g_str_equal(type, "INCOMING"))
- skype_handle_incoming_call(gc, string_parts[1]);
- } else if (g_str_equal(string_parts[3], "FINISHED") ||
- g_str_equal(string_parts[3], "CANCELLED") ||
- g_str_equal(string_parts[3], "REFUSED") ||
- g_str_equal(string_parts[3], "MISSED") ||
- g_str_equal(string_parts[3], "FAILED"))
- {
- skype_handle_call_got_ended(string_parts[1]);
- }
- }
-//#else
- } else if (!purple_media_manager_get() && g_str_equal(command, "CALL"))
- {
- if (g_str_equal(string_parts[2], "STATUS"))
- {
- if (g_str_equal(string_parts[3], "RINGING"))
- {
- temp = skype_send_message("GET CALL %s TYPE", string_parts[1]);
- type = g_new0(gchar, 9);
- sscanf(temp, "CALL %*s TYPE %[^_]", type);
- g_free(temp);
- if (g_str_equal(type, "INCOMING"))
- {
- temp = skype_send_message("GET CALL %s PARTNER_HANDLE", string_parts[1]);
- sender = g_strdup(&temp[21+strlen(string_parts[1])]);
- g_free(temp);
- temp = skype_send_message("GET CALL %s PARTNER_DISPNAME", string_parts[1]);
- chatname = g_strdup(&temp[23+strlen(string_parts[1])]);
- g_free(temp);
- conv = purple_find_conversation_with_account(PURPLE_CONV_TYPE_IM, sender, this_account);
-
- if (conv != NULL)
- purple_conversation_write(conv, sender, _("Call started"), PURPLE_MESSAGE_SYSTEM|PURPLE_MESSAGE_NOTIFY, time(NULL));
-
- if (chatname && *chatname)
- {
- temp = g_strdup_printf("%s (%s)", chatname, sender);
- g_free(chatname);
- chatname = temp;
- temp = g_strdup_printf(_("%s is calling you."), chatname);
- } else {
- temp = g_strdup_printf(_("%s is calling you."), sender);
- }
-
- purple_request_action(gc, _("Incoming Call"), temp,
- _("Do you want to accept their call?"),
- -1, this_account, sender, conv, g_strdup(string_parts[1]), 3,
- _("_Accept"), G_CALLBACK(skype_call_accept_cb),
- _("Accept with Video"), G_CALLBACK(skype_call_accept_video_cb),
- _("_Reject"), G_CALLBACK(skype_call_reject_cb),
- _("_Ignore"), G_CALLBACK(skype_call_ignore_cb),
- _("Send to _Voicemail"), G_CALLBACK(skype_call_voicemail_cb),
- _("_Forward"), G_CALLBACK(skype_call_forward_cb));
- g_free(temp);
- g_free(chatname);
- g_free(sender);
- }
- g_free(type);
- } else if (g_str_equal(string_parts[3], "INPROGRESS") ||
- g_str_equal(string_parts[3], "MISSED"))
-
- {
- purple_request_close_with_handle(gc);
- }
- }
-#endif
- } else if (g_str_equal(command, "SMS"))
- {
- skype_debug_info("skype", "SMS lookup table %x\n", sms_convo_link_table);
- if (sms_convo_link_table != NULL)
- {
- temp = g_hash_table_lookup(sms_convo_link_table, string_parts[1]);
- skype_debug_info("skype", "Found mobile %s from SMS number %s\n", temp?temp:"null", string_parts[1]);
- conv = purple_find_conversation_with_account(PURPLE_CONV_TYPE_IM, temp, this_account);
- skype_debug_info("skype", "Found conv %d\n", conv);
- if (conv)
- {
- if (g_str_equal(string_parts[2], "STATUS"))
- {
- temp = g_strconcat(_("Status: "), string_parts[3], NULL);
- purple_conversation_write(conv, NULL, temp, PURPLE_MESSAGE_SYSTEM | PURPLE_MESSAGE_NO_LOG, time(NULL));
- g_free(temp);
- } else if (g_str_equal(string_parts[2], "FAILUREREASON"))
- {
- temp = g_strconcat(_("Failure Reason: "), string_parts[3], NULL);
- purple_conversation_write(conv, NULL, temp, PURPLE_MESSAGE_SYSTEM | PURPLE_MESSAGE_NO_LOG, time(NULL));
- g_free(temp);
- skype_send_message_nowait("SET SMS %s SEEN", string_parts[1]);
- } else if (g_str_equal(string_parts[2], "PRICE"))
- {
- if (atoi(string_parts[3]) > 0 &&
- purple_conversation_get_data(conv, "price_precision") &&
- purple_conversation_get_data(conv, "price_currency"))
- {
- int exponenet = 1;
- double d;
- for (i = atoi(purple_conversation_get_data(conv, "price_precision"));
- i > 0; i--)
- {
- exponenet *= 10;
- }
- d = atof(string_parts[3]) / exponenet;
- temp = g_strdup_printf("%s %s %f", _("Price: "),
- (char*)purple_conversation_get_data(conv, "price_currency"),
- d);
- purple_conversation_write(conv, NULL, temp, PURPLE_MESSAGE_SYSTEM | PURPLE_MESSAGE_NO_LOG, time(NULL));
- g_free(temp);
- }
- } else if (g_str_equal(string_parts[2], "PRICE_PRECISION"))
- {
- purple_conversation_set_data(conv, "price_precision", g_strdup(string_parts[3]));
- } else if (g_str_equal(string_parts[2], "PRICE_CURRENCY"))
- {
- purple_conversation_set_data(conv, "price_currency", g_strdup(string_parts[3]));
- }
- }
- }
- } else if (g_str_equal(command, "MESSAGES") || g_str_equal(command, "CHATMESSAGES"))
- {
- //MISSEDCHATMESSAGES response - workaround for Skype 6 and higher
- gchar *messages_start = strchr(message, ' ');
- if (messages_start != NULL)
- {
- gchar **messages = g_strsplit(messages_start + 1, ", ", 0);
- for (i = 0; messages[i]; i++)
- {
- skype_send_message_nowait("GET CHATMESSAGE %s STATUS", messages[i]);
- }
- g_strfreev(messages);
- }
- }
- if (string_parts)
- {
- g_strfreev(string_parts);
- }
- g_free(message);
- return FALSE;
-}
-
-void
-skype_chat_password_cb(SkypeChat *chat, const gchar *entry)
-{
- if (chat && chat->name)
- skype_send_message_nowait("ALTER CHAT %s ENTERPASSWORD %s", chat->name, entry);
-}
-
-void
-skype_call_accept_cb(gchar *call)
-{
- skype_send_message_nowait("ALTER CALL %s ANSWER", call);
- skype_send_message_nowait("SET CALL %s SEEN", call);
- skype_send_message_nowait("CLEAR CALLHISTORY INCOMING");
- skype_send_message_nowait("SEARCH MISSEDCALLS");
- g_free(call);
-}
-
-gboolean
-skype_call_accept_start_video(gpointer callptr)
-{
- gchar *call = callptr;
-
- skype_send_message_nowait("ALTER CALL %s START_VIDEO_SEND", call);
- skype_send_message_nowait("ALTER CALL %s START_VIDEO_RECEIVE", call);
-
- g_free(call);
-
- return FALSE;
-}
-
-void
-skype_call_accept_video_cb(gchar *call)
-{
- skype_send_message("ALTER CALL %s ANSWER", call);
- skype_send_message("SET CALL %s SEEN", call);
- skype_send_message("CLEAR CALLHISTORY INCOMING");
- skype_send_message_nowait("SEARCH MISSEDCALLS");
-
- purple_timeout_add_seconds(3, skype_call_accept_start_video, call);
-}
-
-void
-skype_call_reject_cb(gchar *call)
-{
- skype_send_message_nowait("ALTER CALL %s END HANGUP", call);
- skype_send_message_nowait("ALTER CALL %s HANGUP", call);
- skype_send_message_nowait("SET CALL %s SEEN", call);
- skype_send_message_nowait("CLEAR CALLHISTORY INCOMING");
- skype_send_message_nowait("SEARCH MISSEDCALLS");
- g_free(call);
-}
-
-void
-skype_call_ignore_cb(gchar *call)
-{
- skype_send_message_nowait("SET CALL %s SEEN", call);
- skype_send_message_nowait("CLEAR CALLHISTORY INCOMING");
- skype_send_message_nowait("SEARCH MISSEDCALLS");
- g_free(call);
-}
-
-void
-skype_call_voicemail_cb(gchar *call)
-{
- skype_send_message_nowait("ALTER CALL %s END REDIRECT_TO_VOICEMAIL", call);
- skype_send_message_nowait("SET CALL %s SEEN", call);
- skype_send_message_nowait("CLEAR CALLHISTORY INCOMING");
- skype_send_message_nowait("SEARCH MISSEDCALLS");
- g_free(call);
-}
-
-void
-skype_call_forward_cb(gchar *call)
-{
- skype_send_message_nowait("ALTER CALL %s END FORWARD_CALL", call);
- skype_send_message_nowait("SET CALL %s SEEN", call);
- skype_send_message_nowait("CLEAR CALLHISTORY INCOMING");
- skype_send_message_nowait("SEARCH MISSEDCALLS");
- g_free(call);
-}
-
-void
-skype_auth_allow(gpointer sender)
-{
- skype_send_message("SET USER %s ISAUTHORIZED TRUE", sender);
- g_free(sender);
-}
-
-void
-skype_auth_deny(gpointer sender)
-{
- skype_send_message("SET USER %s ISAUTHORIZED FALSE", sender);
- g_free(sender);
-}
-
-gint
-skype_find_filetransfer(PurpleXfer *transfer, char *skypeid)
-{
- if (transfer == NULL || transfer->data == NULL || skypeid == NULL)
- return -1;
- return strcmp(transfer->data, skypeid);
-}
-
-void
-skype_accept_transfer(PurpleXfer *transfer)
-{
- //can't accept transfers
-}
-
-void
-skype_decline_transfer(PurpleXfer *transfer)
-{
- //can't reject transfers
-}
-
-static SkypeChat*
-skype_find_chat(const gchar *chat_id, PurpleAccount *this_account)
-{
- SkypeChat *chat;
- int i;
-
- if (chat_id == NULL)
- return NULL;
-
- g_static_mutex_lock(&chat_link_mutex);
- if(chat_link_table == NULL)
- {
- chat_link_table = g_hash_table_new(g_str_hash, g_str_equal);
- }
-
- chat = g_hash_table_lookup(chat_link_table, chat_id);
- if (chat == NULL)
- {
- chat = g_new0(SkypeChat, 1);
- chat->name = g_strdup(chat_id);
- chat->account = this_account;
- g_hash_table_insert(chat_link_table, chat->name, chat);
-
- skype_send_message_nowait("GET CHAT %s STATUS", chat_id);
- skype_send_message_nowait("GET CHAT %s TYPE", chat_id);
- skype_send_message_nowait("GET CHAT %s MEMBERS", chat_id);
- skype_send_message_nowait("GET CHAT %s FRIENDLYNAME", chat_id);
- skype_send_message_nowait("GET CHAT %s TOPIC", chat_id);
- skype_send_message_nowait("GET CHAT %s MEMBEROBJECTS", chat_id);
- }
- g_static_mutex_unlock(&chat_link_mutex);
-
- chat->conv = NULL;
-
- if (chat->type)
- {
- if (chat->type == PURPLE_CONV_TYPE_CHAT)
- {
- chat->conv = purple_find_conversation_with_account(chat->type, chat_id, this_account);
- if (!chat->conv)
- {
- chat->prpl_chat_id = g_str_hash(chat_id);
- chat->conv = serv_got_joined_chat(this_account->gc, chat->prpl_chat_id, chat_id);
- }
- } else if (chat->type == PURPLE_CONV_TYPE_IM)
- {
- if (!chat->partner_handle && chat->members)
- {
- for (i=0; chat->members[i]; i++)
- {
- if (*chat->members[i] != '\0' && !g_str_equal(chat->members[i], skype_get_account_username(chat->account)))
- {
- chat->partner_handle = g_strdup(chat->members[i]);
- break;
- }
- }
- }
- if (chat->partner_handle)
- {
- chat->conv = purple_find_conversation_with_account(chat->type, chat->partner_handle, chat->account);
- if (!chat->conv)
- chat->conv = purple_conversation_new(chat->type, chat->account, chat->partner_handle);
- }
- }
- if (chat->conv)
- purple_conversation_set_data(chat->conv, "chat_id", g_strdup(chat_id));
- }
-
-
- return chat;
-}
-
-gint
-skype_find_chat_compare_func(PurpleConversation *conv, char *chat_id)
-{
- char *lookup;
- if (chat_id == NULL || conv == NULL || conv->data == NULL)
- return -1;
- lookup = purple_conversation_get_data(conv, "chat_id");
- if (lookup == NULL)
- return -1;
- return strcmp(lookup, chat_id);
-}
-
-/* Since this function isn't public, and we need it to be, redefine it here */
-static void
-purple_xfer_set_status(PurpleXfer *xfer, PurpleXferStatusType status)
-{
- g_return_if_fail(xfer != NULL);
-
- if (xfer->status == status)
- return;
-
- xfer->status = status;
-
- if(xfer->type == PURPLE_XFER_SEND) {
- switch(status) {
- case PURPLE_XFER_STATUS_ACCEPTED:
- purple_signal_emit(purple_xfers_get_handle(), "file-send-accept", xfer);
- break;
- case PURPLE_XFER_STATUS_STARTED:
- purple_signal_emit(purple_xfers_get_handle(), "file-send-start", xfer);
- break;
- case PURPLE_XFER_STATUS_DONE:
- purple_signal_emit(purple_xfers_get_handle(), "file-send-complete", xfer);
- break;
- case PURPLE_XFER_STATUS_CANCEL_LOCAL:
- case PURPLE_XFER_STATUS_CANCEL_REMOTE:
- purple_signal_emit(purple_xfers_get_handle(), "file-send-cancel", xfer);
- break;
- default:
- break;
- }
- } else if(xfer->type == PURPLE_XFER_RECEIVE) {
- switch(status) {
- case PURPLE_XFER_STATUS_ACCEPTED:
- purple_signal_emit(purple_xfers_get_handle(), "file-recv-accept", xfer);
- break;
- case PURPLE_XFER_STATUS_STARTED:
- purple_signal_emit(purple_xfers_get_handle(), "file-recv-start", xfer);
- break;
- case PURPLE_XFER_STATUS_DONE:
- purple_signal_emit(purple_xfers_get_handle(), "file-recv-complete", xfer);
- break;
- case PURPLE_XFER_STATUS_CANCEL_LOCAL:
- case PURPLE_XFER_STATUS_CANCEL_REMOTE:
- purple_signal_emit(purple_xfers_get_handle(), "file-recv-cancel", xfer);
- break;
- default:
- break;
- }
- }
-}
-
-
-gboolean
-skype_sync_skype_close(PurpleConnection *gc)
-{
- if (gc != NULL)
- purple_connection_error_reason(gc, PURPLE_CONNECTION_ERROR_NETWORK_ERROR, _("\nSkype program closed"));
- return FALSE;
-}
-
-gboolean
-handle_complete_message(int messagenumber)
-{
- SkypeMessage *skypemessage = NULL;
- SkypeChat *chat = NULL;
- PurpleBuddy *buddy = NULL;
- gchar *body_html = NULL;
- xmlnode *xmlblob, *nodi;
- int i;
-
- if (messages_table == NULL)
- return FALSE;
-
- skypemessage = g_hash_table_lookup(messages_table, GINT_TO_POINTER(messagenumber));
- if (skypemessage == NULL)
- return FALSE; //Message no longer exists, must have delt with it already
-
- if (!skypemessage->chatname || !skypemessage->type || !skypemessage->account)
- return FALSE; //Haven't finished filling in all the required details
-
- chat = skype_find_chat(skypemessage->chatname, skypemessage->account);
- if (!chat->type)
- {
- skype_debug_info("skype", "Chat %s has no type\n", skypemessage->chatname);
- //dont know where to put this message
- skype_send_message_nowait("GET CHAT %s STATUS", skypemessage->chatname);
- skype_send_message_nowait("GET CHAT %s TYPE", skypemessage->chatname);
- chat->type_request_count++;
- //Only try a maximum of 100 times to prevent an infinite loop (in case the chat name is unknown)
- if (chat->type_request_count < 100)
- {
- //just wait for a second for the chat to be updated
- purple_timeout_add_seconds(1, (GSourceFunc)handle_complete_message, GINT_TO_POINTER(messagenumber));
- }
- return FALSE;
- }
-
- switch(skypemessage->type)
- {
- case SKYPE_MESSAGE_UNSET:
- return FALSE;
- case SKYPE_MESSAGE_EMOTE:
- if (!skypemessage->body)
- return FALSE;
- body_html = g_strdup_printf("/me %s", skypemessage->body);
- g_free(skypemessage->body);
- skypemessage->body = body_html;
- //set it to be text so that we dont do it again
- skypemessage->type = SKYPE_MESSAGE_TEXT;
- //fallthrough intentional
- case SKYPE_MESSAGE_OTHER:
- //'other' type of message is generally an auth request
- //Check that it's not an xml blob
- if (!skypemessage->body)
- return FALSE;
- xmlblob = xmlnode_from_str(skypemessage->body, -1);
- if (xmlblob)
- {
- if (g_str_equal(xmlblob->name, "partlist"))
- {
- for(nodi = xmlnode_get_child(xmlblob, "part");
- nodi;
- nodi = xmlnode_get_next_twin(nodi))
- {
- if (g_str_equal(xmlnode_get_attrib(nodi, "identity"), skype_get_account_username(skypemessage->account)))
- {
- nodi = xmlnode_get_child(nodi, "duration");
- body_html = xmlnode_get_data(nodi);
- if (body_html)
- {
- g_free(skypemessage->body);
- skypemessage->body = g_strdup_printf(_("Call ended after %s seconds"), body_html);
- g_free(body_html);
- skypemessage->type = SKYPE_MESSAGE_TEXT;
- }
- break;
- }
- }
- if (skypemessage->type == SKYPE_MESSAGE_OTHER)
- {
- //Haven't found any 'duration'
- g_free(skypemessage->body);
- skypemessage->body = g_strdup(_("Call ended"));
- skypemessage->type = SKYPE_MESSAGE_TEXT;
- }
- }
- xmlnode_free(xmlblob);
- }
- case SKYPE_MESSAGE_TEXT:
- if (!skypemessage->body || !skypemessage->from_handle || !skypemessage->timestamp)
- return FALSE;
- if (!skypemessage->account || !skypemessage->account->gc)
- return FALSE;
- body_html = skype_strdup_withhtml(skypemessage->body);
- if (chat->type == PURPLE_CONV_TYPE_CHAT)
- {
- if (skypemessage->flags != PURPLE_MESSAGE_SEND)
- {
- if (chat->prpl_chat_id)
- i = chat->prpl_chat_id;
- else
- i = g_str_hash(chat->name);
- serv_got_chat_in(skypemessage->account->gc, i, skypemessage->from_handle, skypemessage->flags, body_html, skypemessage->timestamp);
- }
- } else if (chat->type == PURPLE_CONV_TYPE_IM)
- {
- if (skypemessage->flags != PURPLE_MESSAGE_SEND)
- {
- PurpleAccount *acct = skypemessage->account;
- if (!g_str_equal(skypemessage->from_handle, skype_get_account_username(acct)))
- {
- serv_got_im(acct->gc, skypemessage->from_handle, body_html, skypemessage->flags, skypemessage->timestamp);
- } else if (chat->partner_handle)
- {
- //if we're here, then we're receiving a message that we sent from a different computer
- serv_got_im(acct->gc, chat->partner_handle, body_html, PURPLE_MESSAGE_SEND, skypemessage->timestamp);
- } else {
- //use the chat name to work out who it came from
- //in format #username1/$username2;junktext for IM's
- char *start, *end;
- start = strchr(skypemessage->chatname, '#');
- if (start)
- {
- start += 1;
- end = strchr(start, '/');
- if (end)
- {
- start = g_strndup(start, end-start);
- if (!g_str_equal(skype_get_account_username(acct), start))
- {
- serv_got_im(acct->gc, start, body_html, PURPLE_MESSAGE_SEND, skypemessage->timestamp);
- g_free(start);
- start = (char *) 1;
- }
- else
- {
- g_free(start);
- start = NULL;
- }
- } else {
- start = NULL;
- }
- }
- if (!start)
- {
- start = strchr(skypemessage->chatname, '$');
- if (start)
- {
- start += 1;
- end = strchr(start, ';');
- if (end)
- {
- start = g_strndup(start, end-start);
- if (!g_str_equal(skype_get_account_username(acct), start))
- {
- serv_got_im(acct->gc, start, body_html, PURPLE_MESSAGE_SEND, skypemessage->timestamp);
- g_free(start);
- }
- }
- }
- }
- }
- } else {
- gchar *msg_num = g_strdup_printf("%d", messagenumber);
- purple_signal_emit(purple_conversations_get_handle(), "received-im-ack",
- skypemessage->account, skypemessage->from_handle, msg_num);
- g_free(msg_num);
- }
- }
- break;
- case SKYPE_MESSAGE_LEFT:
- if (!skypemessage->from_handle || !skypemessage->leavereason)
- return FALSE;
- if (chat->conv && chat->type == PURPLE_CONV_TYPE_CHAT)
- {
- if (g_str_equal(skypemessage->from_handle, skype_get_account_username(skypemessage->account)))
- purple_conv_chat_left(PURPLE_CONV_CHAT(chat->conv));
- purple_conv_chat_remove_user(PURPLE_CONV_CHAT(chat->conv), skypemessage->from_handle, skypemessage->leavereason);
- }
- break;
- case SKYPE_MESSAGE_ADD:
- if (!skypemessage->users)
- return FALSE;
- if (chat->conv && chat->type == PURPLE_CONV_TYPE_CHAT)
- {
- for (i=0; skypemessage->users[i]; i++)
- if (!purple_conv_chat_find_user(PURPLE_CONV_CHAT(chat->conv), skypemessage->users[i]))
- purple_conv_chat_add_user(PURPLE_CONV_CHAT(chat->conv), skypemessage->users[i], NULL, PURPLE_CBFLAGS_NONE, TRUE);
- }
- break;
- case SKYPE_MESSAGE_KICKED:
- if (!skypemessage->users)
- return FALSE;
- if (chat->conv && chat->type == PURPLE_CONV_TYPE_CHAT)
- {
- for (i=0; skypemessage->users[i]; i++)
- {
- if (skypemessage->from_handle)
- purple_conv_chat_remove_user(PURPLE_CONV_CHAT(chat->conv), skypemessage->users[i], g_strdup_printf("Kicked by %s", skypemessage->from_handle));
- else
- purple_conv_chat_remove_user(PURPLE_CONV_CHAT(chat->conv), skypemessage->users[i], g_strdup("Kicked"));
- }
- }
- break;
- case SKYPE_MESSAGE_TOPIC:
- if (!skypemessage->body || !skypemessage->from_handle)
- return FALSE;
- if (chat->conv && chat->type == PURPLE_CONV_TYPE_CHAT)
- {
- purple_conv_chat_set_topic(PURPLE_CONV_CHAT(chat->conv), skypemessage->from_handle, skypemessage->body);
- serv_got_chat_in(skypemessage->account->gc, purple_conv_chat_get_id(PURPLE_CONV_CHAT(chat->conv)), skypemessage->from_handle, PURPLE_MESSAGE_SYSTEM, skype_strdup_withhtml(g_strdup_printf(_("%s has changed the topic to: %s"), skypemessage->from_handle, skypemessage->body)), time(NULL));
- purple_conversation_update(chat->conv, PURPLE_CONV_UPDATE_TOPIC);
- }
- break;
- case SKYPE_MESSAGE_EDITED:
- if (!skypemessage->body || !skypemessage->from_handle || !skypemessage->timestamp)
- return FALSE;
- buddy = purple_find_buddy(skypemessage->account, skypemessage->from_handle);
- body_html = g_strdup_printf("%s edited message '%s'", (buddy&&buddy->alias?buddy->alias:skypemessage->from_handle), skypemessage->body);
- g_free(skypemessage->body);
- skypemessage->body = body_html;
- body_html = skype_strdup_withhtml(skypemessage->body);
- if (chat->type == PURPLE_CONV_TYPE_CHAT)
- {
- if (chat->prpl_chat_id)
- i = chat->prpl_chat_id;
- else
- i = g_str_hash(chat->name);
- serv_got_chat_in(skypemessage->account->gc, i, skypemessage->from_handle, skypemessage->flags, body_html, skypemessage->timestamp);
- } else if (chat->type == PURPLE_CONV_TYPE_IM)
- {
- if (!g_str_equal(skypemessage->from_handle, skype_get_account_username(skypemessage->account)))
- {
- serv_got_im(skypemessage->account->gc, skypemessage->from_handle, body_html, skypemessage->flags, skypemessage->timestamp);
- } else if (chat->partner_handle)
- {
- //if we're here, then we're receiving a message that we sent from a different computer
- serv_got_im(skypemessage->account->gc, chat->partner_handle, body_html, skypemessage->flags, skypemessage->timestamp);
- }
- }
- }
-
- if (skypemessage->flags == PURPLE_MESSAGE_RECV)
- skype_send_message_nowait("SET CHATMESSAGE %d SEEN", messagenumber);
- if (g_hash_table_remove(messages_table, GINT_TO_POINTER(messagenumber)))
- {
- //free the message here
- skypemessage->type = 0;
- skypemessage->timestamp = 0;
- g_free(skypemessage->chatname);
- g_free(skypemessage->body);
- g_free(skypemessage->from_handle);
- g_strfreev(skypemessage->users);
- g_free(skypemessage->leavereason);
-
- g_free(skypemessage);
- }
-
- //can be used in eventloop
- return FALSE;
-}
-