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:
-rw-r--r--skypeweb/.gitignore1
-rw-r--r--skypeweb/Makefile26
-rw-r--r--skypeweb/README.md35
-rw-r--r--skypeweb/libskypeweb.c562
-rw-r--r--skypeweb/libskypeweb.h79
-rw-r--r--skypeweb/purple-skypeweb.spec77
-rw-r--r--skypeweb/skypeweb_connection.c9
-rw-r--r--skypeweb/skypeweb_contacts.c254
-rw-r--r--skypeweb/skypeweb_login.c51
-rw-r--r--skypeweb/skypeweb_messages.c403
-rw-r--r--skypeweb/skypeweb_messages.h5
-rw-r--r--skypeweb/skypeweb_util.c22
-rw-r--r--skypeweb/skypeweb_util.h8
13 files changed, 1138 insertions, 394 deletions
diff --git a/skypeweb/.gitignore b/skypeweb/.gitignore
new file mode 100644
index 0000000..f6a43ef
--- /dev/null
+++ b/skypeweb/.gitignore
@@ -0,0 +1 @@
+libskypeweb.so
diff --git a/skypeweb/Makefile b/skypeweb/Makefile
index 0daeef2..33da89e 100644
--- a/skypeweb/Makefile
+++ b/skypeweb/Makefile
@@ -1,15 +1,17 @@
+CC ?= cc
+CFLAGS ?= -O2 -g -pipe
+PKG_CONFIG ?= pkg-config
-COMPILER = gcc
-DIR_PERM=0755
-FILE_PERM=0644
+DIR_PERM = 0755
+FILE_PERM = 0644
-LIBPURPLE_CFLAGS += $(shell pkg-config --cflags glib-2.0 json-glib-1.0 purple)
-LIBPURPLE_LIBS += $(shell pkg-config --libs glib-2.0 json-glib-1.0 purple)
-PLUGIN_DIR_PURPLE=$(shell pkg-config --variable=plugindir purple)
-DATA_ROOT_DIR_PURPLE=$(shell pkg-config --variable=datarootdir purple)
+LIBPURPLE_CFLAGS += $(shell $(PKG_CONFIG) --cflags glib-2.0 json-glib-1.0 purple)
+LIBPURPLE_LIBS += $(shell $(PKG_CONFIG) --libs glib-2.0 json-glib-1.0 purple)
+PLUGIN_DIR_PURPLE = $(shell $(PKG_CONFIG) --variable=plugindir purple)
+DATA_ROOT_DIR_PURPLE = $(shell $(PKG_CONFIG) --variable=datarootdir purple)
-PRPL_NAME=libskypeweb.so
-PRPL_LIBNAME=${PRPL_NAME}
+PRPL_NAME = libskypeweb.so
+PRPL_LIBNAME = ${PRPL_NAME}
SKYPEWEB_SOURCES = \
skypeweb_connection.c \
@@ -20,7 +22,7 @@ SKYPEWEB_SOURCES = \
libskypeweb.c
.PHONY: all clean install
-all: ${PRPL_NAME}
+all: $(PRPL_NAME)
install:
mkdir -m $(DIR_PERM) -p $(DESTDIR)$(PLUGIN_DIR_PURPLE)
install -m $(FILE_PERM) $(PRPL_LIBNAME) $(DESTDIR)$(PLUGIN_DIR_PURPLE)/$(PRPL_NAME)
@@ -38,5 +40,5 @@ install:
clean:
rm -f libskypeweb.so
-${PRPL_NAME}: ${SKYPEWEB_SOURCES}
- ${COMPILER} -Wall -I. -g -O2 -fPIC -pipe ${SKYPEWEB_SOURCES} -o $@ ${LIBPURPLE_CFLAGS} ${LIBPURPLE_LIBS} -shared
+$(PRPL_NAME): $(SKYPEWEB_SOURCES)
+ $(CC) -Wall -I. -fPIC $(CFLAGS) $(SKYPEWEB_SOURCES) -o $@ $(LIBPURPLE_CFLAGS) $(LIBPURPLE_LIBS) -shared
diff --git a/skypeweb/README.md b/skypeweb/README.md
index 57d918b..6849652 100644
--- a/skypeweb/README.md
+++ b/skypeweb/README.md
@@ -3,7 +3,7 @@ SkypeWeb Plugin for Pidgin
Adds a "Skype (HTTP)" protocol to the accounts list. Requires libjson-glib. GPLv3 Licenced.
-Until I get MSN/Live logins going there won't be any releases on GitHub.
+Download latest releases from [here](https://github.com/EionRobb/skype4pidgin/releases)
Windows
-------
@@ -14,8 +14,8 @@ The plugin requires libjson-glib which is part of the installer exe or can be do
Compiling
---------
-Requires devel headers/libs for libpurple and libjson-glib
-```
+Requires devel headers/libs for libpurple and libjson-glib [libglib2.0-dev, libjson-glib-dev and libpurple-dev]
+```
git clone git://github.com/EionRobb/skype4pidgin.git
cd skype4pidgin/skypeweb
make
@@ -26,15 +26,34 @@ Building RPM package for Fedora/openSUSE/CentOS/RHEL
---------
Requires devel headers/libs for libpurple and json-glib, gcc compiler and rpmbuild tool
```
- sudo yum install git rpm-build gcc json-glib-devel libpurple-devel pidgin-devel
- cd skype4pidgin/skypeweb
- tar -czf skypeweb.tar.gz *
- rpmbuild -tb skypeweb.tar.gz
+ sudo yum install rpm-build gcc json-glib-devel libpurple-devel zlib-devel make automake glib2-devel -y
+ mkdir -p ~/rpmbuild/{BUILD,BUILDROOT,RPMS,SOURCES,SPECS,SRPMS}
+ wget https://raw.githubusercontent.com/EionRobb/skype4pidgin/master/skypeweb/purple-skypeweb.spec \
+ -O ~/rpmbuild/SPECS/purple-skypeweb.spec
+ wget https://github.com/EionRobb/skype4pidgin/archive/master.tar.gz \
+ -O ~/rpmbuild/SOURCES/skype4pidgin-1.0.tar.gz
+ rpmbuild -ba ~/rpmbuild/SPECS/purple-skypeweb.spec
```
The result can be found in ``~/rpmbuild/RPMS/`uname -m`/`` directory.
+Building DEB package for Debian/Ubuntu/Mint
+---------
+Requires devel headers/libs for libpurple and json-glib, gcc compiler and cmake
+```
+ sudo apt install libpurple-dev libjson-glib-dev cmake gcc
+ git clone git://github.com/EionRobb/skype4pidgin.git
+ cd skype4pidgin/skypeweb
+ mkdir build
+ cd build
+ cmake ..
+ cpack
+```
+To install do:
+```
+ sudo dpkg -i skypeweb-0.1.0-Linux.deb
+```
+
Show your appreciation
----------------------
Did this plugin make your life happier? [Send me $1](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=D33N5RV7FEXZU) to say thanks!
-
diff --git a/skypeweb/libskypeweb.c b/skypeweb/libskypeweb.c
index eba639c..aaa4593 100644
--- a/skypeweb/libskypeweb.c
+++ b/skypeweb/libskypeweb.c
@@ -26,6 +26,9 @@
void
skypeweb_do_all_the_things(SkypeWebAccount *sa)
{
+ if (!sa->username) {
+ skypeweb_get_self_details(sa);
+ } else
if (sa->registration_token) {
skypeweb_get_self_details(sa);
@@ -33,12 +36,13 @@ skypeweb_do_all_the_things(SkypeWebAccount *sa)
purple_timeout_remove(sa->authcheck_timeout);
skypeweb_check_authrequests(sa);
sa->authcheck_timeout = purple_timeout_add_seconds(120, (GSourceFunc)skypeweb_check_authrequests, sa);
-
+ purple_connection_set_state(sa->pc, PURPLE_CONNECTION_CONNECTED);
+
skypeweb_get_friend_list(sa);
skypeweb_poll(sa);
skype_web_get_offline_history(sa);
-
+
skypeweb_set_status(sa->account, purple_account_get_active_status(sa->account));
} else {
//Too soon!
@@ -54,6 +58,13 @@ skypeweb_do_all_the_things(SkypeWebAccount *sa)
static const char *
skypeweb_list_icon(PurpleAccount *account, PurpleBuddy *buddy)
{
+
+ if (buddy != NULL) {
+ const gchar *buddy_name = purple_buddy_get_name(buddy);
+ if (buddy_name && SKYPEWEB_BUDDY_IS_MSN(buddy_name)) {
+ return "msn";
+ }
+ }
return "skype";
}
@@ -194,7 +205,7 @@ skypeweb_join_chat(PurpleConnection *pc, GHashTable *data)
}
chatconv = purple_conversations_find_chat_with_account(chatname, sa->account);
- if (chatconv != NULL) {
+ if (chatconv != NULL && !purple_chat_conversation_has_left(chatconv)) {
purple_conversation_present(PURPLE_CONVERSATION(chatconv));
return;
}
@@ -219,7 +230,7 @@ skypeweb_join_chat(PurpleConnection *pc, GHashTable *data)
purple_conversation_present(PURPLE_CONVERSATION(chatconv));
}
-static void
+void
skypeweb_buddy_free(PurpleBuddy *buddy)
{
SkypeWebBuddy *sbuddy = purple_buddy_get_protocol_data(buddy);
@@ -258,11 +269,12 @@ skypeweb_node_menu(PurpleBlistNode *node)
if(PURPLE_IS_BUDDY(node))
{
- buddy = (PurpleBuddy *)node;
+ buddy = PURPLE_BUDDY(node);
if (purple_buddy_get_protocol_data(buddy)) {
SkypeWebBuddy *sbuddy = purple_buddy_get_protocol_data(buddy);
sa = sbuddy->sa;
- } else {
+ }
+ if (sa == NULL) {
PurpleConnection *pc = purple_account_get_connection(purple_buddy_get_account(buddy));
sa = purple_connection_get_protocol_data(pc);
}
@@ -283,6 +295,7 @@ skypeweb_login(PurpleAccount *account)
{
PurpleConnection *pc = purple_account_get_connection(account);
SkypeWebAccount *sa = g_new0(SkypeWebAccount, 1);
+ PurpleConnectionFlags flags;
purple_connection_set_protocol_data(pc, sa);
@@ -293,9 +306,13 @@ skypeweb_login(PurpleAccount *account)
return;
}
- pc->flags |= PURPLE_CONNECTION_HTML | PURPLE_CONNECTION_NO_BGCOLOR | PURPLE_CONNECTION_NO_FONTSIZE;
+ flags = purple_connection_get_flags(pc);
+ flags |= PURPLE_CONNECTION_FLAG_HTML | PURPLE_CONNECTION_FLAG_NO_BGCOLOR | PURPLE_CONNECTION_FLAG_NO_FONTSIZE;
+ purple_connection_set_flags(pc, flags);
- sa->username = g_strdup(purple_account_get_username(account));
+ if (!SKYPEWEB_BUDDY_IS_MSN(purple_account_get_username(account))) {
+ sa->username = g_ascii_strdown(purple_account_get_username(account), -1);
+ }
sa->account = account;
sa->pc = pc;
sa->cookie_table = g_hash_table_new_full(g_str_hash, g_str_equal, g_free, g_free);
@@ -304,7 +321,7 @@ skypeweb_login(PurpleAccount *account)
sa->waiting_conns = g_queue_new();
sa->messages_host = g_strdup(SKYPEWEB_DEFAULT_MESSAGES_HOST);
- if(strchr(sa->username, '@')) {
+ if(strchr(purple_account_get_username(account), '@')) {
//Has an email address for a username, probably a microsoft account?
skypeweb_begin_oauth_login(sa);
} else {
@@ -318,6 +335,7 @@ static void
skypeweb_close(PurpleConnection *pc)
{
SkypeWebAccount *sa;
+ GSList *buddies;
g_return_if_fail(pc != NULL);
@@ -350,6 +368,19 @@ skypeweb_close(PurpleConnection *pc)
sa->dns_queries = g_slist_remove(sa->dns_queries, dns_query);
purple_dnsquery_destroy(dns_query);
}
+
+ while (sa->url_datas) {
+ purple_util_fetch_url_cancel(sa->url_datas->data);
+ sa->url_datas = g_slist_delete_link(sa->url_datas, sa->url_datas);
+ }
+
+ buddies = purple_find_buddies(sa->account, NULL);
+ while (buddies != NULL) {
+ PurpleBuddy *buddy = buddies->data;
+ skypeweb_buddy_free(buddy);
+ purple_buddy_set_protocol_data(buddy, NULL);
+ buddies = g_slist_delete_link(buddies, buddies);
+ }
g_hash_table_destroy(sa->sent_messages_hash);
g_hash_table_destroy(sa->cookie_table);
@@ -433,6 +464,46 @@ skypeweb_cmd_invite(PurpleConversation *conv, const gchar *cmd, gchar **args, gc
return PURPLE_CMD_RET_OK;
}
+static PurpleCmdRet
+skypeweb_cmd_topic(PurpleConversation *conv, const gchar *cmd, gchar **args, gchar **error, void *data)
+{
+ PurpleConnection *pc = NULL;
+ PurpleChatConversation *chat;
+ int id = -1;
+
+ pc = purple_conversation_get_connection(conv);
+ chat = PURPLE_CHAT_CONVERSATION(conv);
+ id = purple_chat_conversation_get_id(chat);
+
+ if (pc == NULL || id == -1)
+ return PURPLE_CMD_RET_FAILED;
+
+ if (!args || !args[0]) {
+ gchar *buf;
+ const gchar *topic = purple_chat_conversation_get_topic(chat);
+
+ if (topic) {
+ gchar *tmp, *tmp2;
+ tmp = g_markup_escape_text(topic, -1);
+ tmp2 = purple_markup_linkify(tmp);
+ buf = g_strdup_printf(_("current topic is: %s"), tmp2);
+ g_free(tmp);
+ g_free(tmp2);
+ } else {
+ buf = g_strdup(_("No topic is set"));
+ }
+
+ purple_conv_chat_write(chat, NULL, buf, PURPLE_MESSAGE_SYSTEM | PURPLE_MESSAGE_NO_LOG, time(NULL));
+
+ g_free(buf);
+ return PURPLE_CMD_RET_OK;
+ }
+
+ skypeweb_chat_set_topic(pc, id, args ? args[0] : NULL);
+
+ return PURPLE_CMD_RET_OK;
+}
+
/******************************************************************************/
/* Plugin functions */
/******************************************************************************/
@@ -514,219 +585,352 @@ skypeweb_uri_handler(const char *proto, const char *cmd, GHashTable *params)
return FALSE;
}
-static gboolean
-plugin_load(PurplePlugin *plugin)
-{
- purple_signal_connect(purple_conversations_get_handle(), "conversation-updated", plugin, PURPLE_CALLBACK(skypeweb_mark_conv_seen), NULL);
-
- return TRUE;
-}
-
-static gboolean
-plugin_unload(PurplePlugin *plugin)
-{
- return TRUE;
-}
-
-static GList *
-skypeweb_actions(PurplePlugin *plugin, gpointer context)
-{
- GList *m = NULL;
- PurplePluginAction *act;
-
- act = purple_plugin_action_new(_("Search for friends..."),
- skypeweb_search_users);
- m = g_list_append(m, act);
+#if PURPLE_VERSION_CHECK(3, 0, 0)
+ static PurpleProtocol *skypeweb_protocol;
+#endif
- return m;
-}
-static void
-plugin_init(PurplePlugin *plugin)
+static gboolean
+plugin_load(PurplePlugin *plugin
+#if PURPLE_VERSION_CHECK(3, 0, 0)
+, GError **error
+#endif
+)
{
- PurpleAccountOption *option;
- PurplePluginInfo *info = plugin->info;
- PurplePluginProtocolInfo *prpl_info = info->extra_info;
- option = purple_account_option_bool_new("", "", FALSE);
- prpl_info->protocol_options = g_list_append(prpl_info->protocol_options, option);
+#if PURPLE_VERSION_CHECK(3, 0, 0)
+ skypeweb_protocol = purple_protocols_add(SKYPEWEB_TYPE_PROTOCOL, error);
+ if (!skypeweb_protocol)
+ return FALSE;
+#endif
+
//leave
- purple_cmd_register("leave", "", PURPLE_CMD_P_PRPL, PURPLE_CMD_FLAG_CHAT |
- PURPLE_CMD_FLAG_PRPL_ONLY | PURPLE_CMD_FLAG_ALLOW_WRONG_ARGS,
- plugin->info->id, skypeweb_cmd_leave,
+ purple_cmd_register("leave", "", PURPLE_CMD_P_PLUGIN, PURPLE_CMD_FLAG_CHAT |
+ PURPLE_CMD_FLAG_PROTOCOL_ONLY | PURPLE_CMD_FLAG_ALLOW_WRONG_ARGS,
+ SKYPEWEB_PLUGIN_ID, skypeweb_cmd_leave,
_("leave: Leave the group chat"), NULL);
//kick
- purple_cmd_register("kick", "s", PURPLE_CMD_P_PRPL, PURPLE_CMD_FLAG_CHAT |
- PURPLE_CMD_FLAG_PRPL_ONLY,
- plugin->info->id, skypeweb_cmd_kick,
+ purple_cmd_register("kick", "s", PURPLE_CMD_P_PLUGIN, PURPLE_CMD_FLAG_CHAT |
+ PURPLE_CMD_FLAG_PROTOCOL_ONLY,
+ SKYPEWEB_PLUGIN_ID, skypeweb_cmd_kick,
_("kick <user>: Kick a user from the group chat."),
NULL);
//add
- purple_cmd_register("add", "s", PURPLE_CMD_P_PRPL, PURPLE_CMD_FLAG_CHAT |
- PURPLE_CMD_FLAG_PRPL_ONLY,
- plugin->info->id, skypeweb_cmd_invite,
+ purple_cmd_register("add", "s", PURPLE_CMD_P_PLUGIN, PURPLE_CMD_FLAG_CHAT |
+ PURPLE_CMD_FLAG_PROTOCOL_ONLY,
+ SKYPEWEB_PLUGIN_ID, skypeweb_cmd_invite,
_("add <user>: Add a user to the group chat."),
NULL);
- /*
//topic
- purple_cmd_register("topic", "s", PURPLE_CMD_P_PRPL, PURPLE_CMD_FLAG_CHAT |
- PURPLE_CMD_FLAG_PRPL_ONLY | PURPLE_CMD_FLAG_ALLOW_WRONG_ARGS,
- plugin->info->id, skypeweb_cmd_topic,
+ purple_cmd_register("topic", "s", PURPLE_CMD_P_PLUGIN, PURPLE_CMD_FLAG_CHAT |
+ PURPLE_CMD_FLAG_PROTOCOL_ONLY | PURPLE_CMD_FLAG_ALLOW_WRONG_ARGS,
+ SKYPEWEB_PLUGIN_ID, skypeweb_cmd_topic,
_("topic [<new topic>]: View or change the topic"),
NULL);
+ /*
//call, as in call person
//kickban
- purple_cmd_register("kickban", "s", PURPLE_CMD_P_PRPL, PURPLE_CMD_FLAG_CHAT |
- PURPLE_CMD_FLAG_PRPL_ONLY,
- plugin->info->id, skypeweb_cmd_kickban,
+ purple_cmd_register("kickban", "s", PURPLE_CMD_P_PLUGIN, PURPLE_CMD_FLAG_CHAT |
+ PURPLE_CMD_FLAG_PROTOCOL_ONLY,
+ SKYPEWEB_PLUGIN_ID, skypeweb_cmd_kickban,
_("kickban <user> [room]: Kick and ban a user from the room."),
NULL);
//setrole
- purple_cmd_register("setrole", "ss", PURPLE_CMD_P_PRPL, PURPLE_CMD_FLAG_CHAT |
- PURPLE_CMD_FLAG_PRPL_ONLY,
- plugin->info->id, skypeweb_cmd_setrole,
+ purple_cmd_register("setrole", "ss", PURPLE_CMD_P_PLUGIN, PURPLE_CMD_FLAG_CHAT |
+ PURPLE_CMD_FLAG_PROTOCOL_ONLY,
+ SKYPEWEB_PLUGIN_ID, skypeweb_cmd_setrole,
_("setrole <user> <MASTER | USER | ADMIN>: Change the role of a user."),
NULL);
*/
- purple_cmd_register("list", "", PURPLE_CMD_P_PRPL, PURPLE_CMD_FLAG_CHAT |
- PURPLE_CMD_FLAG_PRPL_ONLY | PURPLE_CMD_FLAG_IM,
- plugin->info->id, skypeweb_cmd_list,
+ purple_cmd_register("list", "", PURPLE_CMD_P_PLUGIN, PURPLE_CMD_FLAG_CHAT |
+ PURPLE_CMD_FLAG_PROTOCOL_ONLY | PURPLE_CMD_FLAG_IM,
+ SKYPEWEB_PLUGIN_ID, skypeweb_cmd_list,
_("list: Display a list of multi-chat group chats you are in."),
NULL);
purple_signal_connect(purple_get_core(), "uri-handler", plugin, PURPLE_CALLBACK(skypeweb_uri_handler), NULL);
+
+ return TRUE;
+}
+
+static gboolean
+plugin_unload(PurplePlugin *plugin
+#if PURPLE_VERSION_CHECK(3, 0, 0)
+, GError **error
+#endif
+)
+{
+#if PURPLE_VERSION_CHECK(3, 0, 0)
+ if (!purple_protocols_remove(skypeweb_protocol, error))
+ return FALSE;
+#endif
+
+ return TRUE;
+}
+
+static GList *
+skypeweb_actions(
+#if !PURPLE_VERSION_CHECK(3, 0, 0)
+PurplePlugin *plugin, gpointer context
+#else
+PurpleConnection *pc
+#endif
+)
+{
+ GList *m = NULL;
+ PurplePluginAction *act;
+
+ act = purple_plugin_action_new(_("Search for friends..."),
+ skypeweb_search_users);
+ m = g_list_append(m, act);
+
+ return m;
}
#if !PURPLE_VERSION_CHECK(2, 8, 0)
# define OPT_PROTO_INVITE_MESSAGE 0x00000800
#endif
-static PurplePluginProtocolInfo prpl_info = {
+#if !PURPLE_VERSION_CHECK(3, 0, 0)
+static void
+plugin_init(PurplePlugin *plugin)
+{
+ PurplePluginInfo *info = g_new0(PurplePluginInfo, 1);
+ PurplePluginProtocolInfo *prpl_info = g_new0(PurplePluginProtocolInfo, 1);
+#endif
+
#if PURPLE_VERSION_CHECK(3, 0, 0)
- sizeof(PurplePluginProtocolInfo), /* struct_size */
+static void
+skypeweb_protocol_init(PurpleProtocol *prpl_info)
+{
+ PurpleProtocol *info = prpl_info;
+#endif
+ PurpleAccountOption *option, *typing_type1, *typing_type2;
+ PurpleBuddyIconSpec icon_spec = {"jpeg", 0, 0, 96, 96, 0, PURPLE_ICON_SCALE_DISPLAY};
+
+ //PurpleProtocol
+ info->id = SKYPEWEB_PLUGIN_ID;
+ info->name = "Skype (HTTP)";
+ prpl_info->options = OPT_PROTO_CHAT_TOPIC | OPT_PROTO_INVITE_MESSAGE /*| OPT_PROTO_IM_IMAGE*/;
+ option = purple_account_option_bool_new("", "", FALSE);
+ typing_type1 = purple_account_option_bool_new(N_("Show 'Typing' status as system message in chat window."), "show-typing-as-text", FALSE);
+ typing_type2 = purple_account_option_bool_new(N_("Show 'Typing' status with 'Voice' icon near buddy name."), "show-typing-as-icon", FALSE);
+
+#if !PURPLE_VERSION_CHECK(3, 0, 0)
+ prpl_info->protocol_options = g_list_append(prpl_info->protocol_options, option);
+ prpl_info->protocol_options = g_list_append(prpl_info->protocol_options, typing_type1);
+ prpl_info->protocol_options = g_list_append(prpl_info->protocol_options, typing_type2);
+ prpl_info->icon_spec = icon_spec;
+#else
+ prpl_info->account_options = g_list_append(prpl_info->account_options, option);
+ prpl_info->account_options = g_list_append(prpl_info->account_options, typing_type1);
+ prpl_info->account_options = g_list_append(prpl_info->account_options, typing_type2);
+ prpl_info->icon_spec = &icon_spec;
#endif
+
+#if PURPLE_VERSION_CHECK(3, 0, 0)
+}
+
+static void
+skypeweb_protocol_class_init(PurpleProtocolClass *prpl_info)
+{
+#endif
+ //PurpleProtocolClass
+ prpl_info->login = skypeweb_login;
+ prpl_info->close = skypeweb_close;
+ prpl_info->status_types = skypeweb_status_types;
+ prpl_info->list_icon = skypeweb_list_icon;
+#if PURPLE_VERSION_CHECK(3, 0, 0)
+}
+
+static void
+skypeweb_protocol_client_iface_init(PurpleProtocolClientIface *prpl_info)
+{
+ PurpleProtocolClientIface *info = prpl_info;
+#endif
+
+ //PurpleProtocolClientIface
+#if !PURPLE_VERSION_CHECK(3, 0, 0)
+ info->actions = skypeweb_actions;
+#else
+ info->get_actions = skypeweb_actions;
+#endif
+ prpl_info->list_emblem = skypeweb_list_emblem;
+ prpl_info->status_text = skypeweb_status_text;
+ prpl_info->tooltip_text = skypeweb_tooltip_text;
+ prpl_info->blist_node_menu = skypeweb_node_menu;
+ prpl_info->buddy_free = skypeweb_buddy_free;
+ prpl_info->normalize = purple_normalize_nocase;
+ prpl_info->offline_message = skypeweb_offline_message;
+ prpl_info->get_account_text_table = NULL; // skypeweb_get_account_text_table;
+#if PURPLE_VERSION_CHECK(3, 0, 0)
+}
+
+static void
+skypeweb_protocol_server_iface_init(PurpleProtocolServerIface *prpl_info)
+{
+#endif
+
+ //PurpleProtocolServerIface
+ prpl_info->get_info = skypeweb_get_info;
+ prpl_info->set_status = skypeweb_set_status;
+ prpl_info->set_idle = skypeweb_set_idle;
+#if !PURPLE_VERSION_CHECK(3, 0, 0)
+ prpl_info->add_buddy = skypeweb_add_buddy;
+#else
+ prpl_info->add_buddy = skypeweb_add_buddy_with_invite;
+#endif
+ prpl_info->remove_buddy = skypeweb_buddy_remove;
+ prpl_info->group_buddy = skypeweb_fake_group_buddy;
+ prpl_info->rename_group = skypeweb_fake_group_rename;
+#if PURPLE_VERSION_CHECK(3, 0, 0)
+}
- /* options */
- OPT_PROTO_CHAT_TOPIC | OPT_PROTO_INVITE_MESSAGE /*| OPT_PROTO_IM_IMAGE*/,
-
- NULL, /* user_splits */
- NULL, /* protocol_options */
- {"jpeg", 0, 0, 96, 96, 0, PURPLE_ICON_SCALE_DISPLAY}, /* icon_spec */
- skypeweb_list_icon, /* list_icon */
- skypeweb_list_emblem, /* list_emblems */
- skypeweb_status_text, /* status_text */
- skypeweb_tooltip_text, /* tooltip_text */
- skypeweb_status_types, /* status_types */
- skypeweb_node_menu, /* blist_node_menu */
- skypeweb_chat_info, /* chat_info */
- skypeweb_chat_info_defaults, /* chat_info_defaults */
- skypeweb_login, /* login */
- skypeweb_close, /* close */
- skypeweb_send_im, /* send_im */
- NULL, /* set_info */
- skypeweb_send_typing, /* send_typing */
- skypeweb_get_info, /* get_info */
- skypeweb_set_status, /* set_status */
- skypeweb_set_idle, /* set_idle */
- NULL, /* change_passwd */
+static void
+skypeweb_protocol_im_iface_init(PurpleProtocolIMIface *prpl_info)
+{
+#endif
+
+ //PurpleProtocolIMIface
#if !PURPLE_VERSION_CHECK(3, 0, 0)
- skypeweb_add_buddy, /* add_buddy */
+ prpl_info->send_im = skypeweb_send_im;
#else
- skypeweb_add_buddy_with_invite,
+ prpl_info->send = skypeweb_send_im;
+#endif
+ prpl_info->send_typing = skypeweb_send_typing;
+#if PURPLE_VERSION_CHECK(3, 0, 0)
+}
+
+static void
+skypeweb_protocol_chat_iface_init(PurpleProtocolChatIface *prpl_info)
+{
#endif
- NULL, /* add_buddies */
- skypeweb_buddy_remove, /* remove_buddy */
- NULL, /* remove_buddies */
- NULL, /* add_permit */
- skypeweb_buddy_block, /* add_deny */
- NULL, /* rem_permit */
- skypeweb_buddy_unblock, /* rem_deny */
- NULL, /* set_permit_deny */
- skypeweb_join_chat, /* join_chat */
- NULL, /* reject chat invite */
- skypeweb_get_chat_name, /* get_chat_name */
- skypeweb_chat_invite, /* chat_invite */
- NULL,//skypeweb_chat_fake_leave, /* chat_leave */
- NULL, /* chat_whisper */
- skypeweb_chat_send, /* chat_send */
- NULL, /* keepalive */
- NULL, /* register_user */
- NULL, /* get_cb_info */
+
+ //PurpleProtocolChatIface
#if !PURPLE_VERSION_CHECK(3, 0, 0)
- NULL, /* get_cb_away */
+ prpl_info->chat_info = skypeweb_chat_info;
+ prpl_info->chat_info_defaults = skypeweb_chat_info_defaults;
+ prpl_info->join_chat = skypeweb_join_chat;
+ prpl_info->get_chat_name = skypeweb_get_chat_name;
+ prpl_info->chat_invite = skypeweb_chat_invite;
+ prpl_info->chat_leave = NULL; //skypeweb_chat_fake_leave;
+ prpl_info->chat_send = skypeweb_chat_send;
+ prpl_info->set_chat_topic = skypeweb_chat_set_topic;
+#else
+ prpl_info->info = skypeweb_chat_info;
+ prpl_info->info_defaults = skypeweb_chat_info_defaults;
+ prpl_info->join = skypeweb_join_chat;
+ prpl_info->get_name = skypeweb_get_chat_name;
+ prpl_info->invite = skypeweb_chat_invite;
+ prpl_info->leave = NULL; //skypeweb_chat_fake_leave;
+ prpl_info->send = skypeweb_chat_send;
+ prpl_info->set_topic = skypeweb_chat_set_topic;
#endif
- NULL, /* alias_buddy */
- skypeweb_fake_group_buddy, /* group_buddy */
- skypeweb_fake_group_rename, /* rename_group */
- skypeweb_buddy_free, /* buddy_free */
- NULL, /* convo_closed */
- purple_normalize_nocase, /* normalize */
- NULL, /* set_buddy_icon */
- NULL, /* remove_group */
- NULL, /* get_cb_real_name */
- NULL, /* set_chat_topic */
- NULL, /* find_blist_chat */
- skypeweb_roomlist_get_list, /* roomlist_get_list */
- NULL, /* roomlist_cancel */
- NULL, /* roomlist_expand_category */
- NULL, /* can_receive_file */
- NULL, /* send_file */
- NULL, /* new_xfer */
- skypeweb_offline_message, /* offline_message */
- NULL, /* whiteboard_prpl_ops */
- NULL, /* send_raw */
- NULL, /* roomlist_room_serialize */
- NULL, /* unregister_user */
- NULL, /* send_attention */
- NULL, /* attention_types */
-#if (PURPLE_MAJOR_VERSION == 2 && PURPLE_MINOR_VERSION >= 5) || PURPLE_MAJOR_VERSION > 2
-#if PURPLE_MAJOR_VERSION == 2 && PURPLE_MINOR_VERSION >= 5
- sizeof(PurplePluginProtocolInfo), /* struct_size */
+#if PURPLE_VERSION_CHECK(3, 0, 0)
+}
+
+static void
+skypeweb_protocol_privacy_iface_init(PurpleProtocolPrivacyIface *prpl_info)
+{
#endif
- NULL, // skypeweb_get_account_text_table, /* get_account_text_table */
- NULL, /* initiate_media */
- NULL, /* can_do_media */
- NULL, /* get_moods */
- NULL, /* set_public_alias */
- NULL /* get_public_alias */
-#if PURPLE_MAJOR_VERSION == 2 && PURPLE_MINOR_VERSION >= 8
-, skypeweb_add_buddy_with_invite, /* add_buddy_with_invite */
- NULL /* add_buddies_with_invite */
+
+ //PurpleProtocolPrivacyIface
+ prpl_info->add_deny = skypeweb_buddy_block;
+ prpl_info->rem_deny = skypeweb_buddy_unblock;
+#if PURPLE_VERSION_CHECK(3, 0, 0)
+}
+
+static void
+skypeweb_protocol_roomlist_iface_init(PurpleProtocolRoomlistIface *prpl_info)
+{
#endif
+
+ //PurpleProtocolRoomlistIface
+#if !PURPLE_VERSION_CHECK(3, 0, 0)
+ prpl_info->roomlist_get_list = skypeweb_roomlist_get_list;
+#else
+ prpl_info->get_list = skypeweb_roomlist_get_list;
#endif
-};
-
-static PurplePluginInfo info = {
- PURPLE_PLUGIN_MAGIC,
- PURPLE_MAJOR_VERSION, /* major_version */
- PURPLE_MINOR_VERSION, /* minor version */
- PURPLE_PLUGIN_PROTOCOL, /* type */
- NULL, /* ui_requirement */
- 0, /* flags */
- NULL, /* dependencies */
- PURPLE_PRIORITY_DEFAULT, /* priority */
- SKYPEWEB_PLUGIN_ID, /* id */
- "Skype (HTTP)", /* name */
- SKYPEWEB_PLUGIN_VERSION, /* version */
- N_("Skype for Web Protocol Plugin"), /* summary */
- N_("Skype for Web Protocol Plugin"), /* description */
- "Eion Robb <eionrobb@gmail.com>", /* author */
- "http://skype4pidgin.googlecode.com/", /* homepage */
- plugin_load, /* load */
- plugin_unload, /* unload */
- NULL, /* destroy */
- NULL, /* ui_info */
- &prpl_info, /* extra_info */
- NULL, /* prefs_info */
- skypeweb_actions, /* actions */
-
- /* padding */
- NULL,
- NULL,
- NULL,
- NULL
-};
-
-PURPLE_INIT_PLUGIN(skypeweb, plugin_init, info);
+
+#if !PURPLE_VERSION_CHECK(3, 0, 0)
+ // Plugin info
+ info->magic = PURPLE_PLUGIN_MAGIC;
+ info->major_version = PURPLE_MAJOR_VERSION;
+ info->minor_version = PURPLE_MINOR_VERSION;
+ info->type = PURPLE_PLUGIN_PROTOCOL;
+ info->priority = PURPLE_PRIORITY_DEFAULT;
+ info->version = SKYPEWEB_PLUGIN_VERSION;
+ info->summary = N_("Skype for Web Protocol Plugin");
+ info->description = N_("Skype for Web Protocol Plugin");
+ info->author = "Eion Robb <eionrobb@gmail.com>";
+ info->homepage = "http://github.com/EionRobb/skype4pidgin";
+ info->load = plugin_load;
+ info->unload = plugin_unload;
+ info->extra_info = prpl_info;
+
+ // Protocol info
+ #if PURPLE_MINOR_VERSION >= 5
+ prpl_info->struct_size = sizeof(PurplePluginProtocolInfo);
+ #endif
+ #if PURPLE_MINOR_VERSION >= 8
+ prpl_info->add_buddy_with_invite = skypeweb_add_buddy_with_invite;
+ #endif
+
+ plugin->info = info;
+#endif
+
+}
+
+#if PURPLE_VERSION_CHECK(3, 0, 0)
+
+
+PURPLE_DEFINE_TYPE_EXTENDED(
+ SkypeWebProtocol, skypeweb_protocol, PURPLE_TYPE_PROTOCOL, G_TYPE_FLAG_ABSTRACT,
+
+ PURPLE_IMPLEMENT_INTERFACE_STATIC(PURPLE_TYPE_PROTOCOL_CLIENT_IFACE,
+ skypeweb_protocol_client_iface_init)
+
+ PURPLE_IMPLEMENT_INTERFACE_STATIC(PURPLE_TYPE_PROTOCOL_SERVER_IFACE,
+ skypeweb_protocol_server_iface_init)
+
+ PURPLE_IMPLEMENT_INTERFACE_STATIC(PURPLE_TYPE_PROTOCOL_IM_IFACE,
+ skypeweb_protocol_im_iface_init)
+
+ PURPLE_IMPLEMENT_INTERFACE_STATIC(PURPLE_TYPE_PROTOCOL_CHAT_IFACE,
+ skypeweb_protocol_chat_iface_init)
+
+ PURPLE_IMPLEMENT_INTERFACE_STATIC(PURPLE_TYPE_PROTOCOL_PRIVACY_IFACE,
+ skypeweb_protocol_privacy_iface_init)
+
+ PURPLE_IMPLEMENT_INTERFACE_STATIC(PURPLE_TYPE_PROTOCOL_ROOMLIST_IFACE,
+ skypeweb_protocol_roomlist_iface_init)
+);
+
+static PurplePluginInfo *
+plugin_query(GError **error)
+{
+ return purple_plugin_info_new(
+ "id", SKYPEWEB_PLUGIN_ID,
+ "name", "SkypeWeb Protocol",
+ "version", SKYPEWEB_PLUGIN_VERSION,
+ "category", N_("Protocol"),
+ "summary", N_("SkypeWeb Protocol Plugin"),
+ "description", N_("SkypeWeb Protocol Plugin"),
+ "website", "http://github.com/EionRobb/skype4pidgin",
+ "abi-version", PURPLE_ABI_VERSION,
+ "flags", PURPLE_PLUGIN_INFO_FLAGS_INTERNAL |
+ PURPLE_PLUGIN_INFO_FLAGS_AUTO_LOAD,
+ NULL
+ );
+}
+
+
+PURPLE_PLUGIN_INIT(skypeweb, plugin_query, plugin_load, plugin_unload);
+#else
+
+static PurplePluginInfo aLovelyBunchOfCoconuts;
+PURPLE_INIT_PLUGIN(skypeweb, plugin_init, aLovelyBunchOfCoconuts);
+#endif
+
diff --git a/skypeweb/libskypeweb.h b/skypeweb/libskypeweb.h
index 24a686a..6b1fcba 100644
--- a/skypeweb/libskypeweb.h
+++ b/skypeweb/libskypeweb.h
@@ -28,8 +28,8 @@
#include <string.h>
#include <glib/gi18n.h>
#include <sys/types.h>
-#include <sys/time.h>
#ifdef __GNUC__
+ #include <sys/time.h>
#include <unistd.h>
#endif
@@ -80,6 +80,7 @@
#else
#include "buddylist.h"
#include "plugins.h"
+ #include "http.h"
#endif
#if GLIB_MAJOR_VERSION >= 2 && GLIB_MINOR_VERSION >= 12
@@ -95,17 +96,24 @@
#define PurpleChatConversation PurpleConvChat
#define PurpleIMConversation PurpleConvIm
#define PurpleProtocolAction PurplePluginAction
-/* #define G_TYPE_STRING PURPLE_TYPE_STRING */
#define PURPLE_IS_BUDDY PURPLE_BLIST_NODE_IS_BUDDY
#define PurpleProtocolChatEntry struct proto_chat_entry
#define PURPLE_CONNECTION_CONNECTED PURPLE_CONNECTED
#define PURPLE_CONNECTION_CONNECTING PURPLE_CONNECTING
+ #define PURPLE_CONNECTION_FLAG_HTML PURPLE_CONNECTION_HTML
+ #define PURPLE_CONNECTION_FLAG_NO_BGCOLOR PURPLE_CONNECTION_NO_BGCOLOR
+ #define PURPLE_CONNECTION_FLAG_NO_FONTSIZE PURPLE_CONNECTION_NO_FONTSIZE
#define purple_connection_get_protocol_data(pc) ((pc)->proto_data)
#define purple_connection_set_protocol_data(pc, data) ((pc)->proto_data = (data))
+ #define purple_connection_set_flags(pc, flags) (pc->flags = flags)
+ #define purple_connection_get_flags(pc) (pc->flags)
#define purple_conversation_present_error purple_conv_present_error
#define purple_account_privacy_check purple_privacy_check
+ #define purple_account_get_private_alias purple_account_get_alias
+ #define purple_account_set_private_alias purple_account_set_alias
#define purple_serv_got_im serv_got_im
#define purple_serv_got_typing serv_got_typing
+ #define purple_serv_got_alias serv_got_alias
#define PurpleIMTypingState PurpleTypingState
#define PURPLE_IM_NOT_TYPING PURPLE_NOT_TYPING
#define PURPLE_IM_TYPING PURPLE_TYPING
@@ -116,14 +124,22 @@
#define PurpleChatUserFlags PurpleConvChatBuddyFlags
#define PURPLE_CHAT_USER_NONE PURPLE_CBFLAGS_NONE
#define PURPLE_CHAT_USER_OP PURPLE_CBFLAGS_OP
+ #define PURPLE_CHAT_USER_FOUNDER PURPLE_CBFLAGS_FOUNDER
+ #define PURPLE_CHAT_USER_TYPING PURPLE_CBFLAGS_TYPING
+ #define PURPLE_CHAT_USER_AWAY PURPLE_CBFLAGS_AWAY
+ #define PURPLE_CHAT_USER_HALFOP PURPLE_CBFLAGS_HALFOP
#define PURPLE_CHAT_USER_VOICE PURPLE_CBFLAGS_VOICE
+ #define PURPLE_CHAT_USER_TYPING PURPLE_CBFLAGS_TYPING
+ #define purple_chat_user_get_flags(cb) purple_conv_chat_user_get_flags(
#define purple_serv_got_joined_chat(pc, id, name) PURPLE_CONV_CHAT(serv_got_joined_chat(pc, id, name))
#define purple_serv_got_chat_invite serv_got_chat_invite
#define purple_serv_got_chat_in serv_got_chat_in
+ #define purple_chat_conversation_get_topic purple_conv_chat_get_topic
#define purple_chat_conversation_set_topic purple_conv_chat_set_topic
#define purple_chat_conversation_find_user(chat, name) purple_conv_chat_cb_find(chat, name)
#define purple_chat_conversation_add_user purple_conv_chat_add_user
#define purple_chat_conversation_leave purple_conv_chat_left
+ #define purple_chat_conversation_has_left purple_conv_chat_has_left
#define purple_chat_conversation_add_user purple_conv_chat_add_user
#define purple_chat_conversation_remove_user purple_conv_chat_remove_user
#define purple_chat_conversation_clear_users purple_conv_chat_clear_users
@@ -137,7 +153,7 @@
#define purple_conversations_find_im_with_account(name, account) PURPLE_CONV_IM(purple_find_conversation_with_account(PURPLE_CONV_TYPE_IM, name, account))
#define purple_chat_conversation_new(account, from) PURPLE_CONV_CHAT(purple_conversation_new(PURPLE_CONV_TYPE_CHAT, account, from))
#define purple_im_conversation_new(account, from) PURPLE_CONV_IM(purple_conversation_new(PURPLE_CONV_TYPE_IM, account, from))
- #define PURPLE_CONVERSATION(chatorim) (chatorim->conv)
+ #define PURPLE_CONVERSATION(chatorim) (chatorim == NULL ? NULL : chatorim->conv)
#define PURPLE_IM_CONVERSATION(conv) PURPLE_CONV_IM(conv)
#define PURPLE_CHAT_CONVERSATION(conv) PURPLE_CONV_CHAT(conv)
#define PURPLE_IS_IM_CONVERSATION(conv) (purple_conversation_get_type(conv) == PURPLE_CONV_TYPE_IM)
@@ -157,27 +173,76 @@
#define purple_hash_append purple_cipher_context_append
#define purple_hash_digest(hash, data, len) purple_cipher_context_digest(hash, len, data, NULL)
#define purple_hash_destroy purple_cipher_context_destroy
+ #define PURPLE_CMD_FLAG_PROTOCOL_ONLY PURPLE_CMD_FLAG_PRPL_ONLY
+ #define PURPLE_CMD_P_PLUGIN PURPLE_CMD_P_PRPL
+
+/*typedef struct {
+ PurpleConvChatBuddy cb;
+ PurpleConvChat *chat;
+} PurpleChatUser;*/
+
+typedef struct {
+ gchar *host;
+ gint port;
+ gchar *path;
+ gchar *user;
+ gchar *passwd;
+} PurpleHttpURL;
+
+static inline PurpleHttpURL *purple_http_url_parse(const gchar *url) {
+ PurpleHttpURL *ret = g_new0(PurpleHttpURL, 1);
+ purple_url_parse(url, &(ret->host), &(ret->port), &(ret->path), &(ret->user), &(ret->passwd));
+ return ret;
+}
+ #define purple_http_url_get_host(httpurl) (httpurl->host)
+ #define purple_http_url_get_path(httpurl) (httpurl->path)
+static inline void purple_http_url_free(PurpleHttpURL *phl) { g_free(phl->host); g_free(phl->path); g_free(phl->user); g_free(phl->passwd); g_free(phl); }
+
#else
#define purple_conversation_set_data(conv, key, value) g_object_set_data(G_OBJECT(conv), key, value)
#define purple_conversation_get_data(conv, key) g_object_get_data(G_OBJECT(conv), key)
#define purple_hash_destroy g_object_unref
+ #define PURPLE_TYPE_STRING G_TYPE_STRING
+
+
+typedef struct _SkypeWebProtocol
+{
+ PurpleProtocol parent;
+} SkypeWebProtocol;
+
+typedef struct _SkypeWebProtocolClass
+{
+ PurpleProtocolClass parent_class;
+} SkypeWebProtocolClass;
+
+G_MODULE_EXPORT GType skypeweb_protocol_get_type(void);
+#define SKYPEWEB_TYPE_PROTOCOL (skypeweb_protocol_get_type())
+#define SKYPEWEB_PROTOCOL(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), SKYPEWEB_TYPE_PROTOCOL, SkypeWebProtocol))
+#define SKYPEWEB_PROTOCOL_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass), SKYPEWEB_TYPE_PROTOCOL, SkypeWebProtocolClass))
+#define SKYPEWEB_IS_PROTOCOL(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), SKYPEWEB_TYPE_PROTOCOL))
+#define SKYPEWEB_IS_PROTOCOL_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass), SKYPEWEB_TYPE_PROTOCOL))
+#define SKYPEWEB_PROTOCOL_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), SKYPEWEB_TYPE_PROTOCOL, SkypeWebProtocolClass))
+
#endif
#define SKYPEWEB_MAX_MSG_RETRY 2
#define SKYPEWEB_PLUGIN_ID "prpl-skypeweb"
-#define SKYPEWEB_PLUGIN_VERSION "0.1"
+#define SKYPEWEB_PLUGIN_VERSION "1.0"
#define SKYPEWEB_LOCKANDKEY_APPID "msmsgs@msnmsgr.com"
#define SKYPEWEB_LOCKANDKEY_SECRET "Q1P7W2E4J9R8U3S5"
#define SKYPEWEB_CONTACTS_HOST "api.skype.com"
+#define SKYPEWEB_NEW_CONTACTS_HOST "contacts.skype.com"
#define SKYPEWEB_DEFAULT_MESSAGES_HOST "client-s.gateway.messenger.live.com"
#define SKYPEWEB_LOGIN_HOST "login.skype.com"
#define SKYPEWEB_VIDEOMAIL_HOST "vm.skype.com"
#define SKYPEWEB_CLIENTINFO_NAME "swx-skype.com"
-#define SKYPEWEB_CLIENTINFO_VERSION "908/1.2.273"
+#define SKYPEWEB_CLIENTINFO_VERSION "908/1.13.79"
+
+#define SKYPEWEB_BUDDY_IS_MSN(a) G_UNLIKELY((a) != NULL && strchr((a), '@') != NULL)
typedef struct _SkypeWebAccount SkypeWebAccount;
typedef struct _SkypeWebBuddy SkypeWebBuddy;
@@ -206,6 +271,9 @@ struct _SkypeWebAccount {
gchar *skype_token;
gchar *registration_token;
gchar *endpoint;
+ gint registration_expiry;
+
+ GSList *url_datas; /**< PurpleUtilFetchUrlData to be cancelled on logout */
};
struct _SkypeWebBuddy {
@@ -224,6 +292,7 @@ struct _SkypeWebBuddy {
gchar *mood;
};
+void skypeweb_buddy_free(PurpleBuddy *buddy);
void skypeweb_do_all_the_things(SkypeWebAccount *sa);
diff --git a/skypeweb/purple-skypeweb.spec b/skypeweb/purple-skypeweb.spec
index 6bebbe5..9709b0b 100644
--- a/skypeweb/purple-skypeweb.spec
+++ b/skypeweb/purple-skypeweb.spec
@@ -1,28 +1,35 @@
-%define debug_package %{nil}
-%define plugin_name skypeweb
+%global debug_package %{nil}
+%global plugin_name skypeweb
+%global purplelib_name purple-%{plugin_name}
-Name: purple-%{plugin_name}
-Version: 0.1
-Release: 1
-Summary: Adds support for Skype to Pidgin
-Group: Applications/Productivity
+Name: skype4pidgin
+Version: 1.0
+Release: 2%{?dist}
+Summary: Skype plugin for Pidgin/Adium/libpurple
License: GPLv3
-URL: https://github.com/EionRobb/skype4pidgin
-Source0: %{plugin_name}.tar.gz
+URL: https://github.com/EionRobb/%{name}
+Source0: https://github.com/EionRobb/%{name}/releases/download/v1.0/%{name}-%{version}.tar.gz
+Requires: pidgin-%{plugin_name}
+
+%description
+Skype for Pidgin meta package.
-BuildRequires: glib2-devel
-BuildRequires: libpurple-devel
-BuildRequires: json-glib-devel
+%package -n %{purplelib_name}
+Summary: Adds support for Skype to Pidgin
+BuildRequires: pkgconfig(glib-2.0)
+BuildRequires: pkgconfig(purple)
+BuildRequires: pkgconfig(json-glib-1.0)
+BuildRequires: pkgconfig(zlib)
BuildRequires: gcc
-Requires: libpurple
-Requires: json-glib
+BuildRequires: perl
+BuildRequires: gettext
%package -n pidgin-%{plugin_name}
Summary: Adds pixmaps, icons and smileys for Skype protocol.
-Requires: %{name}
+Requires: %{purplelib_name}
Requires: pidgin
-%description
+%description -n %{purplelib_name}
Adds support for Skype to Pidgin, Adium, Finch and other libpurple
based messengers.
@@ -30,27 +37,55 @@ based messengers.
Adds pixmaps, icons and smileys for Skype protocol inplemented by libskypeweb.
%prep
-%setup -c
+%autosetup
+
+# fix W: wrong-file-end-of-line-encoding
+perl -i -pe 's/\r\n/\n/gs' %{plugin_name}/README.md
%build
-make
+cd %{plugin_name}
+%make_build
%install
-make install DESTDIR=%{buildroot}
+cd %{plugin_name}
+%make_install
-%files
-%{_libdir}/purple-2/libskypeweb.so
+%files -n %{purplelib_name}
+%{_libdir}/purple-2/lib%{plugin_name}.so
+%doc %{plugin_name}/README.md CHANGELOG.txt
+%license COPYING.txt
%files -n pidgin-%{plugin_name}
+%dir %{_datadir}/pixmaps/pidgin
+%dir %{_datadir}/pixmaps/pidgin/protocols
+%dir %{_datadir}/pixmaps/pidgin/protocols/16
%{_datadir}/pixmaps/pidgin/protocols/16/skype.png
%{_datadir}/pixmaps/pidgin/protocols/16/skypeout.png
+%dir %{_datadir}/pixmaps/pidgin/protocols/22
%{_datadir}/pixmaps/pidgin/protocols/22/skype.png
%{_datadir}/pixmaps/pidgin/protocols/22/skypeout.png
+%dir %{_datadir}/pixmaps/pidgin/protocols/48
%{_datadir}/pixmaps/pidgin/protocols/48/skype.png
%{_datadir}/pixmaps/pidgin/protocols/48/skypeout.png
+%dir %{_datadir}/pixmaps/pidgin/emotes
+%dir %{_datadir}/pixmaps/pidgin/emotes/skype
%{_datadir}/pixmaps/pidgin/emotes/skype/theme
+%files
+
%changelog
+* Thu Nov 26 2015 V1TSK <vitaly@easycoding.org> - 1.0-2
+- Applyed Maxim Orlov's fixes.
+
+* Sun Nov 08 2015 V1TSK <vitaly@easycoding.org> - 1.0-1
+- Updated to version 1.0.
+
+* Mon Aug 24 2015 jparvela <jparvela@gmail.com> - 0.1-4
+- Added missing files to spec file list.
+
+* Mon Aug 03 2015 BOPOHA <vorona.tolik@gmail.com> - 0.1-3
+- Fixed build with OBS. RPMS can be built from main tarball.
+
* Sat May 09 2015 V1TSK <vitaly@easycoding.org> - 0.1-2
- Separated packages. Now can be used with other libpurple-based clients without Pidgin being installed.
diff --git a/skypeweb/skypeweb_connection.c b/skypeweb/skypeweb_connection.c
index 05a664c..15eba11 100644
--- a/skypeweb/skypeweb_connection.c
+++ b/skypeweb/skypeweb_connection.c
@@ -68,7 +68,7 @@ static gchar *skypeweb_gunzip(const guchar *gzip_data, gssize *len_ptr)
if (gzip_err == Z_DATA_ERROR)
{
inflateEnd(&zstr);
- inflateInit2(&zstr, -MAX_WBITS);
+ gzip_err = inflateInit2(&zstr, -MAX_WBITS);
if (gzip_err != Z_OK)
{
g_free(data_buffer);
@@ -218,6 +218,7 @@ static void skypeweb_connection_process_data(SkypeWebConnection *skypewebcon)
}
}
+ purple_debug_misc("skypeweb", "Got response: %s\n", skypewebcon->rx_buf);
g_free(skypewebcon->rx_buf);
skypewebcon->rx_buf = NULL;
@@ -238,8 +239,6 @@ static void skypeweb_connection_process_data(SkypeWebConnection *skypewebcon)
} else {
JsonNode *root = json_parser_get_root(parser);
- //TODO
- purple_debug_info("skypeweb", "Got response: %s\n", tmp);
purple_debug_info("skypeweb", "executing callback for %s\n", skypewebcon->url);
skypewebcon->callback(skypewebcon->sa, root, skypewebcon->user_data);
}
@@ -378,6 +377,7 @@ static void skypeweb_post_or_get_connect_cb(gpointer data, gint source,
/* TODO: Check the return value of write() */
len = write(skypewebcon->fd, skypewebcon->request->str,
skypewebcon->request->len);
+ (void) len;
skypewebcon->input_watcher = purple_input_add(skypewebcon->fd,
PURPLE_INPUT_READ,
skypeweb_post_or_get_readdata_cb, skypewebcon);
@@ -396,6 +396,7 @@ static void skypeweb_post_or_get_ssl_connect_cb(gpointer data,
/* TODO: Check the return value of write() */
len = purple_ssl_write(skypewebcon->ssl_conn,
skypewebcon->request->str, skypewebcon->request->len);
+ (void) len;
purple_ssl_input_add(skypewebcon->ssl_conn,
skypeweb_post_or_get_ssl_readdata_cb, skypewebcon);
}
@@ -584,7 +585,7 @@ skypeweb_post_or_get(SkypeWebAccount *sa, SkypeWebMethod method,
g_string_append_printf(request, "Content-length: %zu\r\n", strlen(postdata));
}
- if (g_str_equal(host, SKYPEWEB_CONTACTS_HOST) || g_str_equal(host, SKYPEWEB_VIDEOMAIL_HOST)) {
+ if (g_str_equal(host, SKYPEWEB_CONTACTS_HOST) || g_str_equal(host, SKYPEWEB_VIDEOMAIL_HOST) || g_str_equal(host, SKYPEWEB_NEW_CONTACTS_HOST)) {
g_string_append_printf(request, "X-Skypetoken: %s\r\n", sa->skype_token);
g_string_append(request, "X-Stratus-Caller: " SKYPEWEB_CLIENTINFO_NAME "\r\n");
g_string_append(request, "X-Stratus-Request: abcd1234\r\n");
diff --git a/skypeweb/skypeweb_contacts.c b/skypeweb/skypeweb_contacts.c
index 034b7ac..1328340 100644
--- a/skypeweb/skypeweb_contacts.c
+++ b/skypeweb/skypeweb_contacts.c
@@ -34,16 +34,17 @@ static void
skypeweb_get_icon_cb(PurpleUtilFetchUrlData *url_data, gpointer user_data, const gchar *url_text, gsize len, const gchar *error_message)
{
PurpleBuddy *buddy = user_data;
- SkypeWebBuddy *sbuddy;
-
- if (!buddy || !buddy->proto_data)
- return;
+ SkypeWebBuddy *sbuddy = purple_buddy_get_protocol_data(buddy);
+ SkypeWebAccount *sa = sbuddy->sa;
+
+ sa->url_datas = g_slist_remove(sa->url_datas, url_data);
- sbuddy = buddy->proto_data;
+ active_icon_downloads--;
- purple_buddy_icons_set_for_user(buddy->account, buddy->name, g_memdup(url_text, len), len, sbuddy->avatar_url);
+ if (!buddy)
+ return;
- active_icon_downloads--;
+ purple_buddy_icons_set_for_user(purple_buddy_get_account(buddy), purple_buddy_get_name(buddy), g_memdup(url_text, len), len, url_data->url);
}
static void
@@ -52,16 +53,16 @@ skypeweb_get_icon_now(PurpleBuddy *buddy)
SkypeWebBuddy *sbuddy;
gchar *url;
- purple_debug_info("skypeweb", "getting new buddy icon for %s\n", buddy->name);
+ purple_debug_info("skypeweb", "getting new buddy icon for %s\n", purple_buddy_get_name(buddy));
- sbuddy = buddy->proto_data;
+ sbuddy = purple_buddy_get_protocol_data(buddy);
if (sbuddy != NULL && sbuddy->avatar_url && sbuddy->avatar_url[0]) {
url = g_strdup(sbuddy->avatar_url);
} else {
- url = g_strdup_printf("https://api.skype.com/users/%s/profile/avatar", purple_url_encode(buddy->name));
+ url = g_strdup_printf("https://api.skype.com/users/%s/profile/avatar", purple_url_encode(purple_buddy_get_name(buddy)));
}
- purple_util_fetch_url_request(buddy->account, url, TRUE, NULL, FALSE, NULL, FALSE, 524288, skypeweb_get_icon_cb, buddy);
+ skypeweb_fetch_url_request(sbuddy->sa, url, TRUE, NULL, FALSE, NULL, FALSE, 524288, skypeweb_get_icon_cb, buddy);
g_free(url);
@@ -94,10 +95,24 @@ static void
skypeweb_got_imagemessage(PurpleUtilFetchUrlData *url_data, gpointer user_data, const gchar *url_text, gsize len, const gchar *error_message)
{
PurpleConversation *conv = user_data;
+ PurpleConnection *pc = purple_conversation_get_connection(conv);
+ SkypeWebAccount *sa = purple_connection_get_protocol_data(pc);
gint icon_id;
gchar *msg_tmp;
- if (!url_text || !url_text[0] || url_text[0] == '{')
+ sa->url_datas = g_slist_remove(sa->url_datas, url_data);
+
+ if (url_text == NULL && url_data->data_len) {
+ gchar *location;
+ location = skypeweb_string_get_chunk(url_data->webdata, url_data->data_len, "Location: https://", "/");
+ if (location && *location) {
+ skypeweb_download_uri_to_conv(sa, location, conv);
+ g_free(location);
+ }
+ return;
+ }
+
+ if (!url_text || !len || url_text[0] == '{' || url_text[0] == '<')
return;
if (error_message && *error_message)
@@ -115,26 +130,27 @@ skypeweb_got_imagemessage(PurpleUtilFetchUrlData *url_data, gpointer user_data,
void
skypeweb_download_uri_to_conv(SkypeWebAccount *sa, const gchar *uri, PurpleConversation *conv)
{
- gchar *url;
- gchar *clean_uri;
gchar *headers;
+ PurpleUtilFetchUrlData *requestdata;
+ PurpleHttpURL *httpurl;
- clean_uri = purple_strreplace(uri, "/v1//", "/v1/");
- url = g_strconcat(clean_uri, "/views/imgo", NULL);
-
- headers = g_strdup_printf("GET %s HTTP/1.0\r\n"
+ httpurl = purple_http_url_parse(uri);
+ headers = g_strdup_printf("GET /%s HTTP/1.0\r\n"
"Connection: close\r\n"
"Accept: image/*\r\n"
"Cookie: skypetoken_asm=%s\r\n"
- "Host: api.asm.skype.com\r\n"
+ "Host: %s\r\n"
"\r\n\r\n",
- strchr(url, '/'), sa->skype_token);
+ purple_http_url_get_path(httpurl), sa->skype_token,
+ purple_http_url_get_host(httpurl));
- purple_util_fetch_url_request(sa->account, url, TRUE, NULL, FALSE, headers, FALSE, -1, skypeweb_got_imagemessage, conv);
+ requestdata = skypeweb_fetch_url_request(sa, uri, TRUE, NULL, FALSE, headers, FALSE, -1, skypeweb_got_imagemessage, conv);
+
+ if (requestdata != NULL)
+ requestdata->num_times_redirected = 10; /* Prevent following redirects */
g_free(headers);
- g_free(url);
- g_free(clean_uri);
+ purple_http_url_free(httpurl);
}
@@ -142,6 +158,9 @@ static void
skypeweb_got_vm_file(PurpleUtilFetchUrlData *url_data, gpointer user_data, const gchar *url_text, gsize len, const gchar *error_message)
{
PurpleXfer *xfer = user_data;
+ SkypeWebAccount *sa = purple_connection_get_protocol_data(purple_account_get_connection(xfer->account));
+
+ sa->url_datas = g_slist_remove(sa->url_datas, url_data);
purple_xfer_write(xfer, (guchar *)url_text, len);
}
@@ -149,6 +168,7 @@ skypeweb_got_vm_file(PurpleUtilFetchUrlData *url_data, gpointer user_data, const
static void
skypeweb_init_vm_download(PurpleXfer *xfer)
{
+ SkypeWebAccount *sa;
JsonObject *file = xfer->data;
gint64 fileSize;
const gchar *url;
@@ -157,7 +177,8 @@ skypeweb_init_vm_download(PurpleXfer *xfer)
url = json_object_get_string_member(file, "url");
purple_xfer_set_completed(xfer, FALSE);
- purple_util_fetch_url_request(xfer->account, url, TRUE, NULL, FALSE, NULL, FALSE, fileSize, skypeweb_got_vm_file, xfer);
+ sa = purple_connection_get_protocol_data(purple_account_get_connection(xfer->account));
+ skypeweb_fetch_url_request(sa, url, TRUE, NULL, FALSE, NULL, FALSE, fileSize, skypeweb_got_vm_file, xfer);
json_object_unref(file);
}
@@ -192,6 +213,7 @@ skypeweb_got_vm_download_info(SkypeWebAccount *sa, JsonNode *node, gpointer user
assetId = json_object_get_string_member(obj, "assetId");
fileSize = json_object_get_int_member(file, "fileSize");
url = json_object_get_string_member(file, "url");
+ (void) url;
filename = g_strconcat(assetId, ".mp4", NULL);
@@ -256,7 +278,7 @@ skypeweb_got_self_details(SkypeWebAccount *sa, JsonNode *node, gpointer user_dat
{
JsonObject *userobj;
const gchar *old_alias;
- const gchar *displayname;
+ const gchar *displayname = NULL;
const gchar *username;
if (node == NULL || json_node_get_node_type(node) != JSON_NODE_OBJECT)
@@ -266,14 +288,19 @@ skypeweb_got_self_details(SkypeWebAccount *sa, JsonNode *node, gpointer user_dat
username = json_object_get_string_member(userobj, "username");
g_free(sa->username); sa->username = g_strdup(username);
- old_alias = purple_account_get_alias(sa->account);
+ old_alias = purple_account_get_private_alias(sa->account);
if (!old_alias || !*old_alias) {
- displayname = json_object_get_string_member(userobj, "displayname");
+ if (json_object_has_member(userobj, "displayname"))
+ displayname = json_object_get_string_member(userobj, "displayname");
if (!displayname || g_str_equal(displayname, username))
displayname = json_object_get_string_member(userobj, "firstname");
if (displayname)
- purple_account_set_alias(sa->account, displayname);
+ purple_account_set_private_alias(sa->account, displayname);
+ }
+
+ if (!PURPLE_CONNECTION_IS_CONNECTED(sa->pc)) {
+ skypeweb_do_all_the_things(sa);
}
}
@@ -281,7 +308,7 @@ skypeweb_got_self_details(SkypeWebAccount *sa, JsonNode *node, gpointer user_dat
void
skypeweb_get_self_details(SkypeWebAccount *sa)
{
- skypeweb_post_or_get(sa, SKYPEWEB_METHOD_GET | SKYPEWEB_METHOD_SSL, SKYPEWEB_CONTACTS_HOST, "/users/self/displayname", NULL, skypeweb_got_self_details, NULL, TRUE);
+ skypeweb_post_or_get(sa, SKYPEWEB_METHOD_GET | SKYPEWEB_METHOD_SSL, SKYPEWEB_CONTACTS_HOST, "/users/self/profile", NULL, skypeweb_got_self_details, NULL, TRUE);
}
@@ -297,7 +324,7 @@ skypeweb_search_results_add_buddy(PurpleConnection *pc, GList *row, void *user_d
{
PurpleAccount *account = purple_connection_get_account(pc);
- if (!purple_find_buddy(account, g_list_nth_data(row, 0)))
+ if (!purple_blist_find_buddy(account, g_list_nth_data(row, 0)))
purple_blist_request_add_buddy(account, g_list_nth_data(row, 0), "Skype", g_list_nth_data(row, 1));
}
@@ -398,7 +425,7 @@ void
skypeweb_search_users(PurplePluginAction *action)
{
PurpleConnection *pc = (PurpleConnection *) action->context;
- SkypeWebAccount *sa = pc->proto_data;
+ SkypeWebAccount *sa = purple_connection_get_protocol_data(pc);
purple_request_input(pc, "Search for Skype Friends",
"Search for Skype Friends",
@@ -437,16 +464,25 @@ skypeweb_got_friend_profiles(SkypeWebAccount *sa, JsonNode *node, gpointer user_
buddy = purple_find_buddy(sa->account, username);
if (!buddy)
continue;
- sbuddy = buddy->proto_data;
+ sbuddy = purple_buddy_get_protocol_data(buddy);
if (sbuddy == NULL) {
sbuddy = g_new0(SkypeWebBuddy, 1);
- buddy->proto_data = sbuddy;
+ purple_buddy_set_protocol_data(buddy, sbuddy);
sbuddy->skypename = g_strdup(username);
+ sbuddy->sa = sa;
}
g_free(sbuddy->display_name); sbuddy->display_name = g_strdup(json_object_get_string_member(contact, "displayname"));
- serv_got_alias(sa->pc, username, sbuddy->display_name);
- purple_blist_server_alias_buddy(buddy, json_object_get_string_member(contact, "firstname"));
+ purple_serv_got_alias(sa->pc, username, sbuddy->display_name);
+ if (json_object_has_member(contact, "lastname")) {
+ gchar *fullname = g_strconcat(json_object_get_string_member(contact, "firstname"), " ", json_object_get_string_member(contact, "lastname"), NULL);
+
+ purple_blist_server_alias_buddy(buddy, fullname);
+
+ g_free(fullname);
+ } else {
+ purple_blist_server_alias_buddy(buddy, json_object_get_string_member(contact, "firstname"));
+ }
new_avatar = json_object_get_string_member(contact, "avatarUrl");
if (new_avatar && *new_avatar && (!sbuddy->avatar_url || !g_str_equal(sbuddy->avatar_url, new_avatar))) {
@@ -532,11 +568,12 @@ skypeweb_got_info(SkypeWebAccount *sa, JsonNode *node, gpointer user_data)
buddy = purple_find_buddy(sa->account, username);
if (buddy) {
- sbuddy = buddy->proto_data;
+ sbuddy = purple_buddy_get_protocol_data(buddy);
if (sbuddy == NULL) {
sbuddy = g_new0(SkypeWebBuddy, 1);
- buddy->proto_data = sbuddy;
+ purple_buddy_set_protocol_data(buddy, sbuddy);
sbuddy->skypename = g_strdup(username);
+ sbuddy->sa = sa;
}
new_avatar = json_object_get_string_member(userobj, "avatarUrl");
@@ -557,7 +594,7 @@ skypeweb_got_info(SkypeWebAccount *sa, JsonNode *node, gpointer user_data)
void
skypeweb_get_info(PurpleConnection *pc, const gchar *username)
{
- SkypeWebAccount *sa = pc->proto_data;
+ SkypeWebAccount *sa = purple_connection_get_protocol_data(pc);
gchar *url;
url = g_strdup_printf("/users/%s/profile", purple_url_encode(username));
@@ -587,59 +624,96 @@ skypeweb_get_friend_profile(SkypeWebAccount *sa, const gchar *who)
static void
skypeweb_get_friend_list_cb(SkypeWebAccount *sa, JsonNode *node, gpointer user_data)
{
- JsonArray *friends;
+ JsonObject *obj;
+ JsonArray *contacts;
PurpleGroup *group = NULL;
GSList *users_to_fetch = NULL;
- gint index, length;
+ guint index, length;
- friends = json_node_get_array(node);
- length = json_array_get_length(friends);
+ obj = json_node_get_object(node);
+ contacts = json_object_get_array_member(obj, "contacts");
+ length = json_array_get_length(contacts);
for(index = 0; index < length; index++)
{
- JsonObject *friend = json_array_get_object_element(friends, index);
- const gchar *skypename = json_object_get_string_member(friend, "skypename");
- const gchar *fullname = json_object_get_string_member(friend, "fullname");
- const gchar *display_name = json_object_get_string_member(friend, "display_name");
- gboolean authorized = json_object_get_boolean_member(friend, "authorized");
- gboolean blocked = json_object_get_boolean_member(friend, "blocked");
+ JsonObject *contact = json_array_get_object_element(contacts, index);
+ const gchar *id = json_object_get_string_member(contact, "id");
+ const gchar *display_name = json_object_get_string_member(contact, "display_name");
+ const gchar *avatar_url = NULL;
+ gboolean authorized = json_object_get_boolean_member(contact, "authorized");
+ gboolean blocked = json_object_get_boolean_member(contact, "blocked");
+ const gchar *type = json_object_get_string_member(contact, "type");
+
+ JsonObject *name = json_object_get_object_member(contact, "name");
+ const gchar *firstname = json_object_get_string_member(name, "first");
+ const gchar *surname = NULL;
PurpleBuddy *buddy;
- buddy = purple_find_buddy(sa->account, skypename);
+ //TODO make this work for "pstn"
+ if (!g_str_equal(type, "skype") && !g_str_equal(type, "msn"))
+ continue;
+
+ if (json_object_has_member(contact, "suggested") && json_object_get_boolean_member(contact, "suggested") && !authorized) {
+ // suggested buddies wtf? some kind of advertising?
+ continue;
+ }
+
+ buddy = purple_find_buddy(sa->account, id);
if (!buddy)
{
if (!group)
{
- group = purple_find_group("Skype");
+ group = purple_blist_find_group("Skype");
if (!group)
{
group = purple_group_new("Skype");
purple_blist_add_group(group, NULL);
}
}
- buddy = purple_buddy_new(sa->account, skypename, display_name);
+ buddy = purple_buddy_new(sa->account, id, display_name);
purple_blist_add_buddy(buddy, NULL, group, NULL);
}
+ if (json_object_has_member(name, "surname"))
+ surname = json_object_get_string_member(name, "surname");
+
+ // try to free the sbuddy here. no-op if it's not set before, otherwise prevents a leak.
+ skypeweb_buddy_free(buddy);
+
SkypeWebBuddy *sbuddy = g_new0(SkypeWebBuddy, 1);
- sbuddy->skypename = g_strdup(skypename);
- sbuddy->fullname = g_strdup(fullname);
+ sbuddy->skypename = g_strdup(id);
+ sbuddy->sa = sa;
+ sbuddy->fullname = g_strconcat(firstname, (surname ? " " : NULL), surname, NULL);
sbuddy->display_name = g_strdup(display_name);
sbuddy->authorized = authorized;
sbuddy->blocked = blocked;
+ sbuddy->avatar_url = g_strdup(purple_buddy_icons_get_checksum_for_user(buddy));
sbuddy->buddy = buddy;
- buddy->proto_data = sbuddy;
+ purple_buddy_set_protocol_data(buddy, sbuddy);
- serv_got_alias(sa->pc, skypename, sbuddy->display_name);
- purple_blist_server_alias_buddy(buddy, fullname);
+ purple_serv_got_alias(sa->pc, id, sbuddy->display_name);
+ purple_blist_server_alias_buddy(buddy, sbuddy->fullname);
- users_to_fetch = g_slist_prepend(users_to_fetch, sbuddy->skypename);
+ if (json_object_has_member(contact, "avatar_url")) {
+ avatar_url = json_object_get_string_member(contact, "avatar_url");
+ if (avatar_url && *avatar_url && (!sbuddy->avatar_url || !g_str_equal(sbuddy->avatar_url, avatar_url))) {
+ g_free(sbuddy->avatar_url);
+ sbuddy->avatar_url = g_strdup(avatar_url);
+ skypeweb_get_icon(buddy);
+ }
+ }
+
+ if (blocked == TRUE) {
+ purple_privacy_deny_add(sa->account, id, TRUE);
+ } else {
+ users_to_fetch = g_slist_prepend(users_to_fetch, sbuddy->skypename);
+ }
}
if (users_to_fetch)
{
- skypeweb_get_friend_profiles(sa, users_to_fetch);
+ //skypeweb_get_friend_profiles(sa, users_to_fetch);
skypeweb_subscribe_to_contact_status(sa, users_to_fetch);
g_slist_free(users_to_fetch);
}
@@ -647,8 +721,18 @@ skypeweb_get_friend_list_cb(SkypeWebAccount *sa, JsonNode *node, gpointer user_d
void
skypeweb_get_friend_list(SkypeWebAccount *sa)
-{
- skypeweb_post_or_get(sa, SKYPEWEB_METHOD_GET | SKYPEWEB_METHOD_SSL, SKYPEWEB_CONTACTS_HOST, "/users/self/contacts", NULL, skypeweb_get_friend_list_cb, NULL, TRUE);
+{
+ gchar *url;
+
+ if (!sa->username) {
+ //purple_debug_error("skypeweb", "Can't fetch contacts yet, don't have local username");
+ return;
+ }
+
+ url = g_strdup_printf("/contacts/v1/users/%s/contacts", purple_url_encode(sa->username));
+ skypeweb_post_or_get(sa, SKYPEWEB_METHOD_GET | SKYPEWEB_METHOD_SSL, SKYPEWEB_NEW_CONTACTS_HOST, url, NULL, skypeweb_get_friend_list_cb, NULL, TRUE);
+
+ g_free(url);
}
@@ -660,19 +744,20 @@ skypeweb_auth_accept_cb(gpointer sender)
SkypeWebAccount *sa;
gchar *url = NULL;
GSList *users_to_fetch;
+ gchar *buddy_name;
- sa = buddy->account->gc->proto_data;
-
- url = g_strdup_printf("/users/self/contacts/auth-request/%s/accept", purple_url_encode(buddy->name));
+ sa = purple_connection_get_protocol_data(purple_account_get_connection(purple_buddy_get_account(buddy)));
+ buddy_name = g_strdup(purple_buddy_get_name(buddy));
+ url = g_strdup_printf("/users/self/contacts/auth-request/%s/accept", purple_url_encode(buddy_name));
skypeweb_post_or_get(sa, SKYPEWEB_METHOD_PUT | SKYPEWEB_METHOD_SSL, SKYPEWEB_CONTACTS_HOST, url, NULL, NULL, NULL, TRUE);
-
g_free(url);
// Subscribe to status/message updates
- users_to_fetch = g_slist_prepend(NULL, buddy->name);
+ users_to_fetch = g_slist_prepend(NULL, buddy_name);
skypeweb_subscribe_to_contact_status(sa, users_to_fetch);
g_slist_free(users_to_fetch);
+ g_free(buddy_name);
}
void
@@ -682,9 +767,9 @@ skypeweb_auth_reject_cb(gpointer sender)
SkypeWebAccount *sa;
gchar *url = NULL;
- sa = buddy->account->gc->proto_data;
+ sa = purple_connection_get_protocol_data(purple_account_get_connection(purple_buddy_get_account(buddy)));
- url = g_strdup_printf("/users/self/contacts/auth-request/%s/decline", purple_url_encode(buddy->name));
+ url = g_strdup_printf("/users/self/contacts/auth-request/%s/decline", purple_url_encode(purple_buddy_get_name(buddy)));
skypeweb_post_or_get(sa, SKYPEWEB_METHOD_PUT | SKYPEWEB_METHOD_SSL, SKYPEWEB_CONTACTS_HOST, url, NULL, NULL, NULL, TRUE);
@@ -695,7 +780,7 @@ static void
skypeweb_got_authrequests(SkypeWebAccount *sa, JsonNode *node, gpointer user_data)
{
JsonArray *requests;
- gint index, length;
+ guint index, length;
time_t latest_timestamp = 0;
requests = json_node_get_array(node);
@@ -703,12 +788,13 @@ skypeweb_got_authrequests(SkypeWebAccount *sa, JsonNode *node, gpointer user_dat
for(index = 0; index < length; index++)
{
JsonObject *request = json_array_get_object_element(requests, index);
- const gchar *event_time = json_object_get_string_member(request, "event_time");
+ const gchar *event_time_iso = json_object_get_string_member(request, "event_time_iso");
const gchar *sender = json_object_get_string_member(request, "sender");
const gchar *greeting = json_object_get_string_member(request, "greeting");
- time_t event_timestamp = purple_str_to_time(event_time, TRUE, NULL, NULL, NULL);
+ time_t event_timestamp = purple_str_to_time(event_time_iso, TRUE, NULL, NULL, NULL);
- if (event_timestamp <= sa->last_authrequest)
+ latest_timestamp = MAX(latest_timestamp, event_timestamp);
+ if (sa->last_authrequest && event_timestamp <= sa->last_authrequest)
continue;
purple_account_request_authorization(
@@ -716,7 +802,6 @@ skypeweb_got_authrequests(SkypeWebAccount *sa, JsonNode *node, gpointer user_dat
NULL, greeting, FALSE,
skypeweb_auth_accept_cb, skypeweb_auth_reject_cb, purple_buddy_new(sa->account, sender, NULL));
- latest_timestamp = MAX(latest_timestamp, event_timestamp);
}
sa->last_authrequest = latest_timestamp;
@@ -733,11 +818,13 @@ skypeweb_check_authrequests(SkypeWebAccount *sa)
void
skypeweb_add_buddy_with_invite(PurpleConnection *pc, PurpleBuddy *buddy, PurpleGroup *group, const char* message)
{
- SkypeWebAccount *sa = pc->proto_data;
+ SkypeWebAccount *sa = purple_connection_get_protocol_data(pc);
gchar *url, *postdata;
GSList *users_to_fetch;
+ gchar *buddy_name;
- url = g_strdup_printf("/users/self/contacts/auth-request/%s", purple_url_encode(buddy->name));
+ buddy_name = g_strdup(purple_buddy_get_name(buddy));
+ url = g_strdup_printf("/users/self/contacts/auth-request/%s", purple_url_encode(buddy_name));
postdata = g_strdup_printf("greeting=%s", message ? purple_url_encode(message) : "");
skypeweb_post_or_get(sa, SKYPEWEB_METHOD_PUT | SKYPEWEB_METHOD_SSL, SKYPEWEB_CONTACTS_HOST, url, postdata, NULL, NULL, TRUE);
@@ -746,9 +833,11 @@ skypeweb_add_buddy_with_invite(PurpleConnection *pc, PurpleBuddy *buddy, PurpleG
g_free(url);
// Subscribe to status/message updates
- users_to_fetch = g_slist_prepend(NULL, buddy->name);
+ users_to_fetch = g_slist_prepend(NULL, buddy_name);
skypeweb_subscribe_to_contact_status(sa, users_to_fetch);
g_slist_free(users_to_fetch);
+
+ g_free(buddy_name);
}
void
@@ -760,15 +849,22 @@ skypeweb_add_buddy(PurpleConnection *gc, PurpleBuddy *buddy, PurpleGroup *group)
void
skypeweb_buddy_remove(PurpleConnection *pc, PurpleBuddy *buddy, PurpleGroup *group)
{
- SkypeWebAccount *sa = pc->proto_data;
+ SkypeWebAccount *sa = purple_connection_get_protocol_data(pc);
+ gchar *url;
+
+ url = g_strdup_printf("/users/self/contacts/%s", purple_url_encode(purple_buddy_get_name(buddy)));
+
+ skypeweb_post_or_get(sa, SKYPEWEB_METHOD_DELETE | SKYPEWEB_METHOD_SSL, SKYPEWEB_CONTACTS_HOST, url, NULL, NULL, NULL, TRUE);
+
+ g_free(url);
- skypeweb_unsubscribe_from_contact_status(sa, buddy->name);
+ skypeweb_unsubscribe_from_contact_status(sa, purple_buddy_get_name(buddy));
}
void
skypeweb_buddy_block(PurpleConnection *pc, const char *name)
{
- SkypeWebAccount *sa = pc->proto_data;
+ SkypeWebAccount *sa = purple_connection_get_protocol_data(pc);
gchar *url, *postdata;
url = g_strdup_printf("/users/self/contacts/%s/block", purple_url_encode(name));
@@ -783,7 +879,7 @@ skypeweb_buddy_block(PurpleConnection *pc, const char *name)
void
skypeweb_buddy_unblock(PurpleConnection *pc, const char *name)
{
- SkypeWebAccount *sa = pc->proto_data;
+ SkypeWebAccount *sa = purple_connection_get_protocol_data(pc);
gchar *url;
url = g_strdup_printf("/users/self/contacts/%s/unblock", purple_url_encode(name));
diff --git a/skypeweb/skypeweb_login.c b/skypeweb/skypeweb_login.c
index 690efa7..5d2f15a 100644
--- a/skypeweb/skypeweb_login.c
+++ b/skypeweb/skypeweb_login.c
@@ -23,29 +23,38 @@
static void
skypeweb_login_did_auth(PurpleUtilFetchUrlData *url_data, gpointer user_data, const gchar *url_text, gsize len, const gchar *error_message)
{
- gchar *refresh_token;
+ gchar *refresh_token = NULL;
SkypeWebAccount *sa = user_data;
+ sa->url_datas = g_slist_remove(sa->url_datas, url_data);
+
if (url_text == NULL) {
url_text = url_data->webdata;
len = url_data->data_len;
}
- refresh_token = skypeweb_string_get_chunk(url_text, len, "=\"skypetoken\" value=\"", "\"");
+ if (url_text != NULL)
+ refresh_token = skypeweb_string_get_chunk(url_text, len, "=\"skypetoken\" value=\"", "\"");
+
if (refresh_token == NULL) {
- purple_debug_info("skypeweb", "login response was %s\r\n", url_text);
- purple_connection_error(sa->pc,
- PURPLE_CONNECTION_ERROR_AUTHENTICATION_FAILED,
- _("Failed getting Skype Token"));
- return;
+ if (g_strstr_len(url_text, len, "recaptcha_response_field")) {
+ purple_connection_error(sa->pc,
+ PURPLE_CONNECTION_ERROR_AUTHENTICATION_FAILED,
+ _("Captcha required.\nTry logging into web.skype.com and try again."));
+ return;
+ } else {
+ purple_debug_info("skypeweb", "login response was %s\r\n", url_text);
+ purple_connection_error(sa->pc,
+ PURPLE_CONNECTION_ERROR_AUTHENTICATION_FAILED,
+ _("Failed getting Skype Token"));
+ return;
+ }
}
sa->skype_token = refresh_token;
skypeweb_update_cookies(sa, url_text);
- purple_connection_set_state(sa->pc, PURPLE_CONNECTED);
-
skypeweb_do_all_the_things(sa);
}
@@ -59,15 +68,19 @@ skypeweb_login_got_pie(PurpleUtilFetchUrlData *url_data, gpointer user_data, con
const gchar *login_url = "https://" SKYPEWEB_LOGIN_HOST;// "/login?client_id=578134&redirect_uri=https%3A%2F%2Fweb.skype.com";
GString *postdata;
gchar *request;
+ struct timeval tv;
struct timezone tz;
- guint tzhours, tzminutes;
+ gint tzhours, tzminutes;
+ sa->url_datas = g_slist_remove(sa->url_datas, url_data);
+
if (error_message && *error_message) {
purple_connection_error(sa->pc, PURPLE_CONNECTION_ERROR_NETWORK_ERROR, error_message);
return;
}
- gettimeofday(NULL, &tz);
+ gettimeofday(&tv, &tz);
+ (void) tv;
tzminutes = tz.tz_minuteswest;
if (tzminutes < 0) tzminutes = -tzminutes;
tzhours = tzminutes / 60;
@@ -105,7 +118,7 @@ skypeweb_login_got_pie(PurpleUtilFetchUrlData *url_data, gpointer user_data, con
"Content-Length: %" G_GSIZE_FORMAT "\r\n\r\n%s",
strlen(postdata->str), postdata->str);
- purple_util_fetch_url_request(sa->account, login_url, TRUE, NULL, FALSE, request, TRUE, 524288, skypeweb_login_did_auth, sa);
+ skypeweb_fetch_url_request(sa, login_url, TRUE, NULL, FALSE, request, TRUE, 524288, skypeweb_login_did_auth, sa);
g_string_free(postdata, TRUE);
g_free(request);
@@ -121,7 +134,7 @@ skypeweb_begin_web_login(SkypeWebAccount *sa)
{
const gchar *login_url = "https://" SKYPEWEB_LOGIN_HOST "/login?method=skype&client_id=578134&redirect_uri=https%3A%2F%2Fweb.skype.com";
- purple_util_fetch_url_request(sa->account, login_url, TRUE, NULL, FALSE, NULL, FALSE, 524288, skypeweb_login_got_pie, sa);
+ skypeweb_fetch_url_request(sa, login_url, TRUE, NULL, FALSE, NULL, FALSE, 524288, skypeweb_login_got_pie, sa);
purple_connection_set_state(sa->pc, PURPLE_CONNECTION_CONNECTING);
purple_connection_update_progress(sa->pc, _("Connecting"), 1, 4);
@@ -135,6 +148,8 @@ skypeweb_login_got_t(PurpleUtilFetchUrlData *url_data, gpointer user_data, const
gchar *request;
GString *postdata;
gchar *magic_t_value; // T is for tasty
+
+ sa->url_datas = g_slist_remove(sa->url_datas, url_data);
// <input type="hidden" name="t" id="t" value="...">
magic_t_value = skypeweb_string_get_chunk(url_text, len, "=\"t\" value=\"", "\"");
@@ -160,7 +175,7 @@ skypeweb_login_got_t(PurpleUtilFetchUrlData *url_data, gpointer user_data, const
"Content-Length: %" G_GSIZE_FORMAT "\r\n\r\n%s",
strlen(postdata->str), postdata->str);
- purple_util_fetch_url_request(sa->account, login_url, TRUE, NULL, FALSE, request, TRUE, 524288, skypeweb_login_did_auth, sa);
+ skypeweb_fetch_url_request(sa, login_url, TRUE, NULL, FALSE, request, TRUE, 524288, skypeweb_login_did_auth, sa);
g_string_free(postdata, TRUE);
g_free(request);
@@ -180,6 +195,8 @@ skypeweb_login_got_ppft(PurpleUtilFetchUrlData *url_data, gpointer user_data, co
gchar *ppft;
GString *postdata;
gchar *request;
+
+ sa->url_datas = g_slist_remove(sa->url_datas, url_data);
// grab PPFT and cookies (MSPRequ, MSPOK)
msprequ_cookie = skypeweb_string_get_chunk(url_text, len, "Set-Cookie: MSPRequ=", ";");
@@ -209,7 +226,7 @@ skypeweb_login_got_ppft(PurpleUtilFetchUrlData *url_data, gpointer user_data, co
// POST to https://login.live.com/ppsecure/post.srf?wa=wsignin1.0&wreply=https%3A%2F%2Fsecure.skype.com%2Flogin%2Foauth%2Fproxy%3Fclient_id%3D578134%26redirect_uri%3Dhttps%253A%252F%252Fweb.skype.com
- request = g_strdup_printf("POST /ppsecure/post.srf?wa=wsignin1.0&wreply=https%%3A%%2F%%2Fsecure.skype.com%%2Flogin%%2Foauth%%2Fproxy%%3Fclient_id%%3D578134%%26redirect_uri%%3Dhttps%%253A%%252F%%252Fweb.skype.com HTTP/1.0\r\n"
+ request = g_strdup_printf("POST /ppsecure/post.srf?wa=wsignin1.0&wp=MBI_SSL&wreply=https%%3A%%2F%%2Fsecure.skype.com%%2Flogin%%2Foauth%%2Fproxy%%3Fclient_id%%3D578134%%26redirect_uri%%3Dhttps%%253A%%252F%%252Fweb.skype.com HTTP/1.0\r\n"
"Connection: close\r\n"
"Accept: */*\r\n"
"Host: login.live.com\r\n"
@@ -218,7 +235,7 @@ skypeweb_login_got_ppft(PurpleUtilFetchUrlData *url_data, gpointer user_data, co
"Content-Length: %" G_GSIZE_FORMAT "\r\n\r\n%s",
msprequ_cookie, mspok_cookie, cktst_cookie, strlen(postdata->str), postdata->str);
- purple_util_fetch_url_request(sa->account, live_login_url, TRUE, NULL, FALSE, request, FALSE, 524288, skypeweb_login_got_t, sa);
+ skypeweb_fetch_url_request(sa, live_login_url, TRUE, NULL, FALSE, request, FALSE, 524288, skypeweb_login_got_t, sa);
g_string_free(postdata, TRUE);
g_free(request);
@@ -236,7 +253,7 @@ skypeweb_begin_oauth_login(SkypeWebAccount *sa)
{
const gchar *login_url = "https://" SKYPEWEB_LOGIN_HOST "/login/oauth/microsoft?client_id=578134&redirect_uri=https%3A%2F%2Fweb.skype.com";
- purple_util_fetch_url_request(sa->account, login_url, TRUE, NULL, FALSE, NULL, TRUE, 524288, skypeweb_login_got_ppft, sa);
+ skypeweb_fetch_url_request(sa, login_url, TRUE, NULL, FALSE, NULL, TRUE, 524288, skypeweb_login_got_ppft, sa);
purple_connection_set_state(sa->pc, PURPLE_CONNECTION_CONNECTING);
purple_connection_update_progress(sa->pc, _("Connecting"), 1, 4);
diff --git a/skypeweb/skypeweb_messages.c b/skypeweb/skypeweb_messages.c
index 6222327..26a66a1 100644
--- a/skypeweb/skypeweb_messages.c
+++ b/skypeweb/skypeweb_messages.c
@@ -21,7 +21,20 @@
#include "skypeweb_connection.h"
#include "skypeweb_contacts.h"
-
+static gboolean
+skypeweb_is_user_self(SkypeWebAccount *sa, const gchar *username) {
+ if (!username || *username == 0) {
+ return FALSE;
+ }
+
+ if (sa->username) {
+ if (g_str_equal(username, sa->username)) {
+ return TRUE;
+ }
+ }
+
+ return !g_ascii_strcasecmp(username, purple_account_get_username(sa->account));
+}
static gchar *
skypeweb_meify(const gchar *message, gint skypeemoteoffset)
@@ -40,6 +53,8 @@ process_userpresence_resource(SkypeWebAccount *sa, JsonObject *resource)
{
const gchar *selfLink = json_object_get_string_member(resource, "selfLink");
const gchar *status = json_object_get_string_member(resource, "status");
+ // const gchar *capabilities = json_object_get_string_member(resource, "capabilities");
+ // const gchar *lastSeenAt = json_object_get_string_member(resource, "lastSeenAt");
const gchar *from;
from = skypeweb_contact_url_to_name(selfLink);
@@ -57,10 +72,26 @@ process_userpresence_resource(SkypeWebAccount *sa, JsonObject *resource)
purple_blist_add_buddy(purple_buddy_new(sa->account, from, NULL), NULL, group, NULL);
}
+ // if (g_str_equal(capabilities, "IsMobile")) { //"Seamless | IsMobile"
+ // purple_protocol_got_user_status(sa->account, from, "mobile", NULL);
+ // }
+
purple_protocol_got_user_status(sa->account, from, status, NULL);
purple_protocol_got_user_idle(sa->account, from, g_str_equal(status, "Idle"), 0);
}
+// static gboolean
+// skypeweb_clear_typing_hack(PurpleChatUser *cb)
+// {
+ // PurpleChatUserFlags cbflags;
+
+ // cbflags = purple_chat_user_get_flags(cb);
+ // cbflags &= ~PURPLE_CHAT_USER_TYPING & ~PURPLE_CHAT_USER_VOICE;
+ // purple_chat_user_set_flags(cb, cbflags);
+
+ // return FALSE;
+// }
+
static void
process_message_resource(SkypeWebAccount *sa, JsonObject *resource)
{
@@ -92,9 +123,6 @@ process_message_resource(SkypeWebAccount *sa, JsonObject *resource)
if (json_object_has_member(resource, "content"))
content = json_object_get_string_member(resource, "content");
- from = skypeweb_contact_url_to_name(from);
- g_return_if_fail(from);
-
if (strstr(conversationLink, "/19:")) {
// This is a Thread/Group chat message
const gchar *chatname, *topic;
@@ -106,34 +134,109 @@ process_message_resource(SkypeWebAccount *sa, JsonObject *resource)
if (!chatconv) {
chatconv = purple_serv_got_joined_chat(sa->pc, g_str_hash(chatname), chatname);
purple_conversation_set_data(PURPLE_CONVERSATION(chatconv), "chatname", g_strdup(chatname));
-
- topic = json_object_get_string_member(resource, "threadtopic");
- purple_chat_conversation_set_topic(chatconv, NULL, topic);
-
+
+ if (json_object_has_member(resource, "threadtopic")) {
+ topic = json_object_get_string_member(resource, "threadtopic");
+ purple_chat_conversation_set_topic(chatconv, NULL, topic);
+ }
+
skypeweb_get_conversation_history(sa, chatname);
skypeweb_get_thread_users(sa, chatname);
}
conv = PURPLE_CONVERSATION(chatconv);
- if ((g_str_equal(messagetype, "RichText") || g_str_equal(messagetype, "Text")) && content && *content) {
+ if (g_str_equal(messagetype, "Control/Typing")) {
+ PurpleChatUserFlags cbflags;
+ PurpleChatUser *cb;
+
+ from = skypeweb_contact_url_to_name(from);
+ g_return_if_fail(from);
+
+ // typing notification text, not personalized because of multiple "typing" events
+ if (purple_account_get_bool(sa->account, "show-typing-as-text", FALSE)) {
+ const gchar *message = g_strdup_printf("%s ...", N_("buddy typing"));
+ const gchar *last_message = NULL;
+
+ // get last message (first in GList)
+ if (conv && g_list_length(conv->message_history)) {
+ PurpleMessage *last = g_list_nth_data(g_list_first(conv->message_history),0);
+ last_message = g_strdup(last->what);
+ }
+
+ // add typing notification to chat
+ if (last_message && !g_str_equal(last_message, message)) {
+ purple_conversation_write(conv, NULL, message, PURPLE_MESSAGE_NO_LOG | PURPLE_MESSAGE_NOTIFY | PURPLE_MESSAGE_ACTIVE_ONLY , composetimestamp);
+ }
+ }
+
+ #if !PURPLE_VERSION_CHECK(3, 0, 0)
+ cbflags = purple_conv_chat_user_get_flags(chatconv, from);
+ (void) cb;
+ #else
+ cb = purple_chat_conversation_find_user(chatconv, from);
+ cbflags = purple_chat_user_get_flags(cb);
+ #endif
+
+ cbflags |= PURPLE_CHAT_USER_TYPING;
+
+ // typing notification icon
+ if (purple_account_get_bool(sa->account, "show-typing-as-icon", FALSE)) {
+ cbflags |= PURPLE_CHAT_USER_VOICE;
+ }
+
+ #if !PURPLE_VERSION_CHECK(3, 0, 0)
+ purple_conv_chat_user_set_flags(chatconv, from, cbflags);
+ #else
+ purple_chat_user_set_flags(cb, cbflags);
+ #endif
+
+ //purple_timeout_add_seconds(7, skypeweb_clear_typing_hack, cb);
+
+ } else if ((g_str_equal(messagetype, "RichText") || g_str_equal(messagetype, "Text"))) {
gchar *html;
gint64 skypeemoteoffset = 0;
+ PurpleChatUserFlags cbflags;
+ PurpleChatUser *cb;
if (json_object_has_member(resource, "skypeemoteoffset"))
skypeemoteoffset = atoi(json_object_get_string_member(resource, "skypeemoteoffset"));
+ from = skypeweb_contact_url_to_name(from);
+ g_return_if_fail(from);
+
+ // Remove typing notification icon w/o "show-typing-as-icon" option check.
+ // Hard reset cbflags even if user changed settings while someone typing message.
+ #if !PURPLE_VERSION_CHECK(3, 0, 0)
+ cbflags = purple_conv_chat_user_get_flags(chatconv, from);
+ (void) cb;
+ #else
+ cb = purple_chat_conversation_find_user(chatconv, from);
+ cbflags = purple_chat_user_get_flags(cb);
+ #endif
+
+ cbflags &= ~PURPLE_CHAT_USER_TYPING & ~PURPLE_CHAT_USER_VOICE;
+
+ #if !PURPLE_VERSION_CHECK(3, 0, 0)
+ purple_conv_chat_user_set_flags(chatconv, from, cbflags);
+ #else
+ purple_chat_user_set_flags(cb, cbflags);
+ #endif
+
//TODO if (skypeeditedid && *skypeeditedid) { ... }
+ (void) skypeeditedid;
- if (g_str_equal(messagetype, "Text")) {
- gchar *temp = skypeweb_meify(content, skypeemoteoffset);
- html = purple_markup_escape_text(temp, -1);
- g_free(temp);
- } else {
- html = skypeweb_meify(content, skypeemoteoffset);
+ if (content && *content) {
+ if (g_str_equal(messagetype, "Text")) {
+ gchar *temp = skypeweb_meify(content, skypeemoteoffset);
+ html = purple_markup_escape_text(temp, -1);
+ g_free(temp);
+ } else {
+ html = skypeweb_meify(content, skypeemoteoffset);
+ }
+ purple_serv_got_chat_in(sa->pc, g_str_hash(chatname), from, skypeweb_is_user_self(sa, from) ? PURPLE_MESSAGE_SEND : PURPLE_MESSAGE_RECV, html, composetimestamp);
+
+ g_free(html);
}
- purple_serv_got_chat_in(sa->pc, g_str_hash(chatname), from, g_str_equal(sa->username, from) ? PURPLE_MESSAGE_SEND : PURPLE_MESSAGE_RECV, html, composetimestamp);
-
- g_free(html);
} else if (g_str_equal(messagetype, "ThreadActivity/AddMember")) {
PurpleXmlNode *blob = purple_xmlnode_from_str(content, -1);
PurpleXmlNode *target;
@@ -153,7 +256,7 @@ process_message_resource(SkypeWebAccount *sa, JsonObject *resource)
target = purple_xmlnode_get_next_twin(target))
{
gchar *user = purple_xmlnode_get_data(target);
- if (g_str_equal(sa->username, &user[2]))
+ if (skypeweb_is_user_self(sa, &user[2]))
purple_chat_conversation_leave(chatconv);
purple_chat_conversation_remove_user(chatconv, &user[2], NULL);
g_free(user);
@@ -183,19 +286,19 @@ process_message_resource(SkypeWebAccount *sa, JsonObject *resource)
PurpleChatUserFlags cbflags = PURPLE_CHAT_USER_NONE;
if (role && *role) {
- if (g_str_equal(role, "Admin")) {
+ if (g_str_equal(role, "Admin") || g_str_equal(role, "admin")) {
cbflags = PURPLE_CHAT_USER_OP;
- } else if (g_str_equal(role, "User")) {
- cbflags = PURPLE_CHAT_USER_VOICE;
+ } else if (g_str_equal(role, "User") || g_str_equal(role, "user")) {
+ //cbflags = PURPLE_CHAT_USER_VOICE;
}
}
#if !PURPLE_VERSION_CHECK(3, 0, 0)
purple_conv_chat_user_set_flags(chatconv, &user[2], cbflags);
+ (void) cb;
#else
cb = purple_chat_conversation_find_user(chatconv, &user[2]);
purple_chat_user_set_flags(cb, cbflags);
#endif
-
g_free(user);
g_free(role);
}
@@ -206,9 +309,18 @@ process_message_resource(SkypeWebAccount *sa, JsonObject *resource)
}
} else {
+ gchar *convbuddyname;
// This is a One-to-one/IM message
- convname = g_strconcat("8:", skypeweb_contact_url_to_name(conversationLink), NULL);
- from = skypeweb_contact_url_to_name(json_object_get_string_member(resource, "from")); //regen the from
+
+ convbuddyname = g_strdup(skypeweb_contact_url_to_name(conversationLink));
+ if (SKYPEWEB_BUDDY_IS_MSN(convbuddyname)) {
+ convname = g_strconcat("1:", convbuddyname, NULL);
+ } else {
+ convname = g_strconcat("8:", convbuddyname, NULL);
+ }
+
+ from = skypeweb_contact_url_to_name(from);
+ g_return_if_fail(from);
if (g_str_equal(messagetype_parts[0], "Control")) {
if (g_str_equal(messagetype_parts[1], "ClearTyping")) {
@@ -233,16 +345,15 @@ process_message_resource(SkypeWebAccount *sa, JsonObject *resource)
} else {
html = skypeweb_meify(content, skypeemoteoffset);
}
- if (g_str_equal(sa->username, from)) {
- from = skypeweb_contact_url_to_name(conversationLink);
- if (from != NULL && !g_str_has_prefix(html, "?OTR")) {
- imconv = purple_conversations_find_im_with_account(from, sa->account);
+ if (skypeweb_is_user_self(sa, from)) {
+ if (!g_str_has_prefix(html, "?OTR")) {
+ imconv = purple_conversations_find_im_with_account(convbuddyname, sa->account);
if (imconv == NULL)
{
- imconv = purple_im_conversation_new(sa->account, from);
+ imconv = purple_im_conversation_new(sa->account, convbuddyname);
}
conv = PURPLE_CONVERSATION(imconv);
- purple_conversation_write(conv, from, html, PURPLE_MESSAGE_SEND, composetimestamp);
+ purple_conversation_write(conv, convbuddyname, html, PURPLE_MESSAGE_SEND, composetimestamp);
}
} else {
purple_serv_got_im(sa->pc, from, html, PURPLE_MESSAGE_RECV, composetimestamp);
@@ -253,11 +364,11 @@ process_message_resource(SkypeWebAccount *sa, JsonObject *resource)
g_free(html);
} else if (g_str_equal(messagetype, "RichText/UriObject")) {
PurpleXmlNode *blob = purple_xmlnode_from_str(content, -1);
- const gchar *uri = purple_xmlnode_get_attrib(blob, "uri");
+ const gchar *uri = purple_xmlnode_get_attrib(blob, "url_thumbnail");
PurpleIMConversation *imconv;
- if (g_str_equal(sa->username, from)) {
- from = skypeweb_contact_url_to_name(conversationLink);
+ if (skypeweb_is_user_self(sa, from)) {
+ from = convbuddyname;
}
if (from != NULL) {
imconv = purple_conversations_find_im_with_account(from, sa->account);
@@ -275,8 +386,8 @@ process_message_resource(SkypeWebAccount *sa, JsonObject *resource)
const gchar *sid = purple_xmlnode_get_attrib(blob, "sid");
PurpleIMConversation *imconv;
- if (g_str_equal(sa->username, from)) {
- from = skypeweb_contact_url_to_name(conversationLink);
+ if (skypeweb_is_user_self(sa, from)) {
+ from = convbuddyname;
}
if (from != NULL) {
imconv = purple_conversations_find_im_with_account(from, sa->account);
@@ -287,12 +398,66 @@ process_message_resource(SkypeWebAccount *sa, JsonObject *resource)
conv = PURPLE_CONVERSATION(imconv);
//skypeweb_download_video_message(sa, sid, conv); //TODO
+ (void) sid;
purple_serv_got_im(sa->pc, from, content, PURPLE_MESSAGE_RECV | PURPLE_MESSAGE_SYSTEM, composetimestamp);
}
purple_xmlnode_free(blob);
+ } else if (g_str_equal(messagetype, "Event/Call")) {
+ PurpleXmlNode *partlist = purple_xmlnode_from_str(content, -1);
+ const gchar *partlisttype = purple_xmlnode_get_attrib(partlist, "type");
+ const gchar *message = NULL;
+ PurpleIMConversation *imconv;
+ gboolean incoming = TRUE;
+
+ if (skypeweb_is_user_self(sa, from)) {
+ incoming = FALSE;
+ (void) incoming;
+ from = convbuddyname;
+ }
+ if (partlisttype && from != NULL) {
+ imconv = purple_conversations_find_im_with_account(from, sa->account);
+ if (imconv == NULL)
+ {
+ imconv = purple_im_conversation_new(sa->account, from);
+ }
+
+ conv = PURPLE_CONVERSATION(imconv);
+ if (g_str_equal(partlisttype, "started")) {
+ message = _("Call started");
+ } else if (g_str_equal(partlisttype, "ended")) {
+ PurpleXmlNode *part;
+ gint duration_int = -1;
+
+ for(part = purple_xmlnode_get_child(partlist, "part");
+ part;
+ part = purple_xmlnode_get_next_twin(part))
+ {
+ const gchar *identity = purple_xmlnode_get_attrib(part, "identity");
+ if (identity && skypeweb_is_user_self(sa, identity)) {
+ PurpleXmlNode *duration = purple_xmlnode_get_child(part, "duration");
+ if (duration != NULL) {
+ gchar *duration_str;
+ duration_str = purple_xmlnode_get_data(duration);
+ duration_int = atoi(duration_str);
+ break;
+ }
+ }
+ }
+ if (duration_int < 0) {
+ message = _("Call missed");
+ } else {
+ //TODO report how long the call was
+ message = _("Call ended");
+ }
+ }
+ purple_serv_got_im(sa->pc, from, message, PURPLE_MESSAGE_RECV | PURPLE_MESSAGE_SYSTEM, composetimestamp);
+ }
+ purple_xmlnode_free(partlist);
} else {
purple_debug_warning("skypeweb", "Unhandled message resource messagetype '%s'\n", messagetype);
}
+
+ g_free(convbuddyname);
}
if (conv != NULL) {
@@ -329,11 +494,14 @@ static void
process_conversation_resource(SkypeWebAccount *sa, JsonObject *resource)
{
const gchar *id = json_object_get_string_member(resource, "id");
+ (void) id;
+
JsonObject *threadProperties;
if (json_object_has_member(resource, "threadProperties")) {
threadProperties = json_object_get_object_member(resource, "threadProperties");
}
+ (void) threadProperties;
}
static void
@@ -403,6 +571,11 @@ skypeweb_poll_cb(SkypeWebAccount *sa, JsonNode *node, gpointer user_data)
gint index, length;
JsonObject *obj = NULL;
+ if (node == NULL && ((int)time(NULL)) > sa->registration_expiry) {
+ skypeweb_get_registration_token(sa);
+ return;
+ }
+
if (node != NULL && json_node_get_node_type(node) == JSON_NODE_OBJECT)
obj = json_node_get_object(node);
@@ -462,16 +635,24 @@ skypeweb_poll(SkypeWebAccount *sa)
void
skypeweb_mark_conv_seen(PurpleConversation *conv, PurpleConversationUpdateType type)
{
+ PurpleConnection *pc = purple_conversation_get_connection(conv);
+ if (!PURPLE_CONNECTION_IS_CONNECTED(pc))
+ return;
+
if (type == PURPLE_CONVERSATION_UPDATE_UNSEEN) {
gchar *last_skypeweb_id = purple_conversation_get_data(conv, "last_skypeweb_id");
if (last_skypeweb_id && *last_skypeweb_id) {
- PurpleAccount *account = purple_conversation_get_account(conv);
- SkypeWebAccount *sa = purple_connection_get_protocol_data(purple_account_get_connection(account));
+ SkypeWebAccount *sa = purple_connection_get_protocol_data(pc);
gchar *post, *url, *convname;
if (PURPLE_IS_IM_CONVERSATION(conv)) {
- convname = g_strconcat("8:", purple_conversation_get_name(conv), NULL);
+ const gchar *buddyname = purple_conversation_get_name(conv);
+ if (SKYPEWEB_BUDDY_IS_MSN(buddyname)) {
+ convname = g_strconcat("1:", buddyname, NULL);
+ } else {
+ convname = g_strconcat("8:", buddyname, NULL);
+ }
} else {
convname = g_strdup(purple_conversation_get_data(conv, "chatname"));
}
@@ -520,14 +701,19 @@ skypeweb_got_thread_users(SkypeWebAccount *sa, JsonNode *node, gpointer user_dat
PurpleChatUserFlags cbflags = PURPLE_CHAT_USER_NONE;
if (role && *role) {
- if (g_str_equal(role, "Admin")) {
+ if (g_str_equal(role, "Admin") || g_str_equal(role, "admin")) {
cbflags = PURPLE_CHAT_USER_OP;
- } else if (g_str_equal(role, "User")) {
- cbflags = PURPLE_CHAT_USER_VOICE;
+ } else if (g_str_equal(role, "User") || g_str_equal(role, "user")) {
+ //cbflags = PURPLE_CHAT_USER_VOICE;
}
}
-
- purple_chat_conversation_add_user(chatconv, username, NULL, cbflags, FALSE);
+
+ if (username == NULL && json_object_has_member(member, "linkedMri")) {
+ username = skypeweb_contact_url_to_name(json_object_get_string_member(member, "linkedMri"));
+ }
+ if (username != NULL) {
+ purple_chat_conversation_add_user(chatconv, username, NULL, cbflags, FALSE);
+ }
}
}
@@ -545,7 +731,7 @@ skypeweb_get_thread_users(SkypeWebAccount *sa, const gchar *convname)
static void
skypeweb_got_conv_history(SkypeWebAccount *sa, JsonNode *node, gpointer user_data)
{
- time_t since = GPOINTER_TO_INT(user_data);
+ gint since = GPOINTER_TO_INT(user_data);
JsonObject *obj;
JsonArray *messages;
gint index, length;
@@ -560,7 +746,7 @@ skypeweb_got_conv_history(SkypeWebAccount *sa, JsonNode *node, gpointer user_dat
{
JsonObject *message = json_array_get_object_element(messages, index);
const gchar *composetime = json_object_get_string_member(message, "composetime");
- time_t composetimestamp = purple_str_to_time(composetime, TRUE, NULL, NULL, NULL);
+ gint composetimestamp = (gint) purple_str_to_time(composetime, TRUE, NULL, NULL, NULL);
if (composetimestamp > since) {
process_message_resource(sa, message);
@@ -569,7 +755,7 @@ skypeweb_got_conv_history(SkypeWebAccount *sa, JsonNode *node, gpointer user_dat
}
void
-skypeweb_get_conversation_history_since(SkypeWebAccount *sa, const gchar *convname, time_t since)
+skypeweb_get_conversation_history_since(SkypeWebAccount *sa, const gchar *convname, gint since)
{
gchar *url;
url = g_strdup_printf("/v1/users/ME/conversations/%s/messages?startTime=%d000&pageSize=30&view=msnp24Equivalent&targetType=Passport|Skype|Lync|Thread", purple_url_encode(convname), since);
@@ -588,7 +774,7 @@ skypeweb_get_conversation_history(SkypeWebAccount *sa, const gchar *convname)
static void
skypeweb_got_all_convs(SkypeWebAccount *sa, JsonNode *node, gpointer user_data)
{
- time_t since = GPOINTER_TO_INT(user_data);
+ gint since = GPOINTER_TO_INT(user_data);
JsonObject *obj;
JsonArray *conversations;
gint index, length;
@@ -605,7 +791,7 @@ skypeweb_got_all_convs(SkypeWebAccount *sa, JsonNode *node, gpointer user_data)
JsonObject *lastMessage = json_object_get_object_member(conversation, "lastMessage");
if (lastMessage != NULL && json_object_has_member(lastMessage, "composetime")) {
const gchar *composetime = json_object_get_string_member(lastMessage, "composetime");
- time_t composetimestamp = purple_str_to_time(composetime, TRUE, NULL, NULL, NULL);
+ gint composetimestamp = (gint) purple_str_to_time(composetime, TRUE, NULL, NULL, NULL);
if (composetimestamp > since) {
skypeweb_get_conversation_history_since(sa, id, since);
@@ -615,7 +801,7 @@ skypeweb_got_all_convs(SkypeWebAccount *sa, JsonNode *node, gpointer user_data)
}
void
-skypeweb_get_all_conversations_since(SkypeWebAccount *sa, time_t since)
+skypeweb_get_all_conversations_since(SkypeWebAccount *sa, gint since)
{
gchar *url;
url = g_strdup_printf("/v1/users/ME/conversations?startTime=%d000&pageSize=100&view=msnp24Equivalent&targetType=Passport|Skype|Lync|Thread", since);
@@ -628,7 +814,7 @@ skypeweb_get_all_conversations_since(SkypeWebAccount *sa, time_t since)
void
skype_web_get_offline_history(SkypeWebAccount *sa)
{
- skypeweb_get_all_conversations_since(sa, purple_account_get_int(sa->account, "last_message_timestamp", time(NULL)));
+ skypeweb_get_all_conversations_since(sa, purple_account_get_int(sa->account, "last_message_timestamp", ((gint) time(NULL))));
}
@@ -699,7 +885,11 @@ skypeweb_unsubscribe_from_contact_status(SkypeWebAccount *sa, const gchar *who)
const gchar *contacts_url = "/v1/users/ME/contacts";
gchar *url;
- url = g_strconcat(contacts_url, "/8:", purple_url_encode(who), NULL);
+ if (SKYPEWEB_BUDDY_IS_MSN(who)) {
+ url = g_strconcat(contacts_url, "/1:", purple_url_encode(who), NULL);
+ } else {
+ url = g_strconcat(contacts_url, "/8:", purple_url_encode(who), NULL);
+ }
skypeweb_post_or_get(sa, SKYPEWEB_METHOD_DELETE | SKYPEWEB_METHOD_SSL, sa->messages_host, url, NULL, NULL, NULL, TRUE);
@@ -726,7 +916,11 @@ skypeweb_subscribe_to_contact_status(SkypeWebAccount *sa, GSList *contacts)
JsonObject *contact = json_object_new();
gchar *id;
- id = g_strconcat("8:", cur->data, NULL);
+ if (SKYPEWEB_BUDDY_IS_MSN(cur->data)) {
+ id = g_strconcat("1:", cur->data, NULL);
+ } else {
+ id = g_strconcat("8:", cur->data, NULL);
+ }
json_object_set_string_member(contact, "id", id);
json_array_add_object_element(contacts_array, contact);
@@ -793,16 +987,31 @@ skypeweb_subscribe(SkypeWebAccount *sa)
static void
skypeweb_got_registration_token(PurpleUtilFetchUrlData *url_data, gpointer user_data, const gchar *url_text, gsize len, const gchar *error_message)
{
- gchar *registration_token;
- gchar *endpointId;
+ gchar *registration_token = NULL;
+ gchar *endpointId = NULL;
+ gchar *expires = NULL;
SkypeWebAccount *sa = user_data;
- gchar *new_messages_host;
+ gchar *new_messages_host = NULL;
+
+ sa->url_datas = g_slist_remove(sa->url_datas, url_data);
if (url_text == NULL) {
url_text = url_data->webdata;
len = url_data->data_len;
}
+ if (url_text == NULL) {
+ if (purple_major_version == 2 && (
+ purple_minor_version < 10 ||
+ (purple_minor_version == 10 && purple_micro_version < 11))
+ ) {
+ purple_connection_error (sa->pc,
+ PURPLE_CONNECTION_ERROR_ENCRYPTION_ERROR,
+ _("Your version of libpurple is too old.\nUpgrade to 2.10.11 or newer and try again."));
+ return;
+ }
+ }
+
new_messages_host = skypeweb_string_get_chunk(url_text, len, "Location: https://", "/");
if (new_messages_host != NULL && !g_str_equal(sa->messages_host, new_messages_host)) {
g_free(sa->messages_host);
@@ -814,9 +1023,11 @@ skypeweb_got_registration_token(PurpleUtilFetchUrlData *url_data, gpointer user_
skypeweb_get_registration_token(sa);
return;
}
+ g_free(new_messages_host);
registration_token = skypeweb_string_get_chunk(url_text, len, "Set-RegistrationToken: ", ";");
endpointId = skypeweb_string_get_chunk(url_text, len, "endpointId=", "\r\n");
+ expires = skypeweb_string_get_chunk(url_text, len, "expires=", ";");
if (registration_token == NULL) {
purple_connection_error (sa->pc,
@@ -828,6 +1039,10 @@ skypeweb_got_registration_token(PurpleUtilFetchUrlData *url_data, gpointer user_
g_free(sa->registration_token); sa->registration_token = registration_token;
g_free(sa->endpoint); sa->endpoint = endpointId;
+ if (expires && *expires) {
+ sa->registration_expiry = atoi(expires);
+ g_free(expires);
+ }
skypeweb_subscribe(sa);
}
@@ -863,8 +1078,10 @@ skypeweb_get_registration_token(SkypeWebAccount *sa)
//purple_debug_info("skypeweb", "reg token request is %s\n", request);
- requestdata = purple_util_fetch_url_request(sa->account, messages_url, TRUE, NULL, FALSE, request, TRUE, 524288, skypeweb_got_registration_token, sa);
- requestdata->num_times_redirected = 10; /* Prevent following redirects */
+ requestdata = skypeweb_fetch_url_request(sa, messages_url, TRUE, NULL, FALSE, request, TRUE, 524288, skypeweb_got_registration_token, sa);
+
+ if (requestdata != NULL)
+ requestdata->num_times_redirected = 10; /* Prevent following redirects */
g_free(request);
g_free(curtime);
@@ -883,7 +1100,11 @@ skypeweb_send_typing(PurpleConnection *pc, const gchar *name, PurpleIMTypingStat
gchar *post, *url;
JsonObject *obj;
- url = g_strdup_printf("/v1/users/ME/conversations/8:%s/messages", purple_url_encode(name));
+ if (SKYPEWEB_BUDDY_IS_MSN(name)) {
+ url = g_strdup_printf("/v1/users/ME/conversations/1:%s/messages", purple_url_encode(name));
+ } else {
+ url = g_strdup_printf("/v1/users/ME/conversations/8:%s/messages", purple_url_encode(name));
+ }
obj = json_object_new();
json_object_set_int_member(obj, "clientmessageid", time(NULL));
@@ -918,6 +1139,7 @@ skypeweb_set_statusid(SkypeWebAccount *sa, const gchar *status)
gchar *url = g_strdup_printf("/v1/users/ME/endpoints/%s/presenceDocs/messagingService", purple_url_encode(sa->endpoint));
post = "{\"id\":\"messagingService\", \"type\":\"EndpointPresenceDoc\", \"selfLink\":\"uri\", \"privateInfo\":{\"epname\":\"skype\"}, \"publicInfo\":{\"capabilities\":\"\", \"type\":1, \"typ\":1, \"skypeNameVersion\":\"" SKYPEWEB_CLIENTINFO_VERSION "/" SKYPEWEB_CLIENTINFO_NAME "\", \"nodeInfo\":\"xx\", \"version\":\"" SKYPEWEB_CLIENTINFO_VERSION "\"}}";
skypeweb_post_or_get(sa, SKYPEWEB_METHOD_PUT | SKYPEWEB_METHOD_SSL, sa->messages_host, url, post, NULL, NULL, TRUE);
+ g_free(url);
}
}
@@ -989,12 +1211,16 @@ skypeweb_chat_send(PurpleConnection *pc, gint id, const gchar *message, PurpleMe
SkypeWebAccount *sa = purple_connection_get_protocol_data(pc);
PurpleChatConversation *chatconv;
- gchar* chatname;
+ const gchar* chatname;
chatconv = purple_conversations_find_chat(pc, id);
chatname = purple_conversation_get_data(PURPLE_CONVERSATION(chatconv), "chatname");
- if (!chatname)
- return -1;
+ if (!chatname) {
+ // Fix for a condition around the chat data and serv_got_joined_chat()
+ chatname = purple_conversation_get_name(PURPLE_CONVERSATION(chatconv));
+ if (!chatname)
+ return -1;
+ }
skypeweb_send_message(sa, chatname, message);
@@ -1009,7 +1235,11 @@ skypeweb_send_im(PurpleConnection *pc, const gchar *who, const gchar *message, P
SkypeWebAccount *sa = purple_connection_get_protocol_data(pc);
gchar *convname;
- convname = g_strconcat("8:", who, NULL);
+ if (SKYPEWEB_BUDDY_IS_MSN(who)) {
+ convname = g_strconcat("1:", who, NULL);
+ } else {
+ convname = g_strconcat("8:", who, NULL);
+ }
skypeweb_send_message(sa, convname, message);
g_free(convname);
@@ -1032,7 +1262,11 @@ skypeweb_chat_invite(PurpleConnection *pc, int id, const char *message, const ch
url = g_string_new("/v1/threads/");
g_string_append_printf(url, "%s", purple_url_encode(chatname));
g_string_append(url, "/members/");
- g_string_append_printf(url, "8:%s", purple_url_encode(who));
+ if (SKYPEWEB_BUDDY_IS_MSN(who)) {
+ g_string_append_printf(url, "1:%s", purple_url_encode(who));
+ } else {
+ g_string_append_printf(url, "8:%s", purple_url_encode(who));
+ }
post = "{\"role\":\"User\"}";
@@ -1056,7 +1290,11 @@ skypeweb_chat_kick(PurpleConnection *pc, int id, const char *who)
url = g_string_new("/v1/threads/");
g_string_append_printf(url, "%s", purple_url_encode(chatname));
g_string_append(url, "/members/");
- g_string_append_printf(url, "8:%s", purple_url_encode(who));
+ if (SKYPEWEB_BUDDY_IS_MSN(who)) {
+ g_string_append_printf(url, "1:%s", purple_url_encode(who));
+ } else {
+ g_string_append_printf(url, "8:%s", purple_url_encode(who));
+ }
post = "";
@@ -1076,7 +1314,11 @@ skypeweb_initiate_chat(SkypeWebAccount *sa, const gchar *who)
members = json_array_new();
contact = json_object_new();
- id = g_strconcat("8:", who, NULL);
+ if (SKYPEWEB_BUDDY_IS_MSN(who)) {
+ id = g_strconcat("1:", who, NULL);
+ } else {
+ id = g_strconcat("8:", who, NULL);
+ }
json_object_set_string_member(contact, "id", id);
json_object_set_string_member(contact, "role", "User");
json_array_add_object_element(members, contact);
@@ -1116,3 +1358,32 @@ skypeweb_initiate_chat_from_node(PurpleBlistNode *node, gpointer userdata)
skypeweb_initiate_chat(sa, purple_buddy_get_name(buddy));
}
}
+
+void
+skypeweb_chat_set_topic(PurpleConnection *pc, int id, const char *topic)
+{
+ SkypeWebAccount *sa = purple_connection_get_protocol_data(pc);
+ PurpleChatConversation *chatconv;
+ JsonObject *obj;
+ gchar *chatname;
+ gchar *post;
+ GString *url;
+
+ chatconv = purple_conversations_find_chat(pc, id);
+ chatname = purple_conversation_get_data(PURPLE_CONVERSATION(chatconv), "chatname");
+
+ url = g_string_new("/v1/threads/");
+ g_string_append_printf(url, "%s", purple_url_encode(chatname));
+ g_string_append(url, "/properties?name=topic");
+
+ obj = json_object_new();
+ json_object_set_string_member(obj, "topic", topic);
+ post = skypeweb_jsonobj_to_string(obj);
+
+ skypeweb_post_or_get(sa, SKYPEWEB_METHOD_PUT | SKYPEWEB_METHOD_SSL, sa->messages_host, url->str, post, NULL, NULL, TRUE);
+
+ g_string_free(url, TRUE);
+ g_free(post);
+ json_object_unref(obj);
+}
+
diff --git a/skypeweb/skypeweb_messages.h b/skypeweb/skypeweb_messages.h
index 1bafcb9..1e01539 100644
--- a/skypeweb/skypeweb_messages.h
+++ b/skypeweb/skypeweb_messages.h
@@ -33,13 +33,14 @@ void skypeweb_chat_invite(PurpleConnection *pc, int id, const char *message, con
void skypeweb_initiate_chat(SkypeWebAccount *sa, const gchar *who);
void skypeweb_initiate_chat_from_node(PurpleBlistNode *node, gpointer userdata);
PurpleRoomlist *skypeweb_roomlist_get_list(PurpleConnection *pc);
+void skypeweb_chat_set_topic(PurpleConnection *pc, int id, const char *topic);
void skypeweb_subscribe_to_contact_status(SkypeWebAccount *sa, GSList *contacts);
void skypeweb_unsubscribe_from_contact_status(SkypeWebAccount *sa, const gchar *who);
-void skypeweb_get_conversation_history_since(SkypeWebAccount *sa, const gchar *convname, time_t since);
+void skypeweb_get_conversation_history_since(SkypeWebAccount *sa, const gchar *convname, gint since);
void skypeweb_get_conversation_history(SkypeWebAccount *sa, const gchar *convname);
void skypeweb_get_thread_users(SkypeWebAccount *sa, const gchar *convname);
-void skypeweb_get_all_conversations_since(SkypeWebAccount *sa, time_t since);
+void skypeweb_get_all_conversations_since(SkypeWebAccount *sa, gint since);
void skype_web_get_offline_history(SkypeWebAccount *sa);
void skypeweb_mark_conv_seen(PurpleConversation *conv, PurpleConversationUpdateType type);
diff --git a/skypeweb/skypeweb_util.c b/skypeweb/skypeweb_util.c
index e91a251..f6bfb73 100644
--- a/skypeweb/skypeweb_util.c
+++ b/skypeweb/skypeweb_util.c
@@ -80,6 +80,7 @@ skypeweb_contact_url_to_name(const gchar *url)
const gchar *start, *end;
start = g_strrstr(url, "/8:");
+ if (!start) start = g_strrstr(url, "/1:");
if (!start) return NULL;
start = start + 3;
@@ -246,3 +247,24 @@ find_acct(const char *prpl, const char *acct_id)
return acct;
}
+
+
+/* Wrapper of purple_util_fetch_url_request_len_with_account()
+ * that takes a SkypeWebAccount instead of a PurpleAccount,
+ * and keeps track of requests in sa->url_datas to cancel them on logout. */
+
+PurpleUtilFetchUrlData *
+skypeweb_fetch_url_request(SkypeWebAccount *sa,
+ const char *url, gboolean full, const char *user_agent, gboolean http11,
+ const char *request, gboolean include_headers, gssize max_len,
+ PurpleUtilFetchUrlCallback callback, void *user_data)
+{
+ PurpleUtilFetchUrlData *url_data;
+
+ url_data = purple_util_fetch_url_request(sa->account, url, full, user_agent, http11, request, include_headers, max_len, callback, user_data);
+
+ if (url_data != NULL)
+ sa->url_datas = g_slist_prepend(sa->url_datas, url_data);
+
+ return url_data;
+}
diff --git a/skypeweb/skypeweb_util.h b/skypeweb/skypeweb_util.h
index c0bbb12..f73a32f 100644
--- a/skypeweb/skypeweb_util.h
+++ b/skypeweb/skypeweb_util.h
@@ -29,4 +29,10 @@ gchar *skypeweb_hmac_sha256(gchar *input);
gint64 skypeweb_get_js_time();
-PurpleAccount *find_acct(const char *prpl, const char *acct_id); \ No newline at end of file
+PurpleAccount *find_acct(const char *prpl, const char *acct_id);
+
+PurpleUtilFetchUrlData *
+skypeweb_fetch_url_request(SkypeWebAccount *sa,
+ const char *url, gboolean full, const char *user_agent, gboolean http11,
+ const char *request, gboolean include_headers, gssize max_len,
+ PurpleUtilFetchUrlCallback callback, void *user_data);