diff -Nru pidgin-skype-20110407+svn612+dfsg/Info.plist pidgin-skype-20130613+svn660+dfsg/Info.plist --- pidgin-skype-20110407+svn612+dfsg/Info.plist 2011-04-10 16:10:16.000000000 +0000 +++ pidgin-skype-20130613+svn660+dfsg/Info.plist 2012-02-08 21:23:05.000000000 +0000 @@ -1,9 +1,9 @@ - + AIMinimumAdiumVersionRequirement - 1.3 + 1.4 CFBundleDevelopmentRegion English CFBundleExecutable @@ -21,7 +21,7 @@ CFBundleSignature AdIM CFBundleVersion - 1.0 + 1.1 NSPrincipalClass SkypePlugin diff -Nru pidgin-skype-20110407+svn612+dfsg/Makefile pidgin-skype-20130613+svn660+dfsg/Makefile --- pidgin-skype-20110407+svn612+dfsg/Makefile 2011-04-10 16:10:16.000000000 +0000 +++ pidgin-skype-20130613+svn660+dfsg/Makefile 2012-11-20 01:33:45.000000000 +0000 @@ -6,13 +6,14 @@ LINUX_ARM_COMPILER = arm-none-linux-gnueabi-gcc LIBPURPLE_CFLAGS = -I/usr/include/libpurple -DPURPLE_PLUGINS -DENABLE_NLS -GLIB_CFLAGS = -I/usr/include/glib-2.0 -I/usr/lib/glib-2.0/include -I/usr/lib64/glib-2.0/include -I/usr/include -DBUS_CFLAGS = -DSKYPE_DBUS -I/usr/include/dbus-1.0 -I/usr/lib/dbus-1.0/include -I/usr/lib64/dbus-1.0/include +GLIB_CFLAGS = `pkg-config --cflags glib-2.0` -I/usr/include +DBUS_CFLAGS = -DSKYPE_DBUS `pkg-config --cflags dbus-1` WIN32_DEV_DIR = /root/pidgin/win32-dev WIN32_PIDGIN_DIR = /root/pidgin/pidgin-2.6.1 WIN32_CFLAGS = -DPURPLE_PLUGINS -DENABLE_NLS -I${WIN32_DEV_DIR}/gtk_2_0/include/glib-2.0 -I${WIN32_PIDGIN_DIR}/libpurple/win32 -I${WIN32_PIDGIN_DIR}/libpurple -I${WIN32_DEV_DIR}/gtk_2_0/include -I${WIN32_DEV_DIR}/gtk_2_0/include/glib-2.0 -I${WIN32_DEV_DIR}/gtk_2_0/lib/glib-2.0/include WIN32_LIBS = -L${WIN32_DEV_DIR}/gtk_2_0/lib -L${WIN32_PIDGIN_DIR}/libpurple -lglib-2.0 -lgobject-2.0 -lgthread-2.0 -lintl -lpurple XUL_LIBS = -I/usr/lib/xulrunner/include xpcomModule.cpp -I/usr/include/nspr +X11_LIBS = `pkg-config --libs x11` VV_CFLAGS = -I/usr/include/gstreamer-0.10 -DUSE_VV -I/usr/include/libxml2 WIN32_VV_CFLAGS = -I${WIN32_DEV_DIR}/libxml2/include -I${WIN32_DEV_DIR}/gstreamer-0.10/include -I${WIN32_DEV_DIR}/gstreamer-0.10/include/gstreamer-0.10 @@ -28,9 +29,9 @@ allarch: skype4pidgin.deb skype4pidgin-installer.exe libskype_dbus.so libskype_dbus64.so libskypearm.so -#By default, 'make' compiles X11 version on local platform +#By default, 'make' compiles X11 and DBus versions on local platform all: .DEPENDS skype_messaging_x11.c skype_messaging_dbus.c - gcc ${LIBPURPLE_CFLAGS} -Wall -pthread ${GLIB_CFLAGS} -I. -g -pipe libskype.c -o libskype.so -shared -fPIC -DPIC + gcc ${LIBPURPLE_CFLAGS} -Wall -pthread ${GLIB_CFLAGS} -I. -g -pipe libskype.c -o libskype.so -shared -fPIC -DPIC ${X11_LIBS} gcc ${LIBPURPLE_CFLAGS} -Wall -pthread ${GLIB_CFLAGS} -I. -g -pipe libskype.c -o libskype_dbus.so -shared -fPIC -DPIC ${DBUS_CFLAGS} install: locales diff -Nru pidgin-skype-20110407+svn612+dfsg/PurpleSkypeAccount.m pidgin-skype-20130613+svn660+dfsg/PurpleSkypeAccount.m --- pidgin-skype-20110407+svn612+dfsg/PurpleSkypeAccount.m 2011-04-10 16:10:16.000000000 +0000 +++ pidgin-skype-20130613+svn660+dfsg/PurpleSkypeAccount.m 2012-02-09 01:18:19.000000000 +0000 @@ -13,6 +13,9 @@ #import #import +char *skype_status_text(PurpleBuddy *buddy); +const char *skype_get_account_username(PurpleAccount *acct); + @implementation PurpleSkypeAccount static SLPurpleCocoaAdapter *purpleThread = nil; @@ -90,7 +93,7 @@ return STATUS_NAME_OFFLINE; } - return nil; + return STATUS_NAME_OFFLINE; } - (const char *)purpleStatusIDForStatus:(AIStatus *)statusState @@ -236,9 +239,10 @@ return YES; } -#ifndef SKYPENET +/*#ifndef SKYPENET - (const char *)purpleAccountName { + printf("puprleAccountName\n"); //override parent method to grab the actual account UID from skype const char *uid = (const char *)skype_get_account_username(NULL); if (!uid || !strlen(uid)) @@ -251,6 +255,7 @@ - (NSString *)formattedUID { const char *uid = (const char *)skype_get_account_username(NULL); + printf("formattedUID %s %x\n", uid, (guint)account); if (!uid || !strlen(uid)) { return @"Skype"; @@ -258,7 +263,13 @@ //override parent method to grab the actual account UID from skype return [[NSString alloc] initWithUTF8String:uid]; } -#endif + +- (NSString *)explicitFormattedUID +{ + printf("explicitFormattedUID %x\n", (guint)account); + return [self formattedUID]; +} +#endif*/ - (BOOL)shouldSetAliasesServerside { @@ -268,8 +279,7 @@ -(void)configurePurpleAccount{ [super configurePurpleAccount]; - if (!account) - return; + PurpleAccount *acct = [self purpleAccount]; //purple_account_set_bool(account, "skypeout_online", TRUE); //purple_account_set_bool(account, "skype_sync", TRUE); @@ -279,16 +289,16 @@ //Use this section of code once the account options page is set up BOOL skypeout_online = [[self preferenceForKey:KEY_SKYPE_SHOW_SKYPEOUT group:GROUP_ACCOUNT_STATUS] boolValue]; - purple_account_set_bool(account, "skypeout_online", skypeout_online); + purple_account_set_bool(acct, "skypeout_online", skypeout_online); BOOL skype_sync = [[self preferenceForKey:KEY_SKYPE_SYNC_OFFLINE group:GROUP_ACCOUNT_STATUS] boolValue]; - purple_account_set_bool(account, "skype_sync", skype_sync); + purple_account_set_bool(acct, "skype_sync", skype_sync); BOOL check_for_updates = [[self preferenceForKey:KEY_SKYPE_CHECK_FOR_UPDATES group:GROUP_ACCOUNT_STATUS] boolValue]; - purple_account_set_bool(account, "check_for_updates", check_for_updates); + purple_account_set_bool(acct, "check_for_updates", check_for_updates); BOOL skype_autostart = [[self preferenceForKey:KEY_SKYPE_AUTOSTART group:GROUP_ACCOUNT_STATUS] boolValue]; - purple_account_set_bool(account, "skype_autostart", skype_autostart); + purple_account_set_bool(acct, "skype_autostart", skype_autostart); } -(NSDictionary *) extractChatCreationDictionaryFromConversation:(PurpleConversation *)conv diff -Nru pidgin-skype-20110407+svn612+dfsg/PurpleSkypeService.m pidgin-skype-20130613+svn660+dfsg/PurpleSkypeService.m --- pidgin-skype-20110407+svn612+dfsg/PurpleSkypeService.m 2011-04-10 16:10:16.000000000 +0000 +++ pidgin-skype-20130613+svn660+dfsg/PurpleSkypeService.m 2012-02-09 01:18:19.000000000 +0000 @@ -117,9 +117,8 @@ return YES; } -- (void)registerStatuses +/*- (void)registerStatuses { - #define SKYPE_ADD_STATUS(status,statustype) [[adium statusController] registerStatus:status \ withDescription:[[adium statusController] localizedDescriptionForCoreStatusName:status]\ ofType:statustype \ @@ -135,7 +134,7 @@ SKYPE_ADD_STATUS(STATUS_NAME_DND, AIAwayStatusType); SKYPE_ADD_STATUS(STATUS_NAME_INVISIBLE, AIInvisibleStatusType); SKYPE_ADD_STATUS(STATUS_NAME_OFFLINE, AIOfflineStatusType); -} +}*/ /*! * @brief Default icon diff -Nru pidgin-skype-20110407+svn612+dfsg/SkypePlugin.m pidgin-skype-20130613+svn660+dfsg/SkypePlugin.m --- pidgin-skype-20110407+svn612+dfsg/SkypePlugin.m 2011-04-10 16:10:16.000000000 +0000 +++ pidgin-skype-20130613+svn660+dfsg/SkypePlugin.m 2012-02-09 01:18:19.000000000 +0000 @@ -17,6 +17,9 @@ extern PurplePlugin *purple_plugin_new(gboolean native, const char *path) __attribute__((weak_import)); //extern void g_thread_init (GThreadFunctions *vtable) __attribute__((weak_import)); +guint (*adium_timeout_add)(guint, GSourceFunc, gpointer); +gboolean purple_init_skype_plugin(void); + static void skypeAdiumPurpleAddXfer(PurpleXfer *xfer) { if (!xfer || !xfer->account || strcmp(xfer->account->protocol_id, "prpl-bigbrownchunx-skype")) @@ -65,7 +68,8 @@ printf("Calling purple_init_skype_plugin()\n"); //Hack in our own transfer code and thread-safe timeout loop adium_purple_xfers_get_ui_ops()->add_xfer = skypeAdiumPurpleAddXfer; - adium_purple_eventloop_get_ui_ops()->timeout_add = adium_threadsafe_timeout_add; + //adium_timeout_add = adium_purple_eventloop_get_ui_ops()->timeout_add; + //adium_purple_eventloop_get_ui_ops()->timeout_add = adium_threadsafe_timeout_add; #ifdef ENABLE_NLS //bindtextdomain("pidgin", [[[NSBundle bundleWithIdentifier:@"im.pidgin.libpurple"] resourcePath] fileSystemRepresentation]); //bind_textdomain_codeset("pidgin", "UTF-8"); diff -Nru pidgin-skype-20110407+svn612+dfsg/debian/changelog pidgin-skype-20130613+svn660+dfsg/debian/changelog --- pidgin-skype-20110407+svn612+dfsg/debian/changelog 2011-09-07 18:55:34.000000000 +0000 +++ pidgin-skype-20130613+svn660+dfsg/debian/changelog 2013-11-13 07:38:07.000000000 +0000 @@ -1,62 +1,11 @@ -pidgin-skype (20110407+svn612+dfsg-1.1) unstable; urgency=low +pidgin-skype (20130613+svn660+dfsg-1) precise; urgency=high - * Non-maintainer upload. - * Fix "pidgin-skype FTBFS with multiarch": add patch from Micah Gersten - (forwarded from Ubuntu) that uses pkg-config instead of using hardcoded - paths. - Closes: #636097 - LP: #756174 + * New upstream snapshot. + * Split binary into p-s-common (plugins), p-s (pidgin icons and theme), + empathy-skype (empathy icons). + * Remove patches + 00Makefile - don't make install anymore. + + 01usepkgconfig - applied upstream. + * Bump Standards-Version to 3.9.4 (no changes). + * Make Vcs-* fields canonical. - -- gregor herrmann Wed, 07 Sep 2011 20:55:31 +0200 - -pidgin-skype (20110407+svn612+dfsg-1) unstable; urgency=low - - * New upstream release. - * Standards-Version to 3.9.2. - - -- Gabriele Giacone <1o5g4r8o@gmail.com> Sun, 10 Apr 2011 19:47:08 +0200 - -pidgin-skype (20100826+dfsg-1) unstable; urgency=low - - * New upstream release. - + Added an 'End Call' buddy menu option - + Added a 're-request authorization' buddy menu option - + Hopefully fixed groups in Adium this time - + Fix to hide the 'Answer Call' window when answering a call - + Fix the 'use saved status at startup' Pidgin preference - * Standards-Version to 3.9.1. - - -- Gabriele Giacone <1o5g4r8o@gmail.com> Mon, 06 Sep 2010 22:17:41 +0200 - -pidgin-skype (20100302+dfsg-1) unstable; urgency=low - - * New upstream release. - * Standards-Version to 3.8.4. - * Reduced patch 00Makefile size. - - -- Gabriele Giacone <1o5g4r8o@gmail.com> Sun, 25 Apr 2010 19:48:07 +0200 - -pidgin-skype (20100121+dfsg-1) unstable; urgency=low - - * New upstream release. (Closes: #566655) - - Fixes "Always shows skype-out contacts online" bug (Closes: #561664) - * Added debug symbols binary package - * Added Replaces/Conflicts for skype4pidgin package - - -- Gabriele Giacone <1o5g4r8o@gmail.com> Sun, 24 Jan 2010 15:30:01 +0100 - -pidgin-skype (20090920+dfsg-2) unstable; urgency=low - - * d/control: Added libpurple dependency - * d/copyright: - - Added Format-Specification field - - Updated copyright years - * Updated maintainer email address - - -- Gabriele Giacone <1o5g4r8o@gmail.com> Sun, 27 Dec 2009 14:44:41 +0100 - -pidgin-skype (20090920+dfsg-1) unstable; urgency=low - - * Initial release (Closes: #555393) - - -- Gabriele Giacone Wed, 04 Nov 2009 02:09:08 +0100 + -- Attila Hammer Wed, 13 Nov 2013 08:37:40 +0200 diff -Nru pidgin-skype-20110407+svn612+dfsg/debian/compat pidgin-skype-20130613+svn660+dfsg/debian/compat --- pidgin-skype-20110407+svn612+dfsg/debian/compat 2011-04-11 00:01:15.000000000 +0000 +++ pidgin-skype-20130613+svn660+dfsg/debian/compat 2013-06-14 09:58:17.000000000 +0000 @@ -1 +1 @@ -7 +9 diff -Nru pidgin-skype-20110407+svn612+dfsg/debian/control pidgin-skype-20130613+svn660+dfsg/debian/control --- pidgin-skype-20110407+svn612+dfsg/debian/control 2011-09-07 18:55:26.000000000 +0000 +++ pidgin-skype-20130613+svn660+dfsg/debian/control 2013-06-14 09:58:17.000000000 +0000 @@ -2,19 +2,39 @@ Section: contrib/net Priority: optional Maintainer: Gabriele Giacone <1o5g4r8o@gmail.com> -Build-Depends: debhelper (>= 7.0.50~), libglib2.0-dev, +Build-Depends: debhelper (>= 9), libglib2.0-dev, libpurple-dev (>= 2.1.1), libx11-dev, librsvg2-bin, libdbus-1-dev, pkg-config -Standards-Version: 3.9.2 -DM-Upload-Allowed: yes +Standards-Version: 3.9.4 Homepage: http://eion.robbmob.com/ +Vcs-Git: git://anonscm.debian.org/collab-maint/pidgin-skype.git +Vcs-Browser: http://anonscm.debian.org/gitweb/?p=collab-maint/pidgin-skype.git -Package: pidgin-skype +Package: pidgin-skype-common Architecture: i386 amd64 Depends: ${shlibs:Depends}, ${misc:Depends}, libpurple0 (>= 2.1.1) Provides: skype4pidgin -Replaces: skype4pidgin -Conflicts: skype4pidgin -Description: Skype plugin for libpurple messengers +Replaces: skype4pidgin, pidgin-skype (<< 20121121+svn646+dfsg-1) +Breaks: skype4pidgin, pidgin-skype (<< 20121121+svn646+dfsg-1) +Description: Skype plugin for libpurple messengers (common files) + This protocol plugin allows libpurple to communicate with Skype. + Applications using libpurple (Pidgin, Finch, Empathy/Telepathy, + etc.) can thus show your Skype contacts alongside those from + other protocols, and you can communicate with them using that + application instead of the Skype user interface. + . + This plugin communicates with the Skype application in the + background to perform its work, so it's necessary to have Skype + installed and running. + This product uses the Skype API but is not endorsed, certified + or otherwise approved in any way by Skype. + . + This package contains D-Bus and X11 libpurple plugins. + +Package: pidgin-skype +Architecture: i386 amd64 +Depends: ${misc:Depends}, libpurple0 (>= 2.1.1), + pidgin-skype-common (>= 20121121+svn646+dfsg-1) +Description: Skype plugin for libpurple messengers (Pidgin-specific files) This protocol plugin allows libpurple to communicate with Skype. Applications using libpurple (Pidgin, Finch, Empathy/Telepathy, etc.) can thus show your Skype contacts alongside those from @@ -26,12 +46,33 @@ installed and running. This product uses the Skype API but is not endorsed, certified or otherwise approved in any way by Skype. + . + This package contains Pidgin-specific files. + +Package: empathy-skype +Architecture: i386 amd64 +Depends: ${misc:Depends}, telepathy-haze, + pidgin-skype-common (>= 20121121+svn646+dfsg-1) +Description: Skype plugin for libpurple messengers (Empathy-specific files) + This protocol plugin allows libpurple to communicate with Skype. + Applications using libpurple (Pidgin, Finch, Empathy/Telepathy, + etc.) can thus show your Skype contacts alongside those from + other protocols, and you can communicate with them using that + application instead of the Skype user interface. + . + This plugin communicates with the Skype application in the + background to perform its work, so it's necessary to have Skype + installed and running. + This product uses the Skype API but is not endorsed, certified + or otherwise approved in any way by Skype. + . + This package contains Empathy-specific files. Package: pidgin-skype-dbg Section: contrib/debug Priority: extra Architecture: i386 amd64 -Depends: ${misc:Depends}, pidgin-skype (= ${binary:Version}) +Depends: ${misc:Depends}, pidgin-skype-common (= ${binary:Version}) Description: Skype plugin for libpurple messengers (debug symbols) This protocol plugin allows libpurple to communicate with Skype. Applications using libpurple (Pidgin, Finch, Empathy/Telepathy, diff -Nru pidgin-skype-20110407+svn612+dfsg/debian/copyright pidgin-skype-20130613+svn660+dfsg/debian/copyright --- pidgin-skype-20110407+svn612+dfsg/debian/copyright 2011-04-11 00:01:15.000000000 +0000 +++ pidgin-skype-20130613+svn660+dfsg/debian/copyright 2013-06-14 09:58:17.000000000 +0000 @@ -1,24 +1,22 @@ -Format-Specification: http://dep.debian.net/deps/dep5/ -Name: Skype plugin for libpurple messengers -Maintainer: Eion Robb +Format: http://www.debian.org/doc/packaging-manuals/copyright-format/1.0 +Upstream-Name: Skype plugin for libpurple messengers +Upstream-Contact: Eion Robb Source: http://skype4pidgin.googlecode.com/svn/trunk/ Disclaimer: This package complies with the DFSG (Debian Free Software - Guidelines) but is not part of the Debian GNU/Linux distribution. - It's included in contrib archive area because it requires the package - Skype client which doesn't comply with the DFSG and which is not in - Debian archive. + Guidelines) but is not part of the Debian GNU/Linux distribution. It's + included in contrib archive area because it requires the package Skype client + which doesn't comply with the DFSG and which is not in Debian archive. Files under icons/* have been removed from the upstream tarball because released with a non-DFSG compliant license. +Files: * Copyright: 2007-2010, Eion Robb License: GPL-3+ -On Debian systems the full text of the GNU General Public -License can be found in the `/usr/share/common-licenses/GPL-3' -file. + On Debian systems the full text of the GNU General Public License can be found + in the `/usr/share/common-licenses/GPL-3' file. Files: debian/* Copyright: 2009-2010, Gabriele Giacone <1o5g4r8o@gmail.com> License: GPL-3+ -On Debian systems the full text of the GNU General Public -License can be found in the `/usr/share/common-licenses/GPL-3' -file. + On Debian systems the full text of the GNU General Public License can be found + in the `/usr/share/common-licenses/GPL-3' file. diff -Nru pidgin-skype-20110407+svn612+dfsg/debian/empathy-skype.links pidgin-skype-20130613+svn660+dfsg/debian/empathy-skype.links --- pidgin-skype-20110407+svn612+dfsg/debian/empathy-skype.links 1970-01-01 00:00:00.000000000 +0000 +++ pidgin-skype-20130613+svn660+dfsg/debian/empathy-skype.links 2013-06-14 09:58:17.000000000 +0000 @@ -0,0 +1,11 @@ +usr/share/pidgin-skype-common/icons/16/skype.png usr/share/empathy/icons/hicolor/16x16/apps/im-skype-dbus.png +usr/share/pidgin-skype-common/icons/22/skype.png usr/share/empathy/icons/hicolor/22x22/apps/im-skype-dbus.png +usr/share/pidgin-skype-common/icons/48/skype.png usr/share/empathy/icons/hicolor/48x48/apps/im-skype-dbus.png + +usr/share/pidgin-skype-common/icons/16/skype.png usr/share/empathy/icons/hicolor/16x16/apps/im-skype-x11.png +usr/share/pidgin-skype-common/icons/22/skype.png usr/share/empathy/icons/hicolor/22x22/apps/im-skype-x11.png +usr/share/pidgin-skype-common/icons/48/skype.png usr/share/empathy/icons/hicolor/48x48/apps/im-skype-x11.png + +usr/share/pidgin-skype-common/icons/16/skypeout.png usr/share/empathy/icons/hicolor/16x16/apps/im-skypeout.png +usr/share/pidgin-skype-common/icons/22/skypeout.png usr/share/empathy/icons/hicolor/22x22/apps/im-skypeout.png +usr/share/pidgin-skype-common/icons/48/skypeout.png usr/share/empathy/icons/hicolor/48x48/apps/im-skypeout.png diff -Nru pidgin-skype-20110407+svn612+dfsg/debian/patches/00Makefile pidgin-skype-20130613+svn660+dfsg/debian/patches/00Makefile --- pidgin-skype-20110407+svn612+dfsg/debian/patches/00Makefile 2011-04-11 00:01:15.000000000 +0000 +++ pidgin-skype-20130613+svn660+dfsg/debian/patches/00Makefile 1970-01-01 00:00:00.000000000 +0000 @@ -1,27 +0,0 @@ -Description: This patch for binary optimization and not to try to - install removed icons -Author: Gabriele Giacone <1o5g4r8o@gmail.com> - ---- a/Makefile -+++ b/Makefile -@@ -30,8 +30,8 @@ - - #By default, 'make' compiles X11 version on local platform - all: .DEPENDS skype_messaging_x11.c skype_messaging_dbus.c -- gcc ${LIBPURPLE_CFLAGS} -Wall -pthread ${GLIB_CFLAGS} -I. -g -pipe libskype.c -o libskype.so -shared -fPIC -DPIC -- gcc ${LIBPURPLE_CFLAGS} -Wall -pthread ${GLIB_CFLAGS} -I. -g -pipe libskype.c -o libskype_dbus.so -shared -fPIC -DPIC ${DBUS_CFLAGS} -+ gcc ${LIBPURPLE_CFLAGS} -Wall -pthread ${GLIB_CFLAGS} -I. -g -O2 -pipe libskype.c -o libskype.so -shared -fPIC -DPIC -+ gcc ${LIBPURPLE_CFLAGS} -Wall -pthread ${GLIB_CFLAGS} -I. -g -O2 -pipe libskype.c -o libskype_dbus.so -shared -fPIC -DPIC ${DBUS_CFLAGS} - - install: locales - mkdir -p $(DESTDIR)/usr/share/pixmaps/pidgin/emotes/skype -@@ -41,9 +41,6 @@ - mkdir -p $(DESTDIR)/usr/share/pixmaps/pidgin/protocols/48 - mkdir -p $(DESTDIR)/usr/lib/purple-2 - install -m 664 theme $(DESTDIR)/usr/share/pixmaps/pidgin/emotes/skype/ -- install -m 664 icons/16/skypeout.png icons/16/skype.png $(DESTDIR)/usr/share/pixmaps/pidgin/protocols/16 -- install -m 664 icons/22/skypeout.png icons/22/skype.png $(DESTDIR)/usr/share/pixmaps/pidgin/protocols/22 -- install -m 664 icons/48/skypeout.png icons/48/skype.png $(DESTDIR)/usr/share/pixmaps/pidgin/protocols/48 - install -m 664 libskype_dbus.so libskype.so $(DESTDIR)/usr/lib/purple-2/ - - uninstall: diff -Nru pidgin-skype-20110407+svn612+dfsg/debian/patches/01hardening pidgin-skype-20130613+svn660+dfsg/debian/patches/01hardening --- pidgin-skype-20110407+svn612+dfsg/debian/patches/01hardening 1970-01-01 00:00:00.000000000 +0000 +++ pidgin-skype-20130613+svn660+dfsg/debian/patches/01hardening 2013-06-14 09:58:17.000000000 +0000 @@ -0,0 +1,24 @@ +Description: Add hardening flags. +Author: Gabriele Giacone <1o5g4r8o@gmail.com> + +--- a/Makefile ++++ b/Makefile +@@ -5,6 +5,7 @@ LINUX64_COMPILER = x86_64-pc-linux-gnu-g + WIN32_COMPILER = /usr/bin/i586-mingw32-gcc + LINUX_ARM_COMPILER = arm-none-linux-gnueabi-gcc + ++BUILDFLAGS = ${CFLAGS} ${CPPFLAGS} ${LDFLAGS} + LIBPURPLE_CFLAGS = -I/usr/include/libpurple -DPURPLE_PLUGINS -DENABLE_NLS + GLIB_CFLAGS = `pkg-config --cflags glib-2.0` -I/usr/include + DBUS_CFLAGS = -DSKYPE_DBUS `pkg-config --cflags dbus-1` +@@ -31,8 +32,8 @@ allarch: skype4pidgin.deb skype4pidgin-i + + #By default, 'make' compiles X11 and DBus versions on local platform + all: .DEPENDS skype_messaging_x11.c skype_messaging_dbus.c +- gcc ${LIBPURPLE_CFLAGS} -Wall -pthread ${GLIB_CFLAGS} -I. -g -pipe libskype.c -o libskype.so -shared -fPIC -DPIC ${X11_LIBS} +- gcc ${LIBPURPLE_CFLAGS} -Wall -pthread ${GLIB_CFLAGS} -I. -g -pipe libskype.c -o libskype_dbus.so -shared -fPIC -DPIC ${DBUS_CFLAGS} ++ gcc ${BUILDFLAGS} ${LIBPURPLE_CFLAGS} -Wall -pthread ${GLIB_CFLAGS} -I. -g -pipe libskype.c -o libskype.so -shared -fPIC -DPIC ${X11_LIBS} ++ gcc ${BUILDFLAGS} ${LIBPURPLE_CFLAGS} -Wall -pthread ${GLIB_CFLAGS} -I. -g -pipe libskype.c -o libskype_dbus.so -shared -fPIC -DPIC ${DBUS_CFLAGS} + + install: locales + mkdir -p $(DESTDIR)/usr/share/pixmaps/pidgin/emotes/skype diff -Nru pidgin-skype-20110407+svn612+dfsg/debian/patches/02nowarn pidgin-skype-20130613+svn660+dfsg/debian/patches/02nowarn --- pidgin-skype-20110407+svn612+dfsg/debian/patches/02nowarn 1970-01-01 00:00:00.000000000 +0000 +++ pidgin-skype-20130613+svn660+dfsg/debian/patches/02nowarn 2013-06-14 09:58:17.000000000 +0000 @@ -0,0 +1,21 @@ +Description: Remove warnings at build time. +Author: Gabriele Giacone <1o5g4r8o@gmail.com> + +--- a/libskype.c ++++ b/libskype.c +@@ -2646,6 +2646,7 @@ skype_check_missedmessages(PurpleAccount + return TRUE; //keep looking for missed messages + } + ++#ifdef _WIN32 + static gboolean + skype_check_missedvoicemails(PurpleAccount *account) + { +@@ -2683,6 +2684,7 @@ skype_check_missedvoicemails(PurpleAccou + + return FALSE; + } ++#endif + + static void + skype_initiate_chat(PurpleBlistNode *node, gpointer data) diff -Nru pidgin-skype-20110407+svn612+dfsg/debian/patches/03emblems pidgin-skype-20130613+svn660+dfsg/debian/patches/03emblems --- pidgin-skype-20110407+svn612+dfsg/debian/patches/03emblems 1970-01-01 00:00:00.000000000 +0000 +++ pidgin-skype-20130613+svn660+dfsg/debian/patches/03emblems 2013-06-14 09:58:17.000000000 +0000 @@ -0,0 +1,54 @@ +Description: Display voice icon if contact has call equipment. +Author: Gabriele Giacone <1o5g4r8o@gmail.com> +Forwarded: https://code.google.com/p/skype4pidgin/issues/detail?id=207 + +--- a/libskype.c ++++ b/libskype.c +@@ -424,6 +424,8 @@ plugin_init(PurplePlugin *plugin) + + option = purple_account_option_bool_new(_("Show SkypeOut contacts as 'Online'"), "skypeout_online", TRUE); + prpl_info.protocol_options = g_list_append(prpl_info.protocol_options, option); ++ option = purple_account_option_bool_new(_("Show Voice/Video emblems if contact is Voice/Video capable"), "voicevideoemblems", TRUE); ++ prpl_info.protocol_options = g_list_append(prpl_info.protocol_options, option); + option = purple_account_option_bool_new(_("Make Skype online/offline when going online/offline"), "skype_sync", TRUE); + prpl_info.protocol_options = g_list_append(prpl_info.protocol_options, option); + //option = purple_account_option_bool_new(_("Automatically check for updates"), "check_for_updates", TRUE); +@@ -1190,6 +1192,7 @@ skype_set_buddies(PurpleAccount *acct) + purple_prpl_got_user_status(acct, buddy->name, full_friends_list[i+5], NULL); + } + skype_send_message_nowait("GET USER %s IS_VIDEO_CAPABLE", buddy->name); ++ skype_send_message_nowait("GET USER %s HASCALLEQUIPMENT", buddy->name); + } + g_strfreev(full_friends_list); + skype_put_buddies_in_groups(); +@@ -1554,9 +1557,11 @@ skype_list_emblem(PurpleBuddy *buddy) + return "birthday"; + } + } +- if (sbuddy->is_video_capable) +- { +- return "video"; ++ if (purple_account_get_bool(buddy->account, "voicevideoemblems", TRUE)) { ++ if (sbuddy->is_video_capable) ++ return "video"; ++ if (sbuddy->has_call_equipment) ++ return "voice"; + } + } + return NULL; +@@ -1589,6 +1594,7 @@ skype_update_buddy_status(PurpleBuddy *b + skype_send_message_nowait("GET USER %s MOOD_TEXT", buddy->name); + skype_send_message_nowait("GET USER %s RICH_MOOD_TEXT", buddy->name); + skype_send_message_nowait("GET USER %s IS_VIDEO_CAPABLE", buddy->name); ++ skype_send_message_nowait("GET USER %s HASCALLEQUIPMENT", buddy->name); + + /* if this function was called from another thread, don't loop over it */ + return FALSE; +@@ -2123,6 +2129,7 @@ skype_buddy_new(PurpleBuddy *buddy) + { + skype_send_message_nowait("GET USER %s ONLINESTATUS", buddy->name); + skype_send_message_nowait("GET USER %s IS_VIDEO_CAPABLE", buddy->name); ++ skype_send_message_nowait("GET USER %s HASCALLEQUIPMENT", buddy->name); + } + return newbuddy; + } diff -Nru pidgin-skype-20110407+svn612+dfsg/debian/patches/series pidgin-skype-20130613+svn660+dfsg/debian/patches/series --- pidgin-skype-20110407+svn612+dfsg/debian/patches/series 2011-09-07 18:55:26.000000000 +0000 +++ pidgin-skype-20130613+svn660+dfsg/debian/patches/series 2013-06-14 09:58:17.000000000 +0000 @@ -1,2 +1,3 @@ -00Makefile -use-pkg-config.patch +01hardening +02nowarn +03emblems diff -Nru pidgin-skype-20110407+svn612+dfsg/debian/patches/use-pkg-config.patch pidgin-skype-20130613+svn660+dfsg/debian/patches/use-pkg-config.patch --- pidgin-skype-20110407+svn612+dfsg/debian/patches/use-pkg-config.patch 2011-09-07 19:16:30.000000000 +0000 +++ pidgin-skype-20130613+svn660+dfsg/debian/patches/use-pkg-config.patch 1970-01-01 00:00:00.000000000 +0000 @@ -1,20 +0,0 @@ -Description: Use pkg-config to find include paths - We can use pkg-config to find the dbus and glib include paths - instead of hard coding them so the build doesn't break w/multiarch. -Author: Micah Gersten -Bug-Ubuntu: https://bugs.launchpad.net/bugs/756174 -Bug-Debian: http://bugs.debian.org/636097 - ---- pidgin-skype-20110407+svn612+dfsg.orig/Makefile -+++ pidgin-skype-20110407+svn612+dfsg/Makefile -@@ -6,8 +6,8 @@ WIN32_COMPILER = /usr/bin/i586-mingw32-g - LINUX_ARM_COMPILER = arm-none-linux-gnueabi-gcc - - LIBPURPLE_CFLAGS = -I/usr/include/libpurple -DPURPLE_PLUGINS -DENABLE_NLS --GLIB_CFLAGS = -I/usr/include/glib-2.0 -I/usr/lib/glib-2.0/include -I/usr/lib64/glib-2.0/include -I/usr/include --DBUS_CFLAGS = -DSKYPE_DBUS -I/usr/include/dbus-1.0 -I/usr/lib/dbus-1.0/include -I/usr/lib64/dbus-1.0/include -+GLIB_CFLAGS = `pkg-config --cflags glib-2.0` -I/usr/include -+DBUS_CFLAGS = -DSKYPE_DBUS `pkg-config --cflags dbus-1` - WIN32_DEV_DIR = /root/pidgin/win32-dev - WIN32_PIDGIN_DIR = /root/pidgin/pidgin-2.6.1 - WIN32_CFLAGS = -DPURPLE_PLUGINS -DENABLE_NLS -I${WIN32_DEV_DIR}/gtk_2_0/include/glib-2.0 -I${WIN32_PIDGIN_DIR}/libpurple/win32 -I${WIN32_PIDGIN_DIR}/libpurple -I${WIN32_DEV_DIR}/gtk_2_0/include -I${WIN32_DEV_DIR}/gtk_2_0/include/glib-2.0 -I${WIN32_DEV_DIR}/gtk_2_0/lib/glib-2.0/include diff -Nru pidgin-skype-20110407+svn612+dfsg/debian/pidgin-skype-common.install pidgin-skype-20130613+svn660+dfsg/debian/pidgin-skype-common.install --- pidgin-skype-20110407+svn612+dfsg/debian/pidgin-skype-common.install 1970-01-01 00:00:00.000000000 +0000 +++ pidgin-skype-20130613+svn660+dfsg/debian/pidgin-skype-common.install 2013-06-14 09:58:17.000000000 +0000 @@ -0,0 +1,8 @@ +libskype.so /usr/lib/purple-2 +libskype_dbus.so /usr/lib/purple-2 +debian/icons/16/skype.png /usr/share/pidgin-skype-common/icons/16 +debian/icons/16/skypeout.png /usr/share/pidgin-skype-common/icons/16 +debian/icons/22/skype.png /usr/share/pidgin-skype-common/icons/22 +debian/icons/22/skypeout.png /usr/share/pidgin-skype-common/icons/22 +debian/icons/48/skype.png /usr/share/pidgin-skype-common/icons/48 +debian/icons/48/skypeout.png /usr/share/pidgin-skype-common/icons/48 diff -Nru pidgin-skype-20110407+svn612+dfsg/debian/pidgin-skype.install pidgin-skype-20130613+svn660+dfsg/debian/pidgin-skype.install --- pidgin-skype-20110407+svn612+dfsg/debian/pidgin-skype.install 1970-01-01 00:00:00.000000000 +0000 +++ pidgin-skype-20130613+svn660+dfsg/debian/pidgin-skype.install 2013-06-14 09:58:17.000000000 +0000 @@ -0,0 +1 @@ +theme /usr/share/pixmaps/pidgin/emotes/skype diff -Nru pidgin-skype-20110407+svn612+dfsg/debian/pidgin-skype.links pidgin-skype-20130613+svn660+dfsg/debian/pidgin-skype.links --- pidgin-skype-20110407+svn612+dfsg/debian/pidgin-skype.links 1970-01-01 00:00:00.000000000 +0000 +++ pidgin-skype-20130613+svn660+dfsg/debian/pidgin-skype.links 2013-06-14 09:58:17.000000000 +0000 @@ -0,0 +1,6 @@ +usr/share/pidgin-skype-common/icons/16/skype.png usr/share/pixmaps/pidgin/protocols/16/skype.png +usr/share/pidgin-skype-common/icons/16/skypeout.png usr/share/pixmaps/pidgin/protocols/16/skypeout.png +usr/share/pidgin-skype-common/icons/22/skype.png usr/share/pixmaps/pidgin/protocols/22/skype.png +usr/share/pidgin-skype-common/icons/22/skypeout.png usr/share/pixmaps/pidgin/protocols/22/skypeout.png +usr/share/pidgin-skype-common/icons/48/skype.png usr/share/pixmaps/pidgin/protocols/48/skype.png +usr/share/pidgin-skype-common/icons/48/skypeout.png usr/share/pixmaps/pidgin/protocols/48/skypeout.png diff -Nru pidgin-skype-20110407+svn612+dfsg/debian/rules pidgin-skype-20130613+svn660+dfsg/debian/rules --- pidgin-skype-20110407+svn612+dfsg/debian/rules 2011-04-11 00:01:15.000000000 +0000 +++ pidgin-skype-20130613+svn660+dfsg/debian/rules 2013-06-14 09:58:17.000000000 +0000 @@ -1,33 +1,39 @@ #!/usr/bin/make -f #export DH_VERBOSE=1 export DH_OPTIONS +export DEB_BUILD_MAINT_OPTIONS = hardening=+bindnow -SVGDIR = $(CURDIR)/debian/svgs -DESTDIR = $(CURDIR)/debian/pidgin-skype +SVGS = debian/svgs +ICONS = debian/icons +DESTDIR = $(CURDIR)/debian/tmp %: dh $@ override_dh_auto_build: $(MAKE) all + override_dh_auto_install: - $(MAKE) DESTDIR=$(DESTDIR) install - rsvg-convert -w 16 -h 16 $(SVGDIR)/skype16.svg \ - -o $(DESTDIR)/usr/share/pixmaps/pidgin/protocols/16/skype.png - rsvg-convert -w 16 -h 16 $(SVGDIR)/skypeout.svg \ - -o $(DESTDIR)/usr/share/pixmaps/pidgin/protocols/16/skypeout.png - rsvg-convert -w 22 -h 22 $(SVGDIR)/skype.svg \ - -o $(DESTDIR)/usr/share/pixmaps/pidgin/protocols/22/skype.png - rsvg-convert -w 22 -h 22 $(SVGDIR)/skypeout.svg \ - -o $(DESTDIR)/usr/share/pixmaps/pidgin/protocols/22/skypeout.png - rsvg-convert -w 48 -h 48 $(SVGDIR)/skype.svg \ - -o $(DESTDIR)/usr/share/pixmaps/pidgin/protocols/48/skype.png - rsvg-convert -w 48 -h 48 $(SVGDIR)/skypeout.svg \ - -o $(DESTDIR)/usr/share/pixmaps/pidgin/protocols/48/skypeout.png + for i in 16 22 48; do \ + [ $$i -eq 16 ] && SVG=$(SVGS)/skype16.svg || SVG=$(SVGS)/skype.svg; \ + SVGOUT=$(SVGS)/skypeout.svg; \ + mkdir -p $(ICONS)/$${i}; \ + rsvg-convert -w $${i} -h $${i} $${SVG} \ + -o $(ICONS)/$${i}/skype.png; \ + rsvg-convert -w $${i} -h $${i} $${SVGOUT} \ + -o $(ICONS)/$${i}/skypeout.png; \ + done + +override_dh_auto_clean: + -rm -rf $(ICONS) + dh_auto_clean override_dh_strip: dh_strip --dbg-package=pidgin-skype-dbg +override_dh_builddeb: + dh_builddeb -- -Zxz + TMPDIR=tmp-pidgin-skype get-orig-source: @echo date=$(date) svnrev=$(svnrev) @@ -35,5 +41,5 @@ "Usage: debian/rules date=YYYYMMDD svnrev=nnnn get-orig-source";exit 1;fi svn export -r $(svnrev) http://skype4pidgin.googlecode.com/svn/trunk/ $(TMPDIR) find $(TMPDIR) -type f -name '*.png' -print -delete - cd $(TMPDIR) && tar --exclude-vcs -zcf ../../pidgin-skype_$(date)+dfsg.orig.tar.gz * + cd $(TMPDIR) && tar --exclude-vcs -Jcf ../../pidgin-skype_$(date)+svn$(svnrev)+dfsg.orig.tar.xz * rm -rf $(TMPDIR) diff -Nru pidgin-skype-20110407+svn612+dfsg/debian/source/options pidgin-skype-20130613+svn660+dfsg/debian/source/options --- pidgin-skype-20110407+svn612+dfsg/debian/source/options 1970-01-01 00:00:00.000000000 +0000 +++ pidgin-skype-20130613+svn660+dfsg/debian/source/options 2013-06-14 09:58:17.000000000 +0000 @@ -0,0 +1 @@ +compression=xz diff -Nru pidgin-skype-20110407+svn612+dfsg/debug.c pidgin-skype-20130613+svn660+dfsg/debug.c --- pidgin-skype-20110407+svn612+dfsg/debug.c 2011-04-10 16:10:16.000000000 +0000 +++ pidgin-skype-20130613+svn660+dfsg/debug.c 2012-10-29 21:12:07.000000000 +0000 @@ -19,6 +19,10 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ + +#ifndef INCLUDED_LIBSKYPE_C +# error "Don't compile this file directly. Just compile libskype.c instead." +#endif #include #include diff -Nru pidgin-skype-20110407+svn612+dfsg/libskype.c pidgin-skype-20130613+svn660+dfsg/libskype.c --- pidgin-skype-20110407+svn612+dfsg/libskype.c 2011-04-10 16:10:16.000000000 +0000 +++ pidgin-skype-20130613+svn660+dfsg/libskype.c 2013-05-23 00:00:54.000000000 +0000 @@ -40,7 +40,9 @@ #include #include -#include +#if __GNUC__ +# include +#endif #include //#include @@ -72,8 +74,7 @@ #include #include -//#ifdef USE_VV -#if 1 +#ifndef INSTANTBIRD #include gboolean skype_media_initiate(PurpleAccount *account, const char *who, PurpleMediaSessionType type); PurpleMediaCaps skype_get_media_caps(PurpleAccount *account, const char *who); @@ -146,6 +147,7 @@ static guint protocol_version = 7; +#define INCLUDED_LIBSKYPE_C #include "debug.c" #include "skype_messaging.c" @@ -163,6 +165,7 @@ void skype_set_status(PurpleAccount *account, PurpleStatus *status); void skype_set_idle(PurpleConnection *gc, int time); void skype_add_buddy(PurpleConnection *gc, PurpleBuddy *buddy, PurpleGroup *group); +void skype_add_buddy_with_invite(PurpleConnection *pc, PurpleBuddy *buddy, PurpleGroup *group, const char *message); void skype_remove_buddy(PurpleConnection *gc, PurpleBuddy *buddy, PurpleGroup *group); void skype_add_deny(PurpleConnection *gc, const char *who); void skype_rem_deny(PurpleConnection *gc, const char *who); @@ -241,7 +244,9 @@ void skype_get_public_alias(PurpleConnection *gc, _account_char_fn success_cb, _account_char_fn failure_cb); #ifndef SKYPENET +#ifdef _WIN32 static void skype_open_skype_options(void); +#endif void skype_call_number(gpointer ignore, gchar *number); void skype_call_number_request(PurplePlugin *plugin, gpointer data); void skype_program_update_callback(PurpleUtilFetchUrlData *url_data, gpointer user_data, const gchar *url_text, gsize len, const gchar *error_message); @@ -261,6 +266,9 @@ OPT_PROTO_NO_PASSWORD| #endif #endif +#if PURPLE_MAJOR_VERSION == 2 && PURPLE_MINOR_VERSION >= 8 + OPT_PROTO_INVITE_MESSAGE| +#endif OPT_PROTO_REGISTER_NOSCREENNAME|OPT_PROTO_CHAT_TOPIC|OPT_PROTO_SLASH_COMMANDS_NATIVE, NULL, /* user_splits */ @@ -283,7 +291,11 @@ skype_set_status, /* set_status */ skype_set_idle, /* set_idle */ NULL, /* change_passwd */ +#if PURPLE_MAJOR_VERSION == 2 && PURPLE_MINOR_VERSION >= 8 + skype_add_buddy_with_invite, /* add_buddy */ +#else skype_add_buddy, /* add_buddy */ +#endif NULL, /* add_buddies */ skype_remove_buddy, /* remove_buddy */ NULL, /* remove_buddies */ @@ -332,14 +344,20 @@ #endif sizeof(PurplePluginProtocolInfo), /* struct_size */ NULL, /* get_account_text_table */ -//#ifdef USE_VV -#if 1 +#ifndef INSTANTBIRD skype_media_initiate,/* initiate_media */ skype_get_media_caps,/* can_do_media */ +#else + NULL, /* initiate_media */ + NULL, /* can_do_media */ #endif NULL, /* get_moods */ skype_set_public_alias, /* set_public_alias */ skype_get_public_alias /* get_public_alias */ +#if PURPLE_MAJOR_VERSION == 2 && PURPLE_MINOR_VERSION >= 8 +, skype_add_buddy_with_invite, /* add_buddy_with_invite */ + NULL /* add_buddies_with_invite */ +#endif }; static PurplePluginInfo info = { @@ -395,8 +413,11 @@ bind_textdomain_codeset(GETTEXT_PACKAGE, "UTF-8"); #endif - if (!g_thread_supported ()) - g_thread_init (NULL); +#if GLIB_MAJOR_VERSION == 2 && GLIB_MINOR_VERSION < 32 + if (glib_check_version(2, 32, 0)) + if (!g_thread_supported ()) + g_thread_init (NULL); +#endif this_plugin = plugin; /* plugin's path at this_plugin->path */ @@ -603,6 +624,9 @@ if(PURPLE_BLIST_NODE_IS_BUDDY(node)) { + buddy = (PurpleBuddy *)node; + sbuddy = (SkypeBuddy *)buddy->proto_data; + #ifndef SKYPENET #ifndef __APPLE__ act = purple_menu_action_new(_("_Send File"), @@ -610,11 +634,7 @@ NULL, NULL); m = g_list_append(m, act); #endif -//#ifndef USE_VV -#if 1 - buddy = (PurpleBuddy *)node; - sbuddy = (SkypeBuddy *)buddy->proto_data; - +#ifndef INSTANTBIRD if (!purple_media_manager_get()) { gint call_id = 0, i, j; @@ -622,8 +642,8 @@ if (temp && *temp && temp[5] && temp[6]) { gchar **ids = g_strsplit(&temp[6], ", ", 0); - g_free(temp); gchar **buddy_calls = NULL; + g_free(temp); temp = skype_send_message("SEARCH CALLS %s", buddy->name); if (temp && *temp && temp[5] && temp[6]) { @@ -806,7 +826,7 @@ return m; } -#ifndef SKYPENET +#if !defined SKYPENET && defined _WIN32 static void skype_open_skype_options(void) { @@ -1019,6 +1039,35 @@ return types; } +void +skype_get_all_buddy_info(PurpleBuddy *buddy) +{ + skype_send_message_nowait("GET USER %s MOOD_TEXT", buddy->name); + skype_send_message_nowait("GET USER %s ABOUT", buddy->name); + + skype_send_message_nowait("GET USER %s SEX", buddy->name); + skype_send_message_nowait("GET USER %s BIRTHDAY", buddy->name); + skype_send_message_nowait("GET USER %s LANGUAGE", buddy->name); + skype_send_message_nowait("GET USER %s COUNTRY", buddy->name); + skype_send_message_nowait("GET USER %s TIMEZONE", buddy->name); + skype_send_message_nowait("GET USER %s PROVINCE", buddy->name); + skype_send_message_nowait("GET USER %s CITY", buddy->name); + skype_send_message_nowait("GET USER %s PHONE_MOBILE", buddy->name); + skype_send_message_nowait("GET USER %s PHONE_OFFICE", buddy->name); + skype_send_message_nowait("GET USER %s PHONE_HOME", buddy->name); + skype_send_message_nowait("GET USER %s HOMEPAGE", buddy->name); + + skype_send_message_nowait("GET USER %s IS_VIDEO_CAPABLE", buddy->name); + skype_send_message_nowait("GET USER %s PHONE_MOBILE", buddy->name); + skype_send_message_nowait("GET USER %s HASCALLEQUIPMENT", buddy->name); + skype_send_message_nowait("GET USER %s IS_VOICEMAIL_CAPABLE", buddy->name); + skype_send_message_nowait("GET USER %s CAN_LEAVE_VM", buddy->name); + skype_send_message_nowait("GET USER %s ISAUTHORIZED", buddy->name); + skype_send_message_nowait("GET USER %s ISBLOCKED", buddy->name); + skype_send_message_nowait("GET USER %s LASTONLINETIMESTAMP", buddy->name); + skype_send_message_nowait("GET USER %s NROF_AUTHED_BUDDIES", buddy->name); +} + gboolean skype_set_buddies(PurpleAccount *acct) { @@ -1070,6 +1119,7 @@ //for now, dump them into a default group, until skype tells us where they belong if (full_friends_list[i][0] == '+') { +#ifndef __APPLE__ if (skypeout_group == NULL) { skypeout_group = purple_find_group("SkypeOut"); @@ -1081,10 +1131,12 @@ purple_blist_add_group(skypeout_group, NULL); } } +#endif purple_blist_add_buddy(buddy, NULL, skypeout_group, NULL); } else { +#ifndef __APPLE__ if (skype_group == NULL) { skype_group = purple_find_group("Skype"); @@ -1096,6 +1148,7 @@ purple_blist_add_group(skype_group, NULL); } } +#endif purple_blist_add_buddy(buddy, NULL, skype_group, NULL); } } @@ -1143,6 +1196,7 @@ } else { purple_prpl_got_user_status(acct, buddy->name, full_friends_list[i+5], NULL); } + skype_send_message_nowait("GET USER %s IS_VIDEO_CAPABLE", buddy->name); } g_strfreev(full_friends_list); skype_put_buddies_in_groups(); @@ -1192,6 +1246,7 @@ //for now, dump them into a default group, until skype tells us where they belong if (friends[i][0] == '+') { +#ifndef __APPLE__ if (skypeout_group == NULL) { skypeout_group = purple_find_group("SkypeOut"); @@ -1201,10 +1256,12 @@ purple_blist_add_group(skypeout_group, NULL); } } +#endif purple_blist_add_buddy(buddy, NULL, skypeout_group, NULL); } else { +#ifndef __APPLE__ if (skype_group == NULL) { skype_group = purple_find_group("Skype"); @@ -1214,6 +1271,7 @@ purple_blist_add_group(skype_group, NULL); } } +#endif purple_blist_add_buddy(buddy, NULL, skype_group, NULL); } } @@ -1376,6 +1434,7 @@ acct = purple_buddy_get_account(buddy); +#ifndef INSTANTBIRD if (api_supports_avatar == 1 || api_supports_avatar == -1) { fh = g_file_open_tmp("skypeXXXXXX", &filename, &error); @@ -1463,16 +1522,16 @@ } g_free(username); } - if (api_supports_avatar == 3) +#else /* ifdef INSTANTBIRD */ + api_supports_avatar = 3; +#endif + if (api_supports_avatar == 3 || api_supports_avatar == -1) { - filename = g_strconcat("http://", purple_account_get_string(acct, "host", "skype.robbmob.com"), "/avatars/", buddy->name, NULL); + filename = g_strdup_printf("http://api.skype.com/users/%s/profile/avatar", purple_url_encode(buddy->name)); purple_util_fetch_url(filename, TRUE, NULL, FALSE, skype_got_buddy_icon_cb, buddy); g_free(filename); - return; - } - if (api_supports_avatar == -1) - { - api_supports_avatar = 0; + + api_supports_avatar = 3; return; } } @@ -1606,6 +1665,7 @@ if (!skype_connect()) { +#ifndef INSTANTBIRD if (purple_account_get_bool(acct, "skype_autostart", TRUE)) { skype_debug_info("skype", "Should I start Skype?\n"); @@ -1627,6 +1687,7 @@ return; } } +#endif purple_timeout_add_seconds(10, (GSourceFunc) skype_login_retry, acct); return; } @@ -1663,6 +1724,8 @@ { gchar *reply; PurpleConnection *gc; + static guint missedmessagestimout = 0; + gc = purple_account_get_connection(acct); purple_connection_update_progress(gc, _("Authorizing"), @@ -1715,7 +1778,24 @@ //sync buddies after everything else has finished loading purple_timeout_add_seconds(1, (GSourceFunc)skype_set_buddies, (gpointer)acct); - purple_timeout_add_seconds(30, (GSourceFunc)skype_check_missedmessages, (gpointer)acct); + + if (TRUE) + { + gint version_int = 0; + gchar *version = skype_send_message("GET SKYPEVERSION"); + sscanf(version, "%*s %d", &version_int); + skype_debug_info("skype", "version [%s] - %d\n", version, version_int); + g_free(version); + + if (version_int >= 5 && !missedmessagestimout) { + missedmessagestimout = purple_timeout_add_seconds(10, (GSourceFunc)skype_check_missedmessages, (gpointer)acct); + skype_debug_info("skype", "installing skype_check_missedmessages\n"); + } else if (version_int < 5 && missedmessagestimout) { + purple_timeout_remove(missedmessagestimout); + missedmessagestimout = 0; + skype_debug_info("skype", "removing skype_check_missedmessages\n"); + } + } return FALSE; } @@ -1814,8 +1894,7 @@ g_hash_table_destroy(sms_convo_link_table); sms_convo_link_table = NULL; -//#ifdef USE_VV -#if 1 +#ifndef INSTANTBIRD g_hash_table_destroy(call_media_hash); call_media_hash = NULL; #endif @@ -1941,8 +2020,8 @@ { g_free(sbuddy->gender); sbuddy->gender = NULL; - if (value && strlen(value) && !g_str_equal(value, "UNKNOWN")) - sbuddy->gender = g_strdup(value); + if (value && *value && !g_str_equal(value, "UNKNOWN")) + sbuddy->gender = g_ascii_strdown(value, -1); } else if (g_str_equal(skype_buddy_property, "LANGUAGE")) { g_free(sbuddy->language); @@ -2068,33 +2147,9 @@ skype_send_message_nowait("GET USER %s FULLNAME", buddy->name); if (buddy->name[0] != '+') { - skype_send_message_nowait("GET USER %s MOOD_TEXT", buddy->name); - skype_send_message_nowait("GET USER %s BIRTHDAY", buddy->name); - skype_send_message_nowait("GET USER %s IS_VIDEO_CAPABLE", buddy->name); - skype_send_message_nowait("GET USER %s PHONE_MOBILE", buddy->name); - - /*skype_send_message_nowait("GET USER %s SEX", buddy->name); - skype_send_message_nowait("GET USER %s LANGUAGE", buddy->name); - skype_send_message_nowait("GET USER %s COUNTRY", buddy->name); - skype_send_message_nowait("GET USER %s ISAUTHORIZED", buddy->name); - skype_send_message_nowait("GET USER %s ISBLOCKED", buddy->name); - skype_send_message_nowait("GET USER %s LASTONLINETIMESTAMP", buddy->name); - skype_send_message_nowait("GET USER %s TIMEZONE", buddy->name); - skype_send_message_nowait("GET USER %s NROF_AUTHED_BUDDIES", buddy->name); - skype_send_message_nowait("GET USER %s ABOUT", buddy->name); - - skype_send_message_nowait("GET USER %s PROVINCE", buddy->name); - skype_send_message_nowait("GET USER %s CITY", buddy->name); - skype_send_message_nowait("GET USER %s PHONE_HOME", buddy->name); - skype_send_message_nowait("GET USER %s PHONE_OFFICE", buddy->name); - skype_send_message_nowait("GET USER %s PHONE_MOBILE", buddy->name); - skype_send_message_nowait("GET USER %s HOMEPAGE", buddy->name); - skype_send_message_nowait("GET USER %s HASCALLEQUIPMENT", buddy->name); + skype_send_message_nowait("GET USER %s ONLINESTATUS", buddy->name); skype_send_message_nowait("GET USER %s IS_VIDEO_CAPABLE", buddy->name); - skype_send_message_nowait("GET USER %s IS_VOICEMAIL_CAPABLE", buddy->name); - skype_send_message_nowait("GET USER %s CAN_LEAVE_VM", buddy->name);*/ } - return newbuddy; } @@ -2138,104 +2193,68 @@ } } -void -skype_get_info(PurpleConnection *gc, const gchar *username) +gboolean +skype_display_buddy_info(PurpleBuddy *buddy) { PurpleNotifyUserInfo *user_info; - double timezoneoffset = 0; - struct tm *birthday_time; - int time; - gchar *temp; - PurpleBuddy *buddy; SkypeBuddy *sbuddy; - buddy = purple_find_buddy(gc->account, username); if (buddy && buddy->proto_data) { +#define _SKYPE_USER_INFO(prop, key) if (prop) \ + purple_notify_user_info_add_pair(user_info, _(key), (prop)); sbuddy = buddy->proto_data; user_info = purple_notify_user_info_new(); - purple_notify_user_info_add_section_header(user_info, _("Contact Info")); - purple_notify_user_info_add_pair(user_info, _("Skype Name"), buddy->name); - purple_notify_user_info_add_pair(user_info, _("Full Name"), sbuddy->fullname); - purple_notify_user_info_add_pair(user_info, _("Mood Text"), sbuddy->mood); - + _SKYPE_USER_INFO(sbuddy->handle, "Skype Name"); + _SKYPE_USER_INFO(sbuddy->fullname, "Full Name"); + if (strlen(sbuddy->mood) != 0) + _SKYPE_USER_INFO(sbuddy->mood, "Mood Text"); purple_notify_user_info_add_section_break(user_info); - - purple_notify_user_info_add_section_header(user_info, _("Personal Information")); - purple_notify_user_info_add_pair(user_info, _("Birthday"), purple_date_format_short(sbuddy->birthday)); - purple_notify_user_info_add_pair(user_info, _("Gender"), sbuddy->gender); - purple_notify_user_info_add_pair(user_info, _("Preferred Language"), sbuddy->language); - purple_notify_user_info_add_pair(user_info, _("Country"), sbuddy->country); - purple_notify_user_info_add_pair(user_info, _("Is Video Capable"), (sbuddy->is_video_capable?"TRUE":"FALSE")); - purple_notify_user_info_add_pair(user_info, _("Authorization Granted"), (sbuddy->is_authorized?"TRUE":"FALSE")); - purple_notify_user_info_add_pair(user_info, _("Blocked"), (sbuddy->is_blocked?"TRUE":"FALSE")); + if (sbuddy->birthday != 0) + _SKYPE_USER_INFO(purple_date_format_short(sbuddy->birthday),"Birthday"); + _SKYPE_USER_INFO(sbuddy->gender, "Gender"); + _SKYPE_USER_INFO(sbuddy->language, "Preferred Language"); + _SKYPE_USER_INFO(sbuddy->country, "Country"); if (sbuddy->timezone_offset) - { - purple_notify_user_info_add_pair(user_info, _("Timezone"), temp = g_strdup_printf("UMT %+.1f", sbuddy->timezone_offset)); - g_free(temp); - } else { - purple_notify_user_info_add_pair(user_info, _("Timezone"), NULL); - } - purple_notify_user_info_add_pair(user_info, _("Number of buddies"), temp = g_strdup_printf("%d", sbuddy->number_of_buddies)); - g_free(temp); - + _SKYPE_USER_INFO(g_strdup_printf("UMT %+.1f", sbuddy->timezone_offset), + "Timezone"); + _SKYPE_USER_INFO(sbuddy->province, "Province"); + _SKYPE_USER_INFO(sbuddy->city, "City"); + _SKYPE_USER_INFO(sbuddy->phone_mobile, "Phone Mobile"); + _SKYPE_USER_INFO(sbuddy->phone_office, "Phone Office"); + _SKYPE_USER_INFO(sbuddy->phone_home, "Phone Home"); + _SKYPE_USER_INFO(sbuddy->homepage, "Homepage"); purple_notify_user_info_add_section_break(user_info); + _SKYPE_USER_INFO(sbuddy->is_video_capable?_("Yes"):_("No"), "Video Capable"); + _SKYPE_USER_INFO(sbuddy->has_call_equipment?_("Yes"):_("No"), "Call Equipment"); + _SKYPE_USER_INFO(sbuddy->is_voicemail_capable?_("Yes"):_("No"), "VoiceMail Capable"); + _SKYPE_USER_INFO(sbuddy->can_leave_voicemail?_("Yes"):_("No"), "Can Leave VoiceMail"); + _SKYPE_USER_INFO(sbuddy->is_authorized?_("Yes"):_("No"), "Authorization Granted"); + _SKYPE_USER_INFO(sbuddy->is_blocked?_("Yes"):_("No"), "Blocked"); + _SKYPE_USER_INFO(g_strdup_printf("%d", sbuddy->number_of_buddies), "Number of buddies"); - purple_notify_user_info_add_pair(user_info, NULL, sbuddy->about); - - purple_notify_userinfo(gc, username, user_info, NULL, NULL); - purple_notify_user_info_destroy(user_info); - - return; + _SKYPE_USER_INFO(timestamp_to_datetime(sbuddy->last_online), "Last online"); + purple_notify_user_info_add_section_break(user_info); + _SKYPE_USER_INFO(sbuddy->about, "About"); + + purple_notify_userinfo(purple_account_get_connection(buddy->account), + buddy->name, user_info, + (PurpleNotifyCloseCallback)purple_notify_user_info_destroy, user_info); } - - user_info = purple_notify_user_info_new(); -#define _SKYPE_USER_INFO(prop, key) \ - purple_notify_user_info_add_pair(user_info, _(key),\ - (skype_get_user_info(username, prop))); + return FALSE; +} - purple_notify_user_info_add_section_header(user_info, _("Contact Info")); - _SKYPE_USER_INFO("HANDLE", "Skype Name"); - _SKYPE_USER_INFO("FULLNAME", "Full Name"); - purple_notify_user_info_add_section_break(user_info); - purple_notify_user_info_add_section_header(user_info, _("Personal Information")); - //_SKYPE_USER_INFO("BIRTHDAY", "Birthday"); - temp = skype_get_user_info(username, "BIRTHDAY"); - if (temp && strlen(temp) && !g_str_equal(temp, "0")) +void +skype_get_info(PurpleConnection *gc, const gchar *username) +{ + PurpleBuddy *buddy; + buddy = purple_find_buddy(gc->account, username); + if (buddy) { - birthday_time = g_new(struct tm, 1); - purple_str_to_time(temp, FALSE, birthday_time, NULL, NULL); - purple_notify_user_info_add_pair(user_info, _("Birthday"), g_strdup(purple_date_format_short(birthday_time))); - g_free(birthday_time); - } else { - purple_notify_user_info_add_pair(user_info, _("Birthday"), g_strdup("0")); + skype_get_all_buddy_info(buddy); + purple_timeout_add_seconds(2, (GSourceFunc)skype_display_buddy_info, buddy); } - _SKYPE_USER_INFO("SEX", "Gender"); - _SKYPE_USER_INFO("LANGUAGE", "Preferred Language"); - _SKYPE_USER_INFO("COUNTRY", "Country"); - _SKYPE_USER_INFO("IS_VIDEO_CAPABLE", "Is Video Capable"); - _SKYPE_USER_INFO("ISAUTHORIZED", "Authorization Granted"); - _SKYPE_USER_INFO("ISBLOCKED", "Blocked"); - //_SKYPE_USER_INFO("LASTONLINETIMESTAMP", "Last online"); //timestamp - time = atoi(skype_get_user_info(username, "LASTONLINETIMESTAMP")); - skype_debug_info("skype", "time: %d\n", time); - purple_notify_user_info_add_pair(user_info, _("Last online"), - timestamp_to_datetime((time_t) time)); - // g_strdup(purple_date_format_long(localtime((time_t *)(void *)&time)))); - //_SKYPE_USER_INFO("TIMEZONE", "Timezone"); //in seconds - timezoneoffset = atof(skype_get_user_info(username, "TIMEZONE")) / 3600; - timezoneoffset -= 24; //timezones are offset by 24 hours to keep them valid and unsigned - purple_notify_user_info_add_pair(user_info, _("Timezone"), g_strdup_printf("UMT %+.1f", timezoneoffset)); - - _SKYPE_USER_INFO("NROF_AUTHED_BUDDIES", "Number of buddies"); - purple_notify_user_info_add_section_break(user_info); - //_SKYPE_USER_INFO("ABOUT", ""); - purple_notify_user_info_add_pair(user_info, NULL, (skype_get_user_info(username, "ABOUT"))); - - purple_notify_userinfo(gc, username, user_info, NULL, NULL); - purple_notify_user_info_destroy(user_info); - } gchar * @@ -2360,9 +2379,11 @@ group_number = skype_find_group_with_name(new_group); if (group_number <= 0) { + struct _cheat_skype_group_buddy_struct *cheat; if (group_number == 0) skype_send_message_nowait("CREATE GROUP %s", new_group); - struct _cheat_skype_group_buddy_struct *cheat = g_new(struct _cheat_skype_group_buddy_struct, 1); + + cheat = g_new(struct _cheat_skype_group_buddy_struct, 1); cheat->gc = gc; cheat->who = g_strdup(who); cheat->old_group = old_group?g_strdup(old_group):NULL; @@ -2407,10 +2428,10 @@ skype_send_message_nowait("DELETE GROUP %d", group_number); } -void -skype_add_buddy(PurpleConnection *gc, PurpleBuddy *buddy, PurpleGroup *group) +void +skype_add_buddy_with_invite(PurpleConnection *gc, PurpleBuddy *buddy, PurpleGroup *group, const char *message) { - skype_send_message_nowait("SET USER %s BUDDYSTATUS 2 %s", buddy->name, _("Please authorize me so I can add you to my buddy list.")); + skype_send_message_nowait("SET USER %s BUDDYSTATUS 2 %s", buddy->name, message); if (buddy->alias == NULL || strlen(buddy->alias) == 0) skype_update_buddy_alias(buddy); @@ -2427,6 +2448,12 @@ } void +skype_add_buddy(PurpleConnection *gc, PurpleBuddy *buddy, PurpleGroup *group) +{ + skype_add_buddy_with_invite(gc, buddy, group, _("Please authorize me so I can add you to my buddy list.")); +} + +void skype_remove_buddy(PurpleConnection *gc, PurpleBuddy *buddy, PurpleGroup *group) { // Check that the buddy doesn't exist in other groups (ie, is the UI being weird) @@ -2614,35 +2641,10 @@ static gboolean skype_check_missedmessages(PurpleAccount *account) { - int i; - gchar **messages; - gchar *message; - gchar *messages_start; - GList *message_list = NULL; - GList *iter; - - message = skype_send_message("SEARCH MISSEDCHATMESSAGES"); - if (!message || *message == '\0') - return FALSE; //there was an error - messages_start = strchr(message, ' '); - if (messages_start != NULL) - { - messages = g_strsplit(messages_start + 1, ", ", 0); - for (i = 0; messages[i]; i++) - { - message_list = g_list_insert_sorted(message_list, messages[i], (GCompareFunc)strcmp); - } - for (iter = message_list; iter; iter = g_list_next(iter)) - { - skype_send_message_nowait("GET CHATMESSAGE %s STATUS", iter->data); - } - g_strfreev(messages); - g_list_free(message_list); - } - g_free(message); + skype_send_message_nowait("SEARCH MISSEDCHATMESSAGES"); - return FALSE; //dont keep looking for missed messages - //return TRUE; //keep looking for missed messages + //return FALSE; //dont keep looking for missed messages + return TRUE; //keep looking for missed messages } static gboolean @@ -3291,8 +3293,7 @@ return FALSE; } -//#ifdef USE_VV -#if 1 +#ifndef INSTANTBIRD /* Skype info from developer.skype.com and forum.skype.com: Audio: diff -Nru pidgin-skype-20110407+svn612+dfsg/libskypekit/libskypekit.cpp pidgin-skype-20130613+svn660+dfsg/libskypekit/libskypekit.cpp --- pidgin-skype-20110407+svn612+dfsg/libskypekit/libskypekit.cpp 1970-01-01 00:00:00.000000000 +0000 +++ pidgin-skype-20130613+svn660+dfsg/libskypekit/libskypekit.cpp 2011-12-09 00:37:06.000000000 +0000 @@ -0,0 +1,1845 @@ +/* + * libskypekit.cpp + * skypekit + * + * Created by MyMacSpace on 19/04/10. + * Copyright 2010 __MyCompanyName__. All rights reserved. + * + */ + +#include "libskypekit.h" + +Contact::Ref find_contact(Skype *skype, const char *who) +{ + SEString skypename = who; + ContactGroup::Ref cg; + Contact::Refs contacts; + if (!skype->GetHardwiredContactGroup(ContactGroup::ALL_KNOWN_CONTACTS, cg) || !cg->GetContacts(contacts)) { + //Unable to get contact list + return Contact::Ref(0); + } + + Sid::String identity; + for (uint i = 0; i < contacts.size(); i++) { + contacts[i]->GetIdentity(identity); + if (contacts[i] && identity == skypename) { + return contacts[i]; + } + } + + return Contact::Ref(0); +} + +ContactGroup::Ref find_group(Skype *skype, Sid::String& groupname) +{ + ContactGroup::Refs cgs; + ContactGroup::Ref cg; + if (!skype->GetCustomContactGroups(cgs)) + return ContactGroup::Ref(0); + + while((cg = cgs.peek())) + { + SEString displayname; + cg->GetPropGivenDisplayname(displayname); + if (displayname.equals(groupname)) + return cg; + } + + return ContactGroup::Ref(0); +} + +Conversation::Ref find_conversation(Skype *skype, const char *who) +{ + SEStringList participants; + Conversation::Ref conv; + Sid::String skypename = who; + + participants.append(skypename); + skype->GetConversationByParticipants(participants, conv, true, false); + + return conv; +} + +const char *skype_list_icon(PurpleAccount *account, PurpleBuddy *buddy) +{ + return "skype"; +} + +GList *skype_status_types(PurpleAccount *acct) +{ + GList *types; + PurpleStatusType *status; + + purple_debug_info("skype", "returning status types\n"); + + types = NULL; + + /* Statuses are almost all the same. Define a macro to reduce code repetition. */ +#define _SKYPE_ADD_NEW_STATUS(prim,id,name) status = \ + purple_status_type_new_with_attrs( \ + prim, /* PurpleStatusPrimitive */ \ + id, /* id */ \ + _(name), /* name */ \ + TRUE, /* savable */ \ + TRUE, /* user_settable */ \ + FALSE, /* not independent */ \ + \ + /* Attributes - each status can have a message. */ \ + "message", \ + _("Mood"), \ + purple_value_new(PURPLE_TYPE_STRING), \ + NULL); \ + \ + \ + types = g_list_append(types, status) + + + _SKYPE_ADD_NEW_STATUS(PURPLE_STATUS_AVAILABLE, "ONLINE", "Online"); + _SKYPE_ADD_NEW_STATUS(PURPLE_STATUS_AVAILABLE, "SKYPEME", "SkypeMe"); + _SKYPE_ADD_NEW_STATUS(PURPLE_STATUS_AWAY, "AWAY", "Away"); + _SKYPE_ADD_NEW_STATUS(PURPLE_STATUS_EXTENDED_AWAY, "NA", "Not Available"); + _SKYPE_ADD_NEW_STATUS(PURPLE_STATUS_UNAVAILABLE, "DND", "Do Not Disturb"); + _SKYPE_ADD_NEW_STATUS(PURPLE_STATUS_INVISIBLE, "INVISIBLE", "Invisible"); + //_SKYPE_ADD_NEW_STATUS(PURPLE_STATUS_OFFLINE, "Offline"); + + //User status could be 'logged out' - make not settable + status = purple_status_type_new_full(PURPLE_STATUS_OFFLINE, "LOGGEDOUT", _("Logged out"), FALSE, FALSE, FALSE); + types = g_list_append(types, status); + + //User could be a SkypeOut contact + if (purple_account_get_bool(acct, "skypeout_online", TRUE)) + { + status = purple_status_type_new_full(PURPLE_STATUS_MOBILE, "SKYPEOUT", _("SkypeOut"), FALSE, FALSE, FALSE); + } else { + status = purple_status_type_new_full(PURPLE_STATUS_OFFLINE, "SKYPEOUT", _("SkypeOut"), FALSE, FALSE, FALSE); + } + types = g_list_append(types, status); + + //Offline people shouldn't have status messages + status = purple_status_type_new_full(PURPLE_STATUS_OFFLINE, "OFFLINE", _("Offline"), FALSE, TRUE, FALSE); + types = g_list_append(types, status); + + return types; +} + +void skype_login(PurpleAccount *acct) +{ + PurpleConnection *pc; + SEString AppToken = SKYPE_APP_TOKEN; + MyAccount::Ref A; + MySkype *skype = 0; + SETCPTransport *transport = 0; + SEString accountName = acct->username; + SEString accountPW = acct->password; + + pc = purple_account_get_connection(acct); + pc->proto_data = NULL; + pc->flags = (PurpleConnectionFlags) (PURPLE_CONNECTION_HTML | PURPLE_CONNECTION_NO_BGCOLOR); + + transport = new SETCPTransport(purple_account_get_string(acct, "host", "127.0.0.1"), + purple_account_get_int(acct, "port", 8963)); + skype = new MySkype(transport); + pc->proto_data = skype; + + purple_debug_info("skypekit", "Pre init()\n"); + if (!skype->init(1, 1)) + { + purple_connection_error(pc, "Could not connect"); + return; + } + purple_debug_info("skypekit", "Pre start()\n"); + skype->start(); + purple_debug_info("skypekit", "Post start()\n"); + skype->SetApplicationToken(AppToken); + purple_debug_info("skypekit", "Set token to %s\n", SKYPE_APP_TOKEN); + + skype->pa = acct; + skype->pc = pc; + + if (skype->GetAccount(accountName, A)) + { + purple_debug_info("skypekit", "Got account\n"); + if (!A->LoginWithPassword(accountPW, false, true)) + { + purple_connection_error(pc, "Invalid username or password2"); + return; + } + } else { + purple_connection_error(pc, "Invalid username or password"); + return; + } + + A->SetAvailability(Contact::ONLINE); + +} + +void skype_close(PurpleConnection *pc) +{ + Skype *skype = (Skype *) pc->proto_data; + PurpleAccount *account = pc->account; + MyAccount::Ref A; + SEString accountName = account->username; + + if (!pc || !pc->proto_data) + return; + + purple_debug_info("skypekit", "Logging out\n"); + if(skype->GetAccount(accountName, A)) + { + purple_debug_info("skypekit", "...\n"); + A->Logout(true); + } + purple_debug_info("skypekit", "Logged out\n"); + + skype->stop(); + purple_debug_info("skypekit", "Stopped\n"); + skype->cleanup(); + purple_debug_info("skypekit", "Clean\n"); + + delete skype; +} + +int skype_send_im(PurpleConnection *gc, const gchar *who, const gchar *message, PurpleMessageFlags flags) +{ + Skype *skype = (Skype *)gc->proto_data; + Message::Ref msg; + + ConversationRef conv = find_conversation(skype, who); + + if (conv->PostText(message, msg, true)) + { + return strlen(message); + } else { + return -1; + } +} + +int +skype_chat_send(PurpleConnection *gc, int id, const char *message, PurpleMessageFlags flags) +{ + MySkype *skype = (MySkype *)gc->proto_data; + Conversation *conv = skype->newConversation(id); + Message::Ref msg; + + if (conv->PostText(message, msg, true)) + { + serv_got_chat_in(gc, id, purple_account_get_username(purple_connection_get_account(gc)), PURPLE_MESSAGE_SEND, + message, time(NULL)); + + return 1; + } else { + return -1; + } +} + +void +skype_set_chat_topic(PurpleConnection *gc, int id, const char *topic) +{ + MySkype *skype = (MySkype *)gc->proto_data; + Conversation *conv = skype->newConversation(id); + + conv->SetTopic(topic); +} + +void +skype_set_status(PurpleAccount *account, PurpleStatus *status) +{ + PurpleConnection *pc = purple_account_get_connection(account); + MySkype *skype = (MySkype *)pc->proto_data; + PurpleStatusType *type; + const char *message; + const char *statusid; + MyAccount::Ref A; + SEString accountName = account->username; + + if (!skype->GetAccount(accountName, A)) + return; + + type = purple_status_get_type(status); + statusid = purple_status_type_get_id(type); + if (g_str_equal(statusid, "ONLINE")) + { + A->SetAvailability(Contact::ONLINE); + } else if (g_str_equal(statusid, "SKYPEME")) + { + A->SetAvailability(Contact::SKYPE_ME); + } else if (g_str_equal(statusid, "AWAY")) + { + A->SetAvailability(Contact::AWAY); + } else if (g_str_equal(statusid, "NA")) + { + A->SetAvailability(Contact::NOT_AVAILABLE); + } else if (g_str_equal(statusid, "DND")) + { + A->SetAvailability(Contact::DO_NOT_DISTURB); + } else if (g_str_equal(statusid, "INVISIBLE")) + { + A->SetAvailability(Contact::INVISIBLE); + } else if (g_str_equal(statusid, "OFFLINE")) + { + A->SetAvailability(Contact::OFFLINE); + } + + message = purple_status_get_attr_string(status, "message"); + if (message == NULL) + message = ""; + else + message = purple_markup_strip_html(message); + + A->SetStrProperty(Contact::P_MOOD_TEXT, message); +} + +unsigned int +skype_send_typing(PurpleConnection *gc, const gchar *who, PurpleTypingState state) +{ + Skype *skype = (Skype *)gc->proto_data; + Message::Ref msg; + + //Don't send typing notifications to self + if (g_str_equal(who, gc->account->username)) + return 999; + + ConversationRef conv = find_conversation(skype, who); + + switch(state) + { + case PURPLE_NOT_TYPING: + conv->SetMyTextStatusTo(Participant::TEXT_NA); + break; + case PURPLE_TYPING: + conv->SetMyTextStatusTo(Participant::WRITING); + break; + case PURPLE_TYPED: + conv->SetMyTextStatusTo(Participant::READING); + break; + default: + break; + } + + return 999; +} + +const char * +skype_normalize(const PurpleAccount *acct, const char *who) +{ + static gchar *last_normalize = NULL; + g_free(last_normalize); + last_normalize = g_utf8_strdown(who, -1); + return last_normalize; +} + +void skype_add_deny(PurpleConnection *gc, const char *who) +{ + Skype *skype = (Skype *)gc->proto_data; + Contact::Ref contact = find_contact(skype, who); + + if (contact) + { + contact->SetBlocked(true); + } +} +void skype_rem_deny(PurpleConnection *gc, const char *who) +{ + Skype *skype = (Skype *)gc->proto_data; + Contact::Ref contact = find_contact(skype, who); + + if (contact) + { + contact->SetBlocked(false); + } +} +void skype_add_permit(PurpleConnection *gc, const char *who) +{ + Skype *skype = (Skype *)gc->proto_data; + Contact::Ref contact = find_contact(skype, who); + + if (contact) + { + contact->SetBuddyStatus(true); + } +} +void +skype_rem_permit(PurpleConnection *gc, const char *who) +{ + Skype *skype = (Skype *)gc->proto_data; + Contact::Ref contact = find_contact(skype, who); + + if (contact) + { + contact->SetBuddyStatus(false); + } +} + +char * +skype_status_text(PurpleBuddy *buddy) +{ + PurpleAccount *account = purple_buddy_get_account(buddy); + PurpleConnection *pc = purple_account_get_connection(account); + Skype *skype = (Skype *)pc->proto_data; + SEString mood; + + Contact::Ref contact = find_contact(skype, buddy->name); + + if (contact) + { + mood = contact->GetProp(Contact::P_MOOD_TEXT); + } + + if (mood.isEmpty()) + { + return NULL; + } + + return g_strdup(mood); +} + +void +skype_tooltip_text(PurpleBuddy *buddy, PurpleNotifyUserInfo *userinfo, gboolean full) +{ + PurplePresence *presence; + PurpleStatus *status; + const gchar *text; + + presence = purple_buddy_get_presence(buddy); + status = purple_presence_get_active_status(presence); + purple_notify_user_info_add_pair(userinfo, _("Status"), purple_status_get_name(status)); + + text = purple_status_get_attr_string(status, "message"); + if (text) + purple_notify_user_info_add_pair(userinfo, _("Mood"), text); +} + +void +skype_add_buddy(PurpleConnection *pc, PurpleBuddy *buddy, PurpleGroup *group) +{ + Skype *skype = (Skype *)pc->proto_data; + bool Found = false; + Contact::Ref NewContact; + SEString name = buddy->name; + SEString alias = buddy->alias; + ContactGroup::Ref NewGroup; + SEString groupname = group->name; + + Found = skype->GetContact(name, NewContact); + if (!Found) + return; + + NewContact->GiveDisplayName(alias); + NewContact->SendAuthRequest(""); + NewContact->SetBuddyStatus(true); + + NewGroup = find_group(skype, groupname); + if (!NewGroup) + { + skype->CreateCustomContactGroup(NewGroup); + NewGroup->GiveDisplayName(groupname); + } + NewGroup->AddContact(NewContact); + +} + +void +skype_remove_buddy(PurpleConnection *pc, PurpleBuddy *buddy, PurpleGroup *group) +{ + Skype *skype = (Skype *)pc->proto_data; + bool Found = false; + Contact::Ref RemovableContact; + SEString name = buddy->name; + SEString alias = buddy->alias; + ContactGroup::Ref NewGroup; + SEString groupname = group->name; + + Found = skype->GetContact(name, RemovableContact); + + NewGroup = find_group(skype, groupname); + if (NewGroup) + NewGroup->RemoveContact(RemovableContact); +} + +const char * +skype_list_emblem(PurpleBuddy *buddy) +{ + PurpleConnection *pc = purple_account_get_connection(buddy->account); + Skype *skype = (Skype *)pc->proto_data; + Contact::Ref contact = find_contact(skype, buddy->name); + Contact::AVAILABILITY avail; + bool hasCap = false; + + if (contact) + { + contact->GetPropAvailability(avail); + switch(avail) + { + case Contact::ONLINE_FROM_MOBILE: + case Contact::AWAY_FROM_MOBILE: + case Contact::NOT_AVAILABLE_FROM_MOBILE: + case Contact::DO_NOT_DISTURB_FROM_MOBILE: + case Contact::SKYPE_ME_FROM_MOBILE: + return "mobile"; + break; + default: + break; + } + if (contact->HasCapability(Contact::CAPABILITY_MOBILE_DEVICE, hasCap) + && hasCap == true) + return "mobile"; + + if (contact->HasCapability(Contact::CAPABILITY_VIDEO, hasCap) + && hasCap == true) + return "video"; + } + + return NULL; +} + +gboolean +skype_offline_msg(const PurpleBuddy *buddy) +{ + return TRUE; +} + +// Since this function isn't public, and we need it to be, redefine it here +static void +purple_xfer_set_status(PurpleXfer *xfer, PurpleXferStatusType status) +{ + g_return_if_fail(xfer != NULL); + + if (xfer->status == status) + return; + + xfer->status = status; + + if(xfer->type == PURPLE_XFER_SEND) { + switch(status) { + case PURPLE_XFER_STATUS_ACCEPTED: + purple_signal_emit(purple_xfers_get_handle(), "file-send-accept", xfer); + break; + case PURPLE_XFER_STATUS_STARTED: + purple_signal_emit(purple_xfers_get_handle(), "file-send-start", xfer); + break; + case PURPLE_XFER_STATUS_DONE: + purple_signal_emit(purple_xfers_get_handle(), "file-send-complete", xfer); + break; + case PURPLE_XFER_STATUS_CANCEL_LOCAL: + case PURPLE_XFER_STATUS_CANCEL_REMOTE: + purple_signal_emit(purple_xfers_get_handle(), "file-send-cancel", xfer); + break; + default: + break; + } + } else if(xfer->type == PURPLE_XFER_RECEIVE) { + switch(status) { + case PURPLE_XFER_STATUS_ACCEPTED: + purple_signal_emit(purple_xfers_get_handle(), "file-recv-accept", xfer); + break; + case PURPLE_XFER_STATUS_STARTED: + purple_signal_emit(purple_xfers_get_handle(), "file-recv-start", xfer); + break; + case PURPLE_XFER_STATUS_DONE: + purple_signal_emit(purple_xfers_get_handle(), "file-recv-complete", xfer); + break; + case PURPLE_XFER_STATUS_CANCEL_LOCAL: + case PURPLE_XFER_STATUS_CANCEL_REMOTE: + purple_signal_emit(purple_xfers_get_handle(), "file-recv-cancel", xfer); + break; + default: + break; + } + } +} + +gboolean +skype_can_receive_file(PurpleConnection *pc, const char *who) +{ + return TRUE; +} + +void +skype_xfer_cancel_send(PurpleXfer *xfer) +{ + purple_debug_info("skypekit", "xfer_cancel_send\n"); + Transfer *transfer = (Transfer *) xfer->data; + if (transfer != NULL) + { + transfer->Cancel(); + } +} + +void +skype_xfer_cancel_recv(PurpleXfer *xfer) +{ + purple_debug_info("skypekit", "xfer_cancel_recv\n"); + Transfer *transfer = (Transfer *) xfer->data; + if (transfer != NULL) + { + transfer->Cancel(); + } +} + +void +skype_xfer_init(PurpleXfer *xfer) +{ + purple_debug_info("skypekit", "xfer_init\n"); + Skype *skype = (Skype *)xfer->account->gc->proto_data; + SEFilenameList filenames; + Message::Ref msg; + TRANSFER_SENDFILE_ERROR error; + SEFilename error_filename; + SEString body; + + if (xfer == NULL) + return; + + purple_xfer_set_status(xfer, PURPLE_XFER_STATUS_NOT_STARTED); + + if (xfer->type == PURPLE_XFER_SEND) + { + ConversationRef conv = find_conversation(skype, xfer->who); + + filenames.append(xfer->local_filename); + body += xfer->message; + if (!conv->PostFiles(filenames, body, error, error_filename) || error) + { + purple_debug_error("skypekit", "Failed to post %s (from %s) because %d\n", (const char *)error_filename, (const char *)body, error); + purple_xfer_error(xfer->type, xfer->account, xfer->who, "Error sending file"); + purple_xfer_cancel_local(xfer); + return; + } else { + purple_debug_info("skypekit", "Send file %s\n", xfer->local_filename); + purple_xfer_set_cancel_send_fnc(xfer, skype_xfer_cancel_send); + } + } else if (xfer->type == PURPLE_XFER_RECEIVE) + { + purple_debug_info("skypekit", "incoming file\n"); + bool result; + //transfer->Accept("path", result); + //if (!result) { + //accept failed + //} + Transfer *transfer = (Transfer *) xfer->data; + if (transfer != NULL) + { + transfer->Accept(purple_xfer_get_local_filename(xfer), result); + if (!result) + { + purple_debug_error("skypekit", "accept failed\n"); + } else { + purple_xfer_set_cancel_recv_fnc(xfer, skype_xfer_cancel_recv); + } + } + } +} + +void +skype_xfer_start(PurpleXfer *xfer) +{ + purple_debug_info("skypekit", "xfer_start\n"); +} + +void +skype_xfer_end(PurpleXfer *xfer) +{ + purple_debug_info("skypekit", "xfer_end\n"); +} + +//called when the incoming file request is denied +void +skype_xfer_request_denied(PurpleXfer *xfer) +{ + purple_debug_info("skypekit", "xfer_request_denied\n"); + Transfer *transfer = (Transfer *) xfer->data; + if (transfer != NULL) + { + transfer->Cancel(); + } +} + +PurpleXfer * +skype_xfer_new(PurpleConnection *pc, const char *who) +{ + purple_debug_info("skypekit", "xfer_new\n"); + PurpleXfer *xfer = NULL; + + xfer = purple_xfer_new(pc->account, PURPLE_XFER_SEND, who); + + purple_xfer_set_init_fnc(xfer, skype_xfer_init); + //purple_xfer_set_start_fnc(xfer, skype_xfer_start); + //purple_xfer_set_end_fnc(xfer, skype_xfer_end); + purple_xfer_set_cancel_send_fnc(xfer, skype_xfer_cancel_send); + //purple_xfer_set_cancel_recv_fnc(xfer, skype_xfer_cancel_recv); + + return xfer; +} + +void +skype_send_file(PurpleConnection *pc, const char *who, const char *filename) +{ + purple_debug_info("skypekit", "send_file\n"); + PurpleXfer *xfer = skype_xfer_new(pc, who); + + if (filename) + { + purple_xfer_request_accepted(xfer, filename); + } else { + purple_xfer_request(xfer); + } +} + +void +skype_get_info(PurpleConnection *pc, const gchar *username) +{ + PurpleNotifyUserInfo *user_info; + Skype *skype = (Skype *) pc->proto_data; + MyContact::Ref contact = find_contact(skype, username); + + SEIntList Keys; + SEIntDict Values; + + Keys.append(Contact::P_SKYPENAME); + Keys.append(Contact::P_FULLNAME); + Keys.append(Contact::P_MOOD_TEXT); + Keys.append(Contact::P_BIRTHDAY); + Keys.append(Contact::P_GENDER); + Keys.append(Contact::P_LANGUAGES); + Keys.append(Contact::P_COUNTRY); + Keys.append(Contact::P_GIVEN_AUTHLEVEL); + Keys.append(Contact::P_TIMEZONE); + Keys.append(Contact::P_NROF_AUTHED_BUDDIES); + Keys.append(Contact::P_ABOUT); + Values = contact->GetProps(Keys); + + user_info = purple_notify_user_info_new(); + + purple_notify_user_info_add_section_header(user_info, _("Contact Info")); + purple_notify_user_info_add_pair(user_info, _("Skype Name"), Values.find(Contact::P_SKYPENAME)); + purple_notify_user_info_add_pair(user_info, _("Full Name"), Values.find(Contact::P_FULLNAME)); + purple_notify_user_info_add_pair(user_info, _("Mood Text"), Values.find(Contact::P_MOOD_TEXT)); + + purple_notify_user_info_add_section_break(user_info); + + purple_notify_user_info_add_section_header(user_info, _("Personal Information")); + struct tm birthday_time; + purple_str_to_time(Values.find(Contact::P_BIRTHDAY), TRUE, &birthday_time, NULL, NULL); + purple_notify_user_info_add_pair(user_info, _("Birthday"), purple_date_format_short(&birthday_time)); + purple_notify_user_info_add_pair(user_info, _("Gender"), Values.find(Contact::P_GENDER).toUInt() == 1 ? _("Male") : _("Female")); + purple_notify_user_info_add_pair(user_info, _("Preferred Language"), Values.find(Contact::P_LANGUAGES)); + purple_notify_user_info_add_pair(user_info, _("Country"), Values.find(Contact::P_COUNTRY)); + purple_notify_user_info_add_pair(user_info, _("Authorization Granted"), Values.find(Contact::P_GIVEN_AUTHLEVEL).toUInt() == Contact::AUTHORIZED_BY_ME ? _("Yes") : _("No")); + purple_notify_user_info_add_pair(user_info, _("Blocked"), Values.find(Contact::P_GIVEN_AUTHLEVEL).toUInt() == Contact::BLOCKED_BY_ME ? _("Yes") : _("No")); + + gchar *temp; + purple_notify_user_info_add_pair(user_info, _("Timezone"), temp = g_strdup_printf("UMT %+.1f", ((double)Values.find(Contact::P_TIMEZONE).toUInt()) / 3600 - 24)); + g_free(temp); + + purple_notify_user_info_add_pair(user_info, _("Number of buddies"), Values.find(Contact::P_NROF_AUTHED_BUDDIES)); + + purple_notify_user_info_add_section_break(user_info); + + purple_notify_user_info_add_pair(user_info, NULL, Values.find(Contact::P_ABOUT)); + + purple_notify_userinfo(pc, username, user_info, NULL, NULL); + purple_notify_user_info_destroy(user_info); +} + +void +skype_alias_buddy(PurpleConnection *pc, const char *who, const char *alias) +{ + Skype *skype = (Skype *)pc->proto_data; + SEString displayname = alias; + Contact::Ref contact = find_contact(skype, who); + + contact->GiveDisplayName(displayname); +} + +void +skype_set_buddy_icon(PurpleConnection *pc, PurpleStoredImage *img) +{ + Skype *skype = (Skype *)pc->proto_data; + MyAccount::Ref A; + SEString accountName = pc->account->username; + SEBinary avatarImg; + + avatarImg.set(purple_imgstore_get_data(img), purple_imgstore_get_size(img)); + + if (!skype->GetAccount(accountName, A)) + return; + + A->SetBinProperty(Account::P_AVATAR_IMAGE, avatarImg); +} + +static const char * +skype_contact_status_to_id(int availability) +{ + const char *status; + switch(availability) + { + case Contact::ONLINE: + case Contact::ONLINE_FROM_MOBILE: + status = "ONLINE"; + break; + case Contact::AWAY: + case Contact::AWAY_FROM_MOBILE: + status = "AWAY"; + break; + case Contact::NOT_AVAILABLE: + case Contact::NOT_AVAILABLE_FROM_MOBILE: + status = "NA"; + break; + case Contact::SKYPE_ME: + case Contact::SKYPE_ME_FROM_MOBILE: + status = "SKYPEME"; + break; + case Contact::DO_NOT_DISTURB: + case Contact::DO_NOT_DISTURB_FROM_MOBILE: + status = "DND"; + break; + case Contact::INVISIBLE: + status = "INVISIBLE"; + break; + case Contact::OFFLINE: + case Contact::OFFLINE_BUT_VM_ABLE: + case Contact::OFFLINE_BUT_CF_ABLE: + //case Contact::PENDINGAUTH: + //case Contact::BLOCKED: + default: + status = "OFFLINE"; + break; + } + + return status; +} + +typedef struct { + gpointer me; + int prop; + SEString value; +} SKOnChangeStructHelper; + +gboolean +MyAccountOnChangeTimeout(gpointer data) +{ + SKOnChangeStructHelper *helper = (SKOnChangeStructHelper *) data; + MyAccount *account = (MyAccount *) helper->me; + gint prop = (int)helper->prop; + account->OnChangeThreadSafe(prop, helper->value); + g_free(helper); + return FALSE; +} + +void MyAccount::OnChange(int prop) +{ + SKOnChangeStructHelper *helper = g_new0(SKOnChangeStructHelper, 1); + helper->me = (gpointer) this; + helper->prop = prop; + helper->value = this->GetProp(prop); + + SEStringList DebugStrings = this->getPropDebug(prop, helper->value); + purple_debug_info("skypekit", "Account %s %s\n", (const char *)DebugStrings[1], (const char *)DebugStrings[2]); + + purple_timeout_add(1, MyAccountOnChangeTimeout, helper); + return; +} +void MyAccount::OnChangeThreadSafe(int prop, const SEString& value) +{ + if (prop == Account::P_STATUS) + { + Account::STATUS status = (Account::STATUS) value.toUInt(); + size_t progress; + const gchar *status_text; + + switch(status) + { + case Account::LOGGED_OUT: + case Account::LOGGED_OUT_AND_PWD_SAVED: + case Account::LOGGING_OUT: + status_text = "Logged out"; + progress = 0; + break; + case Account::CONNECTING_TO_P2P: + status_text = "Connecting to P2P network"; + progress = 1; + break; + case Account::CONNECTING_TO_SERVER: + status_text = "Connecting to login server"; + progress = 2; + break; + case Account::LOGGING_IN: + status_text = "Waiting for response from server"; + progress = 3; + break; + case Account::INITIALIZING: + status_text = "Response OK, initialising structures"; + progress = 4; + break; + case Account::LOGGED_IN: + status_text = "Logged in"; + progress = 5; + break; + } + + purple_connection_update_progress(this->pc, status_text, progress, 6); + } + + if ((prop == Account::P_STATUS) && (value.toUInt() == Account::LOGGED_IN)) + { + purple_connection_set_state(this->pc, PURPLE_CONNECTED); + purple_debug_info("skypekit", "Login complete.\n"); + + //Download the buddy list + + ContactGroup::Ref SkypeBuddies; + Skype *skype = (Skype *)this->pc->proto_data; + skype->GetHardwiredContactGroup(ContactGroup::ALL_BUDDIES, SkypeBuddies); + + ContactRefs MyContactList; + SkypeBuddies->GetContacts(MyContactList); + + PurpleBuddy *buddy; + PurpleGroup *skype_group = purple_find_group("Skype"); + int ContactCount = MyContactList.size(); + for (int I = 0; I < ContactCount; I++) + { + SEString SkypeName; + MyContactList[I]->GetIdentity(SkypeName); + SEString Alias = MyContactList[I]->GetProp(Contact::P_DISPLAYNAME); + + buddy = purple_find_buddy(this->pa, SkypeName); + if (buddy == NULL) + { + buddy = purple_buddy_new(this->pa, SkypeName, Alias); + if (skype_group == NULL) + { + skype_group = purple_group_new("Skype"); + purple_blist_add_group(skype_group, NULL); + } + purple_blist_add_buddy(buddy, NULL, skype_group, NULL); + } + + SEString Availability = MyContactList[I]->GetProp(Contact::P_AVAILABILITY); + const char *status = skype_contact_status_to_id(Availability.toUInt()); + if (status != NULL) + purple_prpl_got_user_status(this->pa, (const char *)SkypeName, status, NULL); + }; + }; + + if ((prop == Account::P_STATUS) && (value.toUInt() == Account::LOGGED_OUT)) + { + purple_debug_info("skypekit", "Logout complete.\n"); + purple_connection_error(this->pc, _("\nSkype program closed")); + }; +}; + +PurpleXfer *find_skype_xfer(MyTransfer *transfer) +{ + PurpleXfer *xfer; + PurpleXferType purpletype; + SEIntList Keys; + SEIntDict Values; + GList *xfers; + + Keys.append(Transfer::P_TYPE); + Keys.append(Transfer::P_STATUS); + Keys.append(Transfer::P_FILENAME); + Keys.append(Transfer::P_FILEPATH); + Keys.append(Transfer::P_FILESIZE); + Keys.append(Transfer::P_PARTNER_HANDLE); + Values = transfer->GetProps(Keys); + + purpletype = (Values.find(Transfer::P_TYPE).toUInt() == Transfer::INCOMING ? PURPLE_XFER_RECEIVE : PURPLE_XFER_SEND); + + if (transfer->xfer != NULL) + return transfer->xfer; + + gulong transfer_filesize = atoul(Values.find(Transfer::P_FILESIZE)); + + xfers = purple_xfers_get_all(); + for(; xfers; xfers = g_list_next(xfers)) + { + xfer = (PurpleXfer *)xfers->data; + if (xfer->type == purpletype && + xfer->account == transfer->pa && + xfer->size == transfer_filesize && + (!xfer->local_filename || + g_str_equal(xfer->local_filename, Values.find(Transfer::P_FILEPATH))) && + xfer->who && g_str_equal(xfer->who, Values.find(Transfer::P_PARTNER_HANDLE))) + { + purple_debug_info("skypekit", "found the xfer we're looking for\n"); + //as best as we can tell, this is the xfer we're looking for + transfer->xfer = xfer; + xfer->data = transfer->me(); + + return xfer; + } + } + + //Didn't find the xfer, make a new one + xfer = purple_xfer_new(transfer->pa, purpletype, Values.find(Transfer::P_PARTNER_HANDLE)); + + if (xfer) + { + if (!Values.find(Transfer::P_FILENAME).isEmpty()) + purple_xfer_set_filename(xfer, Values.find(Transfer::P_FILENAME)); + if (!Values.find(Transfer::P_FILEPATH).isEmpty()) + purple_xfer_set_local_filename(xfer, Values.find(Transfer::P_FILEPATH)); + purple_debug_info("skypekit", "filesize %lu\n", transfer_filesize); + purple_xfer_set_size(xfer, transfer_filesize); + + purple_xfer_set_init_fnc(xfer, skype_xfer_init); + purple_xfer_set_cancel_recv_fnc(xfer, skype_xfer_cancel_recv); + purple_xfer_set_cancel_send_fnc(xfer, skype_xfer_cancel_send); + + xfer->data = transfer->me(); + transfer->xfer = xfer; + + purple_xfer_add(xfer); + purple_debug_info("skypekit", "had to add a new xfer\n"); + } + + return xfer; +} + +//called when the user accepts an incomming call from the ui +static gboolean +skype_call_accept(Conversation *conversation) +{ + conversation->JoinLiveSession(); + return FALSE; +} + +//called when the user ends an incomming call from the ui +static gboolean +skype_call_end(Conversation *conversation) +{ + conversation->LeaveLiveSession(); + return FALSE; +} + +static void +skype_media_state_changed(PurpleMedia *media, PurpleMediaState state, gchar *session_id, gchar *participant, MyConversation *conversation) +{ + if (state == PURPLE_MEDIA_STATE_END) + { + conversation->media = NULL; + } +} + +static void +skype_stream_info_changed(PurpleMedia *media, PurpleMediaInfoType type, gchar *session_id, gchar *participant, gboolean local, + Conversation *conversation) +{ + if (type == PURPLE_MEDIA_INFO_ACCEPT) { + skype_call_accept(conversation); + } else if (type == PURPLE_MEDIA_INFO_HANGUP || type == PURPLE_MEDIA_INFO_REJECT) { + skype_call_end(conversation); + } +} + +void +skype_handle_incoming_call(PurpleConnection *pc, MyConversation::Ref &conversation, const char *who, const char *display_name) +{ + PurpleAccount *account; + account = purple_connection_get_account(pc); + if (purple_media_manager_get()) + { + PurpleMedia *media; + media = purple_media_manager_create_media(purple_media_manager_get(), account, "fsrtpconference", who, FALSE); + if (media != NULL) + { + purple_media_set_prpl_data(media, conversation->me()); + conversation->media = media; + + purple_media_add_stream(media, "skype-audio1", who, PURPLE_MEDIA_AUDIO, FALSE, "nice", 0, NULL); + purple_media_add_stream(media, "skype-audio2", who, PURPLE_MEDIA_AUDIO, FALSE, "rawudp", 0, NULL); + //g_signal_emit(media, purple_media_signals[STATE_CHANGED], 0, PURPLE_MEDIA_STATE_NEW, "skype-audio", who); + //g_signal_emit_by_name(media, "state-changed", 0, PURPLE_MEDIA_STATE_NEW, "skype-audio", who); + + g_signal_connect_swapped(G_OBJECT(media), "accepted", G_CALLBACK(skype_call_accept), conversation->me()); + g_signal_connect(G_OBJECT(media), "state-changed", G_CALLBACK(skype_media_state_changed), conversation->me()); + g_signal_connect(G_OBJECT(media), "stream-info", G_CALLBACK(skype_stream_info_changed), conversation->me()); + } else { + purple_debug_info("skype_media", "purple_mmcm returned NULL\n"); + } + } else //if (!purple_media_manager_get()) + { + gchar *temp = g_strdup_printf(_("%s (%s) is calling you."), display_name, who); + purple_request_action(conversation->me(), _("Incoming Call"), temp, + _("Do you want to accept their call?"), + 0, account, who, NULL, conversation->me(), 2, + _("_Accept"), G_CALLBACK(skype_call_accept), + _("_Reject"), G_CALLBACK(skype_call_end)); + g_free(temp); + + } +} + +void +skype_handle_call_got_ended(PurpleConnection *pc, MyConversation::Ref &conversation) +{ + if (purple_media_manager_get()) + { + if (conversation->media) + purple_media_manager_remove_media(purple_media_manager_get(), conversation->media); + } else //if (!purple_media_manager_get()) + { + purple_request_close_with_handle(conversation->me()); + } +} + +gboolean +skype_initiate_media(PurpleAccount *account, const char *who, PurpleMediaSessionType type) +{ + PurpleMedia *media; + PurpleConnection *pc = purple_account_get_connection(account); + Skype *skype = (Skype *)pc->proto_data; + + //Use skype's own audio/video stuff for now + media = purple_media_manager_create_media(purple_media_manager_get(), account, "fsrtpconference", who, TRUE); + MyConversation::Ref conv = find_conversation(skype, who); + + if (media != NULL) + { + conv->JoinLiveSession(); + purple_media_set_prpl_data(media, conv->me()); + conv->media = media; + + g_signal_connect_swapped(G_OBJECT(media), "accepted", G_CALLBACK(skype_call_accept), conv->me()); + g_signal_connect(G_OBJECT(media), "state-changed", G_CALLBACK(skype_media_state_changed), conv->me()); + g_signal_connect(G_OBJECT(media), "stream-info", G_CALLBACK(skype_stream_info_changed), conv->me()); + } else { + purple_debug_info("skype_media", "media is NULL\n"); + } + return TRUE; +} + +PurpleMediaCaps +skype_get_media_caps(PurpleAccount *account, const char *who) +{ + PurpleMediaCaps caps = PURPLE_MEDIA_CAPS_NONE; + Contact::Ref contact; + PurpleConnection *pc = purple_account_get_connection(account); + Skype *skype = (Skype *)pc->proto_data; + bool hasNoAudioCap, hasVideoCap; + + contact = find_contact(skype, who); + contact->HasCapability(Contact::CAPABILITY_VOICE_EVER, hasNoAudioCap); + if (!hasNoAudioCap) + caps = PURPLE_MEDIA_CAPS_AUDIO; + + //TODO: Make video work + //contact->HasCapability(Contact::CAPABILITY_VIDEO, hasVideoCap); + //if (hasVideoCap) + // caps |= PURPLE_MEDIA_CAPS_AUDIO_VIDEO; + + return caps; +} + +typedef struct { + gpointer me; + ConversationRef conversation; + Conversation::LIST_TYPE type; + bool added; +} SKOnConversationListChangeStructHelper; + +gboolean +MySkypeOnConversationListChangeTimeout(gpointer data) +{ + SKOnConversationListChangeStructHelper *helper = (SKOnConversationListChangeStructHelper *)data; + if (helper) + { + MySkype *skype = (MySkype *) helper->me; + if (skype) + skype->OnConversationListChangeThreadSafe(helper->conversation, helper->type, helper->added); + } + g_free(helper); + return FALSE; +} + +void MySkype::OnConversationListChange( + const ConversationRef &conversation, + const Conversation::LIST_TYPE &type, + const bool &added) +{ + SKOnConversationListChangeStructHelper *helper = g_new0(SKOnConversationListChangeStructHelper, 1); + helper->me = (gpointer) this; + helper->conversation = conversation; + helper->type = type; + helper->added = added; + purple_timeout_add(1, MySkypeOnConversationListChangeTimeout, helper); +} + +void MySkype::OnConversationListChangeThreadSafe( + const ConversationRef &conv, + const Conversation::LIST_TYPE &type, + const bool &added) +{ + MyConversation::Ref conversation = conv; + if (type == Conversation::LIVE_CONVERSATIONS) + { + uint LiveStatus; + SEIntList Keys; + SEIntDict Values; + + Keys.append(Conversation::P_DISPLAYNAME); + Keys.append(Conversation::P_LOCAL_LIVESTATUS); + Values = conversation->GetProps(Keys); + LiveStatus = Values.find(Conversation::P_LOCAL_LIVESTATUS).toUInt(); + + if (LiveStatus == Conversation::RINGING_FOR_ME) + { + ParticipantRefs CallerList; + conversation->GetParticipants(CallerList, Conversation::OTHER_CONSUMERS); + SEString PartList = ""; + for (unsigned I = 0; I < CallerList.size(); I++) + { + PartList = PartList + ", " + (const char*)CallerList[I]->GetProp(Participant::P_IDENTITY); + } + + skype_handle_incoming_call(this->pc, conversation, PartList, Values.find(Conversation::P_DISPLAYNAME)); + } else if (LiveStatus == Conversation::NONE) + { + skype_handle_call_got_ended(this->pc, conversation); + } + } +} + +typedef struct { + gpointer me; + Message::Ref message; + bool changesInboxTimestamp; + Message::Ref supersedesHistoryMessage; + Conversation::Ref conversation; +} SKOnMessageStructHelper; + +gboolean +MySkypeOnMessageTimeout(gpointer data) +{ + SKOnMessageStructHelper *helper = (SKOnMessageStructHelper *) data; + if (helper) + { + MySkype *skype = (MySkype *) helper->me; + if (skype) + skype->OnMessageThreadSafe(helper->message, helper->changesInboxTimestamp, helper->supersedesHistoryMessage, helper->conversation); + } + g_free(helper); + return FALSE; +} +void MySkype::OnMessage(const Message::Ref& message, const bool& changesInboxTimestamp, + const Message::Ref& supersedesHistoryMessage, + const Conversation::Ref& conversation) +{ + SKOnMessageStructHelper *helper = g_new0(SKOnMessageStructHelper, 1); + helper->me = (gpointer) this; + helper->message = message; + helper->changesInboxTimestamp = changesInboxTimestamp; + helper->supersedesHistoryMessage = supersedesHistoryMessage; + helper->conversation = conversation; + purple_timeout_add(1, MySkypeOnMessageTimeout, helper); + return; +} +void MySkype::OnMessageThreadSafe(const Message::Ref& message, const bool& changesInboxTimestamp, + const Message::Ref& supersedesHistoryMessage, + const Conversation::Ref& conversation) +{ + SEIntList Keys; + SEIntDict Values; + int MessageType = message->GetProp(Message::P_TYPE).toUInt(); + int ConvType = conversation->GetProp(Conversation::P_TYPE).toUInt(); + + SEStringList DebugStrings = message->getPropDebug(Message::P_TYPE, MessageType); + purple_debug_info("skypekit", "MessageMsg %s %s\n", (const char *)DebugStrings[1], (const char *)DebugStrings[2]); + DebugStrings = conversation->getPropDebug(Conversation::P_TYPE, ConvType); + purple_debug_info("skypekit", "MessageConv %s %s\n", (const char *)DebugStrings[1], (const char *)DebugStrings[2]); + + if (MessageType == Message::POSTED_EMOTE || MessageType == Message::POSTED_TEXT) + { + Keys.append(Message::P_AUTHOR); + Keys.append(Message::P_BODY_XML); + Keys.append(Message::P_TIMESTAMP); + Keys.append(Message::P_ORIGINALLY_MEANT_FOR); + Values = message->GetProps(Keys); + gchar *message_body; + + if (MessageType == Message::POSTED_EMOTE) + { + const gchar *tempmsg = Values.find(Message::P_BODY_XML); + message_body = g_strconcat("/me ", tempmsg, NULL); + } else { + message_body = g_strdup(Values.find(Message::P_BODY_XML)); + } + + purple_debug_info("skypekit", "Message %s : %s : %s\n", (const char*)Values[0], (const char*)Values[1], (const char*)Values[2]); + + if (ConvType == Conversation::DIALOG) + { + if (!Values.find(Message::P_AUTHOR).equals(this->pa->username)) + { + serv_got_im(this->pc, Values.find(Message::P_AUTHOR), message_body, + PURPLE_MESSAGE_RECV, Values.find(Message::P_TIMESTAMP).toUInt()); + } else { + //Check that we haven't sent the message from here + //serv_got_im(this->pc, Values.find(Message::P_ORIGINALLY_MEANT_FOR), message_body, + // PURPLE_MESSAGE_SEND, Values.find(Message::P_TIMESTAMP).toUInt()); + } + } else if (ConvType == Conversation::CONFERENCE) + { + int ConvId = conversation->getOID(); + serv_got_chat_in(this->pc, ConvId, Values.find(Message::P_AUTHOR), PURPLE_MESSAGE_RECV, + message_body, Values.find(Message::P_TIMESTAMP).toUInt()); + + } + g_free(message_body); + } else if (MessageType == Message::POSTED_FILES) { + // someone sending a file + MyTransfer::Refs transfers; + if (message->GetTransfers(transfers)) { + for(guint i = 0; i < transfers.size(); i++) { + MyTransfer::Ref transfer = transfers[i]; + Keys.append(Transfer::P_TYPE); + Keys.append(Transfer::P_STATUS); + Keys.append(Transfer::P_FILENAME); + Keys.append(Transfer::P_FILESIZE); + Keys.append(Transfer::P_PARTNER_HANDLE); + Values = transfer->GetProps(Keys); + if (Values.find(Transfer::P_STATUS).toUInt() < Transfer::TRANSFERRING) + { + if (Values.find(Transfer::P_TYPE).toUInt() == Transfer::INCOMING) { + purple_debug_info("skypekit", "New incoming file\n"); + PurpleXfer *xfer = purple_xfer_new(this->pa, PURPLE_XFER_RECEIVE, Values.find(Transfer::P_PARTNER_HANDLE)); + if (xfer) + { + gulong filesize = atoul(Values.find(Transfer::P_FILESIZE)); + purple_xfer_set_init_fnc(xfer, skype_xfer_init); + purple_xfer_set_request_denied_fnc(xfer, skype_xfer_request_denied); + purple_xfer_set_filename(xfer, Values.find(Transfer::P_FILENAME)); + purple_debug_info("skypekit", "filesize %lu\n", filesize); + purple_xfer_set_size(xfer, filesize); + + xfer->data = transfer->me(); + transfer->xfer = xfer; + + purple_xfer_request(xfer); + } + } else if (Values.find(Transfer::P_TYPE).toUInt() == Transfer::OUTGOING) { + if (!transfer->xfer) + { + purple_debug_info("skypekit", "no PurpleXfer for this transfer\n"); + //find the current transfer, or create one if we cant find it + transfer->xfer = find_skype_xfer(transfer->me()); + } + } + } + } + } + } else if (MessageType == Message::SPAWNED_CONFERENCE) { + //Turned this im into a chat + // see MyConversation::OnSpawnConference() + } else if (MessageType == Message::ADDED_CONSUMERS) { + //People added to this chat + int ConvId = conversation->getOID(); + PurpleConversation *conv = purple_find_chat(this->pc, ConvId); + Keys.append(Message::P_IDENTITIES); + Values = message->GetProps(Keys); + purple_debug_info("skypekit", "added users %s to chat %d\n", (const char *)Values.find(Message::P_IDENTITIES), ConvId); + purple_conv_chat_add_user(PURPLE_CONV_CHAT(conv), Values.find(Message::P_IDENTITIES), NULL, PURPLE_CBFLAGS_NONE, TRUE); + } else if (MessageType == Message::RETIRED_OTHERS) { + // Other user was kicked + int ConvId = conversation->getOID(); + PurpleConversation *conv = purple_find_chat(this->pc, ConvId); + Keys.append(Message::P_IDENTITIES); + Keys.append(Message::P_LEAVEREASON); + Keys.append(Message::P_REASON); + Values = message->GetProps(Keys); + purple_debug_info("skypekit", "removed users %s from chat %d\n", (const char *)Values.find(Message::P_IDENTITIES), ConvId); + purple_conv_chat_remove_user(PURPLE_CONV_CHAT(conv), Values.find(Message::P_IDENTITIES), Values.find(Message::P_REASON)); + } else if (MessageType == Message::RETIRED) { + // User left conversation + int ConvId = conversation->getOID(); + serv_got_chat_left(this->pc, ConvId); + } + + //Mark all messages as read/consumed + conversation->SetConsumedHorizon(time(NULL)); +} + +gboolean +MyConversationOnSpawnConferenceTimeout(gpointer data) +{ + MyConversation *conv = (MyConversation *) data; + conv->OnSpawnConferenceThreadSafe(conv->ref()); + return FALSE; +} +void MyConversation::OnSpawnConference(const ConversationRef& spawned) +{ + MyConversation::Ref conv = spawned; + purple_timeout_add(1, MyConversationOnSpawnConferenceTimeout, conv->me()); +} +//ignore the 'this' keyword here, TODO fix the timeout call +void MyConversation::OnSpawnConferenceThreadSafe(const ConversationRef& spawned) +{ + SEIntList Keys; + SEIntDict Values; + MyConversation::Ref conversation = spawned; + int ConvId = conversation->getOID(); + + Keys.append(Conversation::P_IDENTITY); + Keys.append(Conversation::P_DISPLAYNAME); + Values = conversation->GetProps(Keys); + + purple_debug_info("skypekit", "joined chat %s %d\n", (const char *)Values.find(Conversation::P_IDENTITY), ConvId); + PurpleConversation *conv = serv_got_joined_chat(this->pc, ConvId, Values.find(Conversation::P_IDENTITY)); + purple_conv_chat_set_topic(PURPLE_CONV_CHAT(conv), NULL, Values.find(Conversation::P_DISPLAYNAME)); + + ParticipantRefs participants; + conversation->GetParticipants(participants); + ParticipantRef participant; + while((participant = participants.peek())) + { + SEString who; + participant->GetPropIdentity(who); + purple_debug_info("skypekit", "adding user %s to chat %d\n", (const char *) who, ConvId); + purple_conv_chat_add_user(PURPLE_CONV_CHAT(conv), who, NULL, PURPLE_CBFLAGS_NONE, FALSE); + } +} + +gboolean +MyConversationOnChangeTimeout(gpointer data) +{ + SKOnChangeStructHelper *helper = (SKOnChangeStructHelper *) data; + MyConversation *conversation = (MyConversation *) helper->me; + int prop = (int) helper->prop; + conversation->OnChangeThreadSafe(prop, helper->value); + g_free(helper); + return FALSE; +} +void MyConversation::OnChange(int prop) +{ + SKOnChangeStructHelper *helper = g_new0(SKOnChangeStructHelper, 1); + helper->me = (gpointer) this; + helper->prop = prop; + helper->value = this->GetProp(prop); + + SEStringList DebugStrings = this->getPropDebug(prop, helper->value); + purple_debug_info("skypekit", "Conversation %s %s\n", (const char *)DebugStrings[1], (const char *)DebugStrings[2]); + + purple_timeout_add(1, MyConversationOnChangeTimeout, helper); + return; +} +void MyConversation::OnChangeThreadSafe(int prop, const SEString &value) +{ +} + +gboolean +MyMessageOnChangeTimeout(gpointer data) +{ + SKOnChangeStructHelper *helper = (SKOnChangeStructHelper *) data; + MyMessage *message = (MyMessage *) helper->me; + int prop = (int) helper->prop; + message->OnChangeThreadSafe(prop, helper->value); + g_free(helper); + return FALSE; +} +void MyMessage::OnChange(int prop) +{ + SKOnChangeStructHelper *helper = g_new0(SKOnChangeStructHelper, 1); + helper->me = (gpointer) this; + helper->prop = prop; + helper->value = this->GetProp(prop); + + SEStringList DebugStrings = this->getPropDebug(prop, helper->value); + purple_debug_info("skypekit", "Message %s %s\n", (const char *)DebugStrings[1], (const char *)DebugStrings[2]); + + purple_timeout_add(1, MyMessageOnChangeTimeout, helper); + return; +} +void MyMessage::OnChangeThreadSafe(int prop, const SEString &value) +{ + SEIntList Keys; + SEIntDict Values; + Keys.append(Message::P_ORIGINALLY_MEANT_FOR); + Keys.append(Message::P_BODY_XML); + Keys.append(Message::P_CONVO_ID); + int MsgId = this->getOID(); + + if (prop == Message::P_SENDING_STATUS) + { + Values = this->GetProps(Keys); + + const gchar *tempmsg = Values.find(Message::P_BODY_XML); + const gchar *otherperson = Values.find(Message::P_ORIGINALLY_MEANT_FOR); + gchar *message_number = g_strdup_printf("%du", MsgId); + + if (value.toUInt() == Message::SENT) + { + purple_signal_emit(purple_conversations_get_handle(), "received-im-ack", + this->pa, otherperson, message_number); + } else if (value.toUInt() == Message::SENDING) + { + purple_signal_emit(purple_conversations_get_handle(), "waiting-im-ack", + this->pa, otherperson, tempmsg, message_number); + } + + g_free(message_number); + } +} + +gboolean +MyParticipantOnChangeTimeout(gpointer data) +{ + SKOnChangeStructHelper *helper = (SKOnChangeStructHelper *) data; + MyParticipant *participant = (MyParticipant *) helper->me; + int prop = (int) helper->prop; + participant->OnChangeThreadSafe(prop, helper->value); + g_free(helper); + return FALSE; +} +void MyParticipant::OnChange(int prop) +{ + SKOnChangeStructHelper *helper = g_new0(SKOnChangeStructHelper, 1); + helper->me = (gpointer) this; + helper->prop = prop; + helper->value = this->GetProp(prop); + + SEStringList DebugStrings = this->getPropDebug(prop, helper->value); + purple_debug_info("skypekit", "Participant %s %s\n", (const char *)DebugStrings[1], (const char *)DebugStrings[2]); + + purple_timeout_add(1, MyParticipantOnChangeTimeout, helper); + return; +} +void MyParticipant::OnChangeThreadSafe(int prop, const SEString &value) +{ + if (prop == Participant::P_TEXT_STATUS) + { + // typing notifications + int TextStatus = value.toUInt(); + PurpleTypingState typingState; + switch(TextStatus) + { + default: + case Participant::TEXT_NA: + typingState = PURPLE_NOT_TYPING; + break; + case Participant::READING: + typingState = PURPLE_TYPED; + break; + case Participant::WRITING: + case Participant::WRITING_AS_ANGRY: + case Participant::WRITING_AS_CAT: + typingState = PURPLE_TYPING; + break; + } + + SEString Name = this->GetProp(Participant::P_IDENTITY); + purple_debug_info("skypekit", "Got typing notification from %s\n", (const char *) Name); + serv_got_typing(this->pc, (const char *)Name, 10, typingState); + } +} + +gboolean +MyTransferOnChangeTimeout(gpointer data) +{ + SKOnChangeStructHelper *helper = (SKOnChangeStructHelper *) data; + MyTransfer *transfer = (MyTransfer *) helper->me; + int prop = (int) helper->prop; + transfer->OnChangeThreadSafe(prop, helper->value); + g_free(helper); + return FALSE; +} +void MyTransfer::OnChange(int prop) +{ + SKOnChangeStructHelper *helper = g_new0(SKOnChangeStructHelper, 1); + helper->me = (gpointer) this; + helper->prop = prop; + helper->value = this->GetProp(prop); + + SEStringList DebugStrings = this->getPropDebug(prop, helper->value); + purple_debug_info("skypekit", "Transfer %s %s\n", (const char *)DebugStrings[1], (const char *)DebugStrings[2]); + + purple_timeout_add(1, MyTransferOnChangeTimeout, helper); + return; +} +void MyTransfer::OnChangeThreadSafe(int prop, const SEString &value) +{ + if (this->xfer == NULL) + { + this->xfer = find_skype_xfer(this); + } + + if (this->xfer != NULL) + { + if(prop == Transfer::P_STATUS) + { + switch(value.toUInt()) + { + case Transfer::NEW: + case Transfer::WAITING_FOR_ACCEPT: + purple_xfer_set_status(this->xfer, PURPLE_XFER_STATUS_NOT_STARTED); + break; + case Transfer::CONNECTING: + purple_xfer_set_status(this->xfer, PURPLE_XFER_STATUS_ACCEPTED); + break; + case Transfer::TRANSFERRING: + case Transfer::TRANSFERRING_OVER_RELAY: + purple_xfer_set_status(this->xfer, PURPLE_XFER_STATUS_STARTED); + break; + case Transfer::COMPLETED: + purple_xfer_set_completed(this->xfer, TRUE); + break; + case Transfer::CANCELLED_BY_REMOTE: + purple_xfer_cancel_remote(this->xfer); + break; + case Transfer::CANCELLED: + purple_xfer_cancel_local(this->xfer); + break; + case Transfer::FAILED: + purple_xfer_error(this->xfer->type, this->pa, this->xfer->who, "Transfer failed"); + break; + case Transfer::PAUSED: + case Transfer::REMOTELY_PAUSED: + case Transfer::PLACEHOLDER: + case Transfer::OFFER_FROM_OTHER_INSTANCE: + default: + break; + } + purple_xfer_update_progress(this->xfer); + } else if (prop == Transfer::P_BYTESTRANSFERRED) + { + if (purple_xfer_get_status(this->xfer) < PURPLE_XFER_STATUS_STARTED) + purple_xfer_set_status(this->xfer, PURPLE_XFER_STATUS_STARTED); + purple_xfer_set_bytes_sent(this->xfer, atol(value)); + purple_xfer_update_progress(this->xfer); + } + } +} + +void +skypekit_auth_allow(gpointer userdata) +{ + ContactRef contact = * (ContactRef *)userdata; + contact->SetBuddyStatus(true); +} +void +skypekit_auth_deny(gpointer userdata) +{ + ContactRef contact = * (ContactRef *)userdata; + contact->SetBlocked(true); +} + +static void +skype_call_user_from_blist(PurpleBlistNode *node, Conversation *conv) +{ + if(PURPLE_BLIST_NODE_IS_BUDDY(node)) + { + conv->JoinLiveSession(); + } +} +static void +skype_hangup_from_blist(PurpleBlistNode *node, Conversation *conv) +{ + if(PURPLE_BLIST_NODE_IS_BUDDY(node)) + { + conv->LeaveLiveSession(); + } +} + +static void +skype_request_auth_from_blist(PurpleBlistNode *node, gpointer data) +{ + PurpleBuddy *buddy; + + if (!PURPLE_BLIST_NODE_IS_BUDDY(node)) + return; + + buddy = (PurpleBuddy *)node; + + PurpleConnection *pc = purple_account_get_connection(buddy->account); + Skype *skype = (Skype *)pc->proto_data; + Contact::Ref contact = find_contact(skype, buddy->name); + + contact->SendAuthRequest(""); +} + +static GList * +skype_node_menu(PurpleBlistNode *node) +{ + GList *m = NULL; + PurpleMenuAction *act; + + if(PURPLE_BLIST_NODE_IS_BUDDY(node)) + { + PurpleBuddy *buddy = (PurpleBuddy *)node; + PurpleConnection *pc = purple_account_get_connection(buddy->account); + Skype *skype = (Skype *)pc->proto_data; + + if (!purple_media_manager_get()) + { + MyConversation::Ref conv = find_conversation(skype, buddy->name); + Conversation::LOCAL_LIVESTATUS liveStatus; + conv->GetPropLocalLivestatus(liveStatus); + + if (liveStatus == Conversation::NONE || + liveStatus == Conversation::OTHERS_ARE_LIVE || + liveStatus == Conversation::RECENTLY_LIVE) + { + act = purple_menu_action_new(_("Call..."), + PURPLE_CALLBACK(skype_call_user_from_blist), + conv->me(), NULL); + m = g_list_append(m, act); + } else if (liveStatus != Conversation::OTHERS_ARE_LIVE_FULL) + { + act = purple_menu_action_new(_("End Call..."), + PURPLE_CALLBACK(skype_hangup_from_blist), + conv->me(), NULL); + m = g_list_append(m, act); + + } + } + + if (!PURPLE_BUDDY_IS_ONLINE(buddy)) + { + Contact::Ref contact = find_contact(skype, buddy->name); + Contact::AVAILABILITY avail; + contact->GetPropAvailability(avail); + + if (avail == Contact::PENDINGAUTH) + { + act = purple_menu_action_new(_("Re-request authorization"), + PURPLE_CALLBACK(skype_request_auth_from_blist), + NULL, NULL); + m = g_list_append(m, act); + } + } + } + + return m; +} + + +typedef struct { + gpointer me; + ContactRef contact; +} SKOnContactGroupChangeStructHelper; +gboolean +MyContactGroupOnChangeTimeout(gpointer data) +{ + SKOnContactGroupChangeStructHelper *helper = (SKOnContactGroupChangeStructHelper *) data; + MyContactGroup *contactgroup = (MyContactGroup *) helper->me; + contactgroup->OnChangeThreadSafe(helper->contact); + g_free(helper); + return FALSE; +} +void MyContactGroup::OnChange(const ContactRef& contact) +{ + SKOnContactGroupChangeStructHelper *helper = g_new0(SKOnContactGroupChangeStructHelper, 1); + helper->me = (gpointer) this; + helper->contact = contact; + purple_timeout_add(1, MyContactGroupOnChangeTimeout, helper); + return; +} +void MyContactGroup::OnChangeThreadSafe(const ContactRef& contact) +{ + purple_debug_info("skypekit", "ContactGroup::OnChange\n"); + + TYPE type; + this->GetPropType(type); + if (type == ContactGroup::CONTACTS_WAITING_MY_AUTHORIZATION) + { + SEString ContactSkypeName; + SEString ContactDisplayName; + SEString AuthRequestText; + contact->GetPropSkypename(ContactSkypeName); + contact->GetPropReceivedAuthrequest(AuthRequestText); + contact->GetPropDisplayname(ContactDisplayName); + + purple_account_request_authorization(this->pa, ContactSkypeName, NULL, ContactDisplayName, + AuthRequestText, FALSE, skypekit_auth_allow, skypekit_auth_deny, + &(contact->ref())); + + //contact->IgnoreAuthRequest(); + } +} + +gboolean +MyContactOnChangeTimeout(gpointer data) +{ + SKOnChangeStructHelper *helper = (SKOnChangeStructHelper *) data; + MyContact *contact = (MyContact *) helper->me; + int prop = (int) helper->prop; + contact->OnChangeThreadSafe(prop, helper->value); + g_free(helper); + return FALSE; +} +void MyContact::OnChange(int prop) +{ + SKOnChangeStructHelper *helper = g_new0(SKOnChangeStructHelper, 1); + helper->me = (gpointer) this; + helper->prop = prop; + helper->value = this->GetProp(prop); + + SEStringList DebugStrings = this->getPropDebug(prop, helper->value); + purple_debug_info("skypekit", "Contact %s %s\n", (const char *)DebugStrings[1], (const char *)DebugStrings[2]); + + purple_timeout_add(1, MyContactOnChangeTimeout, helper); + return; +} + +void +skype_auth_allow(gpointer pointer) +{ + Contact *contact = (Contact *)pointer; + //contact->GiveAuthlevel(Contact::AUTHORIZED_BY_ME); + contact->SetBuddyStatus(true); +} + +void +skype_auth_deny(gpointer pointer) +{ + Contact *contact = (Contact *)pointer; + //contact->GiveAuthlevel(Contact::BLOCKED_BY_ME); + contact->SetBlocked(true); +} + +void MyContact::OnChangeThreadSafe(int prop, const SEString &value) +{ + SEString Name; + if (prop == Contact::P_AVAILABILITY) + { + this->GetIdentity(Name); +// SEStringList DebugStrings = this->getPropDebug(prop, value); +// purple_debug_info("skypekit", "User %s is %s\n", (const char *)Name, (const char *)DebugStrings[2]); + const char *status; + + status = skype_contact_status_to_id(value.toUInt()); + if (status != NULL) + purple_prpl_got_user_status(this->pa, (const char *)Name, status, NULL); + } else if (prop == Contact::P_AVATAR_IMAGE) + { + bool hasAvatar = false; + Sid::Binary avatarData; + this->GetIdentity(Name); + this->GetAvatar(hasAvatar, avatarData); + if (hasAvatar) + { + purple_buddy_icons_set_for_user(this->pa, (const char *)Name, (char *)avatarData, avatarData.size(), NULL); + } else { + purple_buddy_icons_set_for_user(this->pa, (const char *)Name, NULL, 0, NULL); + } + } else if (prop == Contact::P_MOOD_TEXT) + { + //moodString = new SEString(value); + } else if (prop == Contact::P_RECEIVED_AUTHREQUEST) + { + SEString DisplayName; + this->GetPropDisplayname(DisplayName); + this->GetIdentity(Name); + + if (purple_account_get_bool(this->pa, "reject_all_auths", FALSE)) + { + skype_auth_deny(this->me()); + } else { + purple_account_request_authorization(this->pa, (const char *)Name, NULL, (const char *)DisplayName, + value, (purple_find_buddy(this->pa, (const char *)Name) != NULL), + skype_auth_allow, skype_auth_deny, this->me()); + } + } +}; + diff -Nru pidgin-skype-20110407+svn612+dfsg/libskypekit/libskypekit.h pidgin-skype-20130613+svn660+dfsg/libskypekit/libskypekit.h --- pidgin-skype-20110407+svn612+dfsg/libskypekit/libskypekit.h 1970-01-01 00:00:00.000000000 +0000 +++ pidgin-skype-20130613+svn660+dfsg/libskypekit/libskypekit.h 2011-12-09 00:37:06.000000000 +0000 @@ -0,0 +1,361 @@ + +#include "prpl.h" +#include "blist.h" +#include "account.h" +#include "accountopt.h" +#include "connection.h" +#include "server.h" + +#include "mediamanager.h" +#include "request.h" + +#include + +#define SKYPE_APP_TOKEN "AAAgBobH4q2OPAaCX6vWseC82MmHZ1Cpayj61rbYlh0uenHxFByJ/lLu9HSN5nT3TjS91/2RQMASlCmZUCM5zINkR3nQ1240JpB0yNfYfzxXm8EyE9p9gWAGU7spUMvuROxoQR0042VUR4dCRW/kYr3yeYiYOXW0poxxwg+esEbX8W1tqing25kfjUVsij6+T+dxtV8t/B1yGpTiT1okj9FoBvZgnwDoEGEywG5xeJTGLuFtHGALqa7gwvj9rulf7TuM1Q==" + +#define GETTEXT_PACKAGE "skype4pidgin" +#ifdef ENABLE_NLS +# ifdef _WIN32 +# include +# endif +# include +#else +# define _(a) a +#endif + +#include "debug.h" + +#include "skype-embedded_2.h" +#include "skype-tcp-transport.h" + + +#define atoul(x) strtoul(x, (char **)NULL, 10) + + +class MyAccount : public Account +{ +public: + typedef DRef Ref; + MyAccount(unsigned int oid, SERootObject* root); + ~MyAccount() {}; + PurpleAccount *pa; + PurpleConnection *pc; + + void OnChange(int prop); + void OnChangeThreadSafe(int prop, const SEString& value); +}; + +MyAccount::MyAccount(unsigned int oid, SERootObject* root) : Account(oid, root) {}; + + +class MyContact : public Contact +{ +public: + typedef DRef Ref; + MyContact(unsigned int oid, SERootObject* root); + ~MyContact() {}; + PurpleAccount *pa; + PurpleConnection *pc; + MyContact *me() {return this;} + SEString moodString; + + void OnChange(int prop); + void OnChangeThreadSafe(int prop, const SEString& value); +}; + +MyContact::MyContact(unsigned int oid, SERootObject* root) : Contact(oid, root) {}; + +class MyContactGroup : public ContactGroup +{ +public: + typedef DRef Ref; + MyContactGroup(unsigned int oid, SERootObject* root); + ~MyContactGroup() {}; + PurpleAccount *pa; + PurpleConnection *pc; + + void OnChange(const ContactRef& contact); + void OnChangeThreadSafe(const ContactRef& contact); +}; + +MyContactGroup::MyContactGroup(unsigned int oid, SERootObject* root) : ContactGroup(oid, root) {}; + +class MyParticipant : public Participant +{ +public: + typedef DRef Ref; + MyParticipant(unsigned int oid, SERootObject* root); + ~MyParticipant() {}; + PurpleAccount *pa; + PurpleConnection *pc; + + void OnChange(int prop); + void OnChangeThreadSafe(int prop, const SEString& value); +}; + +MyParticipant::MyParticipant(unsigned int oid, SERootObject* root) : Participant(oid, root) {}; + +class MyTransfer : public Transfer +{ +public: + typedef DRef Ref; + MyTransfer(unsigned int oid, SERootObject* root); + ~MyTransfer() {}; + PurpleAccount *pa; + PurpleConnection *pc; + PurpleXfer *xfer; + + MyTransfer *me() {return this;} + + void OnChange(int prop); + void OnChangeThreadSafe(int prop, const SEString& value); +}; + +MyTransfer::MyTransfer(unsigned int oid, SERootObject* root) : Transfer(oid, root) {}; + +class MyConversation : public Conversation +{ +public: + typedef DRef Ref; + MyConversation(unsigned int oid, SERootObject* root); + ~MyConversation() {}; + PurpleAccount *pa; + PurpleConnection *pc; + PurpleMedia *media; + + MyConversation *me() {return this;} + + void OnChange(int prop); + void OnChangeThreadSafe(int prop, const SEString& value); + void OnSpawnConference(const ConversationRef& spawned); + void OnSpawnConferenceThreadSafe(const ConversationRef& spawned); +}; + +MyConversation::MyConversation(unsigned int oid, SERootObject* root) : Conversation(oid, root) {}; + +class MyMessage : public Message +{ +public: + typedef DRef Ref; + MyMessage(unsigned int oid, SERootObject* root); + ~MyMessage() {}; + PurpleAccount *pa; + PurpleConnection *pc; + + void OnChange(int prop); + void OnChangeThreadSafe(int prop, const SEString& value); +}; + +MyMessage::MyMessage(unsigned int oid, SERootObject* root) : Message(oid, root) {}; + +class MySkype : public Skype +{ +public: + MySkype(SETransport* transport) : Skype(transport) {} + ~MySkype() {} + PurpleConnection *pc; + PurpleAccount *pa; + + // Every time an account object is created, we will return instance of MyAccount + Account* newAccount(int oid) {MyAccount *acc = new MyAccount(oid, this); acc->pc=this->pc; acc->pa=this->pa; return acc;} + Contact* newContact(int oid) {MyContact *con = new MyContact(oid, this); con->pc=this->pc; con->pa=this->pa; return con;} + ContactGroup* newContactGroup(int oid) {MyContactGroup *grp = new MyContactGroup(oid, this); grp->pc=this->pc; grp->pa=this->pa; return grp;} + Participant* newParticipant(int oid) {MyParticipant *par = new MyParticipant(oid, this); par->pc=this->pc; par->pa=this->pa; return par;} + Transfer* newTransfer(int oid) {MyTransfer *tra = new MyTransfer(oid, this); tra->xfer=NULL; tra->pc=this->pc; tra->pa=this->pa; return tra;} + Conversation* newConversation(int oid) {MyConversation *con = new MyConversation(oid, this); con->pc=this->pc; con->pa=this->pa; return con;} + Message* newMessage(int oid) {MyMessage *msg = new MyMessage(oid, this); msg->pc=this->pc; msg->pa=this->pa; return msg;} + + virtual void OnMessage( + const Message::Ref& message, + const bool& changesInboxTimestamp, + const Message::Ref& supersedesHistoryMessage, + const Conversation::Ref& conversation); + virtual void OnMessageThreadSafe( + const Message::Ref& message, + const bool& changesInboxTimestamp, + const Message::Ref& supersedesHistoryMessage, + const Conversation::Ref& conversation); + + virtual void OnConversationListChange( + const ConversationRef &conversation, + const Conversation::LIST_TYPE &type, + const bool &added); + virtual void OnConversationListChangeThreadSafe( + const ConversationRef &conversation, + const Conversation::LIST_TYPE &type, + const bool &added); +}; + +extern "C" { + + const char *skype_list_icon(PurpleAccount *account, PurpleBuddy *buddy); + GList *skype_status_types(PurpleAccount *acct); + void skype_login(PurpleAccount *acct); + void skype_close(PurpleConnection *gc); + int skype_send_im(PurpleConnection *gc, const gchar *who, const gchar *message, PurpleMessageFlags flags); + void skype_set_status(PurpleAccount *account, PurpleStatus *status); + unsigned int skype_send_typing(PurpleConnection *gc, const char *name, PurpleTypingState state); + void skype_add_deny(PurpleConnection *gc, const char *who); + void skype_rem_deny(PurpleConnection *gc, const char *who); + char *skype_status_text(PurpleBuddy *buddy); + void skype_add_buddy(PurpleConnection *gc, PurpleBuddy *buddy, PurpleGroup *group); + void skype_remove_buddy(PurpleConnection *gc, PurpleBuddy *buddy, PurpleGroup *group); + void skype_add_permit(PurpleConnection *gc, const char *who); + void skype_rem_permit(PurpleConnection *gc, const char *who); + const char *skype_list_emblem(PurpleBuddy *buddy); + void skype_alias_buddy(PurpleConnection *gc, const char *who, const char *alias); + void skype_send_file(PurpleConnection *, const char *who, const char *filename); + gboolean skype_offline_msg(const PurpleBuddy *buddy); + gboolean skype_can_receive_file(PurpleConnection *pc, const char *who); + PurpleXfer *skype_xfer_new(PurpleConnection *pc, const char *who); + void skype_alias_buddy(PurpleConnection *pc, const char *who, const char *alias); + void skype_set_buddy_icon(PurpleConnection *pc, PurpleStoredImage *img); + gboolean skype_initiate_media(PurpleAccount *account, const char *who, PurpleMediaSessionType type); + PurpleMediaCaps skype_get_media_caps(PurpleAccount *account, const char *who); + static GList *skype_node_menu(PurpleBlistNode *node); + void skype_tooltip_text(PurpleBuddy *buddy, PurpleNotifyUserInfo *userinfo, gboolean full); + int skype_chat_send(PurpleConnection *gc, int id, const char *message, PurpleMessageFlags flags); + const char *skype_normalize(const PurpleAccount *acct, const char *who); + void skype_set_chat_topic(PurpleConnection *gc, int id, const char *topic); + void skype_get_info(PurpleConnection *gc, const gchar *username); + + PurplePluginProtocolInfo prpl_info = { + /* options */ + (PurpleProtocolOptions) (OPT_PROTO_CHAT_TOPIC | OPT_PROTO_USE_POINTSIZE), + NULL, /* user_splits */ + NULL, /* protocol_options */ + {"jpeg", 0, 0, 256, 256, 0, PURPLE_ICON_SCALE_SEND}, /* icon_spec */ + skype_list_icon, /* list_icon */ + skype_list_emblem, /* list_emblem */ + skype_status_text, /* status_text */ + skype_tooltip_text, /* tooltip_text */ + skype_status_types, /* status_types */ + skype_node_menu, /* blist_node_menu */ + NULL,/* chat_info */ + NULL,/* chat_info_defaults */ + skype_login, /* login */ + skype_close, /* close */ + skype_send_im, /* send_im */ + NULL, /* set_info */ + skype_send_typing, /* send_typing */ + skype_get_info, /* get_info */ + skype_set_status, /* set_status */ + NULL, /* set_idle */ + NULL, /* change_passwd */ + skype_add_buddy, /* add_buddy */ + NULL, /* add_buddies */ + skype_remove_buddy, /* remove_buddy */ + NULL, /* remove_buddies */ + skype_add_permit, /* add_permit */ + skype_add_deny, /* add_deny */ + skype_rem_permit, /* rem_permit */ + skype_rem_deny, /* rem_deny */ + NULL, /* set_permit_deny */ + NULL, /* join_chat */ + NULL, /* reject chat invite */ + NULL, /* get_chat_name */ + NULL, /* chat_invite */ + NULL, /* chat_leave */ + NULL, /* chat_whisper */ + skype_chat_send, /* chat_send */ + NULL, /* keepalive */ + NULL, /* register_user */ + NULL, /* get_cb_info */ + NULL, /* get_cb_away */ + skype_alias_buddy, /* alias_buddy */ + NULL, /* group_buddy */ + NULL, /* rename_group */ + NULL, /* buddy_free */ + NULL, /* convo_closed */ + skype_normalize, /* normalize */ + skype_set_buddy_icon,/* set_buddy_icon */ + NULL, /* remove_group */ + NULL, /* get_cb_real_name */ + skype_set_chat_topic,/* set_chat_topic */ + NULL, /* find_blist_chat */ + NULL, /* roomlist_get_list */ + NULL, /* roomlist_cancel */ + NULL, /* roomlist_expand_category */ + skype_can_receive_file, /* can_receive_file */ + skype_send_file, /* send_file */ + skype_xfer_new, /* new_xfer */ + skype_offline_msg, /* 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 == 1 + (gpointer) +#endif + sizeof(PurplePluginProtocolInfo), /* struct_size */ + NULL, /* get_account_text_table */ + skype_initiate_media,/* initiate_media */ + skype_get_media_caps /* can_do_media */ + }; + + gboolean + plugin_load(PurplePlugin *plugin) + { + return TRUE; + } + + gboolean + plugin_unload(PurplePlugin *plugin) + { + return TRUE; + } + + static PurplePluginInfo info = { + PURPLE_PLUGIN_MAGIC, + /* PURPLE_MAJOR_VERSION, + PURPLE_MINOR_VERSION, + */ + 2, 1, + PURPLE_PLUGIN_PROTOCOL, /* type */ + NULL, /* ui_requirement */ + 0, /* flags */ + NULL, /* dependencies */ + PURPLE_PRIORITY_DEFAULT, /* priority */ + "prpl-bigbrownchunx-skypekit", /* id */ + "SkypeKit", /* name */ + "0.1", /* version */ + "Allows using Skype IM functions from within Pidgin", /* summary */ + "Allows using Skype IM functions from within Pidgin", /* description */ + "Eion Robb ", /* author */ + "http://eion.robbmob.com/", /* homepage */ + plugin_load, /* load */ + plugin_unload, /* unload */ + NULL, /* destroy */ + NULL, /* ui_info */ + &prpl_info, /* extra_info */ + NULL, /* prefs_info */ + NULL, /* actions */ + NULL, /* padding */ + NULL, + NULL, + NULL + }; + + static void + plugin_init(PurplePlugin *plugin) + { + PurpleAccountOption *option; + + #if _WIN32 && ENABLE_NLS + bindtextdomain(GETTEXT_PACKAGE, LOCALEDIR); + bind_textdomain_codeset(GETTEXT_PACKAGE, "UTF-8"); + #endif + + //if (!g_thread_supported ()) + //g_thread_init (NULL); + + option = purple_account_option_string_new(_("Server"), "host", "127.0.0.1"); + prpl_info.protocol_options = g_list_append(prpl_info.protocol_options, option); + option = purple_account_option_int_new(_("Port"), "port", 8963); + prpl_info.protocol_options = g_list_append(prpl_info.protocol_options, option); + } + + PURPLE_INIT_PLUGIN(skypekit, plugin_init, info); +}; diff -Nru pidgin-skype-20110407+svn612+dfsg/skype_events.c pidgin-skype-20130613+svn660+dfsg/skype_events.c --- pidgin-skype-20110407+svn612+dfsg/skype_events.c 2011-04-10 16:10:16.000000000 +0000 +++ pidgin-skype-20130613+svn660+dfsg/skype_events.c 2013-04-14 06:44:59.000000000 +0000 @@ -20,6 +20,10 @@ * along with this program. If not, see . */ +#ifndef INCLUDED_LIBSKYPE_C +# error "Don't compile this file directly. Just compile libskype.c instead." +#endif + #include void skype_auth_allow(gpointer sender); @@ -497,6 +501,36 @@ purple_conv_chat_set_topic(PURPLE_CONV_CHAT(chat->conv), my_username, string_parts[3]); purple_conversation_update(chat->conv, PURPLE_CONV_UPDATE_TOPIC); } + } else if (chat->conv && g_str_equal(string_parts[2], "MEMBEROBJECTS")) + { + if (chat->type == PURPLE_CONV_TYPE_CHAT) + { + chatusers = g_strsplit(string_parts[3], ", ", 0); + for (i=0; chatusers[i]; i++) + { + temp = skype_send_message("GET CHATMEMBER %s IDENTITY", chatusers[i]); + sender = g_strdup(&temp[21 + strlen(chatusers[i])]); + g_free(temp); + temp = skype_send_message("GET CHATMEMBER %s ROLE", chatusers[i]); + type = g_strdup(&temp[17 + strlen(chatusers[i])]); + g_free(temp); + + if (g_str_equal(type, "USER")) { + purple_conv_chat_user_set_flags(PURPLE_CONV_CHAT(chat->conv), sender, PURPLE_CBFLAGS_VOICE); + } else if (g_str_equal(type, "HELPER")) { + purple_conv_chat_user_set_flags(PURPLE_CONV_CHAT(chat->conv), sender, PURPLE_CBFLAGS_HALFOP); + } else if (g_str_equal(type, "MASTER")) { + purple_conv_chat_user_set_flags(PURPLE_CONV_CHAT(chat->conv), sender, PURPLE_CBFLAGS_OP); + } else if (g_str_equal(type, "CREATOR")) { + purple_conv_chat_user_set_flags(PURPLE_CONV_CHAT(chat->conv), sender, PURPLE_CBFLAGS_FOUNDER); + } else { + purple_conv_chat_user_set_flags(PURPLE_CONV_CHAT(chat->conv), sender, PURPLE_CBFLAGS_NONE); + } + + g_free(sender); + g_free(type); + } + } } else if (chat->name && g_str_equal(string_parts[2], "MYSTATUS") && g_str_equal(string_parts[3], "PASSWORD_REQUIRED")) { purple_request_input(gc, _("Incorrect password"), _("Password"), chat->name, "", FALSE, @@ -760,8 +794,7 @@ } g_strfreev(chatusers); } -//#ifdef USE_VV -#if 1 +#ifndef INSTANTBIRD } else if (purple_media_manager_get() && g_str_equal(command, "CALL")) { if (g_str_equal(string_parts[2], "STATUS")) @@ -804,6 +837,9 @@ g_free(temp); conv = purple_find_conversation_with_account(PURPLE_CONV_TYPE_IM, sender, this_account); + if (conv != NULL) + purple_conversation_write(conv, sender, _("Call started"), PURPLE_MESSAGE_SYSTEM|PURPLE_MESSAGE_NOTIFY, time(NULL)); + if (chatname && *chatname) { temp = g_strdup_printf("%s (%s)", chatname, sender); @@ -816,7 +852,7 @@ purple_request_action(gc, _("Incoming Call"), temp, _("Do you want to accept their call?"), - 0, this_account, sender, conv, g_strdup(string_parts[1]), 3, + -1, this_account, sender, conv, g_strdup(string_parts[1]), 3, _("_Accept"), G_CALLBACK(skype_call_accept_cb), _("Accept with Video"), G_CALLBACK(skype_call_accept_video_cb), _("_Reject"), G_CALLBACK(skype_call_reject_cb), @@ -887,6 +923,19 @@ } } } + } else if (g_str_equal(command, "MESSAGES") || g_str_equal(command, "CHATMESSAGES")) + { + //MISSEDCHATMESSAGES response - workaround for Skype 6 and higher + gchar *messages_start = strchr(message, ' '); + if (messages_start != NULL) + { + gchar **messages = g_strsplit(messages_start + 1, ", ", 0); + for (i = 0; messages[i]; i++) + { + skype_send_message_nowait("GET CHATMESSAGE %s STATUS", messages[i]); + } + g_strfreev(messages); + } } if (string_parts) { @@ -909,7 +958,21 @@ skype_send_message_nowait("ALTER CALL %s ANSWER", call); skype_send_message_nowait("SET CALL %s SEEN", call); skype_send_message_nowait("CLEAR CALLHISTORY INCOMING"); + skype_send_message_nowait("SEARCH MISSEDCALLS"); + g_free(call); +} + +gboolean +skype_call_accept_start_video(gpointer callptr) +{ + gchar *call = callptr; + + skype_send_message_nowait("ALTER CALL %s START_VIDEO_SEND", call); + skype_send_message_nowait("ALTER CALL %s START_VIDEO_RECEIVE", call); + g_free(call); + + return FALSE; } void @@ -918,9 +981,9 @@ skype_send_message("ALTER CALL %s ANSWER", call); skype_send_message("SET CALL %s SEEN", call); skype_send_message("CLEAR CALLHISTORY INCOMING"); - skype_send_message_nowait("ALTER CALL %s START_VIDEO_SEND", call); - skype_send_message_nowait("ALTER CALL %s START_VIDEO_RECEIVE", call); - g_free(call); + skype_send_message_nowait("SEARCH MISSEDCALLS"); + + purple_timeout_add_seconds(3, skype_call_accept_start_video, call); } void @@ -930,6 +993,7 @@ skype_send_message_nowait("ALTER CALL %s HANGUP", call); skype_send_message_nowait("SET CALL %s SEEN", call); skype_send_message_nowait("CLEAR CALLHISTORY INCOMING"); + skype_send_message_nowait("SEARCH MISSEDCALLS"); g_free(call); } @@ -938,6 +1002,7 @@ { skype_send_message_nowait("SET CALL %s SEEN", call); skype_send_message_nowait("CLEAR CALLHISTORY INCOMING"); + skype_send_message_nowait("SEARCH MISSEDCALLS"); g_free(call); } @@ -947,6 +1012,7 @@ skype_send_message_nowait("ALTER CALL %s END REDIRECT_TO_VOICEMAIL", call); skype_send_message_nowait("SET CALL %s SEEN", call); skype_send_message_nowait("CLEAR CALLHISTORY INCOMING"); + skype_send_message_nowait("SEARCH MISSEDCALLS"); g_free(call); } @@ -956,6 +1022,7 @@ skype_send_message_nowait("ALTER CALL %s END FORWARD_CALL", call); skype_send_message_nowait("SET CALL %s SEEN", call); skype_send_message_nowait("CLEAR CALLHISTORY INCOMING"); + skype_send_message_nowait("SEARCH MISSEDCALLS"); g_free(call); } @@ -1021,6 +1088,7 @@ skype_send_message_nowait("GET CHAT %s MEMBERS", chat_id); skype_send_message_nowait("GET CHAT %s FRIENDLYNAME", chat_id); skype_send_message_nowait("GET CHAT %s TOPIC", chat_id); + skype_send_message_nowait("GET CHAT %s MEMBEROBJECTS", chat_id); } g_static_mutex_unlock(&chat_link_mutex); @@ -1140,6 +1208,7 @@ { SkypeMessage *skypemessage = NULL; SkypeChat *chat = NULL; + PurpleBuddy *buddy = NULL; gchar *body_html = NULL; xmlnode *xmlblob, *nodi; int i; @@ -1349,7 +1418,7 @@ case SKYPE_MESSAGE_EDITED: if (!skypemessage->body || !skypemessage->from_handle || !skypemessage->timestamp) return FALSE; - PurpleBuddy *buddy = purple_find_buddy(skypemessage->account, skypemessage->from_handle); + buddy = purple_find_buddy(skypemessage->account, skypemessage->from_handle); body_html = g_strdup_printf("%s edited message '%s'", (buddy&&buddy->alias?buddy->alias:skypemessage->from_handle), skypemessage->body); g_free(skypemessage->body); skypemessage->body = body_html; diff -Nru pidgin-skype-20110407+svn612+dfsg/skype_messaging.c pidgin-skype-20130613+svn660+dfsg/skype_messaging.c --- pidgin-skype-20110407+svn612+dfsg/skype_messaging.c 2011-04-10 16:10:16.000000000 +0000 +++ pidgin-skype-20130613+svn660+dfsg/skype_messaging.c 2012-10-29 21:12:07.000000000 +0000 @@ -20,6 +20,10 @@ * along with this program. If not, see . */ +#ifndef INCLUDED_LIBSKYPE_C +# error "Don't compile this file directly. Just compile libskype.c instead." +#endif + #include #include "skype_events.c" @@ -207,8 +211,7 @@ g_thread_yield(); #ifdef __APPLE__ - RunCurrentEventLoop(0); - usleep(1000); + RunCurrentEventLoop(kEventDurationMillisecond); g_static_mutex_lock2(&mutex); if (timeout++ == 10000) diff -Nru pidgin-skype-20110407+svn612+dfsg/skype_messaging_carbon.c pidgin-skype-20130613+svn660+dfsg/skype_messaging_carbon.c --- pidgin-skype-20110407+svn612+dfsg/skype_messaging_carbon.c 2011-04-10 16:10:16.000000000 +0000 +++ pidgin-skype-20130613+svn660+dfsg/skype_messaging_carbon.c 2012-11-07 04:01:04.000000000 +0000 @@ -20,6 +20,10 @@ * along with this program. If not, see . */ +#ifndef INCLUDED_LIBSKYPE_C +# error "Don't compile this file directly. Just compile libskype.c instead." +#endif + #include //#include #include @@ -201,10 +205,10 @@ static gboolean exec_skype() { - gboolean success; - + gboolean success = FALSE; +#ifndef INSTANTBIRD success = g_spawn_command_line_async("/Applications/Skype.app/Contents/MacOS/Skype", NULL); - +#endif return success; } diff -Nru pidgin-skype-20110407+svn612+dfsg/skype_messaging_carbon2.c pidgin-skype-20130613+svn660+dfsg/skype_messaging_carbon2.c --- pidgin-skype-20110407+svn612+dfsg/skype_messaging_carbon2.c 2011-04-10 16:10:16.000000000 +0000 +++ pidgin-skype-20130613+svn660+dfsg/skype_messaging_carbon2.c 2011-08-23 05:55:25.000000000 +0000 @@ -393,7 +393,7 @@ CFSTR("SKSkypeAPICommand"), NULL, userInfo, - FALSE); + TRUE); CFRelease(command); CFRelease(id_number); @@ -417,7 +417,7 @@ CFSTR("SKSkypeAPIDetachRequest"), NULL, userInfo, - FALSE); + TRUE); client_id = 0; } diff -Nru pidgin-skype-20110407+svn612+dfsg/skype_messaging_dbus.c pidgin-skype-20130613+svn660+dfsg/skype_messaging_dbus.c --- pidgin-skype-20110407+svn612+dfsg/skype_messaging_dbus.c 2011-04-10 16:10:16.000000000 +0000 +++ pidgin-skype-20130613+svn660+dfsg/skype_messaging_dbus.c 2012-10-29 21:12:07.000000000 +0000 @@ -20,6 +20,10 @@ * along with this program. If not, see . */ +#ifndef INCLUDED_LIBSKYPE_C +# error "Don't compile this file directly. Just compile libskype.c instead." +#endif + #define DBUS_API_SUBJECT_TO_CHANGE #include @@ -207,6 +211,9 @@ static gboolean exec_skype() { +#ifdef INSTANTBIRD + return FALSE; +#else GError *error; if (g_spawn_command_line_async("skype --enable-dbus --use-session-dbus --disable-cleanlooks", &error)) { @@ -215,5 +222,6 @@ skype_debug_error("skype", "Could not start skype: %s\n", error->message); return FALSE; } +#endif } diff -Nru pidgin-skype-20110407+svn612+dfsg/skype_messaging_network.c pidgin-skype-20130613+svn660+dfsg/skype_messaging_network.c --- pidgin-skype-20110407+svn612+dfsg/skype_messaging_network.c 2011-04-10 16:10:16.000000000 +0000 +++ pidgin-skype-20130613+svn660+dfsg/skype_messaging_network.c 2012-11-07 04:01:04.000000000 +0000 @@ -20,6 +20,10 @@ * along with this program. If not, see . */ +#ifndef INCLUDED_LIBSKYPE_C +# error "Don't compile this file directly. Just compile libskype.c instead." +#endif + #include #include #include diff -Nru pidgin-skype-20110407+svn612+dfsg/skype_messaging_win32.c pidgin-skype-20130613+svn660+dfsg/skype_messaging_win32.c --- pidgin-skype-20110407+svn612+dfsg/skype_messaging_win32.c 2011-04-10 16:10:16.000000000 +0000 +++ pidgin-skype-20130613+svn660+dfsg/skype_messaging_win32.c 2012-11-07 04:01:04.000000000 +0000 @@ -20,6 +20,10 @@ * along with this program. If not, see . */ +#ifndef INCLUDED_LIBSKYPE_C +# error "Don't compile this file directly. Just compile libskype.c instead." +#endif + #include #include #include @@ -163,7 +167,7 @@ if(uiMessage == WM_COPYDATA && hGlobal_SkypeAPIWindowHandle == (HWND)uiParam) { PCOPYDATASTRUCT poCopyData = (PCOPYDATASTRUCT)ulParam; - g_thread_create((GThreadFunc)skype_message_received, (void *)g_strdup(poCopyData->lpData), FALSE, NULL); + skype_message_received(g_strdup(poCopyData->lpData)); return 1; } else if (uiMessage == uiGlobal_MsgID_SkypeControlAPIAttach) { skype_debug_info("skype_win32", "Attached process %d %d\n", uiParam, ulParam); @@ -196,6 +200,9 @@ static gboolean exec_skype() { +#ifdef INSTANTBIRD + return FALSE; +#else DWORD size = 0; gchar *path, *pathtemp; HKEY regkey; @@ -231,6 +238,7 @@ success = g_spawn_command_line_async(pathtemp, NULL); g_free(pathtemp); return success; +#endif } static gboolean diff -Nru pidgin-skype-20110407+svn612+dfsg/skype_messaging_x11.c pidgin-skype-20130613+svn660+dfsg/skype_messaging_x11.c --- pidgin-skype-20110407+svn612+dfsg/skype_messaging_x11.c 2011-04-10 16:10:16.000000000 +0000 +++ pidgin-skype-20130613+svn660+dfsg/skype_messaging_x11.c 2012-10-29 21:12:07.000000000 +0000 @@ -20,12 +20,16 @@ * along with this program. If not, see . */ +#ifndef INCLUDED_LIBSKYPE_C +# error "Don't compile this file directly. Just compile libskype.c instead." +#endif + #include #include static Display *disp = NULL; -static Window win = (Window)-1; -Window skype_win = (Window)-1; +static Window win = (Window)None; +Window skype_win = (Window)None; static GThread *receiving_thread = NULL; Atom message_start, message_continue; static gboolean run_loop = FALSE; @@ -71,9 +75,10 @@ 0, BlackPixel( disp, DefaultScreen( disp ) ), BlackPixel( disp, DefaultScreen( disp ) )); XFlush(disp); - if (win == -1) + if (win == None) { XCloseDisplay(disp); + disp = NULL; skype_debug_info("skype_x11", "Could not create X11 messaging window\n"); return FALSE; } @@ -83,8 +88,8 @@ { XDestroyWindow(disp, win); XCloseDisplay(disp); - win = (Window)-1; - skype_win = (Window)-1; + win = (Window)None; + disp = NULL; skype_debug_info("skype_x11", "Could not create skype Atom\n"); return FALSE; } @@ -94,9 +99,9 @@ { XDestroyWindow(disp, win); XCloseDisplay(disp); - win = (Window)-1; + win = (Window)None; XFree(prop); - skype_win = (Window)-1; + disp = NULL; skype_debug_info("skype", "Skype instance not found\n"); return FALSE; } @@ -116,11 +121,11 @@ skype_disconnect() { run_loop = FALSE; - skype_win = (Window)-1; + skype_win = (Window)None; if (disp != NULL) { - if (win != -1) + if (win != None) { //wait here for the event to be handled XDestroyWindow(disp, win); @@ -128,7 +133,7 @@ XCloseDisplay(disp); } - win = (Window)-1; + win = (Window)None; disp = NULL; } @@ -150,7 +155,7 @@ char *error_return; unsigned int i; - if (skype_win == -1 || win == -1 || disp == NULL) + if (skype_win == None || win == None || disp == NULL) { //There was an error if (message[0] == '#') @@ -276,6 +281,9 @@ static gboolean exec_skype() { +#ifdef INSTANTBIRD + return FALSE; +#else GError *error; #ifdef USE_XVFB_SERVER @@ -330,6 +338,7 @@ skype_debug_error("skype", "Could not start skype: %s\n", error->message); return FALSE; } +#endif } static gboolean diff -Nru pidgin-skype-20110407+svn612+dfsg/theme pidgin-skype-20130613+svn660+dfsg/theme --- pidgin-skype-20110407+svn612+dfsg/theme 2011-04-10 16:10:16.000000000 +0000 +++ pidgin-skype-20130613+svn660+dfsg/theme 2013-04-18 00:31:38.000000000 +0000 @@ -4,21 +4,21 @@ Name=Default-with-Skype Description=Pidgin smileys including Skype -Icon=../default/wink.png -Author=Eion Robb and Hylke Bons +Icon=../../protocols/22/skype.png +Author=Hylke Bons # Default smileys [default] -../default/smile.png :) :-) -../default/smile-big.png :-D :-d :D :d +../default/happy.png :) :-) +../default/excited.png :-D :-d :D :d ../default/sad.png :-( :( ../default/wink.png ;-) ;) -../default/tongue.png :P :-P :-p :p -../default/shock.png =-O =-o +../default/tongue.png :P :p :-P :-p +../default/shocked.png =-O =-o ../default/kiss.png :-* ../default/glasses-cool.png 8-) ../default/embarrassed.png :-[ -../default/crying.png :'( +../default/crying.png :'( :'-( ../default/thinking.png :-/ :-\\ ../default/angel.png O:-) o:-) ../default/shut-mouth.png :-X @@ -26,19 +26,70 @@ ../default/foot-in-mouth.png :-! ../default/shout.png >:o >:O ! ../default/skywalker.png C:-) c:-) C:) c:) -! ../default/monkey.png :-(|) :(|) 8-|) +! ../default/monkey.png :-(|) :(|) 8-|) ! ../default/cyclops.png O-) o-) + +[XMPP] +# Following XEP-0038 + GTalk + our default set, in default set order +# The GTalk strings come from ticket #3307. +../default/happy.png :) :-) =) +../default/excited.png :-D :-d :D :d =D =d +../default/sad.png :-( :( +../default/wink.png ;-) ;) ;^) +../default/tongue.png :P :p :-P :-p +../default/shocked.png =-O =-o :-O :-o +../default/kiss.png :kiss: :-* +../default/glasses-cool.png 8-) B-) +../default/embarrassed.png :-[ +../default/crying.png :'-( :'( +../default/thinking.png :-/ :-\\ +../default/angel.png O:-) o:-) +../default/shut-mouth.png :-X +../default/moneymouth.png :-$ +../default/foot-in-mouth.png :-! +../default/shout.png >:o >:O + +# Following XEP-0038 + GTalk +../default/angry.png >:-( >:( X-( x-( +../default/good.png :yes: +../default/bad.png :no: +../default/stop.png :wait: +../default/rose.png @->-- :rose: +../default/phone.png :telephone: +../default/mail.png :email: +../default/lamp.png :jabber: +../default/cake.png :cake: +../default/in_love.png :heart: :love: <3 +../default/love-over.png :brokenheart: +../default/musical-note.png :music: +../default/beer.png :beer: +../default/coffee.png :coffee: +../default/coins.png :money: +../default/moon.png :moon: +../default/sun.png :sun: +../default/star.png :star: + +# Others +../default/neutral.png :| :-| +../default/victory.png \\m/ + +# Hidden icons from the default set. +! ../default/skywalker.png C:-) c:-) C:) c:) +! ../default/monkey.png :-(|) :(|) 8-|) +! ../default/cyclops.png O-) o-) + + # Following AIM 6.1 [AIM] -../default/smile.png :-) :) +../default/happy.png :-) :) ../default/wink.png ;-) ;) ../default/sad.png :-( :( -../default/tongue.png :-P :P :-p :p -../default/shock.png =-O +../default/tongue.png :-P :p :P :-p +../default/shocked.png =-O =-o ../default/kiss.png :-* ../default/shout.png >:o -../default/smile-big.png :-D :D +../default/excited.png :-D :D ../default/moneymouth.png :-$ ../default/foot-in-mouth.png :-! ../default/embarrassed.png :-[ @@ -48,16 +99,17 @@ ../default/shut-mouth.png :-X ../default/glasses-cool.png 8-) ! ../default/skywalker.png C:-) c:-) C:) c:) -! ../default/monkey.png :-(|) :(|) +! ../default/monkey.png :-(|) :(|) 8-|) +! ../default/cyclops.png O-) o-) # Following Windows Live Messenger 8.1 [MSN] -../default/smile.png :) :-) -../default/smile-big.png :D :d :-D :-d +../default/happy.png :) :-) +../default/excited.png :D :d :-D :-d ../default/wink.png ;) ;-) -../default/shock.png :-O :-o :O :o -../default/tongue.png :P :p :-P :-p +../default/shocked.png :-O :-o :O :o +../default/tongue.png :-P :P :-p :p ../default/glasses-cool.png (H) (h) ../default/angry.png :@ :-@ ../default/embarrassed.png :$ :-$ @@ -67,7 +119,7 @@ ../default/neutral.png :| :-| ../default/devil.png (6) ../default/angel.png (A) (a) -../default/love.png (L) (l) +../default/in_love.png (L) (l) ../default/love-over.png (U) (u) ../default/msn.png (M) (m) ../default/cat.png (@) @@ -127,9 +179,11 @@ ../default/thunder.png (li) ../default/party.png <:o) ../default/eyeroll.png 8-) -../default/yawn.png |-) +../default/sleepy.png |-) +../default/bunny.png ('.') ! ../default/skywalker.png C:-) c:-) C:) c:) -! ../default/monkey.png :-(|) :(|) +! ../default/monkey.png :-(|) :(|) 8-|) +! ../default/cyclops.png O-) o-) # Hidden MSN emotes ../default/cigarette.png (ci) (CI) @@ -140,7 +194,7 @@ # Following QQ 2006 [QQ] -../default/shock.png /:O /jy /surprised +../default/shocked.png /:O /jy /surprised ../default/curl-lip.png /:~ /pz /curl_lip ../default/desire.png /:* /se /desire ../default/dazed.png /:| /dazed @@ -148,13 +202,13 @@ ../default/crying.png /:< /ll /cry ../default/bashful.png /:$ /hx /bashful ../default/shut-mouth.png /:X /bz /shut_mouth -../default/sleepy.png /:Z /shui /sleep +../default/sleeping.png /:Z /shui /sleep ../default/weep.png /:'( /dk /weep ../default/embarrassed.png /:-| /gg /embarassed ../default/pissed-off.png /:@ /fn /pissed_off ../default/act-up.png /:P /tp /act_up -../default/smile-big.png /:D /cy /toothy_smile -../default/smile.png /:) /wx /small_smile +../default/excited.png /:D /cy /toothy_smile +../default/happy.png /:) /wx /small_smile ../default/sad.png /:( /ng /sad ../default/glasses-cool.png /:+ /kuk /cool ../default/doctor.png /:# /feid /SARS @@ -165,9 +219,9 @@ ../default/disdain.png /;d /by /disdain ../default/arrogant.png /;o /am /arrogant ../default/starving.png /:g /jie /starving -../default/yawn.png /|-) /kun /sleepy +../default/sleepy.png /|-) /kun /sleepy ../default/terror.png /:! /jk /terror -../default/sweat.png /:L /sweat +../default/hot.png /:L /sweat ../default/smirk.png /:> /hanx /smirk ../default/soldier.png /:; /db /soldier ../default/struggle.png /;f /fendou /struggle @@ -181,8 +235,8 @@ ../default/hammer.png /xx /qiao /hammer ../default/bye.png /bye /zj /bye ../default/go-away.png /go /shan /go -../default/tremble.png /shake /fad /shake -../default/in-love.png /love /aiq /love +../default/afraid.png /shake /fad /shake +../default/amorous.png /love /aiq /love ../default/jump.png /jump /tiao /jump ../default/search.png /find /zhao /search ../default/lashes.png /& /mm /beautiful_eyebrows @@ -201,12 +255,12 @@ ../default/musical-note.png /music /yy /music ../default/poop.png /shit /bb /shit ../default/coffee.png /coffee /kf /coffee -../default/eat.png /eat /fan /eat +../default/hungry.png /eat /fan /eat ../default/pill.png /pill /yw /pill ../default/rose.png /rose /mg /rose ../default/wilt.png /fade /dx /wilt ../default/kiss.png /kiss /wen /kiss -../default/love.png /heart /xin /heart +../default/in_love.png /heart /xin /heart ../default/love-over.png /break /xs /broken_heart ../default/meeting.png /meeting /hy /meeting ../default/present.png /gift /lw /gift @@ -234,26 +288,29 @@ ../default/girl.png /<00> /nv /woman ../default/boy.png /<11> /nan /man ! ../default/skywalker.png C:-) c:-) C:) c:) -! ../default/monkey.png :-(|) :(|) +! ../default/monkey.png :-(|) :(|) 8-|) +! ../default/cyclops.png O-) o-) # Following ICQ 6.0 [ICQ] -../default/smile.png :-) :) +../default/happy.png :-) :) ../default/neutral.png :-$ ../default/sad.png :-( :( -../default/shock.png =-O +../default/shocked.png =-O ../default/wink.png ;-) ;) ../default/tongue.png :-P :P :-p :p ../default/music.png [:-} ../default/laugh.png *JOKINGLY* -../default/sleepy.png *TIRED* +../default/sleeping.png *TIRED* ../default/crying.png :'( :'-( ../default/sick.png :-! ../default/kissed.png *KISSED* ../default/stop.png *STOP* ../default/kiss.png :-{} :-* ../default/kissing.png *KISSING* +../default/victory.png *YAHOO* +../default/silly.png %) ../default/embarrassed.png :-[ ../default/devil.png ]:-> ../default/angel.png O:-) @@ -264,26 +321,27 @@ ../default/good.png *THUMBS\ UP* ../default/shout.png >:o >:O :-@ ../default/beer.png *DRINK* -../default/smile-big.png :-D :D +../default/excited.png :-D :D ../default/glasses-cool.png 8-) -../default/in-love.png *IN\ LOVE* +../default/amorous.png *IN\ LOVE* ! ../default/skywalker.png C:-) c:-) C:) c:) -! ../default/monkey.png :-(|) :(|) +! ../default/monkey.png :-(|) :(|) 8-|) +! ../default/cyclops.png O-) o-) # Following Yahoo! Messenger 8.1 [Yahoo] -../default/smile.png :) :-) +../default/happy.png :) :-) ../default/question.png :-/ :-\\ -../default/shock.png :-O :O :-o :o +../default/shocked.png :-O :O :-o :o ../default/devil.png >:) ../default/angel.png O:-) o:-) 0:-) ../default/sick.png :-& -../default/yawn.png (:| +../default/sleepy.png (:| ../default/hypnotized.png @-) ../default/on-the-phone.png :)] ../default/sad.png :( :-( -../default/in-love.png :x :-x :X :-X +../default/amorous.png :x :-x :X :-X ../default/angry.png X-( x-( X( x( ../default/crying.png :(( ../default/glasses-nerdy.png :-B :-b @@ -300,11 +358,11 @@ ../default/thinking.png :-? ../default/waiting.png :-w :-W ../default/at-wits-end.png ~x( ~X( -../default/smile-big.png :D :-D :d :-d +../default/excited.png :D :-D :d :-d ../default/tongue.png :-P :P :-p :p ../default/glasses-cool.png B-) b-) ../default/neutral.png :| :-| -../default/sleepy.png I-) i-) |-) +../default/sleeping.png I-) i-) |-) ../default/clown.png :o) :O) ../default/doh.png #-o #-O ../default/weep.png :-< @@ -320,15 +378,109 @@ ../default/time-out.png :-t :-T ../default/hug-left.png >:D< >:d< ../default/love-over.png =(( -../default/sweat.png #:-S #:-s +../default/hot.png #:-S #:-s ../default/rotfl.png =)) :-j :-J ../default/loser.png L-) l-) ../default/party.png <:-P <:-p -../default/nailbiting.png :-SS :-Ss :-sS :-ss +../default/nervous.png :-SS :-Ss :-sS :-ss ../default/cowboy.png <):) ../default/desire.png 8-> ! ../default/skywalker.png C:-) c:-) C:) c:) -! ../default/monkey.png :-(|) :(|) +! ../default/monkey.png :-(|) :(|) 8-|) +! ../default/cyclops.png O-) o-) + +# Hidden Yahoo emotes +../default/alien.png =:) >-) +../default/beat-up.png b-( B-( +../default/chicken.png ~:> +../default/coffee.png ~o) ~O) +../default/cow.png 3:-O 3:-o +../default/dance.png \\:D/ \\:d/ +../default/rose.png @};- +../default/dont-know.png :-L :-l +../default/skeleton.png 8-X 8-x +../default/lamp.png *-:) +../default/monkey.png :(|) +../default/coins.png $-) +../default/peace.png :)>- +../default/pig.png :@) +../default/pray.png [-o< [-O< +../default/pumpkin.png (~~) +../default/shame.png [-X [-x +../default/flag.png **== +../default/clover.png %%- +../default/musical-note.png :-" +../default/giggle.png ;)) +../default/worship.png ^:)^ +../default/star.png (*) +../default/waving.png >:/ +../default/talktohand.png :-@ + +# Only available after activating the Yahoo! Fighter IMVironment +../default/male-fighter1.png o-> O-> +../default/male-fighter2.png o=> O=> +../default/female-fighter.png o-+ O-+ +../default/yin-yang.png (%) + +# Following Yahoo! Messenger 8.1 +[Yahoo JAPAN] +../default/happy.png :) :-) +../default/question.png :-/ :-\\ +../default/shocked.png :-O :O :-o :o +../default/devil.png >:) +../default/angel.png O:-) o:-) 0:-) +../default/sick.png :-& +../default/sleepy.png (:| +../default/hypnotized.png @-) +../default/on-the-phone.png :)] +../default/sad.png :( :-( +../default/amorous.png :x :-x :X :-X +../default/angry.png X-( x-( X( x( +../default/crying.png :(( +../default/glasses-nerdy.png :-B :-b +../default/quiet.png :-$ +../default/drool.png =P~ =p~ +../default/lying.png :^O :^o +../default/call-me.png :-c +../default/wink.png ;) ;-) +../default/embarrassed.png :"> +../default/mean.png :-> :> +../default/laugh.png :)) :-)) +../default/bye.png =; +../default/arrogant.png [-( +../default/thinking.png :-? +../default/waiting.png :-w :-W +../default/at-wits-end.png ~x( ~X( +../default/excited.png :D :-D :d :-d +../default/tongue.png :-P :P :-p :p +../default/glasses-cool.png B-) b-) +../default/neutral.png :| :-| +../default/sleeping.png I-) i-) |-) +../default/clown.png :o) :O) +../default/doh.png #-o #-O +../default/weep.png :-< +../default/go-away.png :-h +../default/lashes.png ;;) +../default/kiss.png :-* :* +../default/confused.png :-S :-s +../default/sarcastic.png /:) +../default/eyeroll.png 8-| +../default/silly.png 8-} +../default/clap.png =D> =d> +../default/mad-tongue.png >:P >:p +../default/time-out.png :-t :-T +../default/hug-left.png >:D< >:d< +../default/love-over.png =(( +../default/hot.png #:-S #:-s +../default/rotfl.png =)) :-j :-J +../default/loser.png L-) l-) +../default/party.png <:-P <:-p +../default/nervous.png :-SS :-Ss :-sS :-ss +../default/cowboy.png <):) +../default/desire.png 8-> +! ../default/skywalker.png C:-) c:-) C:) c:) +! ../default/monkey.png :-(|) :(|) 8-|) +! ../default/cyclops.png O-) o-) # Hidden Yahoo emotes ../default/alien.png =:) >-) @@ -366,14 +518,14 @@ # Following MySpaceIM Beta 1.0.697.0 [MySpaceIM] -../default/smile-big.png :D :-D +../default/excited.png :D :-D ../default/devil.png }:) ../default/confused.png :Z ../default/glasses-nerdy.png B) ../default/bulgy-eyes.png %) ../default/freaked-out.png :E -../default/smile.png :) :-) -../default/in-love.png :X +../default/happy.png :) :-) +../default/amorous.png :X ../default/laugh.png :)) ../default/mohawk.png -: ../default/mad-tongue.png X( @@ -381,7 +533,7 @@ ../default/glasses-nerdy.png Q) ../default/doh.png :G ../default/pirate.png P) -../default/shock.png :O +../default/shocked.png :O ../default/sidefrown.png :{ ../default/sinister.png :B ../default/smirk.png :, @@ -391,79 +543,156 @@ ../default/wink.png ;-) ;) ../default/sad.png :[ ../default/kiss.png :x +! ../default/skywalker.png C:-) c:-) C:) c:) +! ../default/monkey.png :-(|) :(|) 8-|) +! ../default/cyclops.png O-) o-) + + +# MXit standard emoticons +[MXit] +../default/happy.png :-) :) +../default/sad.png :-( :( +../default/wink.png ;-) ;) +../default/excited.png :-D :D :-> :> +../default/neutral.png :-| :| +../default/shocked.png :-O :O +../default/tongue.png :-P :P +../default/embarrassed.png :-$ :$ +../default/glasses-cool.png 8-) +../default/in_love.png (H) +../default/rose.png (F) +### Added in v3.0 +../default/boy.png (m) +../default/girl.png (f) +../default/star.png (*) +../default/chilli.png (c) +../default/kiss.png (x) +../default/lamp.png (i) +../default/pissed-off.png :e :-e +../default/shut-mouth.png :-x :x +../default/thunder.png (z) +../default/coffee.png (U) +../default/mrgreen.png (G) +### Added in v5.0 +../default/sick.png :o( +../default/excruciating.png :-{ :{ +../default/amorous.png :-} :} +../default/eyeroll.png 8-o 8o +../default/crying.png :'( +../default/thinking.png :-? :? +../default/drool.png :-~ :~ +../default/sleeping.png :-z :z +../default/lying.png :L) +../default/glasses-nerdy.png 8-| 8| +../default/pirate.png P-) +### Added in v5.9.7 +../default/bored.png :-[ :[ +../default/cold.png :-< :< +../default/confused.png :-, :, +../default/hungry.png :-C :C +../default/stressed.png :-s :s # Following Skype 2.0 for Linux [Skype] -../default/smile.png :) :-) :=) (smile) +../default/happy.png :) :-) :=) (smile) ../default/sad.png :( :-( :=( (sad) -../default/smile-big.png :D :-D :=D :d :-d :=d (laugh) -../default/glasses-cool.png 8-) 8=) B) B-) B=) (cool) -../default/shock.png :O :-O :=O :o :-o :=o (surprised) -../default/wink.png ;) ;-) ;=) (wink) +../default/excited.png :D :-D :=D :d :-d :=d (laugh) +../default/glasses-cool.png 8) 8-) 8=) B) B-) B=) (cool) +../default/shocked.png :O :-O :=O :o :-o :=o (surprised) +../default/wink.png ;) ;-) ;=) (wink) ../default/crying.png ;( ;-( ;=( (cry) -../default/sweat.png (sweat) (:| -../default/neutral.png :| :-| :=| (speechless) -../default/kiss.png :* :-* :=* (kiss) +../default/hot.png (sweat) (:| +../default/neutral.png :| :-| :=| (speechless) +../default/kiss.png :* :-* :=* (kiss) ../default/tongue.png :P :-P :=P :p :-p :=p (tongueout) ../default/embarrassed.png (blush) :$ :-$ :=$ :"> ../default/dont-know.png :^) (wonder) -../default/sleepy.png |-) I-) I=) (snooze) +../default/sleeping.png |-) I-) I=) (snooze) ../default/neutral.png |-( |( |=( (dull) -../default/in-love.png (inlove) -../default/mean.png ]:) >:) (grin) -../default/act-up.png (talk) -../default/yawn.png (yawn) |-() -../default/sick.png (puke) :& :-& :=& -../default/doh.png (doh) +../default/amorous.png (inlove) +../default/mean.png ]:) >:) (grin) +! ../default/secret.png (talk) +../default/sleepy.png (yawn) |-() +../default/sick.png (puke) :& :-& :=& +../default/doh.png (doh) (facepalm) (fail) ../default/angry.png :@ :-@ :=@ x( x-( X( X-( x=( X=( (angry) ../default/go-away.png (wasntme) ../default/party.png (party) -../default/confused.png :S :s :-s :-S :=s :=S -../default/nailbiting.png (worry) +../default/confused.png :S :s :-s :-S :=s :=S +../default/nervous.png (worry) ../default/snicker.png (mm) (mmm) (mmmm) ../default/glasses-nerdy.png 8-| B-| 8| B| 8=| B=| (nerd) ../default/quiet.png :x :-x :X :-X :# :-# :=x :=X :=# -../default/waving.png (hi) -../default/call-me.png (call) +../default/bye.png (hi) (wave) +! ../default/call-me.png (call) (t) ../default/devil.png (devil) -../default/angel.png (angel) -../default/desire.png (envy) -../default/stop.png (wait) -../default/hug-left.png (hug) (bear) +../default/angel.png (angel) (a) +../default/desire.png (envy) (v) +../default/stop.png (wait) +../default/hug-left.png (hug) (bear) ../default/beauty.png (makeup) (kate) ../default/giggle.png (chuckle) (giggle) -../default/clap.png (clap) -../default/thinking.png (think) :-? :? :=? +../default/clap.png (clap) +../default/thinking.png (think) :-? :? :=? ../default/worship.png (bow) ../default/rotfl.png (rofl) -../default/smile-big.png (whew) -../default/curl-lip.png (happy) +../default/hot.png (whew) +../default/curl-lip.png (happy) ../default/smirk.png (smirk) -../default/good.png (y) (Y) (ok) (yes) +../default/happy.png (nod) +../default/wilt.png (shake) +! ../default/beat-up.png (punch) +../default/good.png (y) (Y) (ok) (yes) ../default/bad.png (n) (N) (no) ../default/handshake.png (handshake) -../default/love.png (h) (H) (l) (L) (heart) (love) -../default/love-over.png (u) (U) (brokenheart) -../default/mail.png (e) (m) (mail) -../default/rain.png (rain) (st) (london) +../default/in_love.png (h) (H) (l) (L) (heart) (love) +! ../default/love-over.png (u) (U) (brokenheart) +! ../default/mail.png (e) (m) (mail) +../default/rain.png (rain) (st) (london) ../default/sun.png (sun) -../default/clock.png (o) (O) (time) (clock) -../default/musical-note.png (music) -../default/film.png (~) (film) (movie) -../default/mobile.png (mp) (ph) (phone) -../default/coffee.png (coffee) +! ../default/clock.png (o) (O) (time) (clock) +../default/musical-note.png (music) +! ../default/film.png (~) (film) (movie) +! ../default/mobile.png (mp) (ph) (phone) +../default/coffee.png (coffee) (c) ../default/pizza.png (pi) (pizza) -../default/cake.png (^) (cake) -../default/beer.png (beer) +../default/cake.png (^) (cake) +../default/beer.png (beer) (b) ../default/terror.png (bandit) -../default/at-wits-end.png (headbang) (banghead) -../default/curse.png (swear) -../default/rose.png (F) (f) (flower) +! ../default/at-wits-end.png (headbang) (banghead) +! ../default/curse.png (swear) +../default/rose.png (F) (f) (flower) ../default/drink.png (d) (D) (drink) -../default/dance.png (dance) \o/ \:D/ \:d/ -../default/star.png (*) (star) -../default/bulgy-eyes.png (drunk) -../default/cigarette.png (smoking) (smoke) (ci) -../default/male-fighter1.png (ninja) -../default/dazed.png (tmi) -../default/goat.png (emo) +../default/dance.png (dance) \\o/ \\:D/ \\:d/ +../default/star.png (*) (star) +! ../default/bulgy-eyes.png (drunk) +! ../default/cigarette.png (smoking) (smoke) (ci) +../default/male-fighter2.png (ninja) (j) +../default/afraid.png (tmi) +../default/ghost.png (emo) +! ../default/goat.png (malthe) +! ../default/dog.png (toivo) +! ../default/mohawk.png (rock) +../default/turtle.png (bug) +../default/loser.png (finger) +! ../default/hypnotized.png (fubar) +! ../small/bathing.png (poolparty) +../default/bunny.png (heidy) +../default/highfive.png (highfive) (hifive) (h5) +../default/fingers-crossed.png (fingers) (fingerscrossed) (yn) +../default/talktohand.png (lalala) (lala) (notlistening) +../default/waiting.png (waiting) (forever) (impatience) +../default/snail.png (tumbleweed) +! ../default/computer.png (wfh) +../default/coins.png (cash) (mo) ($) +! ../../protocols/22/myspace.png (myspace) +! ../../protocols/22/skype.png (skype) (ss) +! ../default/soccerball.png (soccer) +../default/excruciating.png (wtf) +! ../default/cowboy.png (oliver) +../default/moon.png (mooning) +! ../default/camera.png (zilmer) (priidu) +! ../default/lashes.png (hollest) +! ../default/flag.png (flag:US) +../default/waving.png (flex) +