Mercurial > pidgin.yaz
changeset 21143:7be910c7cff7
merge of '20236f54c97e87512b7eb716559a4bd86b73f833'
and '756265e6ef8651abedbdc0a1aad9d50cc32e140f'
author | John Bailey <rekkanoryo@rekkanoryo.org> |
---|---|
date | Mon, 05 Nov 2007 00:35:07 +0000 (2007-11-05) |
parents | 1d92b85ef5d9 (current diff) 846e6800d956 (diff) |
children | aa3933394eec |
files | pidgin/pixmaps/animations/16/Makefile.am pidgin/pixmaps/animations/16/Makefile.mingw pidgin/pixmaps/animations/Makefile.am pidgin/pixmaps/animations/Makefile.mingw pidgin/pixmaps/buddy_icons/Makefile.am pidgin/pixmaps/buddy_icons/Makefile.mingw pidgin/pixmaps/dialogs/16/scalable/Makefile.am pidgin/pixmaps/dialogs/64/scalable/Makefile.am pidgin/pixmaps/dialogs/Makefile.am pidgin/pixmaps/dialogs/Makefile.mingw pidgin/pixmaps/emblems/16/scalable/Makefile.am pidgin/pixmaps/emblems/Makefile.am pidgin/pixmaps/emblems/Makefile.mingw pidgin/pixmaps/emotes/Makefile.am pidgin/pixmaps/emotes/Makefile.mingw pidgin/pixmaps/emotes/default/24/scalable/Makefile.am pidgin/pixmaps/emotes/default/Makefile.am pidgin/pixmaps/icons/16/scalable/Makefile.am pidgin/pixmaps/icons/22/scalable/Makefile.am pidgin/pixmaps/icons/24/scalable/Makefile.am pidgin/pixmaps/icons/32/scalable/Makefile.am pidgin/pixmaps/icons/48/scalable/Makefile.am pidgin/pixmaps/icons/Makefile.am pidgin/pixmaps/icons/Makefile.mingw pidgin/pixmaps/protocols/16/scalable/Makefile.am pidgin/pixmaps/protocols/22/scalable/Makefile.am pidgin/pixmaps/protocols/48/scalable/Makefile.am pidgin/pixmaps/protocols/Makefile.am pidgin/pixmaps/protocols/Makefile.mingw pidgin/pixmaps/status/11/scalable/Makefile.am pidgin/pixmaps/status/16/scalable/Makefile.am pidgin/pixmaps/status/22/scalable/Makefile.am pidgin/pixmaps/status/32/scalable/Makefile.am pidgin/pixmaps/status/Makefile.am pidgin/pixmaps/status/Makefile.mingw pidgin/pixmaps/toolbar/16/scalable/Makefile.am pidgin/pixmaps/toolbar/22/scalable/Makefile.am pidgin/pixmaps/toolbar/Makefile.am pidgin/pixmaps/toolbar/Makefile.mingw pidgin/pixmaps/tray/Makefile.am pidgin/pixmaps/tray/Makefile.mingw |
diffstat | 125 files changed, 2622 insertions(+), 3175 deletions(-) [+] |
line wrap: on
line diff
--- a/Makefile.mingw Sun Nov 04 22:17:45 2007 +0000 +++ b/Makefile.mingw Mon Nov 05 00:35:07 2007 +0000 @@ -42,19 +42,30 @@ # Any *.dll or *.exe files included in win32-install-dir that we don't compile # should be included in this list so they don't get stripped EXTERNAL_DLLS = \ + comerr32.dll \ freebl3.dll \ + gssapi32.dll \ + k5sprt32.dll \ + krb5_32.dll \ libgtkspell.dll \ libmeanwhile-1.dll \ + libsasl.dll \ libxml2.dll \ nspr4.dll \ nss3.dll \ nssckbi.dll \ plc4.dll \ plds4.dll \ + saslANONYMOUS.dll \ + saslCRAMMD5.dll \ + saslDIGESTMD5.dll \ + saslGSSAPI.dll \ + saslLOGIN.dll \ + saslPLAIN.dll \ silc.dll \ silcclient.dll \ + smime3.dll \ softokn3.dll \ - smime3.dll \ ssl3.dll #build an expression for `find` to use to ignore the above files
--- a/configure.ac Sun Nov 04 22:17:45 2007 +0000 +++ b/configure.ac Mon Nov 05 00:35:07 2007 +0000 @@ -2178,66 +2178,34 @@ pidgin/pidgin.pc pidgin/pidgin-uninstalled.pc pidgin/pixmaps/Makefile - pidgin/pixmaps/animations/Makefile - pidgin/pixmaps/animations/16/Makefile - pidgin/pixmaps/buddy_icons/Makefile pidgin/pixmaps/buddy_icons/qq/Makefile - pidgin/pixmaps/dialogs/Makefile pidgin/pixmaps/dialogs/16/Makefile - pidgin/pixmaps/dialogs/16/scalable/Makefile pidgin/pixmaps/dialogs/64/Makefile - pidgin/pixmaps/dialogs/64/scalable/Makefile - pidgin/pixmaps/emblems/Makefile pidgin/pixmaps/emblems/16/Makefile - pidgin/pixmaps/emblems/16/scalable/Makefile - pidgin/pixmaps/emotes/Makefile - pidgin/pixmaps/emotes/default/Makefile pidgin/pixmaps/emotes/default/24/Makefile - pidgin/pixmaps/emotes/default/24/scalable/Makefile pidgin/pixmaps/emotes/none/Makefile - pidgin/pixmaps/icons/Makefile pidgin/pixmaps/icons/16/Makefile - pidgin/pixmaps/icons/16/scalable/Makefile pidgin/pixmaps/icons/22/Makefile - pidgin/pixmaps/icons/22/scalable/Makefile pidgin/pixmaps/icons/24/Makefile - pidgin/pixmaps/icons/24/scalable/Makefile pidgin/pixmaps/icons/32/Makefile - pidgin/pixmaps/icons/32/scalable/Makefile pidgin/pixmaps/icons/48/Makefile - pidgin/pixmaps/icons/48/scalable/Makefile - pidgin/pixmaps/protocols/Makefile pidgin/pixmaps/protocols/16/Makefile - pidgin/pixmaps/protocols/16/scalable/Makefile pidgin/pixmaps/protocols/22/Makefile - pidgin/pixmaps/protocols/22/scalable/Makefile pidgin/pixmaps/protocols/48/Makefile - pidgin/pixmaps/protocols/48/scalable/Makefile - pidgin/pixmaps/status/Makefile pidgin/pixmaps/status/11/Makefile - pidgin/pixmaps/status/11/scalable/Makefile pidgin/pixmaps/status/11/rtl/Makefile pidgin/pixmaps/status/16/Makefile pidgin/pixmaps/status/16/rtl/Makefile - pidgin/pixmaps/status/16/scalable/Makefile pidgin/pixmaps/status/22/Makefile pidgin/pixmaps/status/22/rtl/Makefile - pidgin/pixmaps/status/22/scalable/Makefile pidgin/pixmaps/status/32/Makefile pidgin/pixmaps/status/32/rtl/Makefile - pidgin/pixmaps/status/32/scalable/Makefile pidgin/pixmaps/status/48/Makefile pidgin/pixmaps/status/48/rtl/Makefile - pidgin/pixmaps/toolbar/Makefile pidgin/pixmaps/toolbar/16/Makefile - pidgin/pixmaps/toolbar/16/scalable/Makefile pidgin/pixmaps/toolbar/22/Makefile - pidgin/pixmaps/toolbar/22/scalable/Makefile - pidgin/pixmaps/tray/Makefile pidgin/pixmaps/tray/16/Makefile - pidgin/pixmaps/tray/16/scalable/Makefile pidgin/pixmaps/tray/22/Makefile - pidgin/pixmaps/tray/22/scalable/Makefile pidgin/pixmaps/tray/32/Makefile pidgin/pixmaps/tray/48/Makefile pidgin/plugins/Makefile
--- a/libpurple/buddyicon.c Sun Nov 04 22:17:45 2007 +0000 +++ b/libpurple/buddyicon.c Mon Nov 05 00:35:07 2007 +0000 @@ -116,7 +116,7 @@ { purple_debug_error("buddyicon", "Unable to create directory %s: %s\n", - dirname, strerror(errno)); + dirname, g_strerror(errno)); } } @@ -125,7 +125,7 @@ if (!fwrite(purple_imgstore_get_data(img), purple_imgstore_get_size(img), 1, file)) { purple_debug_error("buddyicon", "Error writing %s: %s\n", - path, strerror(errno)); + path, g_strerror(errno)); } else purple_debug_info("buddyicon", "Wrote cache file: %s\n", path); @@ -135,7 +135,7 @@ else { purple_debug_error("buddyicon", "Unable to create file %s: %s\n", - path, strerror(errno)); + path, g_strerror(errno)); g_free(path); return; } @@ -163,7 +163,7 @@ if (g_unlink(path)) { purple_debug_error("buddyicon", "Failed to delete %s: %s\n", - path, strerror(errno)); + path, g_strerror(errno)); } else { @@ -951,7 +951,7 @@ if (!fwrite(icon_data, icon_len, 1, file)) { purple_debug_error("buddyicon", "Error writing %s: %s\n", - path, strerror(errno)); + path, g_strerror(errno)); } else purple_debug_info("buddyicon", "Wrote migrated cache file: %s\n", path); @@ -961,7 +961,7 @@ else { purple_debug_error("buddyicon", "Unable to create file %s: %s\n", - path, strerror(errno)); + path, g_strerror(errno)); g_free(new_filename); g_free(path); @@ -1056,7 +1056,7 @@ { purple_debug_error("buddyicon", "Unable to create directory %s: %s\n", - dirname, strerror(errno)); + dirname, g_strerror(errno)); } } }
--- a/libpurple/connection.c Sun Nov 04 22:17:45 2007 +0000 +++ b/libpurple/connection.c Mon Nov 05 00:35:07 2007 +0000 @@ -432,7 +432,7 @@ { g_return_val_if_fail(gc != NULL, NULL); - return gc->password; + return gc->password ? gc->password : gc->account->password; } const char *
--- a/libpurple/core.c Sun Nov 04 22:17:45 2007 +0000 +++ b/libpurple/core.c Mon Nov 05 00:35:07 2007 +0000 @@ -378,7 +378,7 @@ if (g_rename(path, new_name)) { purple_debug_error("core", "Error renaming %s to %s: %s. Please report this at http://developer.pidgin.im\n", - path, new_name, strerror(errno)); + path, new_name, g_strerror(errno)); g_free(new_name); return FALSE; } @@ -391,7 +391,7 @@ if (symlink(new_name, old_name)) { purple_debug_warning("core", "Error symlinking %s to %s: %s. Please report this at http://developer.pidgin.im\n", - old_name, new_name, strerror(errno)); + old_name, new_name, g_strerror(errno)); } g_free(old_name); g_free(new_name); @@ -447,7 +447,7 @@ if (g_mkdir(user_dir, S_IRUSR | S_IWUSR | S_IXUSR) == -1) { purple_debug_error("core", "Error creating directory %s: %s. Please report this at http://developer.pidgin.im\n", - user_dir, strerror(errno)); + user_dir, g_strerror(errno)); g_free(status_file); g_free(old_user_dir); return FALSE; @@ -459,7 +459,7 @@ if (!(fp = g_fopen(status_file, "w"))) { purple_debug_error("core", "Error opening file %s for writing: %s. Please report this at http://developer.pidgin.im\n", - status_file, strerror(errno)); + status_file, g_strerror(errno)); g_free(status_file); g_free(old_user_dir); return FALSE; @@ -517,7 +517,7 @@ { char *name_utf8 = g_filename_to_utf8(name, -1, NULL, NULL, NULL); purple_debug_error("core", "Error reading symlink %s: %s. Please report this at http://developer.pidgin.im\n", - name_utf8, strerror(errno)); + name_utf8, g_strerror(errno)); g_free(name_utf8); g_free(name); g_dir_close(dir); @@ -555,7 +555,7 @@ if (symlink(link, logs_dir)) { purple_debug_error("core", "Error symlinking %s to %s: %s. Please report this at http://developer.pidgin.im\n", - logs_dir, link, strerror(errno)); + logs_dir, link, g_strerror(errno)); g_free(link); g_free(name); g_free(logs_dir); @@ -612,7 +612,7 @@ if (g_mkdir(new_icons_dir, S_IRUSR | S_IWUSR | S_IXUSR) == -1) { purple_debug_error("core", "Error creating directory %s: %s. Please report this at http://developer.pidgin.im\n", - new_icons_dir, strerror(errno)); + new_icons_dir, g_strerror(errno)); g_free(new_icons_dir); g_dir_close(icons_dir); g_free(name); @@ -675,7 +675,7 @@ if (!(fp = g_fopen(name, "rb"))) { purple_debug_error("core", "Error opening file %s for reading: %s. Please report this at http://developer.pidgin.im\n", - name, strerror(errno)); + name, g_strerror(errno)); g_free(name); g_dir_close(dir); g_free(status_file); @@ -687,7 +687,7 @@ if (!(new_file = g_fopen(new_name, "wb"))) { purple_debug_error("core", "Error opening file %s for writing: %s. Please report this at http://developer.pidgin.im\n", - new_name, strerror(errno)); + new_name, g_strerror(errno)); fclose(fp); g_free(new_name); g_free(name); @@ -706,7 +706,7 @@ if (size != sizeof(buf) && !feof(fp)) { purple_debug_error("core", "Error reading %s: %s. Please report this at http://developer.pidgin.im\n", - name, strerror(errno)); + name, g_strerror(errno)); fclose(new_file); fclose(fp); g_free(new_name); @@ -720,7 +720,7 @@ if (!fwrite(buf, size, 1, new_file) && ferror(new_file) != 0) { purple_debug_error("core", "Error writing %s: %s. Please report this at http://developer.pidgin.im\n", - new_name, strerror(errno)); + new_name, g_strerror(errno)); fclose(new_file); fclose(fp); g_free(new_name); @@ -735,12 +735,12 @@ if (fclose(new_file)) { purple_debug_error("core", "Error writing: %s: %s. Please report this at http://developer.pidgin.im\n", - new_name, strerror(errno)); + new_name, g_strerror(errno)); } if (fclose(fp)) { purple_debug_warning("core", "Error closing %s: %s\n", - name, strerror(errno)); + name, g_strerror(errno)); } g_free(new_name); } @@ -754,7 +754,7 @@ if (g_unlink(status_file)) { purple_debug_error("core", "Error unlinking file %s: %s. Please report this at http://developer.pidgin.im\n", - status_file, strerror(errno)); + status_file, g_strerror(errno)); g_free(status_file); return FALSE; }
--- a/libpurple/desktopitem.c Sun Nov 04 22:17:45 2007 +0000 +++ b/libpurple/desktopitem.c Mon Nov 05 00:35:07 2007 +0000 @@ -1155,7 +1155,7 @@ dfile = g_fopen(filename, "r"); if (!dfile) { - printf ("Can't open %s: %s", filename, strerror(errno)); + printf ("Can't open %s: %s", filename, g_strerror(errno)); return NULL; }
--- a/libpurple/dnsquery.c Sun Nov 04 22:17:45 2007 +0000 +++ b/libpurple/dnsquery.c Mon Nov 05 00:35:07 2007 +0000 @@ -346,7 +346,7 @@ /* Create pipes for communicating with the child process */ if (pipe(child_out) || pipe(child_in)) { purple_debug_error("dns", - "Could not create pipes: %s\n", strerror(errno)); + "Could not create pipes: %s\n", g_strerror(errno)); return NULL; } @@ -374,7 +374,7 @@ if (resolver->dns_pid == -1) { purple_debug_error("dns", "Could not create child process for DNS: %s\n", - strerror(errno)); + g_strerror(errno)); purple_dnsquery_resolver_destroy(resolver); return NULL; } @@ -416,7 +416,7 @@ return FALSE; } else if (pid < 0) { purple_debug_warning("dns", "Wait for DNS child %d failed: %s\n", - resolver->dns_pid, strerror(errno)); + resolver->dns_pid, g_strerror(errno)); purple_dnsquery_resolver_destroy(resolver); return FALSE; } @@ -430,7 +430,7 @@ rc = write(resolver->fd_in, &dns_params, sizeof(dns_params)); if (rc < 0) { purple_debug_error("dns", "Unable to write to DNS child %d: %d\n", - resolver->dns_pid, strerror(errno)); + resolver->dns_pid, g_strerror(errno)); purple_dnsquery_resolver_destroy(resolver); return FALSE; } @@ -571,7 +571,7 @@ purple_dnsquery_resolved(query_data, hosts); } else if (rc == -1) { - g_snprintf(message, sizeof(message), _("Error reading from resolver process:\n%s"), strerror(errno)); + g_snprintf(message, sizeof(message), _("Error reading from resolver process:\n%s"), g_strerror(errno)); purple_dnsquery_failed(query_data, message); } else if (rc == 0) {
--- a/libpurple/example/nullclient.c Sun Nov 04 22:17:45 2007 +0000 +++ b/libpurple/example/nullclient.c Mon Nov 05 00:35:07 2007 +0000 @@ -269,6 +269,13 @@ PurpleAccount *account; PurpleSavedStatus *status; + /* libpurple's built-in DNS resolution forks processes to perform + * blocking lookups without blocking the main process. It does not + * handle SIGCHLD itself, so if the UI does not you quickly get an army + * of zombie subprocesses marching around. + */ + signal(SIGCHLD, SIG_IGN); + init_libpurple(); printf("libpurple initialized.\n");
--- a/libpurple/ft.c Sun Nov 04 22:17:45 2007 +0000 +++ b/libpurple/ft.c Mon Nov 05 00:35:07 2007 +0000 @@ -207,15 +207,15 @@ switch(xfer_type) { case PURPLE_XFER_SEND: msg = g_strdup_printf(_("Error reading %s: \n%s.\n"), - utf8, strerror(err)); + utf8, g_strerror(err)); break; case PURPLE_XFER_RECEIVE: msg = g_strdup_printf(_("Error writing %s: \n%s.\n"), - utf8, strerror(err)); + utf8, g_strerror(err)); break; default: msg = g_strdup_printf(_("Error accessing %s: \n%s.\n"), - utf8, strerror(err)); + utf8, g_strerror(err)); break; } g_free(utf8);
--- a/libpurple/log.c Sun Nov 04 22:17:45 2007 +0000 +++ b/libpurple/log.c Mon Nov 05 00:35:07 2007 +0000 @@ -756,7 +756,7 @@ if (!fwrite(image_data, image_byte_count, 1, image_file)) { purple_debug_error("log", "Error writing %s: %s\n", - path, strerror(errno)); + path, g_strerror(errno)); fclose(image_file); /* Attempt to not leave half-written files around. */ @@ -771,7 +771,7 @@ else { purple_debug_error("log", "Unable to create file %s: %s\n", - path, strerror(errno)); + path, g_strerror(errno)); } } @@ -1108,7 +1108,7 @@ return TRUE; else if (ret == -1) { - purple_debug_error("log", "Failed to delete: %s - %s\n", data->path, strerror(errno)); + purple_debug_error("log", "Failed to delete: %s - %s\n", data->path, g_strerror(errno)); } else { @@ -1143,7 +1143,7 @@ g_free(dirname); return TRUE; } - purple_debug_info("log", "access(%s) failed: %s\n", dirname, strerror(errno)); + purple_debug_info("log", "access(%s) failed: %s\n", dirname, g_strerror(errno)); g_free(dirname); #else /* Unless and until someone writes equivalent win32 code, @@ -1638,7 +1638,7 @@ if (!(index = g_fopen(pathstr, "rb"))) { purple_debug_error("log", "Failed to open index file \"%s\" for reading: %s\n", - pathstr, strerror(errno)); + pathstr, g_strerror(errno)); /* Fall through so that we'll parse the log file. */ } @@ -1675,7 +1675,7 @@ if (!(file = g_fopen(purple_stringref_value(pathref), "rb"))) { purple_debug_error("log", "Failed to open log file \"%s\" for reading: %s\n", - purple_stringref_value(pathref), strerror(errno)); + purple_stringref_value(pathref), g_strerror(errno)); purple_stringref_unref(pathref); g_free(pathstr); return NULL; @@ -1684,7 +1684,7 @@ index_tmp = g_strdup_printf("%s.XXXXXX", pathstr); if ((index_fd = g_mkstemp(index_tmp)) == -1) { purple_debug_error("log", "Failed to open index temp file: %s\n", - strerror(errno)); + g_strerror(errno)); g_free(pathstr); g_free(index_tmp); index = NULL; @@ -1692,7 +1692,7 @@ if ((index = fdopen(index_fd, "wb")) == NULL) { purple_debug_error("log", "Failed to fdopen() index temp file: %s\n", - strerror(errno)); + g_strerror(errno)); close(index_fd); if (index_tmp != NULL) { @@ -1828,7 +1828,7 @@ if (g_rename(index_tmp, pathstr)) { purple_debug_warning("log", "Failed to rename index temp file \"%s\" to \"%s\": %s\n", - index_tmp, pathstr, strerror(errno)); + index_tmp, pathstr, g_strerror(errno)); g_unlink(index_tmp); g_free(index_tmp); }
--- a/libpurple/nat-pmp.c Sun Nov 04 22:17:45 2007 +0000 +++ b/libpurple/nat-pmp.c Mon Nov 05 00:35:07 2007 +0000 @@ -312,7 +312,7 @@ if (sendto(sendfd, &req, sizeof(req), 0, (struct sockaddr *)(gateway), sizeof(struct sockaddr)) < 0) { - purple_debug_info("nat-pmp", "There was an error sending the NAT-PMP public IP request! (%s)\n", strerror(errno)); + purple_debug_info("nat-pmp", "There was an error sending the NAT-PMP public IP request! (%s)\n", g_strerror(errno)); g_free(gateway); pmp_info.status = PURPLE_PMP_STATUS_UNABLE_TO_DISCOVER; return NULL; @@ -320,7 +320,7 @@ if (setsockopt(sendfd, SOL_SOCKET, SO_RCVTIMEO, &req_timeout, sizeof(req_timeout)) < 0) { - purple_debug_info("nat-pmp", "There was an error setting the socket's options! (%s)\n", strerror(errno)); + purple_debug_info("nat-pmp", "There was an error setting the socket's options! (%s)\n", g_strerror(errno)); g_free(gateway); pmp_info.status = PURPLE_PMP_STATUS_UNABLE_TO_DISCOVER; return NULL; @@ -332,7 +332,7 @@ { if (errno != EAGAIN) { - purple_debug_info("nat-pmp", "There was an error receiving the response from the NAT-PMP device! (%s)\n", strerror(errno)); + purple_debug_info("nat-pmp", "There was an error receiving the response from the NAT-PMP device! (%s)\n", g_strerror(errno)); g_free(gateway); pmp_info.status = PURPLE_PMP_STATUS_UNABLE_TO_DISCOVER; return NULL; @@ -432,13 +432,13 @@ /* TODO: Non-blocking! */ success = (sendto(sendfd, &req, sizeof(req), 0, (struct sockaddr *)(gateway), sizeof(struct sockaddr)) >= 0); if (!success) - purple_debug_info("nat-pmp", "There was an error sending the NAT-PMP mapping request! (%s)\n", strerror(errno)); + purple_debug_info("nat-pmp", "There was an error sending the NAT-PMP mapping request! (%s)\n", g_strerror(errno)); if (success) { success = (setsockopt(sendfd, SOL_SOCKET, SO_RCVTIMEO, &req_timeout, sizeof(req_timeout)) >= 0); if (!success) - purple_debug_info("nat-pmp", "There was an error setting the socket's options! (%s)\n", strerror(errno)); + purple_debug_info("nat-pmp", "There was an error setting the socket's options! (%s)\n", g_strerror(errno)); } if (success) @@ -448,7 +448,7 @@ success = ((recvfrom(sendfd, resp, sizeof(PurplePmpMapResponse), 0, NULL, NULL) >= 0) || (errno == EAGAIN)); if (!success) - purple_debug_info("nat-pmp", "There was an error receiving the response from the NAT-PMP device! (%s)\n", strerror(errno)); + purple_debug_info("nat-pmp", "There was an error receiving the response from the NAT-PMP device! (%s)\n", g_strerror(errno)); } if (success)
--- a/libpurple/network.c Sun Nov 04 22:17:45 2007 +0000 +++ b/libpurple/network.c Mon Nov 05 00:35:07 2007 +0000 @@ -285,7 +285,7 @@ #ifndef _WIN32 purple_debug_warning("network", "getaddrinfo: %s\n", gai_strerror(errnum)); if (errnum == EAI_SYSTEM) - purple_debug_warning("network", "getaddrinfo: system error: %s\n", strerror(errno)); + purple_debug_warning("network", "getaddrinfo: system error: %s\n", g_strerror(errno)); #else purple_debug_warning("network", "getaddrinfo: Error Code = %d\n", errnum); #endif @@ -302,7 +302,7 @@ if (listenfd < 0) continue; if (setsockopt(listenfd, SOL_SOCKET, SO_REUSEADDR, &on, sizeof(on)) != 0) - purple_debug_warning("network", "setsockopt: %s\n", strerror(errno)); + purple_debug_warning("network", "setsockopt: %s\n", g_strerror(errno)); if (bind(listenfd, next->ai_addr, next->ai_addrlen) == 0) break; /* success */ /* XXX - It is unclear to me (datallah) whether we need to be @@ -318,26 +318,26 @@ struct sockaddr_in sockin; if ((listenfd = socket(AF_INET, socket_type, 0)) < 0) { - purple_debug_warning("network", "socket: %s\n", strerror(errno)); + purple_debug_warning("network", "socket: %s\n", g_strerror(errno)); return NULL; } if (setsockopt(listenfd, SOL_SOCKET, SO_REUSEADDR, &on, sizeof(on)) != 0) - purple_debug_warning("network", "setsockopt: %s\n", strerror(errno)); + purple_debug_warning("network", "setsockopt: %s\n", g_strerror(errno)); memset(&sockin, 0, sizeof(struct sockaddr_in)); sockin.sin_family = PF_INET; sockin.sin_port = htons(port); if (bind(listenfd, (struct sockaddr *)&sockin, sizeof(struct sockaddr_in)) != 0) { - purple_debug_warning("network", "bind: %s\n", strerror(errno)); + purple_debug_warning("network", "bind: %s\n", g_strerror(errno)); close(listenfd); return NULL; } #endif if (socket_type == SOCK_STREAM && listen(listenfd, 4) != 0) { - purple_debug_warning("network", "listen: %s\n", strerror(errno)); + purple_debug_warning("network", "listen: %s\n", g_strerror(errno)); close(listenfd); return NULL; } @@ -426,7 +426,7 @@ len = sizeof(addr); if (getsockname(fd, (struct sockaddr *) &addr, &len) == -1) { - purple_debug_warning("network", "getsockname: %s\n", strerror(errno)); + purple_debug_warning("network", "getsockname: %s\n", g_strerror(errno)); return 0; }
--- a/libpurple/plugins/tcl/tcl.c Sun Nov 04 22:17:45 2007 +0000 +++ b/libpurple/plugins/tcl/tcl.c Mon Nov 05 00:35:07 2007 +0000 @@ -198,7 +198,7 @@ } if (ferror(fp)) { - purple_debug(PURPLE_DEBUG_ERROR, "tcl", "error reading %s (%s)\n", plugin->path, strerror(errno)); + purple_debug(PURPLE_DEBUG_ERROR, "tcl", "error reading %s (%s)\n", plugin->path, g_strerror(errno)); g_free(buf); fclose(fp); return FALSE;
--- a/libpurple/protocols/bonjour/Makefile.mingw Sun Nov 04 22:17:45 2007 +0000 +++ b/libpurple/protocols/bonjour/Makefile.mingw Mon Nov 05 00:35:07 2007 +0000 @@ -29,7 +29,7 @@ -I$(GTK_TOP)/include \ -I$(GTK_TOP)/include/glib-2.0 \ -I$(GTK_TOP)/lib/glib-2.0/include \ - -I$(BONJOUR_TOP)/include \ + -I$(BONJOUR_TOP)/Include \ -I$(LIBXML2_TOP)/include \ -I$(PURPLE_TOP) \ -I$(PURPLE_TOP)/win32 \
--- a/libpurple/protocols/bonjour/bonjour.c Sun Nov 04 22:17:45 2007 +0000 +++ b/libpurple/protocols/bonjour/bonjour.c Mon Nov 05 00:35:07 2007 +0000 @@ -648,7 +648,7 @@ /* TODO: Avoid 'localhost,' if possible */ if (gethostname(hostname, 255) != 0) { purple_debug_warning("bonjour", "Error when getting host name: %s. Using \"localhost.\"\n", - strerror(errno)); + g_strerror(errno)); strcpy(hostname, "localhost"); } default_hostname = g_strdup(hostname);
--- a/libpurple/protocols/bonjour/jabber.c Sun Nov 04 22:17:45 2007 +0000 +++ b/libpurple/protocols/bonjour/jabber.c Mon Nov 05 00:35:07 2007 +0000 @@ -244,7 +244,7 @@ return; else if (ret <= 0) { PurpleConversation *conv; - const char *error = strerror(errno); + const char *error = g_strerror(errno); purple_debug_error("bonjour", "Error sending message to buddy %s error: %s\n", purple_buddy_get_name(pb), error ? error : "(null)"); @@ -287,7 +287,7 @@ ret = 0; else if (ret <= 0) { PurpleConversation *conv; - const char *error = strerror(errno); + const char *error = g_strerror(errno); purple_debug_error("bonjour", "Error sending message to buddy %s error: %s\n", purple_buddy_get_name(pb), error ? error : "(null)"); @@ -337,7 +337,7 @@ if (errno != EAGAIN) { BonjourBuddy *bb = pb->proto_data; - purple_debug_warning("bonjour", "receive error: %s\n", strerror(errno)); + purple_debug_warning("bonjour", "receive error: %s\n", g_strerror(errno)); bonjour_jabber_close_conversation(bb->conversation); bb->conversation = NULL; @@ -427,7 +427,7 @@ if (ret == -1 && errno == EAGAIN) return; else if (ret <= 0) { - const char *err = strerror(errno); + const char *err = g_strerror(errno); PurpleConversation *conv; purple_debug_error("bonjour", "Error starting stream with buddy %s at %s:%d error: %s\n", @@ -482,7 +482,7 @@ if (ret == -1 && errno == EAGAIN) ret = 0; else if (ret <= 0) { - const char *err = strerror(errno); + const char *err = g_strerror(errno); purple_debug_error("bonjour", "Error starting stream with buddy %s at %s:%d error: %s\n", purple_buddy_get_name(pb), bb->ip ? bb->ip : "(null)", bb->port_p2pj, err ? err : "(null)"); @@ -583,7 +583,7 @@ /* Open a listening socket for incoming conversations */ if ((data->socket = socket(PF_INET, SOCK_STREAM, 0)) < 0) { - purple_debug_error("bonjour", "Cannot open socket: %s\n", strerror(errno)); + purple_debug_error("bonjour", "Cannot open socket: %s\n", g_strerror(errno)); purple_connection_error(data->account->gc, _("Cannot open socket")); return -1; } @@ -591,7 +591,7 @@ /* Make the socket reusable */ if (setsockopt(data->socket, SOL_SOCKET, SO_REUSEADDR, &yes, sizeof(int)) != 0) { - purple_debug_error("bonjour", "Error setting socket options: %s\n", strerror(errno)); + purple_debug_error("bonjour", "Error setting socket options: %s\n", g_strerror(errno)); purple_connection_error(data->account->gc, _("Error setting socket options")); return -1; } @@ -615,7 +615,7 @@ /* On no! We tried 10 ports and could not bind to ANY of them */ if (!bind_successful) { - purple_debug_error("bonjour", "Cannot bind socket: %s\n", strerror(errno)); + purple_debug_error("bonjour", "Cannot bind socket: %s\n", g_strerror(errno)); purple_connection_error(data->account->gc, _("Could not bind socket to port")); return -1; } @@ -623,7 +623,7 @@ /* Attempt to listen on the bound socket */ if (listen(data->socket, 10) != 0) { - purple_debug_error("bonjour", "Cannot listen on socket: %s\n", strerror(errno)); + purple_debug_error("bonjour", "Cannot listen on socket: %s\n", g_strerror(errno)); purple_connection_error(data->account->gc, _("Could not listen on socket")); return -1; } @@ -670,7 +670,7 @@ } if (!bonjour_jabber_stream_init(pb, source)) { - const char *err = strerror(errno); + const char *err = g_strerror(errno); PurpleConversation *conv; purple_debug_error("bonjour", "Error starting stream with buddy %s at %s:%d error: %s\n",
--- a/libpurple/protocols/irc/dcc_send.c Sun Nov 04 22:17:45 2007 +0000 +++ b/libpurple/protocols/irc/dcc_send.c Mon Nov 05 00:35:07 2007 +0000 @@ -251,7 +251,7 @@ * to the nonblocking nature of the listening socket, so we'll * just try again next time */ /* Let's print an error message anyway */ - purple_debug_warning("irc", "accept: %s\n", strerror(errno)); + purple_debug_warning("irc", "accept: %s\n", g_strerror(errno)); return; }
--- a/libpurple/protocols/jabber/Makefile.mingw Sun Nov 04 22:17:45 2007 +0000 +++ b/libpurple/protocols/jabber/Makefile.mingw Mon Nov 05 00:35:07 2007 +0000 @@ -88,6 +88,21 @@ INCLUDE_PATHS += -I$(CYRUS_SASL_TOP)/include LIB_PATHS += -L$(CYRUS_SASL_TOP)/lib LIBS += -llibsasl +CYRUS_SASL_DLLS = \ + $(CYRUS_SASL_TOP)/bin/comerr32.dll \ + $(CYRUS_SASL_TOP)/bin/gssapi32.dll \ + $(CYRUS_SASL_TOP)/bin/k5sprt32.dll \ + $(CYRUS_SASL_TOP)/bin/krb5_32.dll \ + $(CYRUS_SASL_TOP)/bin/libsasl.dll + +CYRUS_SASL_PLUGINS = \ + $(CYRUS_SASL_TOP)/bin/sasl2/saslANONYMOUS.dll \ + $(CYRUS_SASL_TOP)/bin/sasl2/saslCRAMMD5.dll \ + $(CYRUS_SASL_TOP)/bin/sasl2/saslDIGESTMD5.dll \ + $(CYRUS_SASL_TOP)/bin/sasl2/saslGSSAPI.dll \ + $(CYRUS_SASL_TOP)/bin/sasl2/saslLOGIN.dll \ + $(CYRUS_SASL_TOP)/bin/sasl2/saslPLAIN.dll + endif include $(PIDGIN_COMMON_RULES) @@ -102,6 +117,11 @@ install: all $(DLL_INSTALL_DIR) cp $(XMPP_TARGET).dll $(DLL_INSTALL_DIR) cp $(TARGET).dll $(PURPLE_INSTALL_DIR) +ifeq ($(CYRUS_SASL), 1) + mkdir -p $(PURPLE_INSTALL_DIR)/sasl2 + cp $(CYRUS_SASL_DLLS) $(PURPLE_INSTALL_DIR) + cp $(CYRUS_SASL_PLUGINS) $(PURPLE_INSTALL_DIR)/sasl2 +endif $(OBJECTS): $(PURPLE_CONFIG_H)
--- a/libpurple/protocols/jabber/buddy.c Sun Nov 04 22:17:45 2007 +0000 +++ b/libpurple/protocols/jabber/buddy.c Mon Nov 05 00:35:07 2007 +0000 @@ -2252,6 +2252,16 @@ xmlnode *query; JabberIq *iq; char *dir_server = data; + const char *type; + + /* if they've cancelled the search, we're + * just going to get an error if we send + * a cancel, so skip it */ + type = xmlnode_get_attrib(result, "type"); + if(type && !strcmp(type, "cancel")) { + g_free(dir_server); + return; + } iq = jabber_iq_new_query(js, JABBER_IQ_SET, "jabber:iq:search"); query = xmlnode_get_child(iq->node, "query");
--- a/libpurple/protocols/jabber/libxmpp.c Sun Nov 04 22:17:45 2007 +0000 +++ b/libpurple/protocols/jabber/libxmpp.c Mon Nov 05 00:35:07 2007 +0000 @@ -193,6 +193,9 @@ init_plugin(PurplePlugin *plugin) { #ifdef HAVE_CYRUS_SASL +#ifdef _WIN32 + gchar *sasldir; +#endif int ret; #endif PurpleAccountUserSplit *split; @@ -237,6 +240,11 @@ /* XXX - If any other plugin wants SASL this won't be good ... */ #ifdef HAVE_CYRUS_SASL +#ifdef _WIN32 + sasldir = g_build_filename(wpurple_install_dir(), "sasl2", NULL); + sasl_set_path(SASL_PATH_TYPE_PLUGIN, sasldir); + g_free(sasldir); +#endif if ((ret = sasl_client_init(NULL)) != SASL_OK) { purple_debug_error("xmpp", "Error (%d) initializing SASL.\n", ret); }
--- a/libpurple/protocols/jabber/si.c Sun Nov 04 22:17:45 2007 +0000 +++ b/libpurple/protocols/jabber/si.c Mon Nov 05 00:35:07 2007 +0000 @@ -536,7 +536,7 @@ if(acceptfd == -1 && (errno == EAGAIN || errno == EWOULDBLOCK)) return; else if(acceptfd == -1) { - purple_debug_warning("jabber", "accept: %s\n", strerror(errno)); + purple_debug_warning("jabber", "accept: %s\n", g_strerror(errno)); return; }
--- a/libpurple/protocols/msn/Makefile.am Sun Nov 04 22:17:45 2007 +0000 +++ b/libpurple/protocols/msn/Makefile.am Mon Nov 05 00:35:07 2007 +0000 @@ -52,6 +52,8 @@ slpsession.h \ soap.c\ soap.h\ + soap2.c \ + soap2.h \ state.c \ state.h \ switchboard.c \
--- a/libpurple/protocols/msn/Makefile.mingw Sun Nov 04 22:17:45 2007 +0000 +++ b/libpurple/protocols/msn/Makefile.mingw Mon Nov 05 00:35:07 2007 +0000 @@ -61,6 +61,7 @@ slpmsg.c \ slpsession.c \ soap.c\ + soap2.c\ state.c \ switchboard.c \ sync.c \
--- a/libpurple/protocols/msn/contact.c Sun Nov 04 22:17:45 2007 +0000 +++ b/libpurple/protocols/msn/contact.c Mon Nov 05 00:35:07 2007 +0000 @@ -28,6 +28,7 @@ #include "contact.h" #include "xmlnode.h" #include "group.h" +#include "soap2.h" const char *MsnSoapPartnerScenarioText[] = { @@ -47,6 +48,11 @@ "Pending" }; +typedef struct { + MsnContact *contact; + MsnSoapPartnerScenario which; +} GetContactListCbData; + /* new a contact */ MsnContact * msn_contact_new(MsnSession *session) @@ -55,7 +61,6 @@ contact = g_new0(MsnContact, 1); contact->session = session; - contact->soapconn = msn_soap_new(session,contact,1); return contact; } @@ -64,15 +69,18 @@ void msn_contact_destroy(MsnContact *contact) { - msn_soap_destroy(contact->soapconn); g_free(contact); } MsnCallbackState * -msn_callback_state_new(void) +msn_callback_state_new(MsnSession *session) { - return g_new0(MsnCallbackState, 1); -} + MsnCallbackState *state = g_new0(MsnCallbackState, 1); + + state->session = session; + + return state; +} void msn_callback_state_free(MsnCallbackState *state) @@ -92,46 +100,56 @@ void msn_callback_state_set_who(MsnCallbackState *state, const gchar *who) { + gchar *nval; g_return_if_fail(state != NULL); + nval = g_strdup(who); g_free(state->who); - state->who = g_strdup(who); + state->who = nval; } void msn_callback_state_set_uid(MsnCallbackState *state, const gchar *uid) { + gchar *nval; g_return_if_fail(state != NULL); + nval = g_strdup(uid); g_free(state->uid); - state->uid = g_strdup(uid); + state->uid = nval; } void msn_callback_state_set_old_group_name(MsnCallbackState *state, const gchar *old_group_name) { + gchar *nval; g_return_if_fail(state != NULL); + nval = g_strdup(old_group_name); g_free(state->old_group_name); - state->old_group_name = g_strdup(old_group_name); + state->old_group_name = nval; } void msn_callback_state_set_new_group_name(MsnCallbackState *state, const gchar *new_group_name) { + gchar *nval; g_return_if_fail(state != NULL); + nval = g_strdup(new_group_name); g_free(state->new_group_name); - state->new_group_name = g_strdup(new_group_name); + state->new_group_name = nval; } void msn_callback_state_set_guid(MsnCallbackState *state, const gchar *guid) { + gchar *nval; g_return_if_fail(state != NULL); + nval = g_strdup(guid); g_free(state->guid); - state->guid = g_strdup(guid); + state->guid = nval; } @@ -151,36 +169,6 @@ state->action |= action; } -/*contact SOAP server login error*/ -static void -msn_contact_login_error_cb(MsnSoapConn *soapconn, PurpleSslConnection *gsc, PurpleSslErrorType error) -{ - MsnSession *session; - - session = soapconn->session; - g_return_if_fail(session != NULL); - - msn_session_set_error(session, MSN_ERROR_SERV_DOWN, _("Unable to connect to contact server")); -} - -/*msn contact SOAP server connect process*/ -static gboolean -msn_contact_login_connect_cb(MsnSoapConn *soapconn, PurpleSslConnection *gsc) -{ - MsnSession * session; - MsnContact *contact; - - contact = soapconn->parent; - g_return_val_if_fail(contact != NULL, TRUE); - - session = contact->session; - g_return_val_if_fail(session != NULL, FALSE); - - /*login ok!We can retrieve the contact list*/ -// msn_get_contact_list(contact, MSN_PS_INITIAL, NULL); - return TRUE; -} - /*get MSN member role utility*/ static MsnListId msn_get_memberrole(const char *role) @@ -219,37 +207,20 @@ } /* Create the AddressBook in the server, if we don't have one */ -static gboolean -msn_create_address_cb(MsnSoapConn *soapconn) +static void +msn_create_address_cb(MsnSoapMessage *req, MsnSoapMessage *resp, gpointer data) { - MsnContact *contact; - - if (soapconn->body == NULL) - return TRUE; - - contact = soapconn->parent; - g_return_val_if_fail(contact != NULL, TRUE); - - purple_debug_info("MSN AddressBook", "Address Book successfully created!\n"); - msn_get_address_book(contact, MSN_PS_INITIAL, NULL, NULL); - -// msn_soap_free_read_buf(soapconn); - return TRUE; -} - -static void -msn_create_address_written_cb(MsnSoapConn *soapconn) -{ - purple_debug_info("MSN AddressBook","AddressBookAdd written\n"); - soapconn->read_cb = msn_create_address_cb; - - return; + if (resp && msn_soap_xml_get(resp->xml, "Body/Fault") == NULL) { + purple_debug_info("msnab", "Address Book successfully created!\n"); + msn_get_address_book((MsnContact *)data, MSN_PS_INITIAL, NULL, NULL); + } else { + purple_debug_info("msnab", "Address Book creation failed!\n"); + } } static void msn_create_address_book(MsnContact * contact) { - MsnSoapReq *soap_request; gchar *body; g_return_if_fail(contact != NULL); @@ -257,323 +228,185 @@ g_return_if_fail(contact->session->user != NULL); g_return_if_fail(contact->session->user->passport != NULL); - purple_debug_info("MSN AddressBook","Creating an Address Book.\n"); + purple_debug_info("msnab","Creating an Address Book.\n"); body = g_strdup_printf(MSN_ADD_ADDRESSBOOK_TEMPLATE, contact->session->user->passport); - soap_request = msn_soap_request_new(MSN_CONTACT_SERVER, - MSN_ADDRESS_BOOK_POST_URL,MSN_ADD_ADDRESSBOOK_SOAP_ACTION, - body, - NULL, - msn_create_address_cb, - msn_create_address_written_cb, - msn_contact_connect_init); - msn_soap_post(contact->soapconn, soap_request); + msn_soap_message_send(contact->session, + msn_soap_message_new(MSN_ADD_ADDRESSBOOK_SOAP_ACTION, + xmlnode_from_str(body, -1)), + MSN_CONTACT_SERVER, MSN_ADDRESS_BOOK_POST_URL, msn_create_address_cb, + contact); g_free(body); - - return; +} + +static void +msn_parse_each_member(MsnSession *session, xmlnode *member, const char *node, + MsnListId list) +{ + char *passport = xmlnode_get_data(xmlnode_get_child(member, node)); + char *type = xmlnode_get_data(xmlnode_get_child(member, "Type")); + char *member_id = xmlnode_get_data(xmlnode_get_child(member, "MembershipId")); + MsnUser *user = msn_userlist_find_add_user(session->userlist, passport, NULL); + + purple_debug_info("msncl","%s name: %s, Type: %s, MembershipID: %s\n", + node, passport, type, member_id == NULL ? "(null)" : member_id); + + if (member_id) { + user->membership_id[list] = atoi(member_id); + } + + msn_got_lst_user(session, user, 1 << list, NULL); + + g_free(passport); + g_free(type); + g_free(member_id); +} + +static void +msn_parse_each_service(MsnSession *session, xmlnode *service) +{ + xmlnode *type; + + if ((type = msn_soap_xml_get(service, "Info/Handle/Type"))) { + char *type_str = xmlnode_get_data(type); + + if (g_str_equal(type_str, "Profile")) { + /* Process Windows Live 'Messenger Roaming Identity' */ + } else if (g_str_equal(type_str, "Messenger")) { + xmlnode *lastchange = xmlnode_get_child(service, "LastChange"); + char *lastchange_str = xmlnode_get_data(lastchange); + xmlnode *membership; + + purple_debug_info("msncl","last change: %s\n", lastchange_str); + purple_account_set_string(session->account, "CLLastChange", + lastchange_str); + + for (membership = msn_soap_xml_get(service, + "Memberships/Membership"); + membership; membership = xmlnode_get_next_twin(membership)) { + + xmlnode *role = xmlnode_get_child(membership, "MemberRole"); + char *role_str = xmlnode_get_data(role); + MsnListId list = msn_get_memberrole(role_str); + xmlnode *member; + + purple_debug_info("msncl", "MemberRole role: %s, list: %d\n", + role_str, list); + + for (member = msn_soap_xml_get(membership, "Members/Member"); + member; member = xmlnode_get_next_twin(member)) { + const char *member_type = xmlnode_get_attrib(member, "type"); + if (g_str_equal(member_type, "PassportMember")) { + msn_parse_each_member(session, member, "PassportName", + list); + } else if (g_str_equal(member_type, "PhoneMember")) { + + } else if (g_str_equal(member_type, "EmailMember")) { + msn_parse_each_member(session, member, "Email", list); + } + } + + g_free(role_str); + } + + g_free(lastchange_str); + } + + g_free(type_str); + } } /*parse contact list*/ static void -msn_parse_contact_list(MsnContact * contact) +msn_parse_contact_list(MsnContact *contact, xmlnode *node) { - MsnSession * session; - MsnListOp list_op = 0; - MsnListId list; - char * passport, *typedata; - xmlnode *fault, *faultstringnode, *faultdetail, *errorcode; - xmlnode *node, *body, *response, *result, *services; - xmlnode *service, *memberships, *info, *handle, *handletype; - xmlnode *membershipnode, *members, *member, *passportNode; - - session = contact->session; - node = xmlnode_from_str(contact->soapconn->body, contact->soapconn->body_len); - - if (node == NULL) { - purple_debug_error("MSNCL","Unable to parse SOAP data!\n"); - return; - } - - purple_debug_misc("MSNCL","Parsing contact list with size %d\n", contact->soapconn->body_len); + xmlnode *fault, *faultnode; - purple_debug_misc("MSNCL","Root node @ %p: Name: '%s', child: '%s', lastchild: '%s'\n", node, - node->name ? node->name : "(null)", - (node->child && node->child->name) ? node->child->name : "(null)", - (node->lastchild && node->lastchild->name) ? node->lastchild->name : "(null)"); - - body = xmlnode_get_child(node, "Body"); - - if (body == NULL) { - purple_debug_warning("MSNCL", "Failed to parse contact list Body node\n"); - xmlnode_free(node); - return; - } - purple_debug_info("MSNCL","Body @ %p: Name: '%s'\n",body,body->name); - - /* Did we receive a <Fault> ? */ - if ( (fault = xmlnode_get_child(body, "Fault")) != NULL) { - purple_debug_info("MSNCL","Fault received from SOAP server!\n"); - - if ( (faultstringnode = xmlnode_get_child(fault, "faultstring")) != NULL ) { - gchar * faultstring = xmlnode_get_data(faultstringnode); - purple_debug_info("MSNCL", "Faultstring: %s\n", faultstring ? faultstring : "(null)"); + /* we may get a response if our cache data is too old: + * + * <faultstring>Need to do full sync. Can't sync deltas Client + * has too old a copy for us to do a delta sync</faultstring> + * + * this is not handled yet + */ + if ((fault = msn_soap_xml_get(node, "Body/Fault"))) { + if ((faultnode = xmlnode_get_child(fault, "faultstring"))) { + char *faultstring = xmlnode_get_data(faultnode); + purple_debug_info("msncl", "Retrieving contact list failed: %s\n", + faultstring); g_free(faultstring); } - if ( (faultdetail = xmlnode_get_child(fault, "detail")) != NULL ) { - purple_debug_info("MSNCL","detail @ %p, name: %s\n",faultdetail, faultdetail->name); - - if ( (errorcode = xmlnode_get_child(faultdetail, "errorcode")) != NULL ) { - purple_debug_info("MSNCL","errorcode @ %p, name: %s\n", errorcode, errorcode->name); - - if (errorcode->child != NULL) { - gchar *errorcodestring = xmlnode_get_data(errorcode); - purple_debug_info("MSNCL", "Error Code: %s\n", errorcodestring ? errorcodestring : "(null)"); - - if (errorcodestring && !strncmp(errorcodestring, "ABDoesNotExist", 14) ) { - xmlnode_free(node); - g_free(errorcodestring); - msn_create_address_book(contact); - return; - } - g_free(errorcodestring); - } - } - } - xmlnode_free(node); - msn_get_contact_list(contact, MSN_PS_INITIAL, NULL); - return; - } - - response = xmlnode_get_child(body,"FindMembershipResponse"); - - if (response == NULL) { - /* we may get a response if our cache data is too old: - * - * <faultstring>Need to do full sync. Can't sync deltas Client - * has too old a copy for us to do a delta sync</faultstring> - */ - xmlnode_free(node); - msn_get_contact_list(contact, MSN_PS_INITIAL, NULL); - return; - } - purple_debug_info("MSNCL","FindMembershipResponse @ %p: Name: '%s'\n",response,response->name); + if ((faultnode = msn_soap_xml_get(fault, "detail/errorcode"))) { + char *errorcode = xmlnode_get_data(faultnode); - result = xmlnode_get_child(response,"FindMembershipResult"); - if (result == NULL) { - purple_debug_warning("MSNCL","Received No Update!\n"); - xmlnode_free(node); - return; - } - purple_debug_info("MSNCL","Result @ %p: Name: '%s'\n", result, result->name); - - if ( (services = xmlnode_get_child(result,"Services")) == NULL) { - purple_debug_misc("MSNCL","No <Services> received.\n"); - xmlnode_free(node); - return; - } - - purple_debug_info("MSNCL","Services @ %p\n",services); - - for (service = xmlnode_get_child(services, "Service"); service; - service = xmlnode_get_next_twin(service)) { - purple_debug_info("MSNCL","Service @ %p\n",service); + if (g_str_equal(errorcode, "ABDoesNotExist")) { + msn_create_address_book(contact); + g_free(errorcode); + return; + } - if ( (info = xmlnode_get_child(service,"Info")) == NULL ) { - purple_debug_error("MSNCL","Error getting 'Info' child node\n"); - continue; - } - if ( (handle = xmlnode_get_child(info,"Handle")) == NULL ) { - purple_debug_error("MSNCL","Error getting 'Handle' child node\n"); - continue; - } - if ( (handletype = xmlnode_get_child(handle,"Type")) == NULL ) { - purple_debug_error("MSNCL","Error getting 'Type' child node\n"); - continue; - } - - if ( (typedata = xmlnode_get_data(handletype)) == NULL) { - purple_debug_error("MSNCL","Error retrieving data from 'Type' child node\n"); - continue; - } - - purple_debug_info("MSNCL","processing '%s' Service\n", typedata); - - if ( !g_strcasecmp(typedata, "Profile") ) { - /* Process Windows Live 'Messenger Roaming Identity' */ - g_free(typedata); - continue; + g_free(errorcode); } - if ( !g_strcasecmp(typedata, "Messenger") ) { - char *LastChangeStr = NULL; - xmlnode *LastChangeNode; - - /*Last Change Node*/ - if ((LastChangeNode = xmlnode_get_child(service, "LastChange"))) - LastChangeStr = xmlnode_get_data(LastChangeNode); - purple_debug_info("MSNCL","LastChangeNode: '%s'\n",LastChangeStr ? LastChangeStr : "(null)"); - purple_account_set_string(session->account, "CLLastChange", LastChangeStr); - g_free(LastChangeStr); - - memberships = xmlnode_get_child(service,"Memberships"); - if (memberships == NULL) { - purple_debug_warning("MSNCL","Memberships = NULL, cleaning up and returning.\n"); - g_free(typedata); - xmlnode_free(node); - return; - } - purple_debug_info("MSNCL","Memberships @ %p: Name: '%s'\n",memberships,memberships->name); - for (membershipnode = xmlnode_get_child(memberships, "Membership"); membershipnode; - membershipnode = xmlnode_get_next_twin(membershipnode)){ - xmlnode *roleNode; - char *role = NULL; - list = 0; - - if ((roleNode = xmlnode_get_child(membershipnode,"MemberRole"))) { - role = xmlnode_get_data(roleNode); - list = msn_get_memberrole(role); - } - list_op = 1 << list; - - purple_debug_info("MSNCL","MemberRole role: %s, list_op: %d\n", role ? role : "(null)", list_op); - - g_free(role); - - members = xmlnode_get_child(membershipnode, "Members"); - for (member = xmlnode_get_child(members, "Member"); member; - member = xmlnode_get_next_twin(member)){ - MsnUser *user = NULL; - xmlnode *typeNode, *membershipIdNode = NULL; - gchar *type, *membershipId = NULL; - const char *member_type = xmlnode_get_attrib(member, "type"); - - if (!member_type) { - purple_debug_error("msn", "No Member Type specified for Member.\n"); - continue; - } - - if(!g_strcasecmp(member_type, "PassportMember") ) { - passport = type = NULL; - if ((passportNode = xmlnode_get_child(member, "PassportName"))) - passport = xmlnode_get_data(passportNode); - if ((typeNode = xmlnode_get_child(member, "Type"))) - type = xmlnode_get_data(typeNode); - purple_debug_info("MSNCL","Passport name: '%s', Type: %s\n", passport ? passport : "(null)", type ? type : "(null)"); - /* Why do we even bother parsing it just to free it??? */ - g_free(type); - - user = msn_userlist_find_add_user(session->userlist,passport,NULL); - g_free(passport); - - membershipIdNode = xmlnode_get_child(member,"MembershipId"); - if (membershipIdNode != NULL) { - membershipId = xmlnode_get_data(membershipIdNode); - if (membershipId != NULL) { - user->membership_id[list] = atoi(membershipId); - g_free(membershipId); - } - } + msn_get_contact_list(contact, MSN_PS_INITIAL, NULL); + } else { + xmlnode *service; - msn_got_lst_user(session, user, list_op, NULL); - } - else if (!g_strcasecmp(member_type, "PhoneMember")) { - purple_debug_info("msn", "Recieved Phone Member; ignoring.\n"); - } - else if (!g_strcasecmp(member_type, "EmailMember")) { - xmlnode *emailNode; - passport = NULL; - - if ((emailNode = xmlnode_get_child(member, "Email"))) - passport = xmlnode_get_data(emailNode); - purple_debug_info("MSNCL","Email Member: Name: '%s', list_op: %d\n", passport ? passport : "(null)", list_op); - - user = msn_userlist_find_add_user(session->userlist, passport, NULL); - g_free(passport); - - membershipIdNode = xmlnode_get_child(member,"MembershipId"); - if (membershipIdNode != NULL) { - membershipId = xmlnode_get_data(membershipIdNode); - if (membershipId != NULL) { - user->membership_id[list] = atoi(membershipId); - g_free(membershipId); - } - } - - msn_got_lst_user(session, user, list_op, NULL); - } else { - purple_debug_info("msn", "Unknown Member type: %s\n", member_type); - } - } - } + for (service = msn_soap_xml_get(node, "Body/FindMembershipResponse/" + "FindMembershipResult/Services/Service"); + service; service = xmlnode_get_next_twin(service)) { + msn_parse_each_service(contact->session, service); } - g_free(typedata); } - - xmlnode_free(node); /* Free the whole XML tree */ -} - -static gboolean -msn_get_contact_list_cb(MsnSoapConn *soapconn) -{ - MsnContact *contact; - MsnSession *session; - const char *abLastChange; - const char *dynamicItemLastChange; - gchar *partner_scenario; - - if (soapconn->body == NULL) - return TRUE; - - purple_debug_misc("MSNCL","Got the contact list!\n"); - - contact = soapconn->parent; - g_return_val_if_fail(contact != NULL, TRUE); - session = soapconn->session; - g_return_val_if_fail(session != NULL, FALSE); - g_return_val_if_fail(soapconn->data_cb != NULL, TRUE); - - partner_scenario = soapconn->data_cb; - - msn_parse_contact_list(contact); - /*free the read buffer*/ - msn_soap_free_read_buf(soapconn); - - abLastChange = purple_account_get_string(session->account, "ablastChange", NULL); - dynamicItemLastChange = purple_account_get_string(session->account, "dynamicItemLastChange", NULL); - - if (!strcmp(partner_scenario, MsnSoapPartnerScenarioText[MSN_PS_INITIAL])) { - -#ifdef MSN_PARTIAL_LISTS - /* XXX: this should be enabled when we can correctly do partial - syncs with the server. Currently we need to retrieve the whole - list to detect sync issues */ - msn_get_address_book(contact, MSN_PS_INITIAL, abLastChange, dynamicItemLastChange); -#else - msn_get_address_book(contact, MSN_PS_INITIAL, NULL, NULL); -#endif - } else { - msn_soap_free_read_buf(soapconn); - } - - return TRUE; } static void -msn_get_contact_written_cb(MsnSoapConn *soapconn) +msn_get_contact_list_cb(MsnSoapMessage *req, MsnSoapMessage *resp, + gpointer data) { - purple_debug_misc("MSNCL","Sent SOAP request for the contact list.\n"); - soapconn->read_cb = msn_get_contact_list_cb; + GetContactListCbData *cb_data = data; + MsnContact *contact = cb_data->contact; + MsnSession *session = contact->session; + + g_return_if_fail(session != NULL); + + if (resp != NULL) { + const char *abLastChange; + const char *dynamicItemLastChange; + + purple_debug_misc("msncl","Got the contact list!\n"); + + msn_parse_contact_list(cb_data->contact, resp->xml); + abLastChange = purple_account_get_string(session->account, + "ablastChange", NULL); + dynamicItemLastChange = purple_account_get_string(session->account, + "dynamicItemLastChange", NULL); + + if (cb_data->which == MSN_PS_INITIAL) { +#ifdef MSN_PARTIAL_LISTS + /* XXX: this should be enabled when we can correctly do partial + syncs with the server. Currently we need to retrieve the whole + list to detect sync issues */ + msn_get_address_book(contact, MSN_PS_INITIAL, abLastChange, dynamicItemLastChange); +#else + msn_get_address_book(contact, MSN_PS_INITIAL, NULL, NULL); +#endif + } + } + + g_free(cb_data); } -/* SOAP get contact list*/ +/*SOAP get contact list*/ void -msn_get_contact_list(MsnContact * contact, const MsnSoapPartnerScenario partner_scenario, const char *update_time) +msn_get_contact_list(MsnContact * contact, + const MsnSoapPartnerScenario partner_scenario, const char *update_time) { - MsnSoapReq *soap_request; - gchar *body; + gchar *body = NULL; gchar *update_str = NULL; + GetContactListCbData cb_data = { contact, partner_scenario }; const gchar *partner_scenario_str = MsnSoapPartnerScenarioText[partner_scenario]; purple_debug_misc("MSNCL","Getting Contact List.\n"); @@ -584,17 +417,14 @@ } body = g_strdup_printf(MSN_GET_CONTACT_TEMPLATE, partner_scenario_str, update_str ? update_str : ""); - g_free(update_str); - soap_request = msn_soap_request_new(MSN_CONTACT_SERVER, - MSN_GET_CONTACT_POST_URL, - MSN_GET_CONTACT_SOAP_ACTION, - body, - (gpointer) partner_scenario_str, - msn_get_contact_list_cb, - msn_get_contact_written_cb, - msn_contact_connect_init); - msn_soap_post(contact->soapconn,soap_request); + msn_soap_message_send(contact->session, + msn_soap_message_new(MSN_GET_CONTACT_SOAP_ACTION, + xmlnode_from_str(body, -1)), + MSN_CONTACT_SERVER, MSN_GET_CONTACT_POST_URL, + msn_get_contact_list_cb, g_memdup(&cb_data, sizeof(cb_data))); + + g_free(update_str); g_free(body); } @@ -604,7 +434,7 @@ MsnSession *session = contact->session; xmlnode *group; - purple_debug_info("MsnAb","msn_parse_addressbook_groups()\n"); + purple_debug_info("MSNAB","msn_parse_addressbook_groups()\n"); for(group = xmlnode_get_child(node, "Group"); group; group = xmlnode_get_next_twin(group)){ @@ -756,81 +586,48 @@ } static gboolean -msn_parse_addressbook(MsnContact * contact) +msn_parse_addressbook(MsnContact * contact, xmlnode *node) { - MsnSession *session; - xmlnode * node,*body,*response,*result; + MsnSession * session; + xmlnode *result; xmlnode *groups; xmlnode *contacts; xmlnode *abNode; - xmlnode *fault, *faultstringnode, *faultdetail, *errorcode; + xmlnode *fault; session = contact->session; - node = xmlnode_from_str(contact->soapconn->body, contact->soapconn->body_len); - if ( node == NULL ) { - purple_debug_error("MSN AddressBook","Error parsing Address Book with size %d\n", contact->soapconn->body_len); + if ((fault = msn_soap_xml_get(node, "Body/Fault"))) { + xmlnode *faultnode; + + if ((faultnode = xmlnode_get_child(fault, "faultstring"))) { + gchar *faultstring = xmlnode_get_data(faultnode); + purple_debug_info("MSNAB","Faultstring: %s\n", faultstring); + g_free(faultstring); + } + + if ((faultnode = msn_soap_xml_get(fault, "detail/errorcode"))) { + gchar *errorcode = xmlnode_get_data(faultnode); + + purple_debug_info("MSNAB", "Error Code: %s\n", errorcode); + + if (g_str_equal(errorcode, "ABDoesNotExist")) { + g_free(errorcode); + return TRUE; + } + } + return FALSE; } - purple_debug_misc("MSN AddressBook", "Parsing Address Book with size %d\n", contact->soapconn->body_len); - - purple_debug_misc("MSN AddressBook","node{%p},name:%s,child:%s,last:%s\n", node, - node->name ? node->name : "(null)", - (node->child && node->child->name) ? node->child->name : "(null)", - (node->lastchild && node->lastchild->name) ? node->lastchild->name : "(null)"); - - body = xmlnode_get_child(node,"Body"); - purple_debug_misc("MSN AddressBook","body{%p},name:%s\n",body,body->name); - - /* TODO: This appears to be used in a number of places and should be de-duplicated */ - if ( (fault = xmlnode_get_child(body, "Fault")) != NULL) { - purple_debug_info("MSN AddressBook","Fault received from SOAP server!\n"); - - if ( (faultstringnode = xmlnode_get_child(fault, "faultstring")) != NULL ) { - gchar *faultstring = xmlnode_get_data(faultstringnode); - purple_debug_info("MSN AddressBook","Faultstring: %s\n", faultstring ? faultstring : "(null)"); - g_free(faultstring); - } - if ( (faultdetail = xmlnode_get_child(fault, "detail")) != NULL ) { - purple_debug_info("MSN AddressBook","detail @ %p, name: %s\n",faultdetail, faultdetail->name); - - if ( (errorcode = xmlnode_get_child(faultdetail, "errorcode")) != NULL ) { - gchar *errorcodestring; - purple_debug_info("MSN AddressBook","errorcode @ %p, name: %s\n",errorcode, errorcode->name); - - errorcodestring = xmlnode_get_data(errorcode); - purple_debug_info("MSN AddressBook", "Error Code: %s\n", errorcodestring ? errorcodestring : "(null)"); - - if (errorcodestring && !strncmp(errorcodestring, "ABDoesNotExist", 14) ) { - g_free(errorcodestring); - xmlnode_free(node); - return TRUE; - } - g_free(errorcodestring); - } - } - xmlnode_free(node); - return FALSE; + result = msn_soap_xml_get(node, "Body/ABFindAllResponse/ABFindAllResult"); + if(result == NULL){ + purple_debug_misc("MSNAB","receive no address book update\n"); + return TRUE; } - - response = xmlnode_get_child(body,"ABFindAllResponse"); - - if (response == NULL) { - xmlnode_free(node); - return FALSE; - } - - purple_debug_misc("MSN SOAP","response{%p},name:%s\n",response,response->name); - result = xmlnode_get_child(response,"ABFindAllResult"); - if(result == NULL){ - purple_debug_misc("MSNAB","receive no address book update\n"); - xmlnode_free(node); - return TRUE; - } - purple_debug_info("MSN SOAP","result{%p},name:%s\n",result,result->name); - + /* I don't see this "groups" tag documented on msnpiki, need to find out + if they are really there, and update msnpiki */ /*Process Group List*/ groups = xmlnode_get_child(result,"groups"); if (groups != NULL) { @@ -840,7 +637,7 @@ /*add a default No group to set up the no group Membership*/ msn_group_new(session->userlist, MSN_INDIVIDUALS_GROUP_ID, MSN_INDIVIDUALS_GROUP_NAME); - purple_debug_misc("MsnAB","group_id:%s name:%s\n", + purple_debug_misc("MSNAB","group_id:%s name:%s\n", MSN_INDIVIDUALS_GROUP_ID, MSN_INDIVIDUALS_GROUP_NAME); if ((purple_find_group(MSN_INDIVIDUALS_GROUP_NAME)) == NULL){ PurpleGroup *g = purple_group_new(MSN_INDIVIDUALS_GROUP_NAME); @@ -849,7 +646,7 @@ /*add a default No group to set up the no group Membership*/ msn_group_new(session->userlist, MSN_NON_IM_GROUP_ID, MSN_NON_IM_GROUP_NAME); - purple_debug_misc("MsnAB","group_id:%s name:%s\n", MSN_NON_IM_GROUP_ID, MSN_NON_IM_GROUP_NAME); + purple_debug_misc("MSNAB","group_id:%s name:%s\n", MSN_NON_IM_GROUP_ID, MSN_NON_IM_GROUP_NAME); if ((purple_find_group(MSN_NON_IM_GROUP_NAME)) == NULL){ PurpleGroup *g = purple_group_new(MSN_NON_IM_GROUP_NAME); purple_blist_add_group(g, NULL); @@ -869,7 +666,7 @@ if ((node2 = xmlnode_get_child(abNode, "lastChange"))) tmp = xmlnode_get_data(node2); - purple_debug_info("MsnAB"," lastchanged Time:{%s}\n", tmp ? tmp : "(null)"); + purple_debug_info("MSNAB"," lastchanged Time:{%s}\n", tmp ? tmp : "(null)"); purple_account_set_string(session->account, "ablastChange", tmp); g_free(tmp); tmp = NULL; @@ -880,68 +677,51 @@ g_free(tmp); } - xmlnode_free(node); - msn_soap_free_read_buf(contact->soapconn); return TRUE; } -static gboolean -msn_get_address_cb(MsnSoapConn *soapconn) +static void +msn_get_address_cb(MsnSoapMessage *req, MsnSoapMessage *resp, gpointer data) { - MsnContact *contact; + MsnContact *contact = data; MsnSession *session; - if (soapconn->body == NULL) - return TRUE; + if (resp == NULL) + return; - contact = soapconn->parent; - g_return_val_if_fail(contact != NULL, TRUE); - session = soapconn->session; - g_return_val_if_fail(session != NULL, FALSE); + g_return_if_fail(contact != NULL); + session = contact->session; + g_return_if_fail(session != NULL); - purple_debug_misc("MSN AddressBook", "Got the Address Book!\n"); + purple_debug_misc("MSNAB", "Got the Address Book!\n"); - if ( msn_parse_addressbook(contact) ) { - //msn_soap_free_read_buf(soapconn); - + if (msn_parse_addressbook(contact, resp->xml)) { if (!session->logged_in) { msn_send_privacy(session->account->gc); msn_notification_dump_contact(session); } - - /*free the read buffer*/ - msn_soap_free_read_buf(soapconn); - return TRUE; } else { - /* This is making us loop infinitely when we fail to parse the address book, - disable for now (we should re-enable when we send timestamps) + /* This is making us loop infinitely when we fail to parse the + address book, disable for now (we should re-enable when we + send timestamps) */ /* msn_get_address_book(contact, NULL, NULL); */ msn_session_disconnect(session); purple_connection_error(session->account->gc, _("Unable to retrieve MSN Address Book")); - return FALSE; } } -/**/ -static void -msn_address_written_cb(MsnSoapConn *soapconn) -{ - purple_debug_misc("MSN AddressBook","Sent SOAP request for the Address Book.\n"); - soapconn->read_cb = msn_get_address_cb; -} - /*get the address book*/ void -msn_get_address_book(MsnContact *contact, const MsnSoapPartnerScenario partner_scenario, const char *LastChanged, const char *dynamicItemLastChange) +msn_get_address_book(MsnContact *contact, + MsnSoapPartnerScenario partner_scenario, const char *LastChanged, + const char *dynamicItemLastChange) { - MsnSoapReq *soap_request; - char *body; - char *update_str = NULL; + char *body, *update_str = NULL; - purple_debug_misc("MSN AddressBook","Getting Address Book\n"); + purple_debug_misc("MSNAB","Getting Address Book\n"); /*build SOAP and POST it*/ if (dynamicItemLastChange != NULL) @@ -949,79 +729,58 @@ else if (LastChanged != NULL) update_str = g_strdup_printf(MSN_GET_ADDRESS_UPDATE_XML, LastChanged); - body = g_strdup_printf(MSN_GET_ADDRESS_TEMPLATE, MsnSoapPartnerScenarioText[partner_scenario], update_str ? update_str : ""); - g_free(update_str); - soap_request = msn_soap_request_new(MSN_CONTACT_SERVER, - MSN_ADDRESS_BOOK_POST_URL,MSN_GET_ADDRESS_SOAP_ACTION, - body, - NULL, - msn_get_address_cb, - msn_address_written_cb, - msn_contact_connect_init); - msn_soap_post(contact->soapconn,soap_request); + msn_soap_message_send(contact->session, + msn_soap_message_new(MSN_GET_ADDRESS_SOAP_ACTION, + xmlnode_from_str(body, -1)), + MSN_CONTACT_SERVER, MSN_ADDRESS_BOOK_POST_URL, msn_get_address_cb, + contact); + + g_free(update_str); g_free(body); } -static gboolean -msn_add_contact_read_cb(MsnSoapConn *soapconn) +static void +msn_add_contact_read_cb(MsnSoapMessage *req, MsnSoapMessage *resp, + gpointer data) { - MsnCallbackState *state = NULL; - MsnUserList *userlist; - MsnUser *user; - - g_return_val_if_fail(soapconn->data_cb != NULL, TRUE); - g_return_val_if_fail(soapconn->session != NULL, FALSE); - g_return_val_if_fail(soapconn->session->userlist != NULL, TRUE); + MsnCallbackState *state = data; + MsnSession *session = state->session; - state = (MsnCallbackState *) soapconn->data_cb; + g_return_if_fail(session != NULL); - if (soapconn->body == NULL) { - msn_callback_state_free(state); - return TRUE; - } + if (resp != NULL) { + MsnUserList *userlist = session->userlist; + MsnUser *user; - userlist = soapconn->session->userlist; - - purple_debug_info("MSNCL","Contact added successfully\n"); + purple_debug_info("MSNCL","Contact added successfully\n"); - // the code this block is replacing didn't send ADL for yahoo contacts, - // but i haven't confirmed this is WLM's behaviour wrt yahoo contacts - - if ( !msn_user_is_yahoo(soapconn->session->account, state->who) ) { - - msn_userlist_add_buddy_to_list(userlist, state->who, MSN_LIST_AL); - msn_userlist_add_buddy_to_list(userlist, state->who, MSN_LIST_FL); - } - msn_notification_send_fqy(soapconn->session, state->who); + // the code this block is replacing didn't send ADL for yahoo contacts, + // but i haven't confirmed this is WLM's behaviour wrt yahoo contacts + if ( !msn_user_is_yahoo(session->account, state->who) ) { + msn_userlist_add_buddy_to_list(userlist, state->who, MSN_LIST_AL); + msn_userlist_add_buddy_to_list(userlist, state->who, MSN_LIST_FL); + } - user = msn_userlist_find_add_user(userlist, state->who, state->who); - msn_user_add_group_id(user, state->guid); - - msn_soap_free_read_buf(soapconn); - msn_callback_state_free(state); + msn_notification_send_fqy(session, state->who); - return TRUE; -} + user = msn_userlist_find_add_user(userlist, state->who, state->who); + msn_user_add_group_id(user, state->guid); + } -static void -msn_add_contact_written_cb(MsnSoapConn *soapconn) -{ - purple_debug_info("MSNCL","Add contact request written\n"); - soapconn->read_cb = msn_add_contact_read_cb; + msn_callback_state_free(state); } /* add a Contact in MSN_INDIVIDUALS_GROUP */ void msn_add_contact(MsnContact *contact, MsnCallbackState *state, const char *passport) { - MsnSoapReq *soap_request; gchar *body = NULL; gchar *contact_xml = NULL; - g_return_if_fail(passport != NULL); -/* gchar *escaped_displayname; +#if 0 + gchar *escaped_displayname; if (displayname != NULL) { @@ -1030,87 +789,71 @@ escaped_displayname = passport; } contact_xml = g_strdup_printf(MSN_XML_ADD_CONTACT, escaped_displayname, passport); -*/ +#endif + purple_debug_info("MSNCL","Adding contact %s to contact list\n", passport); -// if ( !strcmp(state->guid, MSN_INDIVIDUALS_GROUP_ID) ) { - contact_xml = g_strdup_printf(MSN_CONTACT_XML, passport); -// } + contact_xml = g_strdup_printf(MSN_CONTACT_XML, passport); body = g_strdup_printf(MSN_ADD_CONTACT_TEMPLATE, contact_xml); + msn_soap_message_send(contact->session, + msn_soap_message_new(MSN_CONTACT_ADD_SOAP_ACTION, + xmlnode_from_str(body, -1)), + MSN_CONTACT_SERVER, MSN_ADDRESS_BOOK_POST_URL, + msn_add_contact_read_cb, state); + g_free(contact_xml); - - /*build SOAP and POST it*/ - - soap_request = msn_soap_request_new(MSN_CONTACT_SERVER, - MSN_ADDRESS_BOOK_POST_URL, - MSN_CONTACT_ADD_SOAP_ACTION, - body, - state, - msn_add_contact_read_cb, - msn_add_contact_written_cb, - msn_contact_connect_init); - msn_soap_post(contact->soapconn,soap_request); - g_free(body); } -static gboolean -msn_add_contact_to_group_read_cb(MsnSoapConn *soapconn) +static void +msn_add_contact_to_group_read_cb(MsnSoapMessage *req, MsnSoapMessage *resp, + gpointer data) { - MsnCallbackState *state; + MsnCallbackState *state = data; MsnUserList *userlist; - g_return_val_if_fail(soapconn->data_cb != NULL, TRUE); - g_return_val_if_fail(soapconn->session != NULL, FALSE); - g_return_val_if_fail(soapconn->session->userlist != NULL, TRUE); + g_return_if_fail(data != NULL); + + userlist = state->session->userlist; - userlist = soapconn->session->userlist; + if (resp != NULL) { + if (msn_userlist_add_buddy_to_group(userlist, state->who, + state->new_group_name)) { + purple_debug_info("MSNCL", "Contact %s added to group %s successfully!\n", state->who, state->new_group_name); + } else { + purple_debug_info("MSNCL","Contact %s added to group %s successfully on server, but failed in the local list\n", state->who, state->new_group_name); + } - state = (MsnCallbackState *) soapconn->data_cb; + if (state->action & MSN_ADD_BUDDY) { + MsnUser *user = msn_userlist_find_user(userlist, state->who); - if (soapconn->body == NULL) { - msn_callback_state_free(state); - return TRUE; - } - - if (msn_userlist_add_buddy_to_group(userlist, state->who, state->new_group_name) == TRUE) { - purple_debug_info("MSNCL", "Contact %s added to group %s successfully!\n", state->who, state->new_group_name); - } else { - purple_debug_info("MSNCL","Contact %s added to group %s successfully on server, but failed in the local list\n", state->who, state->new_group_name); + if ( !msn_user_is_yahoo(state->session->account, state->who) ) { + + msn_userlist_add_buddy_to_list(userlist, state->who, MSN_LIST_AL); + msn_userlist_add_buddy_to_list(userlist, state->who, MSN_LIST_FL); + } + msn_notification_send_fqy(state->session, state->who); + + if (msn_userlist_user_is_in_list(user, MSN_LIST_PL)) { + msn_del_contact_from_list(state->session->contact, NULL, state->who, MSN_LIST_PL); + msn_callback_state_free(state); + return; + } + } + + if (state->action & MSN_MOVE_BUDDY) { + msn_del_contact_from_group(state->session->contact, state->who, state->old_group_name); + } } - if (state->action & MSN_ADD_BUDDY) { - - if ( !msn_user_is_yahoo(soapconn->session->account, state->who) ) { - - msn_userlist_add_buddy_to_list(userlist, state->who, MSN_LIST_AL); - msn_userlist_add_buddy_to_list(userlist, state->who, MSN_LIST_FL); - } - msn_notification_send_fqy(soapconn->session, state->who); - } - - if (state->action & MSN_MOVE_BUDDY) { - msn_del_contact_from_group(soapconn->session->contact, state->who, state->old_group_name); - } else { - msn_callback_state_free(state); - msn_soap_free_read_buf(soapconn); - } - return TRUE; -} - -static void -msn_add_contact_to_group_written_cb(MsnSoapConn *soapconn) -{ - purple_debug_info("MSNCL","Add contact to group request sent!\n"); - soapconn->read_cb = msn_add_contact_to_group_read_cb; + msn_callback_state_free(state); } void msn_add_contact_to_group(MsnContact *contact, MsnCallbackState *state, const char *passport, const char *groupId) { - MsnSoapReq *soap_request; MsnUserList *userlist; MsnUser *user; gchar *body = NULL, *contact_xml; @@ -1143,13 +886,14 @@ return; } - purple_debug_info("MSNCL", "Adding user %s to group %s\n", passport, msn_userlist_find_group_name(userlist, groupId)); user = msn_userlist_find_user(userlist, passport); if (user == NULL) { - purple_debug_warning("MSN CL", "Unable to retrieve user %s from the userlist!\n", passport); + purple_debug_warning("MSNCL", "Unable to retrieve user %s from the userlist!\n", passport); + msn_callback_state_free(state); + return; /* guess this never happened! */ } if (user != NULL && user->uid != NULL) { @@ -1159,60 +903,35 @@ } body = g_strdup_printf(MSN_ADD_CONTACT_GROUP_TEMPLATE, groupId, contact_xml); - g_free(contact_xml); - - /*build SOAP and POST it*/ - soap_request = msn_soap_request_new(MSN_CONTACT_SERVER, - MSN_ADDRESS_BOOK_POST_URL, - MSN_ADD_CONTACT_GROUP_SOAP_ACTION, - body, - state, - msn_add_contact_to_group_read_cb, - msn_add_contact_to_group_written_cb, - msn_contact_connect_init); - msn_soap_post(contact->soapconn,soap_request); + msn_soap_message_send(state->session, + msn_soap_message_new(MSN_ADD_CONTACT_GROUP_SOAP_ACTION, + xmlnode_from_str(body, -1)), + MSN_CONTACT_SERVER, MSN_ADDRESS_BOOK_POST_URL, + msn_add_contact_to_group_read_cb, state); + g_free(contact_xml); g_free(body); } - - -static gboolean -msn_delete_contact_read_cb(MsnSoapConn *soapconn) +static void +msn_delete_contact_read_cb(MsnSoapMessage *req, MsnSoapMessage *resp, + gpointer data) { - MsnUser *user; - MsnCallbackState *state = (MsnCallbackState *) soapconn->data_cb; - MsnUserList *userlist; - - g_return_val_if_fail(soapconn->session != NULL, FALSE); - g_return_val_if_fail(soapconn->session->userlist != NULL, TRUE); + MsnCallbackState *state = data; - userlist = soapconn->session->userlist; + if (resp != NULL) { + MsnUserList *userlist = state->session->userlist; + MsnUser *user = msn_userlist_find_user_with_id(userlist, state->uid); - if (soapconn->body == NULL) { - msn_callback_state_free(state); - return TRUE; - } + purple_debug_info("MSNCL","Delete contact successful\n"); - purple_debug_info("MSNCL","Delete contact successful\n"); - - user = msn_userlist_find_user_with_id(userlist, state->uid); - if (user != NULL) { - msn_userlist_remove_user(userlist, user); + if (user != NULL) { + msn_userlist_remove_user(userlist, user); + } } msn_callback_state_free(state); - msn_soap_free_read_buf(soapconn); - - return TRUE; -} - -static void -msn_delete_contact_written_cb(MsnSoapConn *soapconn) -{ - purple_debug_info("MSNCL","Delete contact request written\n"); - soapconn->read_cb = msn_delete_contact_read_cb; } /*delete a Contact*/ @@ -1221,72 +940,52 @@ { gchar *body = NULL; gchar *contact_id_xml = NULL ; - MsnSoapReq *soap_request; MsnCallbackState *state; g_return_if_fail(contactId != NULL); contact_id_xml = g_strdup_printf(MSN_CONTACT_ID_XML, contactId); - state = msn_callback_state_new(); + state = msn_callback_state_new(contact->session); msn_callback_state_set_uid(state, contactId); /* build SOAP request */ purple_debug_info("MSNCL","Deleting contact with contactId: %s\n", contactId); body = g_strdup_printf(MSN_DEL_CONTACT_TEMPLATE, contact_id_xml); - soap_request = msn_soap_request_new(MSN_CONTACT_SERVER, - MSN_ADDRESS_BOOK_POST_URL, - MSN_CONTACT_DEL_SOAP_ACTION, - body, - state, - msn_delete_contact_read_cb, - msn_delete_contact_written_cb, - msn_contact_connect_init); + msn_soap_message_send(contact->session, + msn_soap_message_new(MSN_CONTACT_DEL_SOAP_ACTION, + xmlnode_from_str(body, -1)), + MSN_CONTACT_SERVER, MSN_ADDRESS_BOOK_POST_URL, + msn_delete_contact_read_cb, state); g_free(contact_id_xml); - - /* POST the SOAP request */ - msn_soap_post(contact->soapconn, soap_request); - g_free(body); } -static gboolean -msn_del_contact_from_group_read_cb(MsnSoapConn *soapconn) +static void +msn_del_contact_from_group_read_cb(MsnSoapMessage *req, MsnSoapMessage *resp, + gpointer data) { - MsnCallbackState *state = (MsnCallbackState *) soapconn->data_cb; + MsnCallbackState *state = data; - if (soapconn->body == NULL) { - msn_callback_state_free(state); - return TRUE; - } - - if (msn_userlist_rem_buddy_from_group(soapconn->session->userlist, state->who, state->old_group_name)) { - purple_debug_info("MSN CL", "Contact %s deleted successfully from group %s\n", state->who, state->old_group_name); - } else { - purple_debug_info("MSN CL", "Contact %s deleted successfully from group %s in the server, but failed in the local list\n", state->who, state->old_group_name); + if (resp != NULL) { + if (msn_userlist_rem_buddy_from_group(state->session->userlist, + state->who, state->old_group_name)) { + purple_debug_info("MSNCL", "Contact %s deleted successfully from group %s\n", state->who, state->old_group_name); + } else { + purple_debug_info("MSNCL", "Contact %s deleted successfully from group %s in the server, but failed in the local list\n", state->who, state->old_group_name); + } } msn_callback_state_free(state); - msn_soap_free_read_buf(soapconn); - - return TRUE; -} - -static void -msn_del_contact_from_group_written_cb(MsnSoapConn *soapconn) -{ - purple_debug_info("MSN CL","Del contact from group request sent!\n"); - soapconn->read_cb = msn_del_contact_from_group_read_cb; } void msn_del_contact_from_group(MsnContact *contact, const char *passport, const char *group_name) { - MsnSoapReq *soap_request; MsnUserList * userlist; MsnUser *user; MsnCallbackState *state; - gchar *body = NULL, *contact_id_xml; + gchar *body, *contact_id_xml; const gchar *groupId; g_return_if_fail(passport != NULL); @@ -1299,16 +998,16 @@ groupId = msn_userlist_find_group_id(userlist, group_name); if (groupId != NULL) { - purple_debug_info("MSN CL", "Deleting user %s from group %s\n", passport, group_name); + purple_debug_info("MSNCL", "Deleting user %s from group %s\n", passport, group_name); } else { - purple_debug_warning("MSN CL", "Unable to retrieve group id from group %s !\n", group_name); + purple_debug_warning("MSNCL", "Unable to retrieve group id from group %s !\n", group_name); return; } user = msn_userlist_find_user(userlist, passport); if (user == NULL) { - purple_debug_warning("MSN CL", "Unable to retrieve user from passport %s!\n", passport); + purple_debug_warning("MSNCL", "Unable to retrieve user from passport %s!\n", passport); return; } @@ -1317,58 +1016,40 @@ return; } - state = msn_callback_state_new(); + state = msn_callback_state_new(contact->session); msn_callback_state_set_who(state, passport); msn_callback_state_set_guid(state, groupId); msn_callback_state_set_old_group_name(state, group_name); contact_id_xml = g_strdup_printf(MSN_CONTACT_ID_XML, user->uid); body = g_strdup_printf(MSN_CONTACT_DEL_GROUP_TEMPLATE, contact_id_xml, groupId); + + msn_soap_message_send(contact->session, + msn_soap_message_new(MSN_CONTACT_DEL_GROUP_SOAP_ACTION, + xmlnode_from_str(body, -1)), + MSN_CONTACT_SERVER, MSN_ADDRESS_BOOK_POST_URL, + msn_del_contact_from_group_read_cb, state); + g_free(contact_id_xml); - - /*build SOAP and POST it*/ - soap_request = msn_soap_request_new(MSN_CONTACT_SERVER, - MSN_ADDRESS_BOOK_POST_URL, - MSN_CONTACT_DEL_GROUP_SOAP_ACTION, - body, - state, - msn_del_contact_from_group_read_cb, - msn_del_contact_from_group_written_cb, - msn_contact_connect_init); - msn_soap_post(contact->soapconn,soap_request); - g_free(body); } -static gboolean -msn_update_contact_read_cb(MsnSoapConn *soapconn) +static void +msn_update_contact_read_cb(MsnSoapMessage *req, MsnSoapMessage *resp, + gpointer data) { - if (soapconn->body == NULL) - return TRUE; - - purple_debug_info("MSN CL","Contact updated successfully\n"); - - return TRUE; -} - -static void -msn_update_contact_written_cb(MsnSoapConn *soapconn) -{ - purple_debug_info("MSN CL","Update contact information request sent\n"); - soapconn->read_cb = msn_update_contact_read_cb; + if (resp) + purple_debug_info("MSN CL","Contact updated successfully\n"); + else + purple_debug_info("MSN CL","Contact updated successfully\n"); } /* Update a contact's nickname */ - void msn_update_contact(MsnContact *contact, const char* nickname) { - MsnSoapReq *soap_request; - gchar *body, *escaped_nickname; - - /* I'm not sure this is right, but if it isn't, the rest of this function will need to be fixed */ - g_return_if_fail(nickname != NULL); + gchar *body = NULL, *escaped_nickname; purple_debug_info("MSN CL","Update contact information with new friendly name: %s\n", nickname); @@ -1376,83 +1057,50 @@ body = g_strdup_printf(MSN_CONTACT_UPDATE_TEMPLATE, escaped_nickname); + msn_soap_message_send(contact->session, + msn_soap_message_new(MSN_CONTACT_UPDATE_SOAP_ACTION, + xmlnode_from_str(body, -1)), + MSN_CONTACT_SERVER, MSN_ADDRESS_BOOK_POST_URL, + msn_update_contact_read_cb, NULL); + g_free(escaped_nickname); - /*build SOAP and POST it*/ - soap_request = msn_soap_request_new(MSN_CONTACT_SERVER, - MSN_ADDRESS_BOOK_POST_URL, - MSN_CONTACT_UPDATE_SOAP_ACTION, - body, - NULL, - msn_update_contact_read_cb, - msn_update_contact_written_cb, - msn_contact_connect_init); - msn_soap_post(contact->soapconn, soap_request); - g_free(body); } - -static gboolean -msn_del_contact_from_list_read_cb(MsnSoapConn *soapconn) +static void +msn_del_contact_from_list_read_cb(MsnSoapMessage *req, MsnSoapMessage *resp, + gpointer data) { - MsnCallbackState *state = NULL; + MsnCallbackState *state = data; + MsnSession *session = state->session; - g_return_val_if_fail(soapconn->data_cb != NULL, TRUE); - g_return_val_if_fail(soapconn->session != NULL, FALSE); - g_return_val_if_fail(soapconn->session->contact != NULL, FALSE); - g_return_val_if_fail(soapconn->session->userlist != NULL, FALSE); - - state = (MsnCallbackState *) soapconn->data_cb; + if (resp != NULL) { + purple_debug_info("MSN CL", "Contact %s deleted successfully from %s list on server!\n", state->who, MsnMemberRole[state->list_id]); - if (soapconn->body == NULL) { - msn_callback_state_free(state); - return TRUE; - } - - purple_debug_info("MSN CL", "Contact %s deleted successfully from %s list on server!\n", state->who, MsnMemberRole[state->list_id]); + if (state->list_id == MSN_LIST_PL) { + MsnUser *user = msn_userlist_find_user(session->userlist, state->who); - if (state->list_id == MSN_LIST_PL) { - MsnUser *user = msn_userlist_find_user(soapconn->session->userlist, state->who); - - if (user != NULL) - msn_user_unset_op(user, MSN_LIST_PL_OP); - - msn_add_contact_to_list(soapconn->session->contact, state, state->who, MSN_LIST_RL); - return TRUE; - } + if (user != NULL) + msn_user_unset_op(user, MSN_LIST_PL_OP); - if (state->list_id == MSN_LIST_AL) { - purple_privacy_permit_remove(soapconn->session->account, state->who, TRUE); - msn_add_contact_to_list(soapconn->session->contact, NULL, state->who, MSN_LIST_BL); - msn_callback_state_free(state); - return TRUE; - } - - if (state->list_id == MSN_LIST_BL) { - purple_privacy_deny_remove(soapconn->session->account, state->who, TRUE); - msn_add_contact_to_list(soapconn->session->contact, NULL, state->who, MSN_LIST_AL); - msn_callback_state_free(state); - return TRUE; + msn_add_contact_to_list(session->contact, state, state->who, MSN_LIST_RL); + return; + } else if (state->list_id == MSN_LIST_AL) { + purple_privacy_permit_remove(session->account, state->who, TRUE); + msn_add_contact_to_list(session->contact, NULL, state->who, MSN_LIST_BL); + } else if (state->list_id == MSN_LIST_BL) { + purple_privacy_deny_remove(session->account, state->who, TRUE); + msn_add_contact_to_list(session->contact, NULL, state->who, MSN_LIST_AL); + } } msn_callback_state_free(state); - msn_soap_free_read_buf(soapconn); - - return TRUE; -} - -static void -msn_del_contact_from_list_written_cb(MsnSoapConn *soapconn) -{ - purple_debug_info("MSN CL","Delete contact from list SOAP request sent!\n"); - soapconn->read_cb = msn_del_contact_from_list_read_cb; } void msn_del_contact_from_list(MsnContact *contact, MsnCallbackState *state, const gchar *passport, const MsnListId list) { - MsnSoapReq *soap_request; gchar *body = NULL, *member = NULL; MsnSoapPartnerScenario partner_scenario; MsnUser *user; @@ -1464,7 +1112,7 @@ purple_debug_info("MSN CL", "Deleting contact %s from %s list\n", passport, MsnMemberRole[list]); if (state == NULL) { - state = msn_callback_state_new(); + state = msn_callback_state_new(contact->session); } msn_callback_state_set_list_id(state, list); msn_callback_state_set_who(state, passport); @@ -1488,79 +1136,55 @@ MsnSoapPartnerScenarioText[partner_scenario], MsnMemberRole[list], member); - g_free(member); - soap_request = msn_soap_request_new( MSN_CONTACT_SERVER, - MSN_SHARE_POST_URL, - MSN_DELETE_MEMBER_FROM_LIST_SOAP_ACTION, - body, - state, - msn_del_contact_from_list_read_cb, - msn_del_contact_from_list_written_cb, - msn_contact_connect_init); + msn_soap_message_send(contact->session, + msn_soap_message_new(MSN_DELETE_MEMBER_FROM_LIST_SOAP_ACTION, + xmlnode_from_str(body, -1)), + MSN_CONTACT_SERVER, MSN_SHARE_POST_URL, + msn_del_contact_from_list_read_cb, state); - msn_soap_post(contact->soapconn,soap_request); - + g_free(member); g_free(body); } -static gboolean -msn_add_contact_to_list_read_cb(MsnSoapConn *soapconn) +static void +msn_add_contact_to_list_read_cb(MsnSoapMessage *req, MsnSoapMessage *resp, + gpointer data) { - MsnCallbackState *state = NULL; + MsnCallbackState *state = data; - g_return_val_if_fail(soapconn->data_cb != NULL, TRUE); - g_return_val_if_fail(soapconn->session != NULL, FALSE); - g_return_val_if_fail(soapconn->session->userlist != NULL, FALSE); - - state = (MsnCallbackState *) soapconn->data_cb; + g_return_if_fail(state != NULL); + g_return_if_fail(state->session != NULL); + g_return_if_fail(state->session->contact != NULL); - if (soapconn->body == NULL) { - msn_callback_state_free(state); - return TRUE; - } - - purple_debug_info("MSN CL", "Contact %s added successfully to %s list on server!\n", state->who, MsnMemberRole[state->list_id]); + if (resp != NULL) { + purple_debug_info("MSN CL", "Contact %s added successfully to %s list on server!\n", state->who, MsnMemberRole[state->list_id]); - if (state->list_id == MSN_LIST_RL) { - MsnUser *user = msn_userlist_find_user(soapconn->session->userlist, state->who); + if (state->list_id == MSN_LIST_RL) { + MsnUser *user = msn_userlist_find_user(state->session->userlist, state->who); - if (user != NULL) { - msn_user_set_op(user, MSN_LIST_RL_OP); - } + if (user != NULL) { + msn_user_set_op(user, MSN_LIST_RL_OP); + } + + if (state->action & MSN_DENIED_BUDDY) { - if (state->action & MSN_DENIED_BUDDY) { - g_return_val_if_fail(soapconn->session->contact != NULL, FALSE); - - msn_add_contact_to_list(soapconn->session->contact, NULL, state->who, MSN_LIST_BL); - return TRUE; + msn_add_contact_to_list(state->session->contact, NULL, state->who, MSN_LIST_BL); + } else if (state->list_id == MSN_LIST_AL) { + purple_privacy_permit_add(state->session->account, state->who, TRUE); + } else if (state->list_id == MSN_LIST_BL) { + purple_privacy_deny_add(state->session->account, state->who, TRUE); + } } } - if (state->list_id == MSN_LIST_AL) { - purple_privacy_permit_add(soapconn->session->account, state->who, TRUE); - } else if (state->list_id == MSN_LIST_BL) { - purple_privacy_deny_add(soapconn->session->account, state->who, TRUE); - } - msn_callback_state_free(state); - msn_soap_free_read_buf(soapconn); - return TRUE; -} - - -static void -msn_add_contact_to_list_written_cb(MsnSoapConn *soapconn) -{ - purple_debug_info("MSN CL","Add contact to list SOAP request sent!\n"); - soapconn->read_cb = msn_add_contact_to_list_read_cb; } void msn_add_contact_to_list(MsnContact *contact, MsnCallbackState *state, const gchar *passport, const MsnListId list) { - MsnSoapReq *soap_request; gchar *body = NULL, *member = NULL; MsnSoapPartnerScenario partner_scenario; @@ -1571,51 +1195,38 @@ purple_debug_info("MSN CL", "Adding contact %s to %s list\n", passport, MsnMemberRole[list]); if (state == NULL) { - state = msn_callback_state_new(); + state = msn_callback_state_new(contact->session); } msn_callback_state_set_list_id(state, list); msn_callback_state_set_who(state, passport); partner_scenario = (list == MSN_LIST_RL) ? MSN_PS_CONTACT_API : MSN_PS_BLOCK_UNBLOCK; - member = g_strdup_printf(MSN_MEMBER_PASSPORT_XML, passport); + member = g_strdup_printf(MSN_MEMBER_PASSPORT_XML, state->who); body = g_strdup_printf(MSN_CONTACT_ADD_TO_LIST_TEMPLATE, MsnSoapPartnerScenarioText[partner_scenario], MsnMemberRole[list], member); - g_free(member); + msn_soap_message_send(contact->session, + msn_soap_message_new(MSN_ADD_MEMBER_TO_LIST_SOAP_ACTION, + xmlnode_from_str(body, -1)), + MSN_CONTACT_SERVER, MSN_SHARE_POST_URL, + msn_add_contact_to_list_read_cb, state); - soap_request = msn_soap_request_new( MSN_CONTACT_SERVER, - MSN_SHARE_POST_URL, - MSN_ADD_MEMBER_TO_LIST_SOAP_ACTION, - body, - state, - msn_add_contact_to_list_read_cb, - msn_add_contact_to_list_written_cb, - msn_contact_connect_init); - - msn_soap_post(contact->soapconn, soap_request); - + g_free(member); g_free(body); } - #if 0 -static gboolean -msn_gleams_read_cb(MsnSoapConn * soapconn) +static void +msn_gleams_read_cb(MsnSoapMessage *req, MsnSoapMessage *resp, gpointer data) { - purple_debug_info("MSN CL","Gleams read done\n"); - return TRUE; -} - -static void -msn_gleams_written_cb(MsnSoapConn * soapconn) -{ - purple_debug_info("MSNP14","finish Group written\n"); - soapconn->read_cb = msn_gleams_read_cb; -// msn_soap_read_cb(data,source,cond); + if (resp != NULL) + purple_debug_info("MSNP14","Gleams read done\n"); + else + purple_debug_info("MSNP14","Gleams read failed\n"); } /*get the gleams info*/ @@ -1625,16 +1236,11 @@ MsnSoapReq *soap_request; purple_debug_info("MSNP14","msn get gleams info...\n"); - /*build SOAP and POST it*/ - soap_request = msn_soap_request_new(MSN_CONTACT_SERVER, - MSN_ADDRESS_BOOK_POST_URL, - MSN_GET_GLEAMS_SOAP_ACTION, - MSN_GLEAMS_TEMPLATE, - NULL, - msn_gleams_read_cb, - msn_gleams_written_cb, - msn_contact_connect_init); - msn_soap_post(contact->soapconn,soap_request); + msn_soap_message_send(contact->session, + msn_soap_message_new(MSN_GET_GLEAMS_SOAP_ACTION, + xmlnode_from_str(MSN_GLEAMS_TEMPLATE, -1)), + MSN_CONTACT_SERVER, MSN_ADDRESS_BOOK_POST_URL, + msn_gleams_read_cb, NULL); } #endif @@ -1643,100 +1249,88 @@ * Group Operations ***************************************************************/ -static gboolean -msn_group_read_cb(MsnSoapConn *soapconn) +static void +msn_group_read_cb(MsnSoapMessage *req, MsnSoapMessage *resp, gpointer data) { - MsnUserList *userlist; - MsnCallbackState *state = NULL; + MsnCallbackState *state = data; - purple_debug_info("MSN CL", "Group request successful.\n"); + purple_debug_info("MSNCL", "Group request successful.\n"); - g_return_val_if_fail(soapconn->session != NULL, FALSE); - g_return_val_if_fail(soapconn->session->userlist != NULL, TRUE); - g_return_val_if_fail(soapconn->session->contact != NULL, FALSE); + g_return_if_fail(state->session != NULL); + g_return_if_fail(state->session->userlist != NULL); + g_return_if_fail(state->session->contact != NULL); - state = (MsnCallbackState *) soapconn->data_cb; - - if (soapconn->body == NULL) { + if (resp == NULL) { msn_callback_state_free(state); - return TRUE; + return; } - + if (state) { - userlist = soapconn->session->userlist; + MsnSession *session = state->session; + MsnUserList *userlist = session->userlist; if (state->action & MSN_RENAME_GROUP) { - msn_userlist_rename_group_id(soapconn->session->userlist, + msn_userlist_rename_group_id(session->userlist, state->guid, state->new_group_name); } if (state->action & MSN_ADD_GROUP) { - gchar *guid, *endguid; - - guid = g_strstr_len(soapconn->read_buf, soapconn->read_len, "<guid>"); - guid += 6; - endguid = g_strstr_len(soapconn->read_buf, soapconn->read_len, "</guid>"); - *endguid = '\0'; - /* create and add the new group to the userlist */ - purple_debug_info("MSN CL", "Adding group %s with guid = %s to the userlist\n", state->new_group_name, guid); - msn_group_new(soapconn->session->userlist, guid, state->new_group_name); + /* the response is taken from + http://telepathy.freedesktop.org/wiki/Pymsn/MSNP/ContactListActions + should copy it to msnpiki some day */ + xmlnode *guid_node = msn_soap_xml_get(resp->xml, + "Body/ABGroupAddResponse/ABGroupAddResult/guid"); + + if (guid_node) { + char *guid = xmlnode_get_data(guid_node); + + /* create and add the new group to the userlist */ + purple_debug_info("MSNCL", "Adding group %s with guid = %s to the userlist\n", state->new_group_name, guid); + msn_group_new(session->userlist, guid, state->new_group_name); - if (state->action & MSN_ADD_BUDDY) { - msn_userlist_add_buddy(soapconn->session->userlist, - state->who, - state->new_group_name); - msn_callback_state_free(state); - return TRUE; - } - - if (state->action & MSN_MOVE_BUDDY) { - msn_add_contact_to_group(soapconn->session->contact, state, state->who, guid); - return TRUE; + g_free(guid); + + if (state->action & MSN_ADD_BUDDY) { + msn_userlist_add_buddy(session->userlist, + state->who, + state->new_group_name); + } else if (state->action & MSN_MOVE_BUDDY) { + msn_add_contact_to_group(session->contact, state, state->who, guid); + return; + } + } else { + purple_debug_info("MSNCL", "Adding group %s failed\n", + state->new_group_name); } } if (state->action & MSN_DEL_GROUP) { GList *l; - msn_userlist_remove_group_id(soapconn->session->userlist, state->guid); + msn_userlist_remove_group_id(session->userlist, state->guid); for (l = userlist->users; l != NULL; l = l->next) { msn_user_remove_group_id( (MsnUser *)l->data, state->guid); } - } msn_callback_state_free(state); } - - msn_soap_free_read_buf(soapconn); - return TRUE; -} - -static void -msn_group_written_cb(MsnSoapConn *soapconn) -{ - purple_debug_info("MSN CL","Sent group request.\n"); - soapconn->read_cb = msn_group_read_cb; } /* add group */ void msn_add_group(MsnSession *session, MsnCallbackState *state, const char* group_name) { - MsnSoapReq *soap_request; - MsnContact *contact; char *body = NULL; - gchar *escaped_group_name; g_return_if_fail(session != NULL); g_return_if_fail(group_name != NULL); - contact = session->contact; - purple_debug_info("MSN CL","Adding group %s to contact list.\n", group_name); + purple_debug_info("MSNCL","Adding group %s to contact list.\n", group_name); if (state == NULL) { - state = msn_callback_state_new(); + state = msn_callback_state_new(session); } msn_callback_state_set_action(state, MSN_ADD_GROUP); @@ -1745,21 +1339,14 @@ /* escape group name's html special chars so it can safely be sent * in a XML SOAP request */ - escaped_group_name = g_markup_escape_text(group_name, -1); - body = g_strdup_printf(MSN_GROUP_ADD_TEMPLATE, escaped_group_name); - g_free(escaped_group_name); + body = g_markup_printf_escaped(MSN_GROUP_ADD_TEMPLATE, group_name); - /*build SOAP and POST it*/ - soap_request = msn_soap_request_new(MSN_CONTACT_SERVER, - MSN_ADDRESS_BOOK_POST_URL, - MSN_GROUP_ADD_SOAP_ACTION, - body, - state, - msn_group_read_cb, - msn_group_written_cb, - msn_contact_connect_init); - msn_soap_post(contact->soapconn,soap_request); - + msn_soap_message_send(session, + msn_soap_message_new(MSN_GROUP_ADD_SOAP_ACTION, + xmlnode_from_str(body, -1)), + MSN_CONTACT_SERVER, MSN_ADDRESS_BOOK_POST_URL, + msn_group_read_cb, state); + g_free(body); } @@ -1767,8 +1354,6 @@ void msn_del_group(MsnSession *session, const gchar *group_name) { - MsnSoapReq *soap_request; - MsnContact *contact; MsnCallbackState *state; char *body = NULL; const gchar *guid; @@ -1776,8 +1361,7 @@ g_return_if_fail(session != NULL); g_return_if_fail(group_name != NULL); - contact = session->contact; - purple_debug_info("MSN CL","Deleting group %s from contact list\n", group_name); + purple_debug_info("MSNCL","Deleting group %s from contact list\n", group_name); guid = msn_userlist_find_group_id(session->userlist, group_name); @@ -1785,7 +1369,7 @@ * we need to delete nothing */ if (guid == NULL) { - purple_debug_info("MSN CL", "Group %s guid not found, returning.\n", group_name); + purple_debug_info("MSNCL", "Group %s guid not found, returning.\n", group_name); return; } @@ -1794,21 +1378,17 @@ return; } - state = msn_callback_state_new(); + state = msn_callback_state_new(session); msn_callback_state_set_action(state, MSN_DEL_GROUP); msn_callback_state_set_guid(state, guid); body = g_strdup_printf(MSN_GROUP_DEL_TEMPLATE, guid); - /*build SOAP and POST it*/ - soap_request = msn_soap_request_new(MSN_CONTACT_SERVER, - MSN_ADDRESS_BOOK_POST_URL, - MSN_GROUP_DEL_SOAP_ACTION, - body, - state, - msn_group_read_cb, - msn_group_written_cb, - msn_contact_connect_init); - msn_soap_post(contact->soapconn, soap_request); + + msn_soap_message_send(session, + msn_soap_message_new(MSN_GROUP_DEL_SOAP_ACTION, + xmlnode_from_str(body, -1)), + MSN_CONTACT_SERVER, MSN_ADDRESS_BOOK_POST_URL, + msn_group_read_cb, state); g_free(body); } @@ -1817,24 +1397,22 @@ void msn_contact_rename_group(MsnSession *session, const char *old_group_name, const char *new_group_name) { - MsnSoapReq *soap_request; - MsnContact *contact; - gchar * escaped_group_name, *body = NULL; + gchar *body = NULL; const gchar * guid; - MsnCallbackState *state = msn_callback_state_new(); + MsnCallbackState *state; g_return_if_fail(session != NULL); g_return_if_fail(session->userlist != NULL); g_return_if_fail(old_group_name != NULL); g_return_if_fail(new_group_name != NULL); - contact = session->contact; purple_debug_info("MSN CL", "Renaming group %s to %s.\n", old_group_name, new_group_name); guid = msn_userlist_find_group_id(session->userlist, old_group_name); if (guid == NULL) return; + state = msn_callback_state_new(session); msn_callback_state_set_guid(state, guid); msn_callback_state_set_new_group_name(state, new_group_name); @@ -1845,31 +1423,14 @@ msn_callback_state_set_action(state, MSN_RENAME_GROUP); - /* escape group name's html special chars so it can safely be sent - * in a XML SOAP request - */ - escaped_group_name = g_markup_escape_text(new_group_name, -1); - - body = g_strdup_printf(MSN_GROUP_RENAME_TEMPLATE, guid, escaped_group_name); + body = g_markup_printf_escaped(MSN_GROUP_RENAME_TEMPLATE, + guid, new_group_name); - soap_request = msn_soap_request_new(MSN_CONTACT_SERVER, - MSN_ADDRESS_BOOK_POST_URL, - MSN_GROUP_RENAME_SOAP_ACTION, - body, - state, - msn_group_read_cb, - msn_group_written_cb, - msn_contact_connect_init); - msn_soap_post(contact->soapconn, soap_request); - - g_free(escaped_group_name); + msn_soap_message_send(session, + msn_soap_message_new(MSN_GROUP_RENAME_SOAP_ACTION, + xmlnode_from_str(body, -1)), + MSN_CONTACT_SERVER, MSN_ADDRESS_BOOK_POST_URL, + msn_group_read_cb, state); + g_free(body); } - -void -msn_contact_connect_init(MsnSoapConn *soapconn) -{ - msn_soap_init(soapconn, MSN_CONTACT_SERVER, TRUE, - msn_contact_login_connect_cb, - msn_contact_login_error_cb); -}
--- a/libpurple/protocols/msn/contact.h Sun Nov 04 22:17:45 2007 +0000 +++ b/libpurple/protocols/msn/contact.h Mon Nov 05 00:35:07 2007 +0000 @@ -380,6 +380,7 @@ gchar * guid; MsnListId list_id; MsnCallbackAction action; + MsnSession *session; }; typedef enum @@ -397,7 +398,7 @@ MsnContact * msn_contact_new(MsnSession *session); void msn_contact_destroy(MsnContact *contact); -MsnCallbackState * msn_callback_state_new(void); +MsnCallbackState * msn_callback_state_new(MsnSession *session); void msn_callback_state_free(MsnCallbackState *state); void msn_callback_state_set_who(MsnCallbackState *state, const gchar *who); void msn_callback_state_set_uid(MsnCallbackState *state, const gchar *uid);
--- a/libpurple/protocols/msn/msn.c Sun Nov 04 22:17:45 2007 +0000 +++ b/libpurple/protocols/msn/msn.c Mon Nov 05 00:35:07 2007 +0000 @@ -580,14 +580,20 @@ psm = purple_status_get_attr_string(status, "message"); currentmedia = purple_status_get_attr_string(status, PURPLE_TUNE_FULL); - if (!purple_presence_is_available(presence)) { + if (!purple_status_is_available(status)) { name = purple_status_get_name(status); } else { name = NULL; } if (name != NULL && *name) { - char *tmp2 = g_markup_escape_text(name, -1); + char *tmp2; + + if (purple_presence_is_idle(presence)) { + tmp2 = g_markup_printf_escaped("%s/%s", name, _("Idle")); + } else { + tmp2 = g_markup_escape_text(name, -1); + } if (psm != NULL && *psm) { tmp = g_markup_escape_text(psm, -1); @@ -601,8 +607,20 @@ } else { if (psm != NULL && *psm) { tmp = g_markup_escape_text(psm, -1); - purple_notify_user_info_add_pair(user_info, _("Status"), tmp); + if (purple_presence_is_idle(presence)) { + purple_notify_user_info_add_pair(user_info, _("Idle"), tmp); + } else { + purple_notify_user_info_add_pair(user_info, _("Status"), tmp); + } g_free(tmp); + } else { + if (purple_presence_is_idle(presence)) { + purple_notify_user_info_add_pair(user_info, _("Status"), + _("Idle")); + } else { + purple_notify_user_info_add_pair(user_info, _("Status"), + purple_status_get_name(status)); + } } } @@ -956,21 +974,17 @@ }else { /*send Offline Instant Message,only to MSN Passport User*/ MsnSession *session; - MsnOim *oim; char *friendname; purple_debug_info("MSNP14","prepare to send offline Message\n"); session = gc->proto_data; - /* XXX/khc: hack */ - if (!session->oim) - session->oim = msn_oim_new(session); - oim = session->oim; friendname = msn_encode_mime(account->username); - msn_oim_prep_send_msg_info(oim, purple_account_get_username(account), - friendname, who, message); + msn_oim_prep_send_msg_info(session->oim, + purple_account_get_username(account), + friendname, who, message); + msn_oim_send_msg(session->oim); g_free(friendname); - msn_oim_send_msg(oim); } return 1;
--- a/libpurple/protocols/msn/nexus.c Sun Nov 04 22:17:45 2007 +0000 +++ b/libpurple/protocols/msn/nexus.c Mon Nov 05 00:35:07 2007 +0000 @@ -22,15 +22,12 @@ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1301 USA */ #include "msn.h" -#include "soap.h" +#include "soap2.h" #include "nexus.h" #include "notification.h" #undef NEXUS_LOGIN_TWN -/*Local Function Prototype*/ -static gboolean nexus_login_connect_cb(MsnSoapConn *soapconn, PurpleSslConnection *gsc); - /************************************************************************** * Main **************************************************************************/ @@ -42,8 +39,6 @@ nexus = g_new0(MsnNexus, 1); nexus->session = session; - /*we must use SSL connection to do Windows Live ID authentication*/ - nexus->soapconn = msn_soap_new(session,nexus,1); nexus->challenge_data = g_hash_table_new_full(g_str_hash, g_str_equal, g_free, g_free); @@ -57,193 +52,98 @@ if (nexus->challenge_data != NULL) g_hash_table_destroy(nexus->challenge_data); - msn_soap_destroy(nexus->soapconn); g_free(nexus); } -#if 0 /* khc */ -/************************************************************************** - * Util - **************************************************************************/ - -static gssize -msn_ssl_read(MsnNexus *nexus) -{ - gssize len; - char temp_buf[4096]; - - if ((len = purple_ssl_read(nexus->gsc, temp_buf, - sizeof(temp_buf))) > 0) - { - nexus->read_buf = g_realloc(nexus->read_buf, - nexus->read_len + len + 1); - strncpy(nexus->read_buf + nexus->read_len, temp_buf, len); - nexus->read_len += len; - nexus->read_buf[nexus->read_len] = '\0'; - } - - return len; -} - -static void -nexus_write_cb(gpointer data, gint source, PurpleInputCondition cond) -{ - MsnNexus *nexus = data; - int len, total_len; - - total_len = strlen(nexus->write_buf); - - len = purple_ssl_write(nexus->gsc, - nexus->write_buf + nexus->written_len, - total_len - nexus->written_len); - - if (len < 0 && errno == EAGAIN) - return; - else if (len <= 0) { - purple_input_remove(nexus->input_handler); - nexus->input_handler = 0; - /* TODO: notify of the error */ - return; - } - nexus->written_len += len; - - if (nexus->written_len < total_len) - return; - - purple_input_remove(nexus->input_handler); - nexus->input_handler = 0; - - g_free(nexus->write_buf); - nexus->write_buf = NULL; - nexus->written_len = 0; - - nexus->written_cb(nexus, source, 0); -} - -#endif /************************************************************************** * Login **************************************************************************/ + static void -nexus_login_error_cb(MsnSoapConn *soapconn, PurpleSslConnection *gsc, PurpleSslErrorType error) +nexus_got_response_cb(MsnSoapMessage *req, MsnSoapMessage *resp, gpointer data) { - MsnSession *session; + MsnNexus *nexus = data; + MsnSession *session = nexus->session; + xmlnode *node; + + if (resp == NULL) { + msn_session_set_error(session, MSN_ERROR_AUTH, _("Windows Live ID authentication:Unable to connect")); + return; + } + + node = msn_soap_xml_get(resp->xml, "Body/" + "RequestSecurityTokenResponseCollection/RequestSecurityTokenResponse"); + + for (; node; node = node->next) { + xmlnode *token = msn_soap_xml_get(node, + "RequestedSecurityToken/BinarySecurityToken"); + + if (token) { + char *token_str = xmlnode_get_data(token); + char **elems, **cur, **tokens; + char *msn_twn_t, *msn_twn_p, *cert_str; + + if (token_str == NULL) continue; + + elems = g_strsplit(token_str, "&", 0); - session = soapconn->session; - g_return_if_fail(session != NULL); + for (cur = elems; *cur != NULL; cur++){ + tokens = g_strsplit(*cur, "=", 2); + g_hash_table_insert(nexus->challenge_data, tokens[0], tokens[1]); + /* Don't free each of the tokens, only the array. */ + g_free(tokens); + } + + g_free(token_str); + g_strfreev(elems); + + msn_twn_t = g_hash_table_lookup(nexus->challenge_data, "t"); + msn_twn_p = g_hash_table_lookup(nexus->challenge_data, "p"); + + /*setup the t and p parameter for session*/ + if (session->passport_info.t != NULL){ + g_free(session->passport_info.t); + } + session->passport_info.t = g_strdup(msn_twn_t); - soapconn->gsc = NULL; + if (session->passport_info.p != NULL) + g_free(session->passport_info.p); + session->passport_info.p = g_strdup(msn_twn_p); + + cert_str = g_strdup_printf("t=%s&p=%s",msn_twn_t,msn_twn_p); + msn_got_login_params(session, cert_str); - msn_session_set_error(session, MSN_ERROR_AUTH, _("Windows Live ID authentication:Unable to connect")); - /* the above line will result in nexus being destroyed, so we don't want - * to destroy it here, or we'd crash */ + purple_debug_info("MSN Nexus","Close nexus connection!\n"); + g_free(cert_str); + msn_nexus_destroy(nexus); + session->nexus = NULL; + + return; + } + } + + /* we must have failed! */ + msn_session_set_error(session, MSN_ERROR_AUTH, _("Windows Live ID authentication: cannot find authenticate token in server response")); } -/*process the SOAP reply, get the Authentication Info*/ -static gboolean -nexus_login_read_cb(MsnSoapConn *soapconn) +/*when connect, do the SOAP Style windows Live ID authentication */ +void +msn_nexus_connect(MsnNexus *nexus) { - MsnNexus *nexus; - MsnSession *session; - - char *base, *c; - char *msn_twn_t,*msn_twn_p; - char *login_params; - char **elems, **cur, **tokens; - char * cert_str; - - nexus = soapconn->parent; - g_return_val_if_fail(nexus != NULL, TRUE); - session = nexus->session; - g_return_val_if_fail(session != NULL, FALSE); - - /*reply OK, we should process the SOAP body*/ - purple_debug_info("MSN Nexus","TWN Server Windows Live ID Reply OK!\n"); - - //TODO: we should parse it using XML -#ifdef NEXUS_LOGIN_TWN - base = g_strstr_len(soapconn->read_buf, soapconn->read_len, TWN_START_TOKEN); - base += strlen(TWN_START_TOKEN); - c = g_strstr_len(soapconn->read_buf, soapconn->read_len, TWN_END_TOKEN); -#else - base = g_strstr_len(soapconn->read_buf, soapconn->read_len, TWN_LIVE_START_TOKEN); - base += strlen(TWN_LIVE_START_TOKEN); - c = g_strstr_len(soapconn->read_buf, soapconn->read_len, TWN_LIVE_END_TOKEN); -#endif - login_params = g_strndup(base, c - base); - - // purple_debug_info("msn", "TWN Cert: {%s}\n", login_params); - - /* Parse the challenge data. */ - elems = g_strsplit(login_params, "&", 0); - - for (cur = elems; *cur != NULL; cur++){ - tokens = g_strsplit(*cur, "=", 2); - g_hash_table_insert(nexus->challenge_data, tokens[0], tokens[1]); - /* Don't free each of the tokens, only the array. */ - g_free(tokens); - } - - g_strfreev(elems); - - msn_twn_t = (char *)g_hash_table_lookup(nexus->challenge_data, "t"); - msn_twn_p = (char *)g_hash_table_lookup(nexus->challenge_data, "p"); - - /*setup the t and p parameter for session*/ - g_free(session->passport_info.t); - session->passport_info.t = g_strdup(msn_twn_t); - - g_free(session->passport_info.p); - session->passport_info.p = g_strdup(msn_twn_p); - - cert_str = g_strdup_printf("t=%s&p=%s",msn_twn_t,msn_twn_p); - msn_got_login_params(session, cert_str); - - purple_debug_info("MSN Nexus","Close nexus connection!\n"); - g_free(cert_str); - g_free(login_params); - msn_nexus_destroy(nexus); - session->nexus = NULL; - - return FALSE; -} - -static void -nexus_login_written_cb(MsnSoapConn *soapconn) -{ - soapconn->read_cb = nexus_login_read_cb; -// msn_soap_read_cb(data,source,cond); -} - - -/*when connect, do the SOAP Style windows Live ID authentication */ -gboolean -nexus_login_connect_cb(MsnSoapConn *soapconn, PurpleSslConnection *gsc) -{ - MsnNexus * nexus; - MsnSession *session; + MsnSession *session = nexus->session; char *ru,*lc,*id,*tw,*ct,*kpp,*kv,*ver,*rn,*tpf; char *fs0,*fs; char *username, *password; - char *request_str, *tail; + char *tail; #ifdef NEXUS_LOGIN_TWN char *challenge_str; #else char *rst1_str,*rst2_str,*rst3_str; #endif - - purple_debug_info("MSN Nexus","Starting Windows Live ID authentication\n"); - - g_return_val_if_fail(soapconn != NULL, FALSE); - nexus = soapconn->parent; - g_return_val_if_fail(nexus != NULL, TRUE); + MsnSoapMessage *soap; - session = soapconn->session; - g_return_val_if_fail(session != NULL, FALSE); - - msn_soap_set_process_step(soapconn, MSN_SOAP_PROCESSING); - + purple_debug_info("MSN Nexus","Starting Windows Live ID authentication\n"); msn_session_set_login_step(session, MSN_LOGIN_STEP_GET_COOKIE); /*prepare the Windows Live ID authentication token*/ @@ -272,10 +172,9 @@ msn_session_set_error(session, MSN_ERROR_AUTH, _("Windows Live ID authentication Failed")); g_free(username); g_free(password); - purple_ssl_close(gsc); msn_nexus_destroy(nexus); session->nexus = NULL; - return FALSE; + return; } /* @@ -314,151 +213,8 @@ #endif g_free(fs); - soapconn->login_path = g_strdup(TWN_POST_URL); - request_str = g_strdup_printf( - "POST %s HTTP/1.1\r\n" - "Accept: text/*\r\n" - "User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)\r\n" - "Host: %s\r\n" - "Content-Length: %" G_GSIZE_FORMAT "\r\n" - "Connection: Keep-Alive\r\n" - "Cache-Control: no-cache\r\n\r\n" - "%s", - soapconn->login_path, soapconn->login_host, strlen(tail), - tail); - -#ifdef MSN_SOAP_DEBUG - purple_debug_misc("MSN Nexus", "TWN Sending:\n%s\n", request_str); -#endif - g_free(tail); - g_free(username); - g_free(password); - - /*prepare to send the SOAP request*/ - msn_soap_write(soapconn, request_str, nexus_login_written_cb); - - return TRUE; + soap = msn_soap_message_new(NULL, xmlnode_from_str(tail, -1)); + msn_soap_message_send(nexus->session, soap, MSN_TWN_SERVER, TWN_POST_URL, + nexus_got_response_cb, nexus); } -#if 0 /* khc */ -static void -nexus_connect_written_cb(gpointer data, gint source, PurpleInputCondition cond) -{ - MsnNexus *nexus = data; - int len; - - char *da_login; - char *base, *c; - - if (nexus->input_handler == 0) - /* TODO: Use purple_ssl_input_add()? */ - nexus->input_handler = purple_input_add(nexus->gsc->fd, - PURPLE_INPUT_READ, nexus_connect_written_cb, nexus); - - - /* Get the PassportURLs line. */ - len = msn_ssl_read(nexus); - - if (len < 0 && errno == EAGAIN) - return; - else if (len < 0) { - purple_input_remove(nexus->input_handler); - nexus->input_handler = 0; - g_free(nexus->read_buf); - nexus->read_buf = NULL; - nexus->read_len = 0; - /* TODO: error handling */ - return; - } - - if (g_strstr_len(nexus->read_buf, nexus->read_len, - "\r\n\r\n") == NULL) - return; - - purple_input_remove(nexus->input_handler); - nexus->input_handler = 0; - - base = strstr(nexus->read_buf, "PassportURLs"); - - if (base == NULL) - { - g_free(nexus->read_buf); - nexus->read_buf = NULL; - nexus->read_len = 0; - return; - } - - if ((da_login = strstr(base, "DALogin=")) != NULL) - { - /* skip over "DALogin=" */ - da_login += 8; - - if ((c = strchr(da_login, ',')) != NULL) - *c = '\0'; - - if ((c = strchr(da_login, '/')) != NULL) - { - nexus->login_path = g_strdup(c); - *c = '\0'; - } - - nexus->login_host = g_strdup(da_login); - } - - g_free(nexus->read_buf); - nexus->read_buf = NULL; - nexus->read_len = 0; - - purple_ssl_close(nexus->gsc); - - /* Now begin the connection to the login server. */ - nexus->gsc = purple_ssl_connect(nexus->session->account, - nexus->login_host, PURPLE_SSL_DEFAULT_PORT, - login_connect_cb, login_error_cb, nexus); -} - - -#endif - -/************************************************************************** - * Connect - **************************************************************************/ - -#if 0 /* khc */ -static void -nexus_connect_cb(gpointer data, PurpleSslConnection *gsc, - PurpleInputCondition cond) -{ - MsnNexus *nexus; - MsnSession *session; - - nexus = data; - g_return_if_fail(nexus != NULL); - - session = nexus->session; - g_return_if_fail(session != NULL); - - msn_session_set_login_step(session, MSN_LOGIN_STEP_AUTH); - - nexus->write_buf = g_strdup("GET /rdr/pprdr.asp\r\n\r\n"); - nexus->written_len = 0; - - nexus->read_len = 0; - - nexus->written_cb = nexus_connect_written_cb; - - nexus->input_handler = purple_input_add(gsc->fd, PURPLE_INPUT_WRITE, - nexus_write_cb, nexus); - - nexus_write_cb(nexus, gsc->fd, PURPLE_INPUT_WRITE); -} - -#endif - -void -msn_nexus_connect(MsnNexus *nexus) -{ - /* Authenticate via Windows Live ID. */ - msn_soap_init(nexus->soapconn, MSN_TWN_SERVER, TRUE, nexus_login_connect_cb, nexus_login_error_cb); - msn_soap_connect(nexus->soapconn); -}
--- a/libpurple/protocols/msn/nexus.h Sun Nov 04 22:17:45 2007 +0000 +++ b/libpurple/protocols/msn/nexus.h Mon Nov 05 00:35:07 2007 +0000 @@ -139,7 +139,6 @@ struct _MsnNexus { MsnSession *session; - MsnSoapConn *soapconn; char * challenge_data_str; GHashTable *challenge_data; };
--- a/libpurple/protocols/msn/notification.c Sun Nov 04 22:17:45 2007 +0000 +++ b/libpurple/protocols/msn/notification.c Mon Nov 05 00:35:07 2007 +0000 @@ -1411,7 +1411,7 @@ { purple_debug_error("msn", "Error opening temp passport file: %s\n", - strerror(errno)); + g_strerror(errno)); } else { @@ -1460,7 +1460,7 @@ { purple_debug_error("msn", "Error closing temp passport file: %s\n", - strerror(errno)); + g_strerror(errno)); g_unlink(session->passport_info.file); g_free(session->passport_info.file); @@ -1790,9 +1790,7 @@ return; /*new a oim session*/ - /* There are several things that call this */ - if (session->oim == NULL) - session->oim = msn_oim_new(session); +// session->oim = msn_oim_new(session); // msn_oim_connect(session->oim); table = msn_message_get_hashtable_from_body(msg);
--- a/libpurple/protocols/msn/oim.c Sun Nov 04 22:17:45 2007 +0000 +++ b/libpurple/protocols/msn/oim.c Mon Nov 05 00:35:07 2007 +0000 @@ -24,24 +24,31 @@ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #include "msn.h" -#include "soap.h" +#include "soap2.h" #include "oim.h" #include "msnutils.h" +typedef struct _MsnOimSendReq { + char *from_member; + char *friendname; + char *to_member; + char *oim_msg; +} MsnOimSendReq; + +typedef struct { + MsnOim *oim; + char *msg_id; +} MsnOimRecvData; + /*Local Function Prototype*/ -static void msn_oim_post_single_get_msg(MsnOim *oim,const char *msgid); +static void msn_oim_post_single_get_msg(MsnOim *oim, char *msgid); static MsnOimSendReq *msn_oim_new_send_req(const char *from_member, - const char *friendname, - const char* to_member, - gint send_seq, - const char *msg); -static void msn_oim_retrieve_connect_init(MsnSoapConn *soapconn); -static void msn_oim_send_connect_init(MsnSoapConn *soapconn); + const char *friendname, + const char* to_member, + const char *msg); static void msn_oim_free_send_req(MsnOimSendReq *req); -static void msn_oim_report_to_user(MsnOim *oim, const char *msg_str); -static void msn_oim_get_process(MsnOim *oim, const char *oim_msg); -static gchar *msn_oim_msg_to_str(MsnOim *oim, const char *body); -static void msn_oim_send_process(MsnOim *oim, const char *body, int len); +static void msn_oim_report_to_user(MsnOimRecvData *rdata, const char *msg_str); +static char *msn_oim_msg_to_str(MsnOim *oim, const char *body); /*new a OIM object*/ MsnOim * @@ -51,10 +58,7 @@ oim = g_new0(MsnOim, 1); oim->session = session; - oim->retrieveconn = msn_soap_new(session, oim, TRUE); - - oim->oim_list = NULL; - oim->sendconn = msn_soap_new(session, oim, TRUE); + oim->oim_list = NULL; oim->run_id = rand_guid(); oim->challenge = NULL; oim->send_queue = g_queue_new(); @@ -69,8 +73,6 @@ MsnOimSendReq *request; purple_debug_info("OIM","destroy the OIM \n"); - msn_soap_destroy(oim->retrieveconn); - msn_soap_destroy(oim->sendconn); g_free(oim->run_id); g_free(oim->challenge); @@ -84,8 +86,7 @@ static MsnOimSendReq * msn_oim_new_send_req(const char *from_member, const char*friendname, - const char* to_member, gint send_seq, - const char *msg) + const char* to_member, const char *msg) { MsnOimSendReq *request; @@ -93,7 +94,6 @@ request->from_member =g_strdup(from_member); request->friendname = g_strdup(friendname); request->to_member = g_strdup(to_member); - request->send_seq = send_seq; request->oim_msg = g_strdup(msg); return request; } @@ -130,135 +130,75 @@ return oim_body; } -/*oim SOAP server login error*/ -static void -msn_oim_send_error_cb(MsnSoapConn *soapconn, PurpleSslConnection *gsc, PurpleSslErrorType error) -{ - MsnSession *session; - - session = soapconn->session; - g_return_if_fail(session != NULL); - - msn_session_set_error(session, MSN_ERROR_SERV_DOWN, _("Unable to connect to OIM server")); -} - -/*msn oim SOAP server connect process*/ -static gboolean -msn_oim_send_connect_cb(MsnSoapConn *soapconn, PurpleSslConnection *gsc) -{ - MsnSession * session; - MsnOim *oim; - - oim = soapconn->parent; - g_return_val_if_fail(oim != NULL, TRUE); - - session = oim->session; - g_return_val_if_fail(session != NULL, FALSE); - - return TRUE; -} - /* * Process the send return SOAP string * If got SOAP Fault,get the lock key,and resend it. */ static void -msn_oim_send_process(MsnOim *oim, const char *body, int len) +msn_oim_send_read_cb(MsnSoapMessage *request, MsnSoapMessage *response, + gpointer data) { - xmlnode *responseNode, *bodyNode; - xmlnode *faultNode = NULL, *faultCodeNode, *faultstringNode; - xmlnode *detailNode, *challengeNode; - char *fault_code, *fault_text; + MsnOim *oim = data; + MsnOimSendReq *msg = g_queue_pop_head(oim->send_queue); + + g_return_if_fail(msg != NULL); - responseNode = xmlnode_from_str(body,len); + if (response == NULL) { + purple_debug_info("MSNP14", "cannot send OIM: %s\n", msg->oim_msg); + } else { + xmlnode *faultNode = msn_soap_xml_get(response->xml, "Body/Fault"); - g_return_if_fail(responseNode != NULL); + if (faultNode == NULL) { + /*Send OK! return*/ + purple_debug_info("MSNP14", "sent OIM: %s\n", msg->oim_msg); + } else { + xmlnode *faultcode = xmlnode_get_child(faultNode, "faultcode"); + + if (faultcode) { + char *faultcode_str = xmlnode_get_data(faultcode); - if ((bodyNode = xmlnode_get_child(responseNode, "Body"))) - faultNode = xmlnode_get_child(bodyNode, "Fault"); + if (g_str_equal(faultcode_str, "q0:AuthenticationFailed")) { + xmlnode *challengeNode = msn_soap_xml_get(faultNode, + "detail/LockKeyChallenge"); - if (faultNode == NULL) { - /*Send OK! return*/ - MsnOimSendReq *request; + if (challengeNode == NULL) { + if (oim->challenge) { + g_free(oim->challenge); + oim->challenge = NULL; - xmlnode_free(responseNode); - request = g_queue_pop_head(oim->send_queue); - msn_oim_free_send_req(request); - /*send next buffered Offline Message*/ - msn_soap_post(oim->sendconn, NULL); - - return; - } + purple_debug_info("msnoim","resending OIM: %s\n", + msg->oim_msg); + g_queue_push_head(oim->send_queue, msg); + msn_oim_send_msg(oim); + return; + } else { + purple_debug_info("msnoim", + "can't find lock key for OIM: %s\n", + msg->oim_msg); + } + } else { + char buf[33]; - /*get the challenge,and repost it*/ - if (faultNode) - faultCodeNode = xmlnode_get_child(faultNode, "faultcode"); + char *challenge = xmlnode_get_data(challengeNode); + msn_handle_chl(challenge, buf); + + g_free(oim->challenge); + oim->challenge = g_strndup(buf, sizeof(buf)); + g_free(challenge); + purple_debug_info("MSNP14","lockkey:{%s}\n",oim->challenge); - if(faultCodeNode == NULL){ - purple_debug_info("MSN OIM", "No faultcode for failed Offline Message.\n"); - xmlnode_free(responseNode); - return; + /*repost the send*/ + purple_debug_info("MSNP14","resending OIM: %s\n", msg->oim_msg); + g_queue_push_head(oim->send_queue, msg); + msn_oim_send_msg(oim); + return; + } + } + } + } } - fault_code = xmlnode_get_data(faultCodeNode); -#if 0 - if(!strcmp(fault_code,"q0:AuthenticationFailed")){ - /*other Fault Reason?*/ - goto oim_send_process_fail; - } -#endif - - faultstringNode = xmlnode_get_child(faultNode, "faultstring"); - fault_text = xmlnode_get_data(faultstringNode); - purple_debug_info("MSN OIM", "Error sending Offline Message: %s (%s)\n", - fault_text ? fault_text : "(null)", fault_code ? fault_code : "(null)"); - - /* lock key fault reason, - * compute the challenge and resend it - */ - if ((detailNode = xmlnode_get_child(faultNode, "detail")) - && (challengeNode = xmlnode_get_child(detailNode, "LockKeyChallenge"))) { - g_free(oim->challenge); - oim->challenge = xmlnode_get_data(challengeNode); - - purple_debug_info("MSN OIM", "Retrying Offline IM with lockkey:{%s}\n", - oim->challenge ? oim->challenge : "(null)"); - - /*repost the send*/ - msn_oim_send_msg(oim); - - /* XXX: This needs to give up eventually (1 retry, maybe?) */ - } - - g_free(fault_text); - g_free(fault_code); - xmlnode_free(responseNode); -} - -static gboolean -msn_oim_send_read_cb(MsnSoapConn *soapconn) -{ - MsnSession *session = soapconn->session; - MsnOim * oim; - - if (soapconn->body == NULL) - return TRUE; - - g_return_val_if_fail(session != NULL, FALSE); - oim = soapconn->session->oim; - g_return_val_if_fail(oim != NULL, TRUE); - - purple_debug_info("MSN OIM","read buffer:{%s}\n", soapconn->body); - msn_oim_send_process(oim,soapconn->body,soapconn->body_len); - - return TRUE; -} - -static void -msn_oim_send_written_cb(MsnSoapConn *soapconn) -{ - soapconn->read_cb = msn_oim_send_read_cb; -// msn_soap_read_cb(data,source,cond); + msn_oim_free_send_req(msg); } void @@ -266,45 +206,36 @@ const char* friendname, const char *tomember, const char * msg) { - MsnOimSendReq *request; - g_return_if_fail(oim != NULL); - request = msn_oim_new_send_req(membername,friendname,tomember,oim->send_seq,msg); - g_queue_push_tail(oim->send_queue,request); + g_queue_push_tail(oim->send_queue, + msn_oim_new_send_req(membername, friendname, tomember, msg)); } /*post send single message request to oim server*/ void msn_oim_send_msg(MsnOim *oim) { - MsnSoapReq *soap_request; MsnOimSendReq *oim_request; char *soap_body,*mspauth; - gchar *msg_body; - char buf[33]; + char *msg_body; g_return_if_fail(oim != NULL); - oim_request = g_queue_pop_head(oim->send_queue); + oim_request = g_queue_peek_head(oim->send_queue); g_return_if_fail(oim_request != NULL); - purple_debug_info("MSN OIM","send single OIM Message\n"); + purple_debug_info("MSNP14","sending OIM: %s\n", oim_request->oim_msg); mspauth = g_strdup_printf("t=%s&p=%s", oim->session->passport_info.t, oim->session->passport_info.p ); - g_queue_push_head(oim->send_queue,oim_request); /* if we got the challenge lock key, we compute it * else we go for the SOAP fault and resend it. */ - if(oim->challenge != NULL){ - msn_handle_chl(oim->challenge, buf); - }else{ - purple_debug_info("MSN OIM","no lock key challenge,wait for SOAP Fault and Resend\n"); - buf[0]='\0'; + if(oim->challenge == NULL){ + purple_debug_info("MSNP14","no lock key challenge,wait for SOAP Fault and Resend\n"); } - purple_debug_info("MSN OIM","get the lock key challenge {%s}\n",buf); msg_body = msn_oim_msg_to_str(oim, oim_request->oim_msg); soap_body = g_strdup_printf(MSN_OIM_SEND_TEMPLATE, @@ -313,117 +244,71 @@ oim_request->to_member, mspauth, MSNP13_WLM_PRODUCT_ID, - buf, - oim_request->send_seq, + oim->challenge ? oim->challenge : "", + oim->send_seq, msg_body); - soap_request = msn_soap_request_new(MSN_OIM_SEND_HOST, - MSN_OIM_SEND_URL, - MSN_OIM_SEND_SOAP_ACTION, - soap_body, - NULL, - msn_oim_send_read_cb, - msn_oim_send_written_cb, - msn_oim_send_connect_init); + msn_soap_message_send(oim->session, + msn_soap_message_new(MSN_OIM_SEND_SOAP_ACTION, + xmlnode_from_str(soap_body, -1)), + MSN_OIM_SEND_HOST, MSN_OIM_SEND_URL, msn_oim_send_read_cb, oim); + + /*increase the offline Sequence control*/ + if (oim->challenge != NULL) { + oim->send_seq++; + } + g_free(mspauth); g_free(msg_body); g_free(soap_body); - - /*increase the offline Sequence control*/ - if(oim->challenge != NULL){ - oim->send_seq++; - } - msn_soap_post(oim->sendconn,soap_request); } /**************************************** * OIM delete SOAP request * **************************************/ -static gboolean -msn_oim_delete_read_cb(MsnSoapConn *soapconn) +static void +msn_oim_delete_read_cb(MsnSoapMessage *request, MsnSoapMessage *response, + gpointer data) { - if (soapconn->body == NULL) - return TRUE; - purple_debug_info("MSN OIM","OIM delete read buffer:{%s}\n",soapconn->body); + MsnOimRecvData *rdata = data; - msn_soap_free_read_buf(soapconn); - /*get next single Offline Message*/ -// msn_soap_post(soapconn,NULL); /* we already do this in soap.c */ - return TRUE; -} + if (response && msn_soap_xml_get(response->xml, "Body/Fault") == NULL) { + purple_debug_info("msnoim", "delete OIM success\n"); + rdata->oim->oim_list = g_list_remove(rdata->oim->oim_list, + rdata->msg_id); + g_free(rdata->msg_id); + } else { + purple_debug_info("msnoim", "delete OIM failed\n"); + } -static void -msn_oim_delete_written_cb(MsnSoapConn *soapconn) -{ - soapconn->read_cb = msn_oim_delete_read_cb; + g_free(rdata); } /*Post to get the Offline Instant Message*/ static void -msn_oim_post_delete_msg(MsnOim *oim,const char *msgid) +msn_oim_post_delete_msg(MsnOimRecvData *rdata) { - MsnSoapReq *soap_request; - gchar *soap_body; - const char *t,*p; + MsnOim *oim = rdata->oim; + char *msgid = rdata->msg_id; + char *soap_body; - g_return_if_fail(oim != NULL); - g_return_if_fail(msgid != NULL); - - purple_debug_info("MSN OIM","Delete single OIM Message {%s}\n",msgid); - t = oim->session->passport_info.t; - p = oim->session->passport_info.p; + purple_debug_info("MSNP14","Delete single OIM Message {%s}\n",msgid); soap_body = g_strdup_printf(MSN_OIM_DEL_TEMPLATE, - t, - p, - msgid - ); - soap_request = msn_soap_request_new(MSN_OIM_RETRIEVE_HOST, - MSN_OIM_RETRIEVE_URL, - MSN_OIM_DEL_SOAP_ACTION, - soap_body, - NULL, - msn_oim_delete_read_cb, - msn_oim_delete_written_cb, - msn_oim_retrieve_connect_init); + oim->session->passport_info.t, oim->session->passport_info.p, msgid); + + msn_soap_message_send(oim->session, + msn_soap_message_new(MSN_OIM_DEL_SOAP_ACTION, + xmlnode_from_str(soap_body, -1)), + MSN_OIM_RETRIEVE_HOST, MSN_OIM_RETRIEVE_URL, + msn_oim_delete_read_cb, rdata); + g_free(soap_body); - msn_soap_post(oim->retrieveconn,soap_request); } /**************************************** * OIM get SOAP request * **************************************/ -/*oim SOAP server login error*/ -static void -msn_oim_get_error_cb(MsnSoapConn *soapconn, PurpleSslConnection *gsc, PurpleSslErrorType error) -{ - MsnSession *session; - - session = soapconn->session; - g_return_if_fail(session != NULL); - msn_soap_clean_unhandled_requests(soapconn); - -// msn_session_set_error(session, MSN_ERROR_SERV_DOWN, _("Unable to connect to OIM server")); -} - -/*msn oim SOAP server connect process*/ -static gboolean -msn_oim_get_connect_cb(MsnSoapConn *soapconn, PurpleSslConnection *gsc) -{ - MsnSession * session; - MsnOim *oim; - - oim = soapconn->parent; - g_return_val_if_fail(oim != NULL, TRUE); - - session = oim->session; - g_return_val_if_fail(session != NULL, FALSE); - - purple_debug_info("MSN OIM","Connected and ready to get OIM!\n"); - - return TRUE; -} - /* like purple_str_to_time, but different. The format of the timestamp * is like this: 5 Sep 2007 21:42:12 -0700 */ static time_t @@ -435,9 +320,13 @@ "Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec", NULL }; + time_t tval = 0; struct tm t; memset(&t, 0, sizeof(t)); + time(&tval); + localtime_r(&tval, &t); + if (sscanf(timestamp, "%02d %03s %04d %02d:%02d:%02d %05s", &t.tm_mday, month_str, &t.tm_year, &t.tm_hour, &t.tm_min, &t.tm_sec, tz_str) == 7) { @@ -466,14 +355,13 @@ tzoff *= -1; t.tm_year -= 1900; - t.tm_isdst = 0; #ifdef _WIN32 if ((sys_tzoff = wpurple_get_tz_offset()) != -1) tzoff += sys_tzoff; #else #ifdef HAVE_TM_GMTOFF - tzoff += t.tm_gmtoff; + tzoff -= t.tm_gmtoff; #else # ifdef HAVE_TIMEZONE tzset(); /* making sure */ @@ -487,13 +375,13 @@ } } - purple_debug_info("MSN OIM:OIM", "Can't parse timestamp %s\n", timestamp); - return time(NULL); + purple_debug_info("MSNP14:OIM", "Can't parse timestamp %s\n", timestamp); + return tval; } /*Post the Offline Instant Message to User Conversation*/ static void -msn_oim_report_to_user(MsnOim *oim, const char *msg_str) +msn_oim_report_to_user(MsnOimRecvData *rdata, const char *msg_str) { MsnMessage *message; char *date,*from,*decode_msg; @@ -502,14 +390,13 @@ char *start,*end; int has_nick = 0; char *passport_str, *passport; - char *msg_id; time_t stamp; message = msn_message_new(MSN_MSG_UNKNOWN); msn_message_parse_payload(message, msg_str, strlen(msg_str), MSG_OIM_LINE_DEM, MSG_OIM_BODY_DEM); - purple_debug_info("MSN OIM","oim body:{%s}\n",message->body); + purple_debug_info("MSNP14","oim body:{%s}\n",message->body); decode_msg = (char *)purple_base64_decode(message->body,&body_len); date = (char *)g_hash_table_lookup(message->attr_table, "Date"); from = (char *)g_hash_table_lookup(message->attr_table, "From"); @@ -519,12 +406,12 @@ if(has_nick){ tokens = g_strsplit(from , " " , 2); passport_str = g_strdup(tokens[1]); - purple_debug_info("MSN OIM","oim Date:{%s},nickname:{%s},tokens[1]:{%s} passport{%s}\n", + purple_debug_info("MSNP14","oim Date:{%s},nickname:{%s},tokens[1]:{%s} passport{%s}\n", date,tokens[0],tokens[1],passport_str); g_strfreev(tokens); }else{ passport_str = g_strdup(from); - purple_debug_info("MSN OIM","oim Date:{%s},passport{%s}\n", + purple_debug_info("MSNP14","oim Date:{%s},passport{%s}\n", date,passport_str); } start = strstr(passport_str,"<"); @@ -536,66 +423,43 @@ stamp = msn_oim_parse_timestamp(date); - serv_got_im(oim->session->account->gc, passport, decode_msg, 0, stamp); + serv_got_im(rdata->oim->session->account->gc, passport, decode_msg, 0, + stamp); /*Now get the oim message ID from the oim_list. * and append to read list to prepare for deleting the Offline Message when sign out */ - if(oim->oim_list != NULL){ - msg_id = oim->oim_list->data; - msn_oim_post_delete_msg(oim,msg_id); - oim->oim_list = g_list_remove(oim->oim_list, oim->oim_list->data); - g_free(msg_id); - } + msn_oim_post_delete_msg(rdata); g_free(passport); + g_free(decode_msg); } /* Parse the XML data, * prepare to report the OIM to user */ static void -msn_oim_get_process(MsnOim *oim, const char *oim_msg) -{ - xmlnode *oim_node,*bodyNode,*responseNode,*msgNode; - char *msg_str; - - oim_node = xmlnode_from_str(oim_msg, strlen(oim_msg)); - bodyNode = xmlnode_get_child(oim_node,"Body"); - responseNode = xmlnode_get_child(bodyNode,"GetMessageResponse"); - msgNode = xmlnode_get_child(responseNode,"GetMessageResult"); - msg_str = xmlnode_get_data(msgNode); - purple_debug_info("OIM","msg:{%s}\n",msg_str); - msn_oim_report_to_user(oim,msg_str); - - g_free(msg_str); - xmlnode_free(oim_node); -} - -static gboolean -msn_oim_get_read_cb(MsnSoapConn *soapconn) +msn_oim_get_read_cb(MsnSoapMessage *request, MsnSoapMessage *response, + gpointer data) { - MsnOim * oim = soapconn->session->oim; - - if (soapconn->body == NULL) - return TRUE; + MsnOimRecvData *rdata = data; - purple_debug_info("MSN OIM","OIM get read buffer:{%s}\n",soapconn->body); - - /*we need to process the read message!*/ - msn_oim_get_process(oim,soapconn->body); - msn_soap_free_read_buf(soapconn); + if (response != NULL) { + xmlnode *msg_node = msn_soap_xml_get(response->xml, + "Body/GetMessageResponse/GetMessageResult"); - /*get next single Offline Message*/ -// msn_soap_post(soapconn,NULL); /* we already do this in soap.c */ - return TRUE; -} - -static void -msn_oim_get_written_cb(MsnSoapConn *soapconn) -{ - soapconn->read_cb = msn_oim_get_read_cb; -// msn_soap_read_cb(data,source,cond); + if (msg_node) { + char *msg_str = xmlnode_get_data(msg_node); + msn_oim_report_to_user(rdata, msg_str); + g_free(msg_str); + } else { + char *str = xmlnode_to_str(response->xml, NULL); + purple_debug_info("msnoim", "Unknown response: %s\n", str); + g_free(str); + } + } else { + purple_debug_info("msnoim", "Failed to get OIM\n"); + } } /* parse the oim XML data @@ -604,116 +468,88 @@ void msn_parse_oim_msg(MsnOim *oim,const char *xmlmsg) { - xmlnode *node, *mNode,*ENode,*INode,*rtNode,*nNode; - char *passport,*msgid,*nickname, *unread, *rTime = NULL; + xmlnode *node, *mNode; + xmlnode *iu_node; MsnSession *session = oim->session; - purple_debug_info("MSN OIM:OIM", "%s", xmlmsg); + purple_debug_info("MSNP14:OIM", "%s", xmlmsg); - node = xmlnode_from_str(xmlmsg, strlen(xmlmsg)); - if (!node || !node->name || strcmp(node->name, "MD") != 0) { - if (node) - xmlnode_free(node); + node = xmlnode_from_str(xmlmsg, -1); + if (strcmp(node->name, "MD") != 0) { + purple_debug_info("msnoim", "WTF is this? %s\n", xmlmsg); + xmlnode_free(node); return; } - ENode = xmlnode_get_child(node, "E"); - INode = xmlnode_get_child(ENode, "IU"); - unread = xmlnode_get_data(INode); - - if (unread != NULL && purple_account_get_check_mail(session->account)) - { - int count = atoi(unread); + iu_node = msn_soap_xml_get(node, "E/IU"); - if (count > 0) - { - const char *passport; - const char *url; + if (iu_node != NULL && purple_account_get_check_mail(session->account)) + { + char *unread = xmlnode_get_data(iu_node); + const char *passport = msn_user_get_passport(session->user); + const char *url = session->passport_info.file; - passport = msn_user_get_passport(session->user); - url = session->passport_info.file; - - purple_notify_emails(session->account->gc, atoi(unread), FALSE, NULL, NULL, - &passport, &url, NULL, NULL); - } + /* XXX/khc: pretty sure this is wrong */ + purple_notify_emails(session->account->gc, atoi(unread), FALSE, NULL, + NULL, &passport, &url, NULL, NULL); + g_free(unread); } for(mNode = xmlnode_get_child(node, "M"); mNode; mNode = xmlnode_get_next_twin(mNode)){ - /*email Node*/ - ENode = xmlnode_get_child(mNode,"E"); - passport = xmlnode_get_data(ENode); - /*Index */ - INode = xmlnode_get_child(mNode,"I"); - msgid = xmlnode_get_data(INode); - /*Nickname*/ - nNode = xmlnode_get_child(mNode,"N"); - nickname = xmlnode_get_data(nNode); - /*receive time*/ - rtNode = xmlnode_get_child(mNode,"RT"); - if(rtNode != NULL) - rTime = xmlnode_get_data(rtNode); -/* purple_debug_info("MSN OIM","E:{%s},I:{%s},rTime:{%s}\n",passport,msgid,rTime); */ + char *passport, *msgid, *nickname, *rtime = NULL; + xmlnode *e_node, *i_node, *n_node, *rt_node; + + e_node = xmlnode_get_child(mNode, "E"); + passport = xmlnode_get_data(e_node); + + i_node = xmlnode_get_child(mNode, "I"); + msgid = xmlnode_get_data(i_node); + + n_node = xmlnode_get_child(mNode, "N"); + nickname = xmlnode_get_data(n_node); - oim->oim_list = g_list_append(oim->oim_list,strdup(msgid)); - msn_oim_post_single_get_msg(oim,msgid); + rt_node = xmlnode_get_child(mNode, "RT"); + if (rt_node != NULL) { + rtime = xmlnode_get_data(rt_node); + } +/* purple_debug_info("msnoim","E:{%s},I:{%s},rTime:{%s}\n",passport,msgid,rTime); */ + + if (!g_list_find_custom(oim->oim_list, msgid, (GCompareFunc)strcmp)) { + oim->oim_list = g_list_append(oim->oim_list, msgid); + msn_oim_post_single_get_msg(oim, msgid); + msgid = NULL; + } + g_free(passport); g_free(msgid); - g_free(rTime); - rTime = NULL; + g_free(rtime); g_free(nickname); } - g_free(unread); + xmlnode_free(node); } /*Post to get the Offline Instant Message*/ static void -msn_oim_post_single_get_msg(MsnOim *oim,const char *msgid) +msn_oim_post_single_get_msg(MsnOim *oim, char *msgid) { - MsnSoapReq *soap_request; - gchar *soap_body; - const char *t,*p; + char *soap_body; + MsnOimRecvData *data = g_new0(MsnOimRecvData, 1); - purple_debug_info("MSN OIM","Get single OIM Message\n"); - t = oim->session->passport_info.t; - p = oim->session->passport_info.p; + purple_debug_info("MSNP14","Get single OIM Message\n"); + + data->oim = oim; + data->msg_id = msgid; soap_body = g_strdup_printf(MSN_OIM_GET_TEMPLATE, - t, - p, - msgid - ); - soap_request = msn_soap_request_new(MSN_OIM_RETRIEVE_HOST, - MSN_OIM_RETRIEVE_URL, - MSN_OIM_GET_SOAP_ACTION, - soap_body, - NULL, - msn_oim_get_read_cb, - msn_oim_get_written_cb, - msn_oim_retrieve_connect_init); - g_free(soap_body); - msn_soap_post(oim->retrieveconn,soap_request); -} + oim->session->passport_info.t, oim->session->passport_info.p, msgid); -/*msn oim retrieve server connect init */ -static void -msn_oim_retrieve_connect_init(MsnSoapConn *soapconn) -{ - purple_debug_info("MSN OIM","Initializing OIM retrieve connection\n"); - msn_soap_init(soapconn, MSN_OIM_RETRIEVE_HOST, TRUE, - msn_oim_get_connect_cb, - msn_oim_get_error_cb); -} + msn_soap_message_send(oim->session, + msn_soap_message_new(MSN_OIM_GET_SOAP_ACTION, + xmlnode_from_str(soap_body, -1)), + MSN_OIM_RETRIEVE_HOST, MSN_OIM_RETRIEVE_URL, + msn_oim_get_read_cb, data); -/*Msn OIM Send Server Connect Init Function*/ -static void -msn_oim_send_connect_init(MsnSoapConn *sendconn) -{ - purple_debug_info("MSN OIM","Initializing OIM send connection\n"); - msn_soap_init(sendconn, MSN_OIM_SEND_HOST, TRUE, - msn_oim_send_connect_cb, - msn_oim_send_error_cb); + g_free(soap_body); } - -/* EOF oim.c*/
--- a/libpurple/protocols/msn/oim.h Sun Nov 04 22:17:45 2007 +0000 +++ b/libpurple/protocols/msn/oim.h Mon Nov 05 00:35:07 2007 +0000 @@ -95,17 +95,6 @@ "</soap:Body>"\ "</soap:Envelope>" -typedef struct _MsnOimSendReq MsnOimSendReq; - -struct _MsnOimSendReq -{ - char *from_member; - char *friendname; - char *to_member; - char *oim_msg; - gint send_seq; -}; - typedef struct _MsnOim MsnOim; struct _MsnOim @@ -127,7 +116,6 @@ * **************************************************/ MsnOim * msn_oim_new(MsnSession *session); void msn_oim_destroy(MsnOim *oim); -void msn_oim_connect(MsnOim *oim); void msn_parse_oim_msg(MsnOim *oim,const char *xmlmsg); @@ -138,11 +126,5 @@ void msn_oim_send_msg(MsnOim *oim); -/*get the OIM message*/ -void msn_oim_get_msg(MsnOim *oim); - -/*report the oim message to the conversation*/ -void msn_oim_report_user(MsnOim *oim,const char *passport,char *msg); - #endif/* _MSN_OIM_H_*/ /*endof oim.h*/
--- a/libpurple/protocols/msn/servconn.c Sun Nov 04 22:17:45 2007 +0000 +++ b/libpurple/protocols/msn/servconn.c Mon Nov 05 00:35:07 2007 +0000 @@ -402,7 +402,7 @@ default: purple_debug_error("msn", "servconn read error," "len: %d, errno: %d, error: %s\n", - len, errno, strerror(errno)); + len, errno, g_strerror(errno)); msn_servconn_got_error(servconn, MSN_SERVCONN_ERROR_READ); return;
--- a/libpurple/protocols/msn/session.c Sun Nov 04 22:17:45 2007 +0000 +++ b/libpurple/protocols/msn/session.c Mon Nov 05 00:35:07 2007 +0000 @@ -24,6 +24,7 @@ #include "msn.h" #include "session.h" #include "notification.h" +#include "oim.h" #include "dialog.h" @@ -42,6 +43,7 @@ session->user = msn_user_new(session->userlist, purple_account_get_username(account), NULL); + session->oim = msn_oim_new(session); /*if you want to chat with Yahoo Messenger*/ //session->protocol_ver = WLM_YAHOO_PROT_VER; @@ -99,6 +101,12 @@ if (session->user != NULL) msn_user_destroy(session->user); + if (session->soap_table) + g_hash_table_destroy(session->soap_table); + + if (session->soap_cleanup_handle) + purple_timeout_remove(session->soap_cleanup_handle); + g_free(session); }
--- a/libpurple/protocols/msn/session.h Sun Nov 04 22:17:45 2007 +0000 +++ b/libpurple/protocols/msn/session.h Mon Nov 05 00:35:07 2007 +0000 @@ -126,6 +126,9 @@ char *client_ip; int client_port; } passport_info; + + GHashTable *soap_table; + int soap_cleanup_handle; }; /**
--- a/libpurple/protocols/msn/slplink.c Sun Nov 04 22:17:45 2007 +0000 +++ b/libpurple/protocols/msn/slplink.c Mon Nov 05 00:35:07 2007 +0000 @@ -39,22 +39,17 @@ char *tmp; char *dir; char *pload; - FILE *tf; int c; gsize pload_size; dir = send ? "send" : "recv"; c = send ? m_sc++ : m_rc++; tmp = g_strdup_printf("%s/msntest/%s/%03d", g_get_home_dir(), dir, c); - tf = g_fopen(tmp, "wb"); - if (tf == NULL) + pload = msn_message_gen_payload(msg, &pload_size); + if (!purple_util_write_data_to_file_absolute(tmp, pload, pload_size)) { - purple_debug_error("msn", "could not open debug file\n"); - return; + purple_debug_error("msn", "could not save debug file"); } - pload = msn_message_gen_payload(msg, &pload_size); - fwrite(pload, 1, pload_size, tf); - fclose(tf); g_free(tmp); } #endif
--- a/libpurple/protocols/msn/soap.c Sun Nov 04 22:17:45 2007 +0000 +++ b/libpurple/protocols/msn/soap.c Mon Nov 05 00:35:07 2007 +0000 @@ -274,7 +274,7 @@ default : purple_debug_error("MSN SOAP", "Read error!" "read len: %d, error = %s\n", - len, strerror(errno)); + len, g_strerror(errno)); purple_input_remove(soapconn->input_handler); //soapconn->input_handler = 0; g_free(soapconn->read_buf); @@ -308,7 +308,7 @@ } /*read the whole SOAP server response*/ -void +static void msn_soap_read_cb(gpointer data, gint source, PurpleInputCondition cond) { MsnSoapConn *soapconn = data;
--- a/libpurple/protocols/msn/soap.h Sun Nov 04 22:17:45 2007 +0000 +++ b/libpurple/protocols/msn/soap.h Mon Nov 05 00:35:07 2007 +0000 @@ -154,7 +154,6 @@ void msn_soap_free_read_buf(MsnSoapConn *soapconn); void msn_soap_free_write_buf(MsnSoapConn *soapconn); void msn_soap_connect_cb(gpointer data, PurpleSslConnection *gsc, PurpleInputCondition cond); -void msn_soap_read_cb(gpointer data, gint source, PurpleInputCondition cond); /*clean the unhandled requests*/ void msn_soap_clean_unhandled_requests(MsnSoapConn *soapconn);
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/libpurple/protocols/msn/soap2.c Mon Nov 05 00:35:07 2007 +0000 @@ -0,0 +1,677 @@ +/** + * @file soap2.c + * C file for SOAP connection related process + * + * purple + * + * Purple is the legal property of its developers, whose names are too numerous + * to list here. Please refer to the COPYRIGHT file distributed with this + * source distribution. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include "internal.h" + +#include "soap2.h" + +#include "session.h" + +#include "debug.h" +#include "xmlnode.h" + +#include <glib.h> +#include <error.h> + +#define SOAP_TIMEOUT (5 * 60) + +typedef struct _MsnSoapRequest { + char *path; + MsnSoapMessage *message; + MsnSoapCallback cb; + gpointer cb_data; +} MsnSoapRequest; + +typedef struct _MsnSoapConnection { + MsnSession *session; + char *host; + + time_t last_used; + PurpleSslConnection *ssl; + gboolean connected; + + guint event_handle; + GString *buf; + gsize handled_len; + gsize body_len; + int response_code; + gboolean headers_done; + gboolean close_when_done; + + MsnSoapMessage *message; + + GQueue *queue; + MsnSoapRequest *current_request; +} MsnSoapConnection; + +static void msn_soap_connection_destroy_foreach_cb(gpointer item, gpointer data); +static gboolean msn_soap_connection_run(gpointer data); + +static MsnSoapConnection *msn_soap_connection_new(MsnSession *session, + const char *host); +static void msn_soap_connection_handle_next(MsnSoapConnection *conn); +static void msn_soap_connection_destroy(MsnSoapConnection *conn); + +static void msn_soap_message_send_internal(MsnSession *session, + MsnSoapMessage *message, const char *host, const char *path, + MsnSoapCallback cb, gpointer cb_data, gboolean first); + +static void msn_soap_request_destroy(MsnSoapRequest *req); +static void msn_soap_connection_sanitize(MsnSoapConnection *conn, gboolean disconnect); + +static gboolean +msn_soap_cleanup_each(gpointer key, gpointer value, gpointer data) +{ + MsnSoapConnection *conn = value; + time_t *t = data; + + if ((*t - conn->last_used) > SOAP_TIMEOUT * 2) { + purple_debug_info("soap", "cleaning up soap conn %p\n", conn); + return TRUE; + } + + return FALSE; +} + +static gboolean +msn_soap_cleanup_for_session(gpointer data) +{ + MsnSession *sess = data; + time_t t = time(NULL); + + purple_debug_info("soap", "session cleanup timeout\n"); + + if (sess->soap_table) { + g_hash_table_foreach_remove(sess->soap_table, msn_soap_cleanup_each, + &t); + + if (g_hash_table_size(sess->soap_table) == 0) { + purple_timeout_remove(sess->soap_cleanup_handle); + sess->soap_cleanup_handle = 0; + } + } + + return TRUE; +} + +static MsnSoapConnection * +msn_soap_get_connection(MsnSession *session, const char *host) +{ + MsnSoapConnection *conn = NULL; + + if (session->soap_table) { + conn = g_hash_table_lookup(session->soap_table, host); + } else { + session->soap_table = g_hash_table_new_full(g_str_hash, g_str_equal, + NULL, (GDestroyNotify)msn_soap_connection_destroy); + } + + if (session->soap_cleanup_handle == 0) + session->soap_cleanup_handle = purple_timeout_add(SOAP_TIMEOUT * 1000, + msn_soap_cleanup_for_session, session); + + if (conn == NULL) { + conn = msn_soap_connection_new(session, host); + g_hash_table_insert(session->soap_table, conn->host, conn); + } + + conn->last_used = time(NULL); + + return conn; +} + +static MsnSoapConnection * +msn_soap_connection_new(MsnSession *session, const char *host) +{ + MsnSoapConnection *conn = g_new0(MsnSoapConnection, 1); + conn->session = session; + conn->host = g_strdup(host); + conn->queue = g_queue_new(); + return conn; +} + +static void +msn_soap_connected_cb(gpointer data, PurpleSslConnection *ssl, + PurpleInputCondition cond) +{ + MsnSoapConnection *conn = data; + + conn->connected = TRUE; + + if (conn->event_handle == 0) + conn->event_handle = purple_timeout_add(0, msn_soap_connection_run, conn); +} + +static void +msn_soap_error_cb(PurpleSslConnection *ssl, PurpleSslErrorType error, + gpointer data) +{ + MsnSoapConnection *conn = data; + + g_hash_table_remove(conn->session->soap_table, conn->host); +} + +static gboolean +msn_soap_handle_redirect(MsnSoapConnection *conn, const char *url) +{ + char *c; + + /* Skip the http:// */ + if ((c = strchr(url, '/')) != NULL) + url += 2; + + if ((c = strchr(url, '/')) != NULL) { + char *host, *path; + + host = g_strndup(url, c - url); + path = g_strdup(c); + + msn_soap_message_send_internal(conn->session, + conn->current_request->message, host, path, + conn->current_request->cb, conn->current_request->cb_data, TRUE); + + msn_soap_request_destroy(conn->current_request); + conn->current_request = NULL; + + g_free(host); + g_free(path); + + return TRUE; + } + + return FALSE; +} + +static gboolean +msn_soap_handle_body(MsnSoapConnection *conn, MsnSoapMessage *response) +{ + xmlnode *body = xmlnode_get_child(response->xml, "Body"); + + if (body) { + MsnSoapRequest *request; + + if (strcmp(body->name, "Fault") == 0) { + xmlnode *fault = xmlnode_get_child(body, "faultcode"); + + if (fault != NULL) { + char *faultdata = xmlnode_get_data(fault); + + if (strcmp(faultdata, "psf:Redirect") == 0) { + xmlnode *url = xmlnode_get_child(body, "redirectUrl"); + + if (url) { + char *urldata = xmlnode_get_data(url); + msn_soap_handle_redirect(conn, urldata); + g_free(urldata); + } + + g_free(faultdata); + return TRUE; + } else if (strcmp(faultdata, "wsse:FailedAuthentication") == 0) { + xmlnode *reason = xmlnode_get_child(body, "faultstring"); + char *reasondata = xmlnode_get_data(reason); + + msn_soap_connection_sanitize(conn, TRUE); + msn_session_set_error(conn->session, MSN_ERROR_AUTH, + reasondata); + + g_free(reasondata); + g_free(faultdata); + return FALSE; + } + + g_free(faultdata); + } + } + + request = conn->current_request; + conn->current_request = NULL; + request->cb(request->message, response, + request->cb_data); + msn_soap_request_destroy(request); + } + + return TRUE; +} + +static void +msn_soap_read_cb(gpointer data, gint fd, PurpleInputCondition cond) +{ + MsnSoapConnection *conn = data; + int count = 0, cnt; + char buf[8192]; + char *linebreak; + char *cursor; + gboolean handled = FALSE; + + if (conn->message == NULL) { + conn->message = msn_soap_message_new(NULL, NULL); + } + + while ((cnt = purple_ssl_read(conn->ssl, buf, sizeof(buf))) > 0) { + purple_debug_info("soap", "read %d bytes\n", cnt); + count += cnt; + if (conn->buf == NULL) { + conn->buf = g_string_new_len(buf, cnt); + } else { + g_string_append_len(conn->buf, buf, cnt); + } + } + + if (cnt < 0) { + if (errno != EAGAIN) { + purple_debug_info("soap", "read: %s\n", g_strerror(errno)); + purple_ssl_close(conn->ssl); + conn->ssl = NULL; + msn_soap_connection_handle_next(conn); + return; + } else if (count == 0) { + return; + } + } + + if (cnt == 0 && count == 0) { + purple_debug_info("soap", "msn_soap_read_cb() called, but no data available?\n"); + purple_ssl_close(conn->ssl); + conn->ssl = NULL; + msn_soap_connection_handle_next(conn); + return; + } + + purple_debug_info("soap", "current %s\n", conn->buf->str); + + cursor = conn->buf->str + conn->handled_len; + + if (!conn->headers_done) { + while ((linebreak = strstr(cursor, "\r\n")) != NULL) { + conn->handled_len = linebreak - conn->buf->str + 2; + + if (conn->response_code == 0) { + if (sscanf(cursor, "HTTP/1.1 %d", &conn->response_code) != 1) { + /* something horribly wrong */ + purple_ssl_close(conn->ssl); + conn->ssl = NULL; + msn_soap_connection_handle_next(conn); + handled = TRUE; + break; + } else if (conn->response_code == 503) { + msn_soap_connection_sanitize(conn, TRUE); + msn_session_set_error(conn->session, MSN_ERROR_SERV_UNAVAILABLE, NULL); + return; + } + } else if (cursor == linebreak) { + /* blank line */ + conn->headers_done = TRUE; + cursor = conn->buf->str + conn->handled_len; + break; + } else { + char *line = g_strndup(cursor, linebreak - cursor); + char *sep = strstr(line, ": "); + char *key = line; + char *value; + + if (sep == NULL) { + purple_debug_info("soap", "ignoring malformed line: %s\n", line); + g_free(line); + goto loop_end; + } + + value = sep + 2; + *sep = '\0'; + msn_soap_message_add_header(conn->message, key, value); + + if ((conn->response_code == 301 || conn->response_code == 300) + && strcmp(key, "Location") == 0) { + + msn_soap_handle_redirect(conn, value); + + handled = TRUE; + g_free(line); + break; + } else if (conn->response_code == 401 && + strcmp(key, "WWW-Authenticate") == 0) { + char *error = strstr(value, "cbtxt="); + + if (error) { + error += strlen("cbtxt="); + } + + msn_soap_connection_sanitize(conn, TRUE); + msn_session_set_error(conn->session, MSN_ERROR_AUTH, + error ? purple_url_decode(error) : NULL); + + g_free(line); + return; + } else if (strcmp(key, "Content-Length") == 0) { + conn->body_len = atoi(value); + } else if (strcmp(key, "Connection") == 0) { + if (strcmp(value, "close") == 0) { + conn->close_when_done = TRUE; + } + } + g_free(line); + } + + loop_end: + cursor = conn->buf->str + conn->handled_len; + } + } + + if (!handled && conn->headers_done) { + if (conn->buf->len - conn->handled_len >= + conn->body_len) { + xmlnode *node = xmlnode_from_str(cursor, conn->body_len); + + if (node == NULL) { + purple_debug_info("soap", "Malformed SOAP response: %s\n", + cursor); + } else { + MsnSoapMessage *message = conn->message; + conn->message = NULL; + message->xml = node; + + if (!msn_soap_handle_body(conn, message)) + return; + } + + msn_soap_connection_handle_next(conn); + } + + return; + } + + if (handled) { + msn_soap_connection_handle_next(conn); + } +} + +static void +msn_soap_write_cb(gpointer data, gint fd, PurpleInputCondition cond) +{ + MsnSoapConnection *conn = data; + int written; + + g_return_if_fail(cond == PURPLE_INPUT_WRITE); + + written = purple_ssl_write(conn->ssl, conn->buf->str + conn->handled_len, + conn->buf->len - conn->handled_len); + + if (written < 0 && errno == EAGAIN) + return; + else if (written <= 0) { + purple_ssl_close(conn->ssl); + conn->ssl = NULL; + msn_soap_connection_handle_next(conn); + return; + } + + conn->handled_len += written; + + if (conn->handled_len < conn->buf->len) + return; + + /* we are done! */ + g_string_free(conn->buf, TRUE); + conn->buf = NULL; + conn->handled_len = 0; + conn->body_len = 0; + conn->response_code = 0; + conn->headers_done = FALSE; + conn->close_when_done = FALSE; + + purple_input_remove(conn->event_handle); + conn->event_handle = purple_input_add(conn->ssl->fd, PURPLE_INPUT_READ, + msn_soap_read_cb, conn); +} + +static gboolean +msn_soap_connection_run(gpointer data) +{ + MsnSoapConnection *conn = data; + MsnSoapRequest *req = g_queue_peek_head(conn->queue); + + conn->event_handle = 0; + + if (req) { + if (conn->ssl == NULL) { + conn->ssl = purple_ssl_connect(conn->session->account, conn->host, + 443, msn_soap_connected_cb, msn_soap_error_cb, conn); + } else if (conn->connected) { + int len = -1; + char *body = xmlnode_to_str(req->message->xml, &len); + GSList *iter; + char *authstr = NULL; + + g_queue_pop_head(conn->queue); + + conn->buf = g_string_new(""); + + if (conn->session->passport_info.mspauth) + authstr = g_strdup_printf("Cookie: MSPAuth=%s\r\n", + conn->session->passport_info.mspauth); + + + g_string_append_printf(conn->buf, + "POST %s HTTP/1.1\r\n" + "SOAPAction: %s\r\n" + "Content-Type:text/xml; charset=utf-8\r\n" + "%s" + "User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)\r\n" + "Accept: */*\r\n" + "Host: %s\r\n" + "Content-Length: %d\r\n" + "Connection: Keep-Alive\r\n" + "Cache-Control: no-cache\r\n", + req->path, req->message->action ? req->message->action : "", + authstr ? authstr : "", conn->host, len); + + for (iter = req->message->headers; iter; iter = iter->next) { + g_string_append(conn->buf, (char *)iter->data); + g_string_append(conn->buf, "\r\n"); + } + + g_string_append(conn->buf, "\r\n"); + g_string_append(conn->buf, body); + + purple_debug_info("soap", "%s\n", conn->buf->str); + + conn->handled_len = 0; + conn->current_request = req; + + conn->event_handle = purple_input_add(conn->ssl->fd, + PURPLE_INPUT_WRITE, msn_soap_write_cb, conn); + msn_soap_write_cb(conn, conn->ssl->fd, PURPLE_INPUT_WRITE); + + g_free(authstr); + g_free(body); + } + } + + return FALSE; +} + +void +msn_soap_message_send(MsnSession *session, MsnSoapMessage *message, + const char *host, const char *path, + MsnSoapCallback cb, gpointer cb_data) +{ + msn_soap_message_send_internal(session, message, host, path, cb, cb_data, + FALSE); +} + +static void +msn_soap_message_send_internal(MsnSession *session, + MsnSoapMessage *message, const char *host, const char *path, + MsnSoapCallback cb, gpointer cb_data, gboolean first) +{ + MsnSoapConnection *conn = msn_soap_get_connection(session, host); + MsnSoapRequest *req = g_new0(MsnSoapRequest, 1); + + req->path = g_strdup(path); + req->message = message; + req->cb = cb; + req->cb_data = cb_data; + + if (first) { + g_queue_push_head(conn->queue, req); + } else { + g_queue_push_tail(conn->queue, req); + } + + if (conn->event_handle == 0) + conn->event_handle = purple_timeout_add(0, msn_soap_connection_run, + conn); +} + +static void +msn_soap_connection_sanitize(MsnSoapConnection *conn, gboolean disconnect) +{ + if (conn->event_handle) { + purple_input_remove(conn->event_handle); + conn->event_handle = 0; + } + + if (conn->message) { + msn_soap_message_destroy(conn->message); + conn->message = NULL; + } + + if (conn->buf) { + g_string_free(conn->buf, TRUE); + conn->buf = NULL; + } + + if (conn->ssl && (disconnect || conn->close_when_done)) { + purple_ssl_close(conn->ssl); + conn->ssl = NULL; + } + + if (conn->current_request) { + msn_soap_request_destroy(conn->current_request); + conn->current_request = NULL; + } +} + +static void +msn_soap_connection_handle_next(MsnSoapConnection *conn) +{ + msn_soap_connection_sanitize(conn, FALSE); + + conn->event_handle = purple_timeout_add(0, msn_soap_connection_run, conn); + + if (conn->current_request) { + MsnSoapRequest *req = conn->current_request; + conn->current_request = NULL; + msn_soap_connection_destroy_foreach_cb(req, conn); + } +} + +static void +msn_soap_connection_destroy_foreach_cb(gpointer item, gpointer data) +{ + MsnSoapRequest *req = item; + + if (req->cb) + req->cb(req->message, NULL, req->cb_data); + + msn_soap_request_destroy(req); +} + +static void +msn_soap_connection_destroy(MsnSoapConnection *conn) +{ + if (conn->current_request) { + MsnSoapRequest *req = conn->current_request; + conn->current_request = NULL; + msn_soap_connection_destroy_foreach_cb(req, conn); + } + + msn_soap_connection_sanitize(conn, TRUE); + g_queue_foreach(conn->queue, msn_soap_connection_destroy_foreach_cb, conn); + g_queue_free(conn->queue); + + g_free(conn->host); + g_free(conn); +} + +MsnSoapMessage * +msn_soap_message_new(const char *action, xmlnode *xml) +{ + MsnSoapMessage *message = g_new0(MsnSoapMessage, 1); + + message->action = g_strdup(action); + message->xml = xml; + + return message; +} + +void +msn_soap_message_destroy(MsnSoapMessage *message) +{ + if (message) { + g_slist_foreach(message->headers, (GFunc)g_free, NULL); + g_slist_free(message->headers); + g_free(message->action); + if (message->xml) + xmlnode_free(message->xml); + g_free(message); + } +} + +void +msn_soap_message_add_header(MsnSoapMessage *req, + const char *name, const char *value) +{ + char *header = g_strdup_printf("%s: %s\r\n", name, value); + + req->headers = g_slist_prepend(req->headers, header); +} + +static void +msn_soap_request_destroy(MsnSoapRequest *req) +{ + g_free(req->path); + msn_soap_message_destroy(req->message); + g_free(req); +} + +xmlnode * +msn_soap_xml_get(xmlnode *parent, const char *node) +{ + xmlnode *ret = NULL; + char **tokens = g_strsplit(node, "/", -1); + int i; + + for (i = 0; tokens[i]; i++) { + if ((ret = xmlnode_get_child(parent, tokens[i])) != NULL) + parent = ret; + else + break; + } + + g_strfreev(tokens); + return ret; +} +
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/libpurple/protocols/msn/soap2.h Mon Nov 05 00:35:07 2007 +0000 @@ -0,0 +1,58 @@ +/** + * @file soap2.h + * header file for SOAP connection related process + * + * purple + * + * Purple is the legal property of its developers, whose names are too numerous + * to list here. Please refer to the COPYRIGHT file distributed with this + * source distribution. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#ifndef _MSN_SOAP2_H +#define _MSN_SOAP2_H + +#include "session.h" +#include "sslconn.h" +#include "xmlnode.h" + +#include <glib.h> + +typedef struct _MsnSoapMessage MsnSoapMessage; +typedef void (*MsnSoapCallback)(MsnSoapMessage *request, + MsnSoapMessage *response, gpointer cb_data); + +struct _MsnSoapMessage { + char *action; + xmlnode *xml; + GSList *headers; +}; + +MsnSoapMessage *msn_soap_message_new(const char *action, xmlnode *xml); + +void msn_soap_message_add_header(MsnSoapMessage *req, + const char *name, const char *value); + +void msn_soap_message_send(MsnSession *session, + MsnSoapMessage *message, const char *host, const char *path, + MsnSoapCallback cb, gpointer cb_data); + +void msn_soap_message_destroy(MsnSoapMessage *message); + +xmlnode *msn_soap_xml_get(xmlnode *parent, const char *node); + +#endif
--- a/libpurple/protocols/msn/userlist.c Sun Nov 04 22:17:45 2007 +0000 +++ b/libpurple/protocols/msn/userlist.c Mon Nov 05 00:35:07 2007 +0000 @@ -70,7 +70,7 @@ { MsnSession *session = pa->gc->proto_data; MsnUserList *userlist = session->userlist; - MsnCallbackState *state = msn_callback_state_new(); + MsnCallbackState *state = msn_callback_state_new(session); msn_callback_state_set_action(state, MSN_DENIED_BUDDY); @@ -680,7 +680,7 @@ purple_debug_info("MSN Userlist", "Add user: %s to group: %s\n", who, new_group_name); - state = msn_callback_state_new(); + state = msn_callback_state_new(userlist->session); msn_callback_state_set_who(state, who); msn_callback_state_set_new_group_name(state, new_group_name); @@ -841,7 +841,7 @@ g_return_if_fail(userlist->session != NULL); g_return_if_fail(userlist->session->contact != NULL); - state = msn_callback_state_new(); + state = msn_callback_state_new(userlist->session); msn_callback_state_set_who(state, who); msn_callback_state_set_action(state, MSN_MOVE_BUDDY); msn_callback_state_set_old_group_name(state, old_group_name);
--- a/libpurple/protocols/myspace/myspace.c Sun Nov 04 22:17:45 2007 +0000 +++ b/libpurple/protocols/myspace/myspace.c Mon Nov 05 00:35:07 2007 +0000 @@ -2353,7 +2353,7 @@ } else if (n < 0) { purple_debug_error("msim", "msim_input_cb: read error, ret=%d, " "error=%s, source=%d, fd=%d (%X))\n", - n, strerror(errno), source, session->fd, session->fd); + n, g_strerror(errno), source, session->fd, session->fd); purple_connection_error(gc, _("Read error")); return; } else if (n == 0) {
--- a/libpurple/protocols/oscar/flap_connection.c Sun Nov 04 22:17:45 2007 +0000 +++ b/libpurple/protocols/oscar/flap_connection.c Mon Nov 05 00:35:07 2007 +0000 @@ -468,7 +468,7 @@ * @param error_message A brief error message that gives more detail * regarding the reason for the disconnecting. This should * be NULL for everything except OSCAR_DISCONNECT_LOST_CONNECTION, - * in which case it should contain the value of strerror(errno), + * in which case it should contain the value of g_strerror(errno), * and OSCAR_DISCONNECT_COULD_NOT_CONNECT, in which case it * should contain the error_message passed back from the call * to purple_proxy_connect(). @@ -812,7 +812,7 @@ /* Error! */ flap_connection_schedule_destroy(conn, - OSCAR_DISCONNECT_LOST_CONNECTION, strerror(errno)); + OSCAR_DISCONNECT_LOST_CONNECTION, g_strerror(errno)); break; } @@ -873,7 +873,7 @@ /* Error! */ flap_connection_schedule_destroy(conn, - OSCAR_DISCONNECT_LOST_CONNECTION, strerror(errno)); + OSCAR_DISCONNECT_LOST_CONNECTION, g_strerror(errno)); break; } @@ -924,7 +924,7 @@ close(conn->fd); conn->fd = -1; flap_connection_schedule_destroy(conn, - OSCAR_DISCONNECT_LOST_CONNECTION, strerror(errno)); + OSCAR_DISCONNECT_LOST_CONNECTION, g_strerror(errno)); return; }
--- a/libpurple/protocols/oscar/odc.c Sun Nov 04 22:17:45 2007 +0000 +++ b/libpurple/protocols/oscar/odc.c Mon Nov 05 00:35:07 2007 +0000 @@ -456,7 +456,7 @@ return; peer_connection_destroy(conn, - OSCAR_DISCONNECT_LOST_CONNECTION, strerror(errno)); + OSCAR_DISCONNECT_LOST_CONNECTION, g_strerror(errno)); return; }
--- a/libpurple/protocols/oscar/oft.c Sun Nov 04 22:17:45 2007 +0000 +++ b/libpurple/protocols/oscar/oft.c Mon Nov 05 00:35:07 2007 +0000 @@ -212,7 +212,7 @@ if (checksum_data->file == NULL) { purple_debug_error("oscar", "Unable to open %s for checksumming: %s\n", - purple_xfer_get_local_filename(xfer), strerror(errno)); + purple_xfer_get_local_filename(xfer), g_strerror(errno)); callback(checksum_data); g_free(checksum_data); }
--- a/libpurple/protocols/oscar/oscar.c Sun Nov 04 22:17:45 2007 +0000 +++ b/libpurple/protocols/oscar/oscar.c Mon Nov 05 00:35:07 2007 +0000 @@ -778,7 +778,7 @@ gchar *utf8; if (value && value[0] && (utf8 = oscar_utf8_try_convert(account, value))) { - purple_notify_user_info_add_pair(user_info, name, value); + purple_notify_user_info_add_pair(user_info, name, utf8); g_free(utf8); } }
--- a/libpurple/protocols/oscar/peer.c Sun Nov 04 22:17:45 2007 +0000 +++ b/libpurple/protocols/oscar/peer.c Mon Nov 05 00:35:07 2007 +0000 @@ -317,7 +317,7 @@ return; peer_connection_destroy(conn, - OSCAR_DISCONNECT_LOST_CONNECTION, strerror(errno)); + OSCAR_DISCONNECT_LOST_CONNECTION, g_strerror(errno)); return; } @@ -367,7 +367,7 @@ return; peer_connection_destroy(conn, - OSCAR_DISCONNECT_LOST_CONNECTION, strerror(errno)); + OSCAR_DISCONNECT_LOST_CONNECTION, g_strerror(errno)); return; }
--- a/libpurple/protocols/qq/qq_proxy.c Sun Nov 04 22:17:45 2007 +0000 +++ b/libpurple/protocols/qq/qq_proxy.c Mon Nov 05 00:35:07 2007 +0000 @@ -237,7 +237,7 @@ close(source); purple_input_remove(phb->inpa); - purple_debug_error("proxy", "getsockopt SO_ERROR check: %s\n", strerror(error)); + purple_debug_error("proxy", "getsockopt SO_ERROR check: %s\n", g_strerror(error)); phb->func(phb->data, -1, _("Unable to connect")); return; @@ -265,7 +265,7 @@ if (fd < 0) { purple_debug(PURPLE_DEBUG_ERROR, "QQ Redirect", - "Unable to create socket: %s\n", strerror(errno)); + "Unable to create socket: %s\n", g_strerror(errno)); return -1; } @@ -297,7 +297,7 @@ purple_debug(PURPLE_DEBUG_WARNING, "QQ", "Connect in asynchronous mode.\n"); phb->inpa = purple_input_add(fd, PURPLE_INPUT_WRITE, no_one_calls, phb); } else { - purple_debug(PURPLE_DEBUG_ERROR, "QQ", "Connection failed: %d\n", strerror(errno)); + purple_debug(PURPLE_DEBUG_ERROR, "QQ", "Connection failed: %d\n", g_strerror(errno)); close(fd); return -1; } /* if errno */ @@ -497,7 +497,7 @@ ret = send(qd->fd, data, len, 0); } if (ret == -1) - purple_connection_error(qd->gc, strerror(errno)); + purple_connection_error(qd->gc, g_strerror(errno)); return ret; }
--- a/libpurple/protocols/qq/udp_proxy_s5.c Sun Nov 04 22:17:45 2007 +0000 +++ b/libpurple/protocols/qq/udp_proxy_s5.c Mon Nov 05 00:35:07 2007 +0000 @@ -74,7 +74,7 @@ memcpy(&sin.sin_port, buf + 8, 2); if (connect(phb->udpsock, (struct sockaddr *) &sin, sizeof(struct sockaddr_in)) < 0) { - purple_debug(PURPLE_DEBUG_INFO, "s5_canread_again", "connect failed: %s\n", strerror(errno)); + purple_debug(PURPLE_DEBUG_INFO, "s5_canread_again", "connect failed: %s\n", g_strerror(errno)); close(phb->udpsock); close(source); g_free(phb->host); @@ -120,7 +120,7 @@ ctllen = sizeof(ctlsin); if (getsockname(source, (struct sockaddr *) &ctlsin, &ctllen) < 0) { - purple_debug(PURPLE_DEBUG_INFO, "QQ", "getsockname: %s\n", strerror(errno)); + purple_debug(PURPLE_DEBUG_INFO, "QQ", "getsockname: %s\n", g_strerror(errno)); close(source); g_free(phb->host); g_free(phb); @@ -300,7 +300,7 @@ len = sizeof(error); if (getsockopt(source, SOL_SOCKET, SO_ERROR, &error, &len) < 0) { - purple_debug(PURPLE_DEBUG_INFO, "getsockopt", "%s\n", strerror(errno)); + purple_debug(PURPLE_DEBUG_INFO, "getsockopt", "%s\n", g_strerror(errno)); close(source); if (phb->account == NULL || purple_account_get_connection(phb->account) != NULL) { @@ -329,7 +329,7 @@ } if (write(source, buf, i) < i) { - purple_debug(PURPLE_DEBUG_INFO, "write", "%s\n", strerror(errno)); + purple_debug(PURPLE_DEBUG_INFO, "write", "%s\n", g_strerror(errno)); purple_debug(PURPLE_DEBUG_ERROR, "socks5 proxy", "Unable to write\n"); close(source);
--- a/libpurple/protocols/sametime/sametime.c Sun Nov 04 22:17:45 2007 +0000 +++ b/libpurple/protocols/sametime/sametime.c Mon Nov 05 00:35:07 2007 +0000 @@ -1702,7 +1702,7 @@ purple_connection_error(pd->gc, _("Connection reset")); } else if(ret < 0) { - char *msg = strerror(err); + char *msg = g_strerror(err); DEBUG_INFO("error in read callback: %s\n", msg); @@ -2167,7 +2167,7 @@ } else { int err = errno; DEBUG_WARN("problem reading from file %s: %s\n", - NSTR(mwFileTransfer_getFileName(ft)), strerror(err)); + NSTR(mwFileTransfer_getFileName(ft)), g_strerror(err)); mwFileTransfer_cancel(ft); } @@ -5009,7 +5009,7 @@ fp = g_fopen(filename, "rb"); if(! fp) { char *msg = g_strdup_printf(_("Error reading file %s: \n%s\n"), - filename, strerror(errno)); + filename, g_strerror(errno)); purple_xfer_error(purple_xfer_get_type(xfer), acct, xfer->who, msg); g_free(msg); return;
--- a/libpurple/protocols/silc/util.c Sun Nov 04 22:17:45 2007 +0000 +++ b/libpurple/protocols/silc/util.c Mon Nov 05 00:35:07 2007 +0000 @@ -79,7 +79,7 @@ pw = getpwuid(getuid()); if (!pw) { - purple_debug_error("silc", "silc: %s\n", strerror(errno)); + purple_debug_error("silc", "silc: %s\n", g_strerror(errno)); return FALSE; } @@ -108,7 +108,7 @@ return FALSE; } } else { - purple_debug_error("silc", "Couldn't stat '%s' directory, error: %s\n", filename, strerror(errno)); + purple_debug_error("silc", "Couldn't stat '%s' directory, error: %s\n", filename, g_strerror(errno)); return FALSE; } } else { @@ -140,7 +140,7 @@ } } else { purple_debug_error("silc", "Couldn't stat '%s' directory, error: %s\n", - servfilename, strerror(errno)); + servfilename, g_strerror(errno)); return FALSE; } } @@ -163,7 +163,7 @@ } } else { purple_debug_error("silc", "Couldn't stat '%s' directory, error: %s\n", - clientfilename, strerror(errno)); + clientfilename, g_strerror(errno)); return FALSE; } } @@ -186,7 +186,7 @@ } } else { purple_debug_error("silc", "Couldn't stat '%s' directory, error: %s\n", - friendsfilename, strerror(errno)); + friendsfilename, g_strerror(errno)); return FALSE; } } @@ -218,12 +218,12 @@ if ((g_stat(file_public_key, &st)) == -1) { purple_debug_error("silc", "Couldn't stat '%s' public key, error: %s\n", - file_public_key, strerror(errno)); + file_public_key, g_strerror(errno)); return FALSE; } } else { purple_debug_error("silc", "Couldn't stat '%s' public key, error: %s\n", - file_public_key, strerror(errno)); + file_public_key, g_strerror(errno)); return FALSE; } } @@ -239,7 +239,7 @@ if ((fd = g_open(file_private_key, O_RDONLY, 0)) != -1) { if ((fstat(fd, &st)) == -1) { purple_debug_error("silc", "Couldn't stat '%s' private key, error: %s\n", - file_private_key, strerror(errno)); + file_private_key, g_strerror(errno)); close(fd); return FALSE; } @@ -261,7 +261,7 @@ if ((fd = g_open(file_private_key, O_RDONLY, 0)) != -1) { if ((fstat(fd, &st)) == -1) { purple_debug_error("silc", "Couldn't stat '%s' private key, error: %s\n", - file_private_key, strerror(errno)); + file_private_key, g_strerror(errno)); close(fd); return FALSE; } @@ -270,12 +270,12 @@ * will set the permissions */ else if ((g_stat(file_private_key, &st)) == -1) { purple_debug_error("silc", "Couldn't stat '%s' private key, error: %s\n", - file_private_key, strerror(errno)); + file_private_key, g_strerror(errno)); return FALSE; } } else { purple_debug_error("silc", "Couldn't stat '%s' private key, error: %s\n", - file_private_key, strerror(errno)); + file_private_key, g_strerror(errno)); return FALSE; } }
--- a/libpurple/protocols/silc10/silc.c Sun Nov 04 22:17:45 2007 +0000 +++ b/libpurple/protocols/silc10/silc.c Mon Nov 05 00:35:07 2007 +0000 @@ -331,7 +331,7 @@ (char *)purple_account_get_string(account, "private-key", prd), (gc->password == NULL) ? "" : gc->password, &client->pkcs, &client->public_key, &client->private_key)) { - g_snprintf(pkd, sizeof(pkd), _("Could not load SILC key pair: %s"), strerror(errno)); + g_snprintf(pkd, sizeof(pkd), _("Could not load SILC key pair: %s"), g_strerror(errno)); purple_connection_error(gc, pkd); return; }
--- a/libpurple/protocols/silc10/util.c Sun Nov 04 22:17:45 2007 +0000 +++ b/libpurple/protocols/silc10/util.c Mon Nov 05 00:35:07 2007 +0000 @@ -79,7 +79,7 @@ pw = getpwuid(getuid()); if (!pw) { - purple_debug_error("silc", "silc: %s\n", strerror(errno)); + purple_debug_error("silc", "silc: %s\n", g_strerror(errno)); return FALSE; } @@ -108,7 +108,7 @@ return FALSE; } } else { - purple_debug_error("silc", "Couldn't stat '%s' directory, error: %s\n", filename, strerror(errno)); + purple_debug_error("silc", "Couldn't stat '%s' directory, error: %s\n", filename, g_strerror(errno)); return FALSE; } } else { @@ -140,7 +140,7 @@ } } else { purple_debug_error("silc", "Couldn't stat '%s' directory, error: %s\n", - servfilename, strerror(errno)); + servfilename, g_strerror(errno)); return FALSE; } } @@ -163,7 +163,7 @@ } } else { purple_debug_error("silc", "Couldn't stat '%s' directory, error: %s\n", - clientfilename, strerror(errno)); + clientfilename, g_strerror(errno)); return FALSE; } } @@ -186,7 +186,7 @@ } } else { purple_debug_error("silc", "Couldn't stat '%s' directory, error: %s\n", - friendsfilename, strerror(errno)); + friendsfilename, g_strerror(errno)); return FALSE; } } @@ -216,12 +216,12 @@ if ((g_stat(file_public_key, &st)) == -1) { purple_debug_error("silc", "Couldn't stat '%s' public key, error: %s\n", - file_public_key, strerror(errno)); + file_public_key, g_strerror(errno)); return FALSE; } } else { purple_debug_error("silc", "Couldn't stat '%s' public key, error: %s\n", - file_public_key, strerror(errno)); + file_public_key, g_strerror(errno)); return FALSE; } } @@ -237,7 +237,7 @@ if ((fd = g_open(file_private_key, O_RDONLY, 0)) != -1) { if ((fstat(fd, &st)) == -1) { purple_debug_error("silc", "Couldn't stat '%s' private key, error: %s\n", - file_private_key, strerror(errno)); + file_private_key, g_strerror(errno)); close(fd); return FALSE; } @@ -257,7 +257,7 @@ if ((fd = g_open(file_private_key, O_RDONLY, 0)) != -1) { if ((fstat(fd, &st)) == -1) { purple_debug_error("silc", "Couldn't stat '%s' private key, error: %s\n", - file_private_key, strerror(errno)); + file_private_key, g_strerror(errno)); close(fd); return FALSE; } @@ -266,12 +266,12 @@ * will set the permissions */ else if ((g_stat(file_private_key, &st)) == -1) { purple_debug_error("silc", "Couldn't stat '%s' private key, error: %s\n", - file_private_key, strerror(errno)); + file_private_key, g_strerror(errno)); return FALSE; } } else { purple_debug_error("silc", "Couldn't stat '%s' private key, error: %s\n", - file_private_key, strerror(errno)); + file_private_key, g_strerror(errno)); return FALSE; } }
--- a/libpurple/protocols/toc/toc.c Sun Nov 04 22:17:45 2007 +0000 +++ b/libpurple/protocols/toc/toc.c Mon Nov 05 00:35:07 2007 +0000 @@ -1795,7 +1795,7 @@ ft->file = g_fopen(ft->filename, "w"); if (!ft->file) { buf = g_strdup_printf(_("Could not open %s for writing!"), ft->filename); - purple_notify_error(ft->gc, NULL, buf, strerror(errno)); + purple_notify_error(ft->gc, NULL, buf, g_strerror(errno)); g_free(buf); purple_input_remove(ft->inpa); close(source); @@ -1812,7 +1812,7 @@ if (!ft->file) { buf = g_strdup_printf("Could not open %s/%s for writing!", ft->filename, ft->hdr.name); - purple_notify_error(ft->gc, NULL, buf, strerror(errno)); + purple_notify_error(ft->gc, NULL, buf, g_strerror(errno)); g_free(buf); purple_input_remove(ft->inpa); close(source);
--- a/libpurple/protocols/yahoo/yahoo.c Sun Nov 04 22:17:45 2007 +0000 +++ b/libpurple/protocols/yahoo/yahoo.c Mon Nov 05 00:35:07 2007 +0000 @@ -2463,7 +2463,7 @@ return; tmp = g_strdup_printf(_("Lost connection with server:\n%s"), - strerror(errno)); + g_strerror(errno)); purple_connection_error(gc, tmp); g_free(tmp); return; @@ -2630,7 +2630,7 @@ return; tmp = g_strdup_printf(_("Lost connection with server:\n%s"), - strerror(errno)); + g_strerror(errno)); purple_connection_error(gc, tmp); g_free(tmp); return; @@ -2701,7 +2701,7 @@ purple_input_remove(gc->inpa); gc->inpa = 0; tmp = g_strdup_printf(_("Lost connection with %s:\n%s"), - "login.yahoo.com:80", strerror(errno)); + "login.yahoo.com:80", g_strerror(errno)); purple_connection_error(gc, tmp); g_free(tmp); return;
--- a/libpurple/protocols/yahoo/ycht.c Sun Nov 04 22:17:45 2007 +0000 +++ b/libpurple/protocols/yahoo/ycht.c Mon Nov 05 00:35:07 2007 +0000 @@ -473,7 +473,7 @@ return; tmp = g_strdup_printf(_("Lost connection with server\n%s"), - strerror(errno)); + g_strerror(errno)); ycht_connection_error(ycht, tmp); g_free(tmp); return;
--- a/libpurple/proxy.c Sun Nov 04 22:17:45 2007 +0000 +++ b/libpurple/proxy.c Mon Nov 05 00:35:07 2007 +0000 @@ -429,9 +429,9 @@ if (ret != 0) error = errno; purple_debug_info("proxy", "Error connecting to %s:%d (%s).\n", - connect_data->host, connect_data->port, strerror(error)); + connect_data->host, connect_data->port, g_strerror(error)); - purple_proxy_connect_data_disconnect(connect_data, strerror(error)); + purple_proxy_connect_data_disconnect(connect_data, g_strerror(error)); return; } @@ -458,7 +458,7 @@ if (connect_data->fd < 0) { purple_proxy_connect_data_disconnect_formatted(connect_data, - _("Unable to create socket:\n%s"), strerror(errno)); + _("Unable to create socket:\n%s"), g_strerror(errno)); return; } @@ -478,7 +478,7 @@ } else { - purple_proxy_connect_data_disconnect(connect_data, strerror(errno)); + purple_proxy_connect_data_disconnect(connect_data, g_strerror(errno)); } } else @@ -496,7 +496,7 @@ { if (ret != 0) error = errno; - purple_proxy_connect_data_disconnect(connect_data, strerror(error)); + purple_proxy_connect_data_disconnect(connect_data, g_strerror(error)); return; } @@ -534,7 +534,7 @@ return; /* Error! */ - purple_proxy_connect_data_disconnect(connect_data, strerror(errno)); + purple_proxy_connect_data_disconnect(connect_data, g_strerror(errno)); return; } if (ret < request_len) { @@ -593,7 +593,7 @@ /* Error! */ purple_proxy_connect_data_disconnect_formatted(connect_data, - _("Lost connection with server:\n%s"), strerror(errno)); + _("Lost connection with server:\n%s"), g_strerror(errno)); return; } @@ -832,7 +832,7 @@ { if (ret != 0) error = errno; - purple_proxy_connect_data_disconnect(connect_data, strerror(error)); + purple_proxy_connect_data_disconnect(connect_data, g_strerror(error)); return; } @@ -899,7 +899,7 @@ if (connect_data->fd < 0) { purple_proxy_connect_data_disconnect_formatted(connect_data, - _("Unable to create socket:\n%s"), strerror(errno)); + _("Unable to create socket:\n%s"), g_strerror(errno)); return; } @@ -937,7 +937,7 @@ } else { - purple_proxy_connect_data_disconnect(connect_data, strerror(errno)); + purple_proxy_connect_data_disconnect(connect_data, g_strerror(errno)); } } else @@ -978,7 +978,7 @@ } } - purple_proxy_connect_data_disconnect(connect_data, strerror(errno)); + purple_proxy_connect_data_disconnect(connect_data, g_strerror(errno)); } static void @@ -1003,7 +1003,7 @@ { if (ret != 0) error = errno; - purple_proxy_connect_data_disconnect(connect_data, strerror(error)); + purple_proxy_connect_data_disconnect(connect_data, g_strerror(error)); return; } @@ -1058,7 +1058,7 @@ if (connect_data->fd < 0) { purple_proxy_connect_data_disconnect_formatted(connect_data, - _("Unable to create socket:\n%s"), strerror(errno)); + _("Unable to create socket:\n%s"), g_strerror(errno)); return; } @@ -1078,7 +1078,7 @@ } else { - purple_proxy_connect_data_disconnect(connect_data, strerror(errno)); + purple_proxy_connect_data_disconnect(connect_data, g_strerror(errno)); } } else @@ -1138,7 +1138,7 @@ /* Error! */ purple_proxy_connect_data_disconnect_formatted(connect_data, - _("Lost connection with server:\n%s"), strerror(errno)); + _("Lost connection with server:\n%s"), g_strerror(errno)); return; } @@ -1247,7 +1247,7 @@ /* Error! */ purple_proxy_connect_data_disconnect_formatted(connect_data, - _("Lost connection with server:\n%s"), strerror(errno)); + _("Lost connection with server:\n%s"), g_strerror(errno)); return; } @@ -1347,7 +1347,7 @@ /* Error! */ purple_proxy_connect_data_disconnect_formatted(connect_data, - _("Lost connection with server:\n%s"), strerror(errno)); + _("Lost connection with server:\n%s"), g_strerror(errno)); return; } @@ -1475,7 +1475,7 @@ /* Error! */ purple_proxy_connect_data_disconnect_formatted(connect_data, - _("Lost connection with server:\n%s"), strerror(errno)); + _("Lost connection with server:\n%s"), g_strerror(errno)); return; } @@ -1584,7 +1584,7 @@ { if (ret != 0) error = errno; - purple_proxy_connect_data_disconnect(connect_data, strerror(error)); + purple_proxy_connect_data_disconnect(connect_data, g_strerror(error)); return; } @@ -1629,7 +1629,7 @@ if (connect_data->fd < 0) { purple_proxy_connect_data_disconnect_formatted(connect_data, - _("Unable to create socket:\n%s"), strerror(errno)); + _("Unable to create socket:\n%s"), g_strerror(errno)); return; } @@ -1649,7 +1649,7 @@ } else { - purple_proxy_connect_data_disconnect(connect_data, strerror(errno)); + purple_proxy_connect_data_disconnect(connect_data, g_strerror(errno)); } } else
--- a/libpurple/util.c Sun Nov 04 22:17:45 2007 +0000 +++ b/libpurple/util.c Mon Nov 05 00:35:07 2007 +0000 @@ -2505,7 +2505,7 @@ } if (g_mkdir(dir, mode) < 0) { - purple_debug_warning("build_dir", "mkdir: %s\n", strerror(errno)); + purple_debug_warning("build_dir", "mkdir: %s\n", g_strerror(errno)); g_strfreev(components); g_free(dir); return -1; @@ -2541,7 +2541,7 @@ if (g_mkdir(user_dir, S_IRUSR | S_IWUSR | S_IXUSR) == -1) { purple_debug_error("util", "Error creating directory %s: %s\n", - user_dir, strerror(errno)); + user_dir, g_strerror(errno)); return FALSE; } } @@ -2576,7 +2576,7 @@ { purple_debug_error("util", "Error removing old file " "%s: %s\n", - filename_temp, strerror(errno)); + filename_temp, g_strerror(errno)); } } @@ -2586,7 +2586,7 @@ { purple_debug_error("util", "Error opening file %s for " "writing: %s\n", - filename_temp, strerror(errno)); + filename_temp, g_strerror(errno)); g_free(filename_temp); return FALSE; } @@ -2599,7 +2599,7 @@ if (fclose(file) != 0) { purple_debug_error("util", "Error closing file %s: %s\n", - filename_temp, strerror(errno)); + filename_temp, g_strerror(errno)); g_free(filename_temp); return FALSE; } @@ -2631,7 +2631,7 @@ if (chmod(filename_temp, S_IRUSR | S_IWUSR) == -1) { purple_debug_error("util", "Error setting permissions of file %s: %s\n", - filename_temp, strerror(errno)); + filename_temp, g_strerror(errno)); } #endif @@ -2640,7 +2640,7 @@ { purple_debug_error("util", "Error renaming %s to %s: %s\n", filename_temp, filename_full, - strerror(errno)); + g_strerror(errno)); } g_free(filename_temp); @@ -3688,7 +3688,7 @@ if(new_data == NULL) { purple_debug_error("util", "Failed to allocate %u bytes: %s\n", - content_len, strerror(errno)); + content_len, g_strerror(errno)); purple_util_fetch_url_error(gfud, _("Unable to allocate enough memory to hold " "the contents from %s. The web server may " @@ -3726,7 +3726,7 @@ return; } else { purple_util_fetch_url_error(gfud, _("Error reading from %s: %s"), - gfud->website.address, strerror(errno)); + gfud->website.address, g_strerror(errno)); return; } } @@ -3757,7 +3757,7 @@ return; else if (len < 0) { purple_util_fetch_url_error(gfud, _("Error writing to %s: %s"), - gfud->website.address, strerror(errno)); + gfud->website.address, g_strerror(errno)); return; } gfud->request_written += len;
--- a/libpurple/win32/libc_interface.c Sun Nov 04 22:17:45 2007 +0000 +++ b/libpurple/win32/libc_interface.c Mon Nov 05 00:35:07 2007 +0000 @@ -300,7 +300,7 @@ return errbuf; } else - return strerror( errornum ); + return g_strerror( errornum ); } /* unistd.h */
--- a/pidgin/gtkdialogs.c Sun Nov 04 22:17:45 2007 +0000 +++ b/pidgin/gtkdialogs.c Mon Nov 05 00:35:07 2007 +0000 @@ -71,6 +71,7 @@ static const struct developer developers[] = { {"Sean Egan", N_("lead developer"), "sean.egan@gmail.com"}, {"Daniel 'datallah' Atallah", N_("developer"), NULL}, + {"John 'rekkanoryo' Bailey", N_("developer"), NULL}, {"Ethan 'Paco-Paco' Blanton", N_("developer"), NULL}, {"Thomas Butter", N_("developer"), NULL}, {"Ka-Hing Cheung", N_("developer"), NULL}, @@ -95,7 +96,6 @@ /* Order: Alphabetical by Last Name */ static const struct developer patch_writers[] = { - {"John 'rekkanoryo' Bailey", NULL, NULL}, {"Dennis 'EvilDennisR' Ristuccia", N_("Senior Contributor/QA"), NULL}, {"Peter 'Fmoo' Ruibal", NULL, NULL}, {"Gabriel 'Nix' Schulhof", NULL, NULL}, @@ -147,7 +147,7 @@ {N_("Danish"), "da", "Morten Brix Pedersen", "morten@wtf.dk"}, {N_("Danish"), "da", "Peter Bach", "bach.peter@gmail.com"}, {N_("German"), "de", "Bj旦rn Voigt", "bjoern@cs.tu-berlin.de"}, - {N_("German"), "de", "Jochen Kemnade", "kemnade@gmail.com"}, + {N_("German"), "de", "Jochen Kemnade", "jochenkemnade@web.de"}, {N_("Dzongkha"), "dz", "Norbu", "nor_den@hotmail.com"}, {N_("Dzongkha"), "dz", "Jurmey Rabgay", "jur_gay@yahoo.com"}, {N_("Dzongkha"), "dz", "Wangmo Sherpa", "rinwanshe@yahoo.com"},
--- a/pidgin/gtkprefs.c Sun Nov 04 22:17:45 2007 +0000 +++ b/pidgin/gtkprefs.c Mon Nov 05 00:35:07 2007 +0000 @@ -1126,13 +1126,26 @@ g_error_free(err); } +static void +browser_button_clicked_cb(GtkWidget *button, gpointer null) +{ + GError *err = NULL; + + if (g_spawn_command_line_async ("gnome-default-applications-properties", &err)) + return; + + purple_notify_error(NULL, NULL, _("Cannot start browser configuration program."), err->message); + g_error_free(err); +} + static GtkWidget * network_page() { GtkWidget *ret; GtkWidget *vbox, *hbox, *entry; GtkWidget *table, *label, *auto_ip_checkbox, *ports_checkbox, *spin_button; - GtkWidget *warning = NULL, *proxy_button = NULL; + GtkWidget *proxy_warning = NULL, *browser_warning = NULL; + GtkWidget *proxy_button = NULL, *browser_button = NULL; GtkSizeGroup *sg; PurpleProxyInfo *proxy_info = NULL; @@ -1217,11 +1230,11 @@ g_signal_connect(G_OBJECT(ports_checkbox), "clicked", G_CALLBACK(pidgin_toggle_sensitive), spin_button); - vbox = pidgin_make_frame(ret, _("Proxy Server")); - prefs_proxy_frame = gtk_vbox_new(FALSE, 0); - if (purple_running_gnome()) { - warning = hbox = gtk_hbox_new(FALSE, PIDGIN_HIG_BOX_SPACE); + vbox = pidgin_make_frame(ret, _("Proxy Server & Browser")); + prefs_proxy_frame = gtk_vbox_new(FALSE, 0); + + proxy_warning = hbox = gtk_hbox_new(FALSE, PIDGIN_HIG_BOX_SPACE); gtk_container_add(GTK_CONTAINER(vbox), hbox); label = gtk_label_new(NULL); @@ -1229,10 +1242,18 @@ _("<b>Proxy configuration program was not found.</b>")); gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 0); + browser_warning = hbox = gtk_hbox_new(FALSE, PIDGIN_HIG_BOX_SPACE); + gtk_container_add(GTK_CONTAINER(vbox), hbox); + + label = gtk_label_new(NULL); + gtk_label_set_markup(GTK_LABEL(label), + _("<b>Browser configuration program was not found.</b>")); + gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 0); + hbox = gtk_hbox_new(FALSE, PIDGIN_HIG_BOX_SPACE); gtk_container_add(GTK_CONTAINER(vbox), hbox); - label = gtk_label_new(_("Proxy preferences are configured in\n" - "GNOME Control Center: Desktop Preferences")); + label = gtk_label_new(_("Proxy & Browser preferences are configured\n" + "in GNOME Preferences")); gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 0); gtk_widget_show(label); @@ -1243,7 +1264,15 @@ G_CALLBACK(proxy_button_clicked_cb), NULL); gtk_box_pack_start(GTK_BOX(hbox), proxy_button, FALSE, FALSE, 0); gtk_widget_show(proxy_button); + browser_button = gtk_button_new_with_mnemonic(_("Configure _Browser")); + g_signal_connect(G_OBJECT(browser_button), "clicked", + G_CALLBACK(browser_button_clicked_cb), NULL); + gtk_box_pack_start(GTK_BOX(hbox), browser_button, FALSE, FALSE, 0); + gtk_widget_show(browser_button); } else { + vbox = pidgin_make_frame(ret, _("Proxy Server")); + prefs_proxy_frame = gtk_vbox_new(FALSE, 0); + pidgin_prefs_dropdown(vbox, _("Proxy _type:"), PURPLE_PREF_STRING, "/purple/proxy/type", _("No proxy"), "none", @@ -1351,11 +1380,20 @@ path = g_find_program_in_path("gnome-network-preferences"); if (path != NULL) { gtk_widget_set_sensitive(proxy_button, TRUE); - gtk_widget_hide(warning); + gtk_widget_hide(proxy_warning); g_free(path); } else { gtk_widget_set_sensitive(proxy_button, FALSE); - gtk_widget_show(warning); + gtk_widget_show(proxy_warning); + } + path = g_find_program_in_path("gnome-default-applications-properties"); + if (path != NULL) { + gtk_widget_set_sensitive(browser_button, TRUE); + gtk_widget_hide(browser_warning); + g_free(path); + } else { + gtk_widget_set_sensitive(browser_button, FALSE); + gtk_widget_show(browser_warning); } }
--- a/pidgin/pixmaps/Makefile.am Sun Nov 04 22:17:45 2007 +0000 +++ b/pidgin/pixmaps/Makefile.am Mon Nov 05 00:35:07 2007 +0000 @@ -1,4 +1,416 @@ -SUBDIRS = animations buddy_icons dialogs emblems emotes icons protocols status toolbar tray +pidginpixmapdir = $(datadir)/pixmaps/pidgin + +SUBDIRS = buddy_icons/qq dialogs/16 dialogs/64 emblems/16 \ + emotes/default/24 emotes/none \ + icons/16 icons/22 icons/24 icons/32 icons/48 \ + protocols/16 protocols/22 protocols/48 \ + status/11 status/16 status/22 status/32 status/48 \ + toolbar/16 toolbar/22 tray/16 tray/22 tray/32 tray/48 + +MAKEFILE_MINGW = \ + buddy_icons/qq/Makefile.mingw \ + dialogs/16/Makefile.mingw \ + dialogs/64/Makefile.mingw \ + icons/16/Makefile.mingw \ + icons/24/Makefile.mingw \ + icons/32/Makefile.mingw \ + icons/48/Makefile.mingw \ + emotes/default/Makefile.mingw \ + emotes/default/24/Makefile.mingw \ + emotes/none/Makefile.mingw \ + emblems/16/Makefile.mingw \ + protocols/22/Makefile.mingw \ + protocols/48/Makefile.mingw \ + status/11/Makefile.mingw \ + status/11/rtl/Makefile.mingw \ + status/16/Makefile.mingw \ + status/16/rtl/Makefile.mingw \ + status/22/Makefile.mingw \ + status/22/rtl/Makefile.mingw \ + status/32/Makefile.mingw \ + status/32/rtl/Makefile.mingw \ + status/48/Makefile.mingw \ + status/48/rtl/Makefile.mingw \ + toolbar/16/Makefile.mingw \ + toolbar/22/Makefile.mingw \ + tray/16/Makefile.mingw \ + tray/22/Makefile.mingw \ + tray/32/Makefile.mingw \ + tray/48/Makefile.mingw + +ANIMATIONS_16 = \ + animations/16/connect0.png \ + animations/16/connect1.png \ + animations/16/connect2.png \ + animations/16/connect3.png \ + animations/16/connect4.png \ + animations/16/connect5.png \ + animations/16/connect6.png \ + animations/16/connect7.png \ + animations/16/connect8.png \ + animations/16/typing0.png \ + animations/16/typing1.png \ + animations/16/typing2.png \ + animations/16/typing3.png \ + animations/16/typing4.png \ + animations/16/typing5.png + +DIALOGS_16_SCALABLE = \ + dialogs/16/scalable/error.svg \ + dialogs/16/scalable/info.svg \ + dialogs/16/scalable/mail.svg + +DIALOGS_64_SCALABLE = \ + dialogs/64/scalable/auth.svg \ + dialogs/64/scalable/cool.svg \ + dialogs/64/scalable/dialog.svg \ + dialogs/64/scalable/error.svg \ + dialogs/64/scalable/info.svg \ + dialogs/64/scalable/question.svg \ + dialogs/64/scalable/warning.svg + +EMBLEMS_16_SCALABLE = \ + emblems/16/scalable/aol-client.svg \ + emblems/16/scalable/blocked.svg \ + emblems/16/scalable/bot.svg \ + emblems/16/scalable/external.svg \ + emblems/16/scalable/female.svg \ + emblems/16/scalable/free-for-chat.svg \ + emblems/16/scalable/game.svg \ + emblems/16/scalable/male.svg \ + emblems/16/scalable/mobile.svg \ + emblems/16/scalable/music.svg \ + emblems/16/scalable/not-authorized.svg \ + emblems/16/scalable/qq-member.svg \ + emblems/16/scalable/secure.svg \ + emblems/16/scalable/unavailable.svg \ + emblems/16/scalable/video.svg \ + emblems/16/scalable/voice.svg + +EMOTES_DEFAULT_24_SCALABLE = \ + emotes/default/24/scalable/act-up.svg \ + emotes/default/24/scalable/airplane.svg \ + emotes/default/24/scalable/alien.svg \ + emotes/default/24/scalable/angel.svg \ + emotes/default/24/scalable/angry.svg \ + emotes/default/24/scalable/arrogant.svg \ + emotes/default/24/scalable/at-wits-end.svg \ + emotes/default/24/scalable/bad.svg \ + emotes/default/24/scalable/bashful.svg \ + emotes/default/24/scalable/beat-up.svg \ + emotes/default/24/scalable/beauty.svg \ + emotes/default/24/scalable/beer.svg \ + emotes/default/24/scalable/blowkiss.svg \ + emotes/default/24/scalable/bomb.svg \ + emotes/default/24/scalable/bowl.svg \ + emotes/default/24/scalable/boy.svg \ + emotes/default/24/scalable/brb.svg \ + emotes/default/24/scalable/bulgy-eyes.svg \ + emotes/default/24/scalable/bye.svg \ + emotes/default/24/scalable/cake.svg \ + emotes/default/24/scalable/call-me.svg \ + emotes/default/24/scalable/camera.svg \ + emotes/default/24/scalable/can.svg \ + emotes/default/24/scalable/car.svg \ + emotes/default/24/scalable/cat.svg \ + emotes/default/24/scalable/chicken.svg \ + emotes/default/24/scalable/clap.svg \ + emotes/default/24/scalable/clock.svg \ + emotes/default/24/scalable/cloudy.svg \ + emotes/default/24/scalable/clover.svg \ + emotes/default/24/scalable/clown.svg \ + emotes/default/24/scalable/coffee.svg \ + emotes/default/24/scalable/coins.svg \ + emotes/default/24/scalable/computer.svg \ + emotes/default/24/scalable/confused.svg \ + emotes/default/24/scalable/console.svg \ + emotes/default/24/scalable/cowboy.svg \ + emotes/default/24/scalable/cow.svg \ + emotes/default/24/scalable/crying.svg \ + emotes/default/24/scalable/curl-lip.svg \ + emotes/default/24/scalable/curse.svg \ + emotes/default/24/scalable/cute.svg \ + emotes/default/24/scalable/cyclops.svg \ + emotes/default/24/scalable/dance.svg \ + emotes/default/24/scalable/dazed.svg \ + emotes/default/24/scalable/desire.svg \ + emotes/default/24/scalable/devil.svg \ + emotes/default/24/scalable/disapointed.svg \ + emotes/default/24/scalable/disdain.svg \ + emotes/default/24/scalable/doctor.svg \ + emotes/default/24/scalable/dog.svg \ + emotes/default/24/scalable/doh.svg \ + emotes/default/24/scalable/dont-know.svg \ + emotes/default/24/scalable/drink.svg \ + emotes/default/24/scalable/drool.svg \ + emotes/default/24/scalable/eat.svg \ + emotes/default/24/scalable/embarrassed.svg \ + emotes/default/24/scalable/excruciating.svg \ + emotes/default/24/scalable/eyeroll.svg \ + emotes/default/24/scalable/female-fighter.svg \ + emotes/default/24/scalable/film.svg \ + emotes/default/24/scalable/fingers-crossed.svg \ + emotes/default/24/scalable/flag.svg \ + emotes/default/24/scalable/foot-in-mouth.svg \ + emotes/default/24/scalable/freaked-out.svg \ + emotes/default/24/scalable/ghost.svg \ + emotes/default/24/scalable/giggle.svg \ + emotes/default/24/scalable/girl.svg \ + emotes/default/24/scalable/glasses-cool.svg \ + emotes/default/24/scalable/glasses-nerdy.svg \ + emotes/default/24/scalable/goat.svg \ + emotes/default/24/scalable/go-away.svg \ + emotes/default/24/scalable/good.svg \ + emotes/default/24/scalable/hammer.svg \ + emotes/default/24/scalable/handcuffs.svg \ + emotes/default/24/scalable/handshake.svg \ + emotes/default/24/scalable/highfive.svg \ + emotes/default/24/scalable/hug-left.svg \ + emotes/default/24/scalable/hug-right.svg \ + emotes/default/24/scalable/hypnotized.svg \ + emotes/default/24/scalable/in-love.svg \ + emotes/default/24/scalable/island.svg \ + emotes/default/24/scalable/jump.svg \ + emotes/default/24/scalable/kissed.svg \ + emotes/default/24/scalable/kissing.svg \ + emotes/default/24/scalable/kiss.svg \ + emotes/default/24/scalable/knife.svg \ + emotes/default/24/scalable/lamp.svg \ + emotes/default/24/scalable/lashes.svg \ + emotes/default/24/scalable/laugh.svg \ + emotes/default/24/scalable/liquor.svg \ + emotes/default/24/scalable/loser.svg \ + emotes/default/24/scalable/love-over.svg \ + emotes/default/24/scalable/love.svg \ + emotes/default/24/scalable/lying.svg \ + emotes/default/24/scalable/madtongue.svg \ + emotes/default/24/scalable/mail.svg \ + emotes/default/24/scalable/male-fighter1.svg \ + emotes/default/24/scalable/male-fighter2.svg \ + emotes/default/24/scalable/mean.svg \ + emotes/default/24/scalable/meeting.svg \ + emotes/default/24/scalable/messed.svg \ + emotes/default/24/scalable/mobile.svg \ + emotes/default/24/scalable/mohawk.svg \ + emotes/default/24/scalable/moneymouth.svg \ + emotes/default/24/scalable/monkey.svg \ + emotes/default/24/scalable/moon.svg \ + emotes/default/24/scalable/msn-away.svg \ + emotes/default/24/scalable/msn-busy.svg \ + emotes/default/24/scalable/msn_online.svg \ + emotes/default/24/scalable/msn.svg \ + emotes/default/24/scalable/musical-note.svg \ + emotes/default/24/scalable/music.svg \ + emotes/default/24/scalable/nailbiting.svg \ + emotes/default/24/scalable/neutral.svg \ + emotes/default/24/scalable/on-the-phone.svg \ + emotes/default/24/scalable/party.svg \ + emotes/default/24/scalable/peace.svg \ + emotes/default/24/scalable/phone.svg \ + emotes/default/24/scalable/pig.svg \ + emotes/default/24/scalable/pill.svg \ + emotes/default/24/scalable/pirate.svg \ + emotes/default/24/scalable/pissed-off.svg \ + emotes/default/24/scalable/pizza.svg \ + emotes/default/24/scalable/plate.svg \ + emotes/default/24/scalable/poop.svg \ + emotes/default/24/scalable/pray.svg \ + emotes/default/24/scalable/present.svg \ + emotes/default/24/scalable/qq.svg \ + emotes/default/24/scalable/question.svg \ + emotes/default/24/scalable/quiet.svg \ + emotes/default/24/scalable/rainbow.svg \ + emotes/default/24/scalable/rain.svg \ + emotes/default/24/scalable/rose-dead.svg \ + emotes/default/24/scalable/rose.svg \ + emotes/default/24/scalable/rotfl.svg \ + emotes/default/24/scalable/sad.svg \ + emotes/default/24/scalable/sarcastic.svg \ + emotes/default/24/scalable/search.svg \ + emotes/default/24/scalable/secret.svg \ + emotes/default/24/scalable/shame.svg \ + emotes/default/24/scalable/sheep.svg \ + emotes/default/24/scalable/shock.svg \ + emotes/default/24/scalable/shout.svg \ + emotes/default/24/scalable/shut-mouth.svg \ + emotes/default/24/scalable/sick.svg \ + emotes/default/24/scalable/sidefrown.svg \ + emotes/default/24/scalable/sigarette.svg \ + emotes/default/24/scalable/silly.svg \ + emotes/default/24/scalable/sinister.svg \ + emotes/default/24/scalable/skeleton.svg \ + emotes/default/24/scalable/skywalker.svg \ + emotes/default/24/scalable/sleepy.svg \ + emotes/default/24/scalable/smile-big.svg \ + emotes/default/24/scalable/smile.svg \ + emotes/default/24/scalable/smirk.svg \ + emotes/default/24/scalable/snail.svg \ + emotes/default/24/scalable/snicker.svg \ + emotes/default/24/scalable/snowman.svg \ + emotes/default/24/scalable/soccerball.svg \ + emotes/default/24/scalable/soldier.svg \ + emotes/default/24/scalable/star.svg \ + emotes/default/24/scalable/starving.svg \ + emotes/default/24/scalable/stop.svg \ + emotes/default/24/scalable/struggle.svg \ + emotes/default/24/scalable/sun.svg \ + emotes/default/24/scalable/sweat.svg \ + emotes/default/24/scalable/talktohand.svg \ + emotes/default/24/scalable/teeth.svg \ + emotes/default/24/scalable/terror.svg \ + emotes/default/24/scalable/thinking.svg \ + emotes/default/24/scalable/thunder.svg \ + emotes/default/24/scalable/time-out.svg \ + emotes/default/24/scalable/tongue.svg \ + emotes/default/24/scalable/tremble.svg \ + emotes/default/24/scalable/turtle.svg \ + emotes/default/24/scalable/tv.svg \ + emotes/default/24/scalable/umbrella.svg \ + emotes/default/24/scalable/vampire.svg \ + emotes/default/24/scalable/victory.svg \ + emotes/default/24/scalable/waiting.svg \ + emotes/default/24/scalable/watermelon.svg \ + emotes/default/24/scalable/waving.svg \ + emotes/default/24/scalable/weep.svg \ + emotes/default/24/scalable/wilt.svg \ + emotes/default/24/scalable/wink.svg \ + emotes/default/24/scalable/worship.svg \ + emotes/default/24/scalable/yawn.svg \ + emotes/default/24/scalable/yin-yang.svg + +PROTOCOLS_16_SCALABLE = \ + protocols/16/scalable/aim.svg \ + protocols/16/scalable/bonjour.svg \ + protocols/16/scalable/gadu-gadu.svg \ + protocols/16/scalable/novell.svg \ + protocols/16/scalable/icq.svg \ + protocols/16/scalable/irc.svg \ + protocols/16/scalable/jabber.svg \ + protocols/16/scalable/meanwhile.svg \ + protocols/16/scalable/msn.svg \ + protocols/16/scalable/qq.svg \ + protocols/16/scalable/silc.svg \ + protocols/16/scalable/simple.svg \ + protocols/16/scalable/yahoo.svg \ + protocols/16/scalable/zephyr.svg + +ICONS_16_SCALABLE = \ + icons/16/scalable/pidgin.svg + +ICONS_22_SCALABLE = \ + icons/22/scalable/pidgin.svg + +ICONS_24_SCALABLE = \ + icons/24/scalable/pidgin.svg + +ICONS_32_SCALABLE = \ + icons/32/scalable/pidgin.svg + +ICONS_48_SCALABLE = \ + icons/48/scalable/pidgin.svg + +PROTOCOLS_22_SCALABLE = \ + protocols/22/scalable/aim.svg \ + protocols/22/scalable/bonjour.svg \ + protocols/22/scalable/gadu-gadu.svg \ + protocols/22/scalable/novell.svg \ + protocols/22/scalable/icq.svg \ + protocols/22/scalable/irc.svg \ + protocols/22/scalable/jabber.svg \ + protocols/22/scalable/meanwhile.svg \ + protocols/22/scalable/msn.svg \ + protocols/22/scalable/qq.svg \ + protocols/22/scalable/silc.svg \ + protocols/22/scalable/simple.svg \ + protocols/22/scalable/yahoo.svg \ + protocols/22/scalable/zephyr.svg + +PROTOCOLS_48_SCALABLE = \ + protocols/48/scalable/aim.svg \ + protocols/48/scalable/bonjour.svg \ + protocols/48/scalable/gadu-gadu.svg \ + protocols/48/scalable/google-talk.svg \ + protocols/48/scalable/novell.svg \ + protocols/48/scalable/icq.svg \ + protocols/48/scalable/irc.svg \ + protocols/48/scalable/jabber.svg \ + protocols/48/scalable/meanwhile.svg \ + protocols/48/scalable/msn.svg \ + protocols/48/scalable/qq.svg \ + protocols/48/scalable/silc.svg \ + protocols/48/scalable/simple.svg \ + protocols/48/scalable/yahoo.svg \ + protocols/48/scalable/zephyr.svg + +STATUS_11_SCALABLE = \ + status/11/scalable/available.svg \ + status/11/scalable/away.svg \ + status/11/scalable/busy.svg \ + status/11/scalable/chat.svg \ + status/11/scalable/extended-away.svg \ + status/11/scalable/invisible.svg \ + status/11/scalable/offline.svg \ + status/11/scalable/person.svg + +STATUS_16_SCALABLE = \ + status/16/scalable/available.svg \ + status/16/scalable/away.svg \ + status/16/scalable/busy.svg \ + status/16/scalable/chat.svg \ + status/16/scalable/extended-away.svg \ + status/16/scalable/log-in.svg \ + status/16/scalable/log-out.svg \ + status/16/scalable/message-pending.svg \ + status/16/scalable/offline.svg \ + status/16/scalable/person.svg + +STATUS_22_SCALABLE = \ + status/22/scalable/available.svg \ + status/22/scalable/away.svg \ + status/22/scalable/busy.svg \ + status/22/scalable/chat.svg \ + status/22/scalable/extended-away.svg \ + status/22/scalable/log-in.svg \ + status/22/scalable/log-out.svg \ + status/22/scalable/offline.svg \ + status/22/scalable/person.svg + +STATUS_32_SCALABLE = \ + status/32/scalable/available.svg \ + status/32/scalable/away.svg \ + status/32/scalable/busy.svg \ + status/32/scalable/chat.svg \ + status/32/scalable/extended-away.svg \ + status/32/scalable/log-in.svg \ + status/32/scalable/log-out.svg \ + status/32/scalable/offline.svg \ + status/32/scalable/person.svg + +TOOLBAR_11 = \ + toolbar/11/message-new.png + +TOOLBAR_16_SCALABLE = \ + toolbar/16/scalable/change-bgcolor.svg \ + toolbar/16/scalable/change-fgcolor.svg \ + toolbar/16/scalable/emote-select.svg \ + toolbar/16/scalable/font-size-down.svg \ + toolbar/16/scalable/font-size-up.svg + +TOOLBAR_22_SCALABLE = \ + toolbar/22/scalable/select-avatar.svg + +TRAY_16_SCALABLE = \ + tray/16/scalable/tray-away.svg \ + tray/16/scalable/tray-busy.svg \ + tray/16/scalable/tray-connecting.svg \ + tray/16/scalable/tray-extended-away.svg \ + tray/16/scalable/tray-invisible.svg \ + tray/16/scalable/tray-message.svg \ + tray/16/scalable/tray-offline.svg \ + tray/16/scalable/tray-online.svg + +TRAY_22_SCALABLE = \ + tray/22/scalable/tray-invisible.svg EXTRA_DIST = \ edit.png \ @@ -10,7 +422,29 @@ arrow-right.xpm \ arrow-left.xpm \ Makefile.mingw \ - pidgin.ico + pidgin.ico \ + $(MAKEFILE_MINGW) \ + $(DIALOGS_16_SCALABLE) \ + $(DIALOGS_64_SCALABLE) \ + $(ICONS_16_SCALABLE) \ + $(ICONS_22_SCALABLE) \ + $(ICONS_24_SCALABLE) \ + $(ICONS_32_SCALABLE) \ + $(ICONS_48_SCALABLE) \ + $(EMBLEMS_16_SCALABLE) \ + $(EMOTES_DEFAULT_24_SCALABLE) \ + $(PROTOCOLS_16_SCALABLE) \ + $(PROTOCOLS_22_SCALABLE) \ + $(PROTOCOLS_48_SCALABLE) \ + $(STATUS_11_SCALABLE) \ + $(STATUS_16_SCALABLE) \ + $(STATUS_22_SCALABLE) \ + $(STATUS_32_SCALABLE) \ + $(TOOLBAR_11) \ + $(TOOLBAR_16_SCALABLE) \ + $(TOOLBAR_22_SCALABLE) \ + $(TRAY_16_SCALABLE) \ + $(TRAY_22_SCALABLE) pidginbuttonpixdir = $(datadir)/pixmaps/pidgin/buttons pidginbuttonpix_DATA = edit.png pause.png info.png @@ -18,3 +452,4 @@ pidgindistpixdir = $(datadir)/pixmaps/pidgin pidgindistpix_DATA = logo.png arrow-down.xpm arrow-left.xpm arrow-right.xpm arrow-up.xpm +nobase_dist_pidginpixmap_DATA = $(ANIMATIONS_16)
--- a/pidgin/pixmaps/Makefile.mingw Sun Nov 04 22:17:45 2007 +0000 +++ b/pidgin/pixmaps/Makefile.mingw Mon Nov 05 00:35:07 2007 +0000 @@ -15,7 +15,16 @@ install: if test '$(SUBDIRS)'; then \ list='$(SUBDIRS)'; for subdir in $$list; do \ + if [ "$$subdir" != "icons/22" ]; then \ $(MAKE) -C $$subdir -f $(MINGW_MAKEFILE) install || exit 1 ;\ + fi \ + done; \ + fi; + if test '$(nobase_dist_pidginpixmap_DATA)'; then \ + list='$(nobase_dist_pidginpixmap_DATA)'; for file in $$list; do \ + dir=`dirname $$file`; \ + mkdir -p $(pidginpixmapdir)/$$dir; \ + cp $$file $(pidginpixmapdir)/$$dir/; \ done; \ fi; if test '$(pidginbuttonpix_DATA)'; then \
--- a/pidgin/pixmaps/animations/16/Makefile.am Sun Nov 04 22:17:45 2007 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,18 +0,0 @@ -EXTRA_DIST = connect0.png \ - connect1.png \ - connect2.png \ - connect3.png \ - connect4.png \ - connect5.png \ - connect6.png \ - connect7.png \ - connect8.png \ - typing0.png \ - typing1.png \ - typing2.png \ - typing3.png \ - typing4.png \ - typing5.png - -pidginanimpixdir = $(datadir)/pixmaps/pidgin/animations/16 -pidginanimpix_DATA = $(EXTRA_DIST)
--- a/pidgin/pixmaps/animations/16/Makefile.mingw Sun Nov 04 22:17:45 2007 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,20 +0,0 @@ -# -# Makefile.mingw -# -# Description: Makefile for win32 (mingw) version of Pidgin pixmaps -# - -PIDGIN_TREE_TOP := ../../../.. -include $(PIDGIN_TREE_TOP)/libpurple/win32/global.mak - -datadir = $(PIDGIN_INSTALL_DIR) -include ./Makefile.am - -.PHONY: install - -install: - if test '$(pidginanimpix_DATA)'; then \ - mkdir -p $(pidginanimpixdir); \ - cp $(pidginanimpix_DATA) $(pidginanimpixdir); \ - fi; -
--- a/pidgin/pixmaps/animations/Makefile.am Sun Nov 04 22:17:45 2007 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,5 +0,0 @@ -SUBDIRS = 16 - -EXTRA_DIST = \ - Makefile.mingw \ - 16/Makefile.mingw
--- a/pidgin/pixmaps/animations/Makefile.mingw Sun Nov 04 22:17:45 2007 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,14 +0,0 @@ -# -# Makefile.mingw -# -# Description: Makefile for win32 (mingw) version of Pidgin pixmaps -# - -include ./Makefile.am - -install: - if test '$(SUBDIRS)'; then \ - list='$(SUBDIRS)'; for subdir in $$list; do \ - $(MAKE) -C $$subdir -f Makefile.mingw install || exit 1; \ - done; \ - fi;
--- a/pidgin/pixmaps/buddy_icons/Makefile.am Sun Nov 04 22:17:45 2007 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,5 +0,0 @@ -SUBDIRS = qq - -EXTRA_DIST = \ - Makefile.mingw \ - qq/Makefile.mingw
--- a/pidgin/pixmaps/buddy_icons/Makefile.mingw Sun Nov 04 22:17:45 2007 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,16 +0,0 @@ -# -# Makefile.mingw -# -# Description: Makefile for win32 (mingw) version of Pidgin pixmaps -# - -include ./Makefile.am - -.PHONY: install - -install: - if test '$(SUBDIRS)'; then \ - list='$(SUBDIRS)'; for subdir in $$list; do \ - $(MAKE) -C $$subdir -f Makefile.mingw install || exit 1; \ - done; \ - fi;
--- a/pidgin/pixmaps/dialogs/16/Makefile.am Sun Nov 04 22:17:45 2007 +0000 +++ b/pidgin/pixmaps/dialogs/16/Makefile.am Mon Nov 05 00:35:07 2007 +0000 @@ -1,5 +1,3 @@ -SUBDIRS = scalable - EXTRA_DIST = auth.png \ error.png \ info.png \
--- a/pidgin/pixmaps/dialogs/16/scalable/Makefile.am Sun Nov 04 22:17:45 2007 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,3 +0,0 @@ -EXTRA_DIST = error.svg \ - info.svg \ - mail.svg
--- a/pidgin/pixmaps/dialogs/64/Makefile.am Sun Nov 04 22:17:45 2007 +0000 +++ b/pidgin/pixmaps/dialogs/64/Makefile.am Mon Nov 05 00:35:07 2007 +0000 @@ -1,5 +1,3 @@ -SUBDIRS = scalable - EXTRA_DIST = auth.png \ cool.png \ dialog.png \
--- a/pidgin/pixmaps/dialogs/64/scalable/Makefile.am Sun Nov 04 22:17:45 2007 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,7 +0,0 @@ -EXTRA_DIST = auth.svg \ - cool.svg \ - dialog.svg \ - error.svg \ - info.svg \ - question.svg \ - warning.svg
--- a/pidgin/pixmaps/dialogs/Makefile.am Sun Nov 04 22:17:45 2007 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,6 +0,0 @@ -SUBDIRS = 16 64 - -EXTRA_DIST = \ - Makefile.mingw \ - 16/Makefile.mingw \ - 64/Makefile.mingw
--- a/pidgin/pixmaps/dialogs/Makefile.mingw Sun Nov 04 22:17:45 2007 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,16 +0,0 @@ -# -# Makefile.mingw -# -# Description: Makefile for win32 (mingw) version of Pidgin pixmaps -# - -include ./Makefile.am - -.PHONY: install - -install: - if test '$(SUBDIRS)'; then \ - list='$(SUBDIRS)'; for subdir in $$list; do \ - $(MAKE) -C $$subdir -f Makefile.mingw install || exit 1; \ - done; \ - fi;
--- a/pidgin/pixmaps/emblems/16/Makefile.am Sun Nov 04 22:17:45 2007 +0000 +++ b/pidgin/pixmaps/emblems/16/Makefile.am Mon Nov 05 00:35:07 2007 +0000 @@ -1,5 +1,3 @@ -SUBDIRS = scalable - EXTRA_DIST = aol-client.png \ birthday.png \ blocked.png \
--- a/pidgin/pixmaps/emblems/16/scalable/Makefile.am Sun Nov 04 22:17:45 2007 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,16 +0,0 @@ -EXTRA_DIST = aol-client.svg \ - blocked.svg \ - bot.svg \ - external.svg \ - female.svg \ - free-for-chat.svg \ - game.svg \ - male.svg \ - mobile.svg \ - music.svg \ - not-authorized.svg \ - qq-member.svg \ - secure.svg \ - unavailable.svg \ - video.svg \ - voice.svg
--- a/pidgin/pixmaps/emblems/Makefile.am Sun Nov 04 22:17:45 2007 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,5 +0,0 @@ -SUBDIRS = 16 - -EXTRA_DIST = \ - Makefile.mingw \ - 16/Makefile.mingw
--- a/pidgin/pixmaps/emblems/Makefile.mingw Sun Nov 04 22:17:45 2007 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,16 +0,0 @@ -# -# Makefile.mingw -# -# Description: Makefile for win32 (mingw) version of Pidgin pixmaps -# - -include ./Makefile.am - -.PHONY: install - -install: - if test '$(SUBDIRS)'; then \ - list='$(SUBDIRS)'; for subdir in $$list; do \ - $(MAKE) -C $$subdir -f Makefile.mingw install || exit 1; \ - done; \ - fi;
--- a/pidgin/pixmaps/emotes/Makefile.am Sun Nov 04 22:17:45 2007 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,3 +0,0 @@ -SUBDIRS=default none - -EXTRA_DIST = Makefile.mingw
--- a/pidgin/pixmaps/emotes/Makefile.mingw Sun Nov 04 22:17:45 2007 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,23 +0,0 @@ -# -# Makefile.mingw -# -# Description: Makefile for win32 (mingw) version of Pidgin pixmaps -# - -include ./Makefile.am - -.PHONY: install clean - -install: - if test '$(SUBDIRS)'; then \ - list='$(SUBDIRS)'; for subdir in $$list; do \ - $(MAKE) -C $$subdir -f Makefile.mingw install || exit 1; \ - done; \ - fi; - -clean: - if test '$(SUBDIRS)'; then \ - list='$(SUBDIRS)'; for subdir in $$list; do \ - $(MAKE) -C $$subdir -f Makefile.mingw clean || exit 1; \ - done; \ - fi;
--- a/pidgin/pixmaps/emotes/default/24/Makefile.am Sun Nov 04 22:17:45 2007 +0000 +++ b/pidgin/pixmaps/emotes/default/24/Makefile.am Mon Nov 05 00:35:07 2007 +0000 @@ -1,5 +1,3 @@ -SUBDIRS = scalable - SMILEYS = act-up.png \ airplane.png \ alien.png \
--- a/pidgin/pixmaps/emotes/default/24/scalable/Makefile.am Sun Nov 04 22:17:45 2007 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,189 +0,0 @@ -SMILEYS = act-up.svg \ - airplane.svg \ - alien.svg \ - angel.svg \ - angry.svg \ - arrogant.svg \ - at-wits-end.svg \ - bad.svg \ - bashful.svg \ - beat-up.svg \ - beauty.svg \ - beer.svg \ - blowkiss.svg \ - bomb.svg \ - bowl.svg \ - boy.svg \ - brb.svg \ - bulgy-eyes.svg \ - bye.svg \ - cake.svg \ - call-me.svg \ - camera.svg \ - can.svg \ - car.svg \ - cat.svg \ - chicken.svg \ - clap.svg \ - clock.svg \ - cloudy.svg \ - clover.svg \ - clown.svg \ - coffee.svg \ - coins.svg \ - computer.svg \ - confused.svg \ - console.svg \ - cowboy.svg \ - cow.svg \ - crying.svg \ - curl-lip.svg \ - curse.svg \ - cute.svg \ - cyclops.svg \ - dance.svg \ - dazed.svg \ - desire.svg \ - devil.svg \ - disapointed.svg \ - disdain.svg \ - doctor.svg \ - dog.svg \ - doh.svg \ - dont-know.svg \ - drink.svg \ - drool.svg \ - eat.svg \ - embarrassed.svg \ - excruciating.svg \ - eyeroll.svg \ - female-fighter.svg \ - film.svg \ - fingers-crossed.svg \ - flag.svg \ - foot-in-mouth.svg \ - freaked-out.svg \ - ghost.svg \ - giggle.svg \ - girl.svg \ - glasses-cool.svg \ - glasses-nerdy.svg \ - goat.svg \ - go-away.svg \ - good.svg \ - hammer.svg \ - handcuffs.svg \ - handshake.svg \ - highfive.svg \ - hug-left.svg \ - hug-right.svg \ - hypnotized.svg \ - in-love.svg \ - island.svg \ - jump.svg \ - kissed.svg \ - kissing.svg \ - kiss.svg \ - knife.svg \ - lamp.svg \ - lashes.svg \ - laugh.svg \ - liquor.svg \ - loser.svg \ - love-over.svg \ - love.svg \ - lying.svg \ - madtongue.svg \ - mail.svg \ - male-fighter1.svg \ - male-fighter2.svg \ - mean.svg \ - meeting.svg \ - messed.svg \ - mobile.svg \ - mohawk.svg \ - moneymouth.svg \ - monkey.svg \ - moon.svg \ - msn-away.svg \ - msn-busy.svg \ - msn_online.svg \ - msn.svg \ - musical-note.svg \ - music.svg \ - nailbiting.svg \ - neutral.svg \ - on-the-phone.svg \ - party.svg \ - peace.svg \ - phone.svg \ - pig.svg \ - pill.svg \ - pirate.svg \ - pissed-off.svg \ - pizza.svg \ - plate.svg \ - poop.svg \ - pray.svg \ - present.svg \ - qq.svg \ - question.svg \ - quiet.svg \ - rainbow.svg \ - rain.svg \ - rose-dead.svg \ - rose.svg \ - rotfl.svg \ - sad.svg \ - sarcastic.svg \ - search.svg \ - secret.svg \ - shame.svg \ - sheep.svg \ - shock.svg \ - shout.svg \ - shut-mouth.svg \ - sick.svg \ - sidefrown.svg \ - sigarette.svg \ - silly.svg \ - sinister.svg \ - skeleton.svg \ - skywalker.svg \ - sleepy.svg \ - smile-big.svg \ - smile.svg \ - smirk.svg \ - snail.svg \ - snicker.svg \ - snowman.svg \ - soccerball.svg \ - soldier.svg \ - star.svg \ - starving.svg \ - stop.svg \ - struggle.svg \ - sun.svg \ - sweat.svg \ - talktohand.svg \ - teeth.svg \ - terror.svg \ - thinking.svg \ - thunder.svg \ - time-out.svg \ - tongue.svg \ - tremble.svg \ - turtle.svg \ - tv.svg \ - umbrella.svg \ - vampire.svg \ - victory.svg \ - waiting.svg \ - watermelon.svg \ - waving.svg \ - weep.svg \ - wilt.svg \ - wink.svg \ - worship.svg \ - yawn.svg \ - yin-yang.svg
--- a/pidgin/pixmaps/emotes/default/Makefile.am Sun Nov 04 22:17:45 2007 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,5 +0,0 @@ -SUBDIRS=24 - -EXTRA_DIST= \ - Makefile.mingw \ - 24/Makefile.mingw
--- a/pidgin/pixmaps/icons/16/Makefile.am Sun Nov 04 22:17:45 2007 +0000 +++ b/pidgin/pixmaps/icons/16/Makefile.am Mon Nov 05 00:35:07 2007 +0000 @@ -1,5 +1,3 @@ -SUBDIRS = scalable - EXTRA_DIST = pidgin.png pidginiconspixdir = $(datadir)/icons/hicolor/16x16/apps
--- a/pidgin/pixmaps/icons/16/scalable/Makefile.am Sun Nov 04 22:17:45 2007 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,1 +0,0 @@ -EXTRA_DIST = pidgin.svg
--- a/pidgin/pixmaps/icons/22/Makefile.am Sun Nov 04 22:17:45 2007 +0000 +++ b/pidgin/pixmaps/icons/22/Makefile.am Mon Nov 05 00:35:07 2007 +0000 @@ -1,5 +1,3 @@ -SUBDIRS = scalable - EXTRA_DIST = pidgin.png pidginiconspixdir = $(datadir)/icons/hicolor/22x22/apps
--- a/pidgin/pixmaps/icons/22/scalable/Makefile.am Sun Nov 04 22:17:45 2007 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,1 +0,0 @@ -EXTRA_DIST = pidgin.svg
--- a/pidgin/pixmaps/icons/24/Makefile.am Sun Nov 04 22:17:45 2007 +0000 +++ b/pidgin/pixmaps/icons/24/Makefile.am Mon Nov 05 00:35:07 2007 +0000 @@ -1,5 +1,3 @@ -SUBDIRS = scalable - EXTRA_DIST = pidgin.png pidginiconspixdir = $(datadir)/icons/hicolor/24x24/apps
--- a/pidgin/pixmaps/icons/24/scalable/Makefile.am Sun Nov 04 22:17:45 2007 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,1 +0,0 @@ -EXTRA_DIST = pidgin.svg
--- a/pidgin/pixmaps/icons/32/Makefile.am Sun Nov 04 22:17:45 2007 +0000 +++ b/pidgin/pixmaps/icons/32/Makefile.am Mon Nov 05 00:35:07 2007 +0000 @@ -1,5 +1,3 @@ -SUBDIRS = scalable - EXTRA_DIST = pidgin.png pidginiconspixdir = $(datadir)/icons/hicolor/32x32/apps
--- a/pidgin/pixmaps/icons/32/scalable/Makefile.am Sun Nov 04 22:17:45 2007 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,1 +0,0 @@ -EXTRA_DIST = pidgin.svg
--- a/pidgin/pixmaps/icons/48/Makefile.am Sun Nov 04 22:17:45 2007 +0000 +++ b/pidgin/pixmaps/icons/48/Makefile.am Mon Nov 05 00:35:07 2007 +0000 @@ -1,5 +1,3 @@ -SUBDIRS = scalable - EXTRA_DIST = pidgin.png pidginiconspixdir = $(datadir)/icons/hicolor/48x48/apps
--- a/pidgin/pixmaps/icons/48/scalable/Makefile.am Sun Nov 04 22:17:45 2007 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,6 +0,0 @@ -EXTRA_DIST = pidgin.svg - -pidginiconspixdir = $(datadir)/icons/hicolor/scalable/apps - -pidginiconspix_DATA = $(EXTRA_DIST) -
--- a/pidgin/pixmaps/icons/Makefile.am Sun Nov 04 22:17:45 2007 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,9 +0,0 @@ -SUBDIRS = 16 22 24 32 48 - -EXTRA_DIST = \ - Makefile.mingw \ - 16/Makefile.mingw \ - 24/Makefile.mingw \ - 32/Makefile.mingw \ - 48/Makefile.mingw -
--- a/pidgin/pixmaps/icons/Makefile.mingw Sun Nov 04 22:17:45 2007 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,19 +0,0 @@ -# -# Makefile.mingw -# -# Description: Makefile for win32 (mingw) version of Pidgin pixmaps -# - -include ./Makefile.am - -install: - -install_real: - if test '$(SUBDIRS)'; then \ - list='$(SUBDIRS)'; for subdir in $$list; do \ - if [ "$$subdir" != "22" ]; then \ - $(MAKE) -C $$subdir -f Makefile.mingw install || exit 1; \ - fi; \ - done; \ - fi; -
--- a/pidgin/pixmaps/protocols/16/Makefile.am Sun Nov 04 22:17:45 2007 +0000 +++ b/pidgin/pixmaps/protocols/16/Makefile.am Mon Nov 05 00:35:07 2007 +0000 @@ -1,5 +1,3 @@ -SUBDIRS = scalable - EXTRA_DIST = aim.png \ bonjour.png \ gadu-gadu.png \
--- a/pidgin/pixmaps/protocols/16/scalable/Makefile.am Sun Nov 04 22:17:45 2007 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,14 +0,0 @@ -EXTRA_DIST = aim.svg \ - bonjour.svg \ - gadu-gadu.svg \ - novell.svg \ - icq.svg \ - irc.svg \ - jabber.svg \ - meanwhile.svg \ - msn.svg \ - qq.svg \ - silc.svg \ - simple.svg \ - yahoo.svg \ - zephyr.svg
--- a/pidgin/pixmaps/protocols/22/Makefile.am Sun Nov 04 22:17:45 2007 +0000 +++ b/pidgin/pixmaps/protocols/22/Makefile.am Mon Nov 05 00:35:07 2007 +0000 @@ -1,5 +1,3 @@ -SUBDIRS = scalable - EXTRA_DIST = aim.png \ bonjour.png \ gadu-gadu.png \
--- a/pidgin/pixmaps/protocols/22/scalable/Makefile.am Sun Nov 04 22:17:45 2007 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,14 +0,0 @@ -EXTRA_DIST = aim.svg \ - bonjour.svg \ - gadu-gadu.svg \ - novell.svg \ - icq.svg \ - irc.svg \ - jabber.svg \ - meanwhile.svg \ - msn.svg \ - qq.svg \ - silc.svg \ - simple.svg \ - yahoo.svg \ - zephyr.svg
--- a/pidgin/pixmaps/protocols/48/Makefile.am Sun Nov 04 22:17:45 2007 +0000 +++ b/pidgin/pixmaps/protocols/48/Makefile.am Mon Nov 05 00:35:07 2007 +0000 @@ -1,5 +1,3 @@ -SUBDIRS = scalable - EXTRA_DIST = aim.png \ bonjour.png \ gadu-gadu.png \
--- a/pidgin/pixmaps/protocols/48/scalable/Makefile.am Sun Nov 04 22:17:45 2007 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,15 +0,0 @@ -EXTRA_DIST = aim.svg \ - bonjour.svg \ - gadu-gadu.svg \ - google-talk.svg \ - novell.svg \ - icq.svg \ - irc.svg \ - jabber.svg \ - meanwhile.svg \ - msn.svg \ - qq.svg \ - silc.svg \ - simple.svg \ - yahoo.svg \ - zephyr.svg
--- a/pidgin/pixmaps/protocols/Makefile.am Sun Nov 04 22:17:45 2007 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,8 +0,0 @@ -SUBDIRS = 16 22 48 - -EXTRA_DIST = \ - Makefile.mingw \ - 16/Makefile.mingw \ - 22/Makefile.mingw \ - 48/Makefile.mingw -
--- a/pidgin/pixmaps/protocols/Makefile.mingw Sun Nov 04 22:17:45 2007 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,16 +0,0 @@ -# -# Makefile.mingw -# -# Description: Makefile for win32 (mingw) version of Pidgin pixmaps -# - -include ./Makefile.am - -.PHONY: install - -install: - if test '$(SUBDIRS)'; then \ - list='$(SUBDIRS)'; for subdir in $$list; do \ - $(MAKE) -C $$subdir -f Makefile.mingw install || exit 1; \ - done; \ - fi;
--- a/pidgin/pixmaps/status/11/Makefile.am Sun Nov 04 22:17:45 2007 +0000 +++ b/pidgin/pixmaps/status/11/Makefile.am Mon Nov 05 00:35:07 2007 +0000 @@ -1,4 +1,4 @@ -SUBDIRS = scalable rtl +SUBDIRS = rtl EXTRA_DIST = available.png \ away.png \
--- a/pidgin/pixmaps/status/11/scalable/Makefile.am Sun Nov 04 22:17:45 2007 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,8 +0,0 @@ -EXTRA_DIST = available.svg \ - away.svg \ - busy.svg \ - chat.svg \ - extended-away.svg \ - invisible.svg \ - offline.svg \ - person.svg
--- a/pidgin/pixmaps/status/16/Makefile.am Sun Nov 04 22:17:45 2007 +0000 +++ b/pidgin/pixmaps/status/16/Makefile.am Mon Nov 05 00:35:07 2007 +0000 @@ -1,4 +1,4 @@ -SUBDIRS = rtl scalable +SUBDIRS = rtl EXTRA_DIST = available.png \ away.png \
--- a/pidgin/pixmaps/status/16/scalable/Makefile.am Sun Nov 04 22:17:45 2007 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,13 +0,0 @@ -EXTRA_DIST = available.svg \ - away.svg \ - busy.svg \ - chat.svg \ - extended-away.svg \ - log-in.svg \ - log-out.svg \ - message-pending.svg \ - offline.svg \ - person.svg - -# half-operator.svg -# operator.svg
--- a/pidgin/pixmaps/status/22/Makefile.am Sun Nov 04 22:17:45 2007 +0000 +++ b/pidgin/pixmaps/status/22/Makefile.am Mon Nov 05 00:35:07 2007 +0000 @@ -1,4 +1,4 @@ -SUBDIRS = rtl scalable +SUBDIRS = rtl EXTRA_DIST = available.png \ away.png \
--- a/pidgin/pixmaps/status/22/scalable/Makefile.am Sun Nov 04 22:17:45 2007 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,9 +0,0 @@ -EXTRA_DIST = available.svg \ - away.svg \ - busy.svg \ - chat.svg \ - extended-away.svg \ - log-in.svg \ - log-out.svg \ - offline.svg \ - person.svg
--- a/pidgin/pixmaps/status/32/Makefile.am Sun Nov 04 22:17:45 2007 +0000 +++ b/pidgin/pixmaps/status/32/Makefile.am Mon Nov 05 00:35:07 2007 +0000 @@ -1,4 +1,4 @@ -SUBDIRS = rtl scalable +SUBDIRS = rtl EXTRA_DIST = available.png \ away.png \
--- a/pidgin/pixmaps/status/32/scalable/Makefile.am Sun Nov 04 22:17:45 2007 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,9 +0,0 @@ -EXTRA_DIST = available.svg \ - away.svg \ - busy.svg \ - chat.svg \ - extended-away.svg \ - log-in.svg \ - log-out.svg \ - offline.svg \ - person.svg
--- a/pidgin/pixmaps/status/Makefile.am Sun Nov 04 22:17:45 2007 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,15 +0,0 @@ -SUBDIRS = 11 16 22 32 48 - -EXTRA_DIST = \ - Makefile.mingw \ - 11/Makefile.mingw \ - 11/rtl/Makefile.mingw \ - 16/Makefile.mingw \ - 16/rtl/Makefile.mingw \ - 22/Makefile.mingw \ - 22/rtl/Makefile.mingw \ - 32/Makefile.mingw \ - 32/rtl/Makefile.mingw \ - 48/Makefile.mingw \ - 48/rtl/Makefile.mingw -
--- a/pidgin/pixmaps/status/Makefile.mingw Sun Nov 04 22:17:45 2007 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,14 +0,0 @@ -# -# Makefile.mingw -# -# Description: Makefile for win32 (mingw) version of Pidgin pixmaps -# - -include ./Makefile.am - -install: - if test '$(SUBDIRS)'; then \ - list='$(SUBDIRS)'; for subdir in $$list; do \ - $(MAKE) -C $$subdir -f Makefile.mingw install || exit 1; \ - done; \ - fi;
--- a/pidgin/pixmaps/toolbar/16/Makefile.am Sun Nov 04 22:17:45 2007 +0000 +++ b/pidgin/pixmaps/toolbar/16/Makefile.am Mon Nov 05 00:35:07 2007 +0000 @@ -1,5 +1,3 @@ -SUBDIRS = scalable - EXTRA_DIST = change-bgcolor.png \ change-fgcolor.png \ emote-select.png \
--- a/pidgin/pixmaps/toolbar/16/scalable/Makefile.am Sun Nov 04 22:17:45 2007 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,5 +0,0 @@ -EXTRA_DIST = change-bgcolor.svg \ - change-fgcolor.svg \ - emote-select.svg \ - font-size-down.svg \ - font-size-up.svg
--- a/pidgin/pixmaps/toolbar/22/Makefile.am Sun Nov 04 22:17:45 2007 +0000 +++ b/pidgin/pixmaps/toolbar/22/Makefile.am Mon Nov 05 00:35:07 2007 +0000 @@ -1,5 +1,3 @@ -SUBDIRS = scalable - EXTRA_DIST = select-avatar.png pidgintoolbarpixdir = $(datadir)/pixmaps/pidgin/toolbar/22
--- a/pidgin/pixmaps/toolbar/22/scalable/Makefile.am Sun Nov 04 22:17:45 2007 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,1 +0,0 @@ -EXTRA_DIST = select-avatar.svg
--- a/pidgin/pixmaps/toolbar/Makefile.am Sun Nov 04 22:17:45 2007 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,11 +0,0 @@ -SUBDIRS = 16 22 - -TINY_ICONS = 11/message-new.png -EXTRA_DIST = \ - Makefile.mingw \ - 16/Makefile.mingw \ - 22/Makefile.mingw \ - $(TINY_ICONS) - -pidgintinytoolbarpixdir = $(datadir)/pixmaps/pidgin/toolbar/11 -pidgintinytoolbarpix_DATA = $(TINY_ICONS)
--- a/pidgin/pixmaps/toolbar/Makefile.mingw Sun Nov 04 22:17:45 2007 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,14 +0,0 @@ -# -# Makefile.mingw -# -# Description: Makefile for win32 (mingw) version of Pidgin pixmaps -# - -include ./Makefile.am - -install: - if test '$(SUBDIRS)'; then \ - list='$(SUBDIRS)'; for subdir in $$list; do \ - $(MAKE) -C $$subdir -f Makefile.mingw install || exit 1; \ - done; \ - fi;
--- a/pidgin/pixmaps/tray/16/Makefile.am Sun Nov 04 22:17:45 2007 +0000 +++ b/pidgin/pixmaps/tray/16/Makefile.am Mon Nov 05 00:35:07 2007 +0000 @@ -1,5 +1,3 @@ -SUBDIRS = scalable - TRAY_ICONS = tray-away.png \ tray-busy.png \ tray-invisible.png \
--- a/pidgin/pixmaps/tray/22/Makefile.am Sun Nov 04 22:17:45 2007 +0000 +++ b/pidgin/pixmaps/tray/22/Makefile.am Mon Nov 05 00:35:07 2007 +0000 @@ -1,5 +1,3 @@ -SUBDIRS = scalable - TRAY_ICONS = tray-away.png \ tray-busy.png \ tray-connecting.png \
--- a/pidgin/pixmaps/tray/Makefile.am Sun Nov 04 22:17:45 2007 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,9 +0,0 @@ -SUBDIRS = 16 22 32 48 - -EXTRA_DIST = \ - Makefile.mingw \ - 16/Makefile.mingw \ - 22/Makefile.mingw \ - 32/Makefile.mingw \ - 48/Makefile.mingw -
--- a/pidgin/pixmaps/tray/Makefile.mingw Sun Nov 04 22:17:45 2007 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,14 +0,0 @@ -# -# Makefile.mingw -# -# Description: Makefile for win32 (mingw) version of Pidgin pixmaps -# - -include ./Makefile.am - -install: - if test '$(SUBDIRS)'; then \ - list='$(SUBDIRS)'; for subdir in $$list; do \ - $(MAKE) -C $$subdir -f Makefile.mingw install || exit 1; \ - done; \ - fi;
--- a/pidgin/win32/nsis/pidgin-installer.nsi Sun Nov 04 22:17:45 2007 +0000 +++ b/pidgin/win32/nsis/pidgin-installer.nsi Mon Nov 05 00:35:07 2007 +0000 @@ -698,6 +698,7 @@ Delete "$INSTDIR\ca-certs\Equifax_Secure_CA.pem" Delete "$INSTDIR\ca-certs\GTE_CyberTrust_Global_Root.pem" + Delete "$INSTDIR\ca-certs\Microsoft_Secure_Server_Authority.pem" Delete "$INSTDIR\ca-certs\Verisign_Class3_Extended_Validation_CA.pem" Delete "$INSTDIR\ca-certs\Verisign_Class3_Primary_CA.pem" Delete "$INSTDIR\ca-certs\Verisign_RSA_Secure_Server_CA.pem" @@ -750,6 +751,7 @@ Delete "$INSTDIR\plugins\win2ktrans.dll" Delete "$INSTDIR\plugins\winprefs.dll" RMDir "$INSTDIR\plugins" + RMDir /r "$INSTDIR\sasl2" Delete "$INSTDIR\sounds\purple\alert.wav" Delete "$INSTDIR\sounds\purple\login.wav" Delete "$INSTDIR\sounds\purple\logout.wav" @@ -757,23 +759,28 @@ Delete "$INSTDIR\sounds\purple\send.wav" RMDir "$INSTDIR\sounds\purple" RMDir "$INSTDIR\sounds" + Delete "$INSTDIR\comerr32.dll" Delete "$INSTDIR\freebl3.dll" + Delete "$INSTDIR\gssapi32.dll" Delete "$INSTDIR\idletrack.dll" + Delete "$INSTDIR\k5sprt32.dll" + Delete "$INSTDIR\krb5_32.dll" Delete "$INSTDIR\libgtkspell.dll" Delete "$INSTDIR\libjabber.dll" + Delete "$INSTDIR\libmeanwhile-1.dll" Delete "$INSTDIR\liboscar.dll" Delete "$INSTDIR\libpurple.dll" - Delete "$INSTDIR\libmeanwhile-1.dll" + Delete "$INSTDIR\libsasl.dll" + Delete "$INSTDIR\libsilc-1-1-2.dll" + Delete "$INSTDIR\libsilcclient-1-1-2.dll" Delete "$INSTDIR\libxml2.dll" Delete "$INSTDIR\nspr4.dll" Delete "$INSTDIR\nss3.dll" Delete "$INSTDIR\nssckbi.dll" + Delete "$INSTDIR\pidgin.dll" Delete "$INSTDIR\pidgin.exe" - Delete "$INSTDIR\pidgin.dll" Delete "$INSTDIR\plc4.dll" Delete "$INSTDIR\plds4.dll" - Delete "$INSTDIR\libsilc-1-1-2.dll" - Delete "$INSTDIR\libsilcclient-1-1-2.dll" Delete "$INSTDIR\smime3.dll" Delete "$INSTDIR\softokn3.dll" Delete "$INSTDIR\ssl3.dll"
--- a/po/mk.po Sun Nov 04 22:17:45 2007 +0000 +++ b/po/mk.po Mon Nov 05 00:35:07 2007 +0000 @@ -11,7 +11,7 @@ "Project-Id-Version: mk\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2007-09-28 15:32-0500\n" -"PO-Revision-Date: 2007-09-09 21:21+0200\n" +"PO-Revision-Date: 2007-11-03 22:57+0100\n" "Last-Translator: Arangel Angov <arangel@linux.net.mk>\n" "Language-Team: Macedonian <ossm-members@hedona.on.net.mk>\n" "MIME-Version: 1.0\n" @@ -484,8 +484,7 @@ #: ../finch/gntblist.c:1079 msgid "Removing this contact will also remove all the buddies in the contact" -msgstr "" -"�����舒仆�于舒�亠 仆舒 仂于仂� 从仂仆�舒从� �亠 亞亳 仂����舒仆亳 亳 亟��亞亳�亠 仗�亳�舒�亠仍亳 于仂 从仂仆�舒从�仂�" +msgstr "�����舒仆�于舒�亠 仆舒 仂于仂� 从仂仆�舒从� �亠 亞亳 仂����舒仆亳 亳 亟��亞亳�亠 仗�亳�舒�亠仍亳 于仂 从仂仆�舒从�仂�" #: ../finch/gntblist.c:1087 msgid "Removing this group will also remove all the buddies in the group" @@ -623,8 +622,7 @@ msgstr "�仂于舒 亳仆��舒仆� 仗仂�舒从舒" #: ../finch/gntblist.c:2218 ../pidgin/gtkdialogs.c:769 -msgid "" -"Please enter the screen name or alias of the person you would like to IM." +msgid "Please enter the screen name or alias of the person you would like to IM." msgstr "" "�仆亠�亠�亠 亞仂 亳仄亠�仂 亳仍亳 舒仍亳�舒�仂� 仆舒 仗�亳�舒�亠仍仂� 仆舒 从仂� ��仂 �舒从舒�亠 亟舒 仄� " "亳�仗�舒�亳�亠 仗仂�舒从舒." @@ -676,12 +674,10 @@ msgstr "��仗�舒�亳 ��..." #: ../finch/gntblist.c:2251 -#, fuzzy msgid "Show empty groups" msgstr "�仂从舒亢亳 仗�舒亰仆亳 亞��仗亳" #: ../finch/gntblist.c:2257 -#, fuzzy msgid "Show offline buddies" msgstr "�仂从舒亢亳 亳�从仍��亠仆亳 仗�亳�舒�亠仍亳" @@ -698,17 +694,16 @@ msgstr "�仂亟�亠亟亳 仗仂 亞仂仍亠仄亳仆舒 仆舒 仍仂亞" #: ../finch/gntcertmgr.c:86 ../pidgin/gtkcertmgr.c:188 -#, fuzzy msgid "Certificate Import" -msgstr "�仂�� 亰舒 仗仂于�亰�于舒�亠" +msgstr "丕于仂亰 仆舒 �亠��亳�亳从舒�" #: ../finch/gntcertmgr.c:87 ../pidgin/gtkcertmgr.c:189 msgid "Specify a hostname" -msgstr "" +msgstr "�亟�亠亟亠�亠 亳仄亠 仆舒 �仂��" #: ../finch/gntcertmgr.c:88 ../pidgin/gtkcertmgr.c:190 msgid "Type the host name this certificate is for." -msgstr "" +msgstr "�仆亠�亠�亠 亳仄亠 仆舒 �仂�� 亰舒 �亠��亳�亳从舒�仂�." #: ../finch/gntcertmgr.c:97 ../pidgin/gtkcertmgr.c:210 #, c-format @@ -716,19 +711,20 @@ "File %s could not be imported.\n" "Make sure that the file is readable and in PEM format.\n" msgstr "" +"�舒�仂�亠从舒�舒 %s 仆亠 仄仂亢亠 亟舒 弍亳亟亠 �于亠亰亠仆舒.\n" +"��亳亞��舒��亠 �亠 亟亠从舒 亟舒�仂�亠从舒�舒 亠 �亳�仍亳于舒 于仂 PEM �仂�仄舒�.\n" #: ../finch/gntcertmgr.c:99 ../pidgin/gtkcertmgr.c:212 msgid "Certificate Import Error" -msgstr "" +msgstr "��亠�从舒 仗�亳 �于仂亰 仆舒 �亠��亳�亳从舒�仂�" #: ../finch/gntcertmgr.c:100 ../pidgin/gtkcertmgr.c:213 msgid "X.509 certificate import failed" -msgstr "" +msgstr "丕于仂亰仂� 仆舒 X.509 �亠��亳�亳从舒�仂� 仆亠 ��仗亠舒" #: ../finch/gntcertmgr.c:110 ../pidgin/gtkcertmgr.c:224 -#, fuzzy msgid "Select a PEM certificate" -msgstr "�亰弍亠�亠�亠 亟舒�仂�亠从舒" +msgstr "�亰弍亠�亠�亠 PEM �亠��亳�亳从舒�" #: ../finch/gntcertmgr.c:127 ../pidgin/gtkcertmgr.c:245 #, c-format @@ -739,20 +735,20 @@ #: ../finch/gntcertmgr.c:129 ../pidgin/gtkcertmgr.c:247 msgid "Certificate Export Error" -msgstr "" +msgstr "��亠�从舒 仗�亳 亳亰于仂亰 仆舒 �亠��亳�亳从舒�仂�" #: ../finch/gntcertmgr.c:130 ../pidgin/gtkcertmgr.c:248 msgid "X.509 certificate export failed" -msgstr "" +msgstr "�亠 ��仗亠舒 亳亰于仂亰仂� 仆舒 X.509 �亠��亳�亳从舒�仂�" #: ../finch/gntcertmgr.c:159 ../pidgin/gtkcertmgr.c:299 msgid "PEM X.509 Certificate Export" -msgstr "" +msgstr "�亰于仂亰 仆舒 �亠��亳�亳从舒� PEM X.509" #: ../finch/gntcertmgr.c:188 -#, fuzzy, c-format +#, c-format msgid "Certificate for %s" -msgstr "弌�舒��� 亰舒 %s" +msgstr "弌亠��亳�亳从舒� 亰舒 %s" #: ../finch/gntcertmgr.c:195 #, c-format @@ -762,23 +758,27 @@ "SHA1 fingerprint:\n" "%s" msgstr "" +"Common name: %s\n" +"\n" +"SHA1 fingerprint:\n" +"%s" #: ../finch/gntcertmgr.c:198 msgid "SSL Host Certificate" -msgstr "" +msgstr "SSL �仂�� �亠��亳�亳从舒�" #: ../finch/gntcertmgr.c:233 ../pidgin/gtkcertmgr.c:372 #, c-format msgid "Really delete certificate for %s?" -msgstr "" +msgstr "弌�于舒�仆仂 亟舒 亞仂 亳亰弍�亳�舒仆仄 �亠��亳�亳从舒�仂� 亰舒 %s?" #: ../finch/gntcertmgr.c:236 ../pidgin/gtkcertmgr.c:374 msgid "Confirm certificate delete" -msgstr "" +msgstr "�仂�于�亟舒 亰舒 弍�亳�亠�亠 仆舒 �亠��亳�亳从舒�仂�" #: ../finch/gntcertmgr.c:293 ../pidgin/gtkcertmgr.c:602 msgid "Certificate Manager" -msgstr "" +msgstr "�亠仆舒�亠� 亰舒 �亠��亳�亳从舒�亳" #. Creating the user splits #: ../finch/gntcertmgr.c:298 ../libpurple/protocols/bonjour/bonjour.c:652 @@ -835,8 +835,7 @@ #: ../finch/gntconv.c:143 ../pidgin/gtkconv.c:489 msgid "Syntax Error: You typed the wrong number of arguments to that command." -msgstr "" -"��亠�从舒 于仂 �亳仆�舒从�舒�舒: �仆亠�仂于�亠 仗仂亞�亠�亠仆 弍�仂� 仆舒 舒�亞�仄亠仆�亳 亰舒 �舒舒 从仂仄舒仆亟舒." +msgstr "��亠�从舒 于仂 �亳仆�舒从�舒�舒: �仆亠�仂于�亠 仗仂亞�亠�亠仆 弍�仂� 仆舒 舒�亞�仄亠仆�亳 亰舒 �舒舒 从仂仄舒仆亟舒." #: ../finch/gntconv.c:148 ../pidgin/gtkconv.c:495 msgid "Your command failed for an unknown reason." @@ -855,9 +854,8 @@ msgstr "�于舒舒 从仂仄舒仆亟舒 仆亠 �舒弍仂�亳 �仂 仂于仂� 仗�仂�仂从仂仍." #: ../finch/gntconv.c:168 -#, fuzzy msgid "Message was not sent, because you are not signed on." -msgstr "�仂�舒从舒�舒 仆亠 仄仂亢亠 亟舒 �亠 亳�仗�舒�亳 弍亳亟亠��亳 仗�舒�舒�亠 仗�亠仄仆仂亞� 弍�亰仂:" +msgstr "�仂�舒从舒�舒 仆亠 仄仂亢亠 亟舒 �亠 亳�仗�舒�亳 弍亳亟亠��亳 仆亠 ��亠 仆舒�舒于亠仆亳." #: ../finch/gntconv.c:251 #, c-format @@ -887,10 +885,8 @@ msgstr "�仂亞亳�舒�亠�仂 亰舒仗仂�仆舒. �亟仆亳�亠 仗仂�舒从亳 于仂 仂于仂� �舒亰亞仂于仂� �亠 弍亳亟舒� 仍仂亞亳�舒仆亳." #: ../finch/gntconv.c:393 ../pidgin/gtkconv.c:1370 -msgid "" -"Logging stopped. Future messages in this conversation will not be logged." -msgstr "" -"�仂亞亳�舒�亠�仂 亠 亰舒仗�亠仆仂. �亟仆亳�亠 仗仂�舒从亳 于仂 仂于仂� �舒亰亞仂于仂� 仆亠仄舒 亟舒 弍亳亟舒� 仍仂亞亳�舒仆亳." +msgid "Logging stopped. Future messages in this conversation will not be logged." +msgstr "�仂亞亳�舒�亠�仂 亠 亰舒仗�亠仆仂. �亟仆亳�亠 仗仂�舒从亳 于仂 仂于仂� �舒亰亞仂于仂� 仆亠仄舒 亟舒 弍亳亟舒� 仍仂亞亳�舒仆亳." #: ../finch/gntconv.c:442 msgid "Send To" @@ -913,14 +909,12 @@ msgstr "�仂亟舒� 亟亠���于仂 亰舒 仗�亳�舒�亠仍..." #: ../finch/gntconv.c:527 -#, fuzzy msgid "Enable Logging" -msgstr "/�仗�亳亳/�于仂亰仄仂亢亳 仍仂亞亳�舒�亠" +msgstr "�从仍��亳 仍仂亞亳�舒�亠" #: ../finch/gntconv.c:533 -#, fuzzy msgid "Enable Sounds" -msgstr "�从仍��亳 亰于��亳:" +msgstr "�从仍��亳 亰于��亳" #: ../finch/gntconv.c:739 msgid "<AUTO-REPLY> " @@ -1113,7 +1107,7 @@ #: ../finch/gntft.c:431 #, c-format msgid "The file was saved as %s." -msgstr "" +msgstr "�舒�仂�亠从舒�舒 亠 亰舒��于舒仆舒 从舒从仂 %s." #: ../finch/gntft.c:432 ../finch/gntft.c:433 ../pidgin/gtkft.c:163 #: ../pidgin/gtkft.c:1116 @@ -1341,18 +1335,16 @@ msgstr "�亟 于�亠仄亠 仆舒 于�亠仄亠" #: ../finch/gntpounce.c:618 -#, fuzzy msgid "Cannot create pounce" -msgstr "�亠 仄仂亢舒仄 亟舒 亞仂 仗�仂仄亠仆舒仄 仗�亠从舒�仂�" +msgstr "�亠 仄仂亢舒仄 亟舒 从�亠亳�舒仄 亟亠���于仂" #: ../finch/gntpounce.c:619 -#, fuzzy msgid "You do not have any accounts." -msgstr "�仂�舒 亟舒 仂亟�亠亟亳�亠 �仄亠�从舒." +msgstr "�亠仄舒�亠 仆亳亠亟仆舒 �仄亠�从舒." #: ../finch/gntpounce.c:620 msgid "You must create an account first before you can create a pounce." -msgstr "" +msgstr "�仂�舒 亟舒 从�亠亳�舒�亠 �仄亠�从舒 仗�亠亟 亟舒 从�亠亳�舒�亠 亟亠���于仂." #: ../finch/gntpounce.c:662 ../pidgin/gtkpounce.c:1096 #, c-format @@ -1771,7 +1763,7 @@ #: ../finch/gntui.c:85 msgid "Certificates" -msgstr "" +msgstr "弌亠��亳�亳从舒�亳" #: ../finch/gntui.c:89 ../pidgin/gtkprefs.c:2035 msgid "Sounds" @@ -1783,23 +1775,20 @@ #: ../finch/plugins/gntclipboard.c:115 ../finch/plugins/gntclipboard.c:121 #: ../finch/plugins/gntclipboard.c:128 -#, fuzzy msgid "Error loading the plugin." -msgstr "弌亠 仗仂�舒于亳�舒 亞�亠�从亳 仗�亳 于舒亟亠�亠 仆舒 亟仂亟舒�仂从仂�." +msgstr "��亠�从舒 仗�亳 于�亳��于舒�亠 仆舒 亟仂亟舒�仂从仂�." #: ../finch/plugins/gntclipboard.c:116 -#, fuzzy msgid "Couldn't find X display" -msgstr "�亠 仄仂亢舒仄 亟舒 �舒 仂�于仂�舒仄 亟舒�仂�亠从舒�舒" +msgstr "�亠 仄仂亢舒仄 亟舒 亞仂 仆舒�亟舒仄 X 仗�亳从舒亰仂�" #: ../finch/plugins/gntclipboard.c:122 -#, fuzzy msgid "Couldn't find window" -msgstr "�亠 仄仂亢舒仄 亟舒 �舒 仂�于仂�舒仄 亟舒�仂�亠从舒�舒" +msgstr "�亠 仄仂亢舒仄 亟舒 亞仂 仆舒�亟舒仄 仗�仂亰仂�亠�仂�" #: ../finch/plugins/gntclipboard.c:129 msgid "This plugin cannot be loaded because it was not built with X11 support." -msgstr "" +msgstr "�仂亟舒�仂从仂� 仆亠 仄仂亢亠 亟舒 弍亳亟亠 于�亳�舒仆 仗仂�舒亟亳 �仂舒 ��仂 仆亠 亠 亳亰弍亳仍亟舒仆 �仂 仗仂亟��从舒 X11." #: ../finch/plugins/gntclipboard.c:158 msgid "GntClipboard" @@ -2026,7 +2015,7 @@ #: ../libpurple/certificate.c:545 msgid "(DOES NOT MATCH)" -msgstr "" +msgstr "(�� 弌� 弌������)" #. Make messages #: ../libpurple/certificate.c:549 @@ -2060,20 +2049,19 @@ #. Make messages #: ../libpurple/certificate.c:1171 -#, fuzzy, c-format +#, c-format msgid "Accept certificate for %s?" -msgstr "��亳�舒�亳 �舒 仗仂从舒仆舒�舒 亰舒 �舒亰亞仂于仂�?" +msgstr "��亳�舒�亳 �亠��亳�亳从舒� 亰舒 %s?" #. TODO: Find what the handle ought to be #: ../libpurple/certificate.c:1177 msgid "SSL Certificate Verification" -msgstr "" +msgstr "��仂于亠�从舒 仆舒 SSL �亠��亳�亳从舒�" #. Number of actions #: ../libpurple/certificate.c:1186 -#, fuzzy msgid "Accept" -msgstr "_��亳�舒�亳" +msgstr "��亳�舒�亳" #: ../libpurple/certificate.c:1187 ../libpurple/protocols/qq/buddy_opt.c:214 #: ../libpurple/protocols/qq/group_im.c:144 @@ -2085,7 +2073,7 @@ #: ../libpurple/certificate.c:1188 msgid "_View Certificate..." -msgstr "" +msgstr "_�亳亟亳 �亠��亳�亳从舒�..." #. Prompt the user to authenticate the certificate #. TODO: Provide the user with more guidance about why he is @@ -2118,14 +2106,12 @@ #. TODO: Probably wrong. #. TODO: Probably wrong #: ../libpurple/certificate.c:1339 ../libpurple/certificate.c:1416 -#, fuzzy msgid "SSL Certificate Error" -msgstr "��亠�从舒 于仂 亰舒仗亳��于舒�亠�仂" +msgstr "��亠�从舒 于仂 SSL �亠��亳�亳从舒�仂�" #: ../libpurple/certificate.c:1340 -#, fuzzy msgid "Invalid certificate chain" -msgstr "�亠于舒仍亳亟亠仆 仆舒�仍仂于" +msgstr "�亠于舒仍亳亟亠仆 �亳仆�亳� 仆舒 �亠��亳�亳从舒�亳" #. vrq will be completed by user_auth #: ../libpurple/certificate.c:1360 @@ -2136,8 +2122,7 @@ #. vrq will be completed by user_auth #: ../libpurple/certificate.c:1382 -msgid "" -"The root certificate this one claims to be issued by is unknown to Pidgin." +msgid "The root certificate this one claims to be issued by is unknown to Pidgin." msgstr "" #: ../libpurple/certificate.c:1408 @@ -2166,18 +2151,16 @@ #. TODO: Find what the handle ought to be #: ../libpurple/certificate.c:1890 -#, fuzzy msgid "Certificate Information" -msgstr "�仆�仂�仄舒�亳亳 亰舒 �亠�于亠�仂�" +msgstr "�仆�仂�仄舒�亳亳 亰舒 �亠��亳�亳从舒�仂�" #: ../libpurple/connection.c:107 msgid "Registration Error" msgstr "��亠�从舒 于仂 �亠亞亳���舒�亳�舒�舒" #: ../libpurple/connection.c:180 -#, fuzzy msgid "Unregistration Error" -msgstr "��亠�从舒 于仂 �亠亞亳���舒�亳�舒�舒" +msgstr "��亠�从舒 仗�亳 亟亠�亠亞亠���舒�亳�舒" #: ../libpurple/connection.c:350 #, c-format @@ -2269,8 +2252,7 @@ #: ../libpurple/dbus-server.h:85 msgid "Purple's D-BUS server is not running for the reason listed below" -msgstr "" -"D-BUS �亠�于亠�仂� 仆舒 Purple 仆亠 �亠 亳亰于���于舒 仗仂�舒亟亳 仗�亳�亳仆亳�亠 仆舒于亠亟亠仆亳 仗仂亟仂仍�" +msgstr "D-BUS �亠�于亠�仂� 仆舒 Purple 仆亠 �亠 亳亰于���于舒 仗仂�舒亟亳 仗�亳�亳仆亳�亠 仆舒于亠亟亠仆亳 仗仂亟仂仍�" #: ../libpurple/desktopitem.c:287 ../libpurple/desktopitem.c:878 msgid "No name" @@ -2462,38 +2444,31 @@ #: ../libpurple/gconf/purple.schemas.in.h:3 msgid "The command used to handle \"gg\" URLs, if enabled." -msgstr "" -"�仂仄舒仆亟舒�舒 从仂�舒 �亠 从仂�亳��亳 亰舒 �仗�舒于�于舒�亠 �仂 ��gg�� URL, 舒从仂 �仂舒 亠 仂于仂亰仄仂亢亠仆仂." +msgstr "�仂仄舒仆亟舒�舒 从仂�舒 �亠 从仂�亳��亳 亰舒 �仗�舒于�于舒�亠 �仂 ��gg�� URL, 舒从仂 �仂舒 亠 仂于仂亰仄仂亢亠仆仂." #: ../libpurple/gconf/purple.schemas.in.h:4 msgid "The command used to handle \"icq\" URLs, if enabled." -msgstr "" -"�仂仄舒仆亟舒�舒 从仂�舒 �亠 从仂�亳��亳 亰舒 �仗�舒于�于舒�亠 �仂 ��icq�� URL, 舒从仂 �仂舒 亠 仂于仂亰仄仂亢亠仆仂." +msgstr "�仂仄舒仆亟舒�舒 从仂�舒 �亠 从仂�亳��亳 亰舒 �仗�舒于�于舒�亠 �仂 ��icq�� URL, 舒从仂 �仂舒 亠 仂于仂亰仄仂亢亠仆仂." #: ../libpurple/gconf/purple.schemas.in.h:5 msgid "The command used to handle \"irc\" URLs, if enabled." -msgstr "" -"�仂仄舒仆亟舒�舒 从仂�舒 �亠 从仂�亳��亳 亰舒 �仗�舒于�于舒�亠 �仂 ��irc�� URL, 舒从仂 �仂舒 亠 仂于仂亰仄仂亢亠仆仂." +msgstr "�仂仄舒仆亟舒�舒 从仂�舒 �亠 从仂�亳��亳 亰舒 �仗�舒于�于舒�亠 �仂 ��irc�� URL, 舒从仂 �仂舒 亠 仂于仂亰仄仂亢亠仆仂." #: ../libpurple/gconf/purple.schemas.in.h:6 msgid "The command used to handle \"msnim\" URLs, if enabled." -msgstr "" -"�仂仄舒仆亟舒�舒 从仂�舒 �亠 从仂�亳��亳 亰舒 �仗�舒于�于舒�亠 �仂 ��msnim�� URL, 舒从仂 �仂舒 亠 仂于仂亰仄仂亢亠仆仂." +msgstr "�仂仄舒仆亟舒�舒 从仂�舒 �亠 从仂�亳��亳 亰舒 �仗�舒于�于舒�亠 �仂 ��msnim�� URL, 舒从仂 �仂舒 亠 仂于仂亰仄仂亢亠仆仂." #: ../libpurple/gconf/purple.schemas.in.h:7 msgid "The command used to handle \"sip\" URLs, if enabled." -msgstr "" -"�仂仄舒仆亟舒�舒 从仂�舒 �亠 从仂�亳��亳 亰舒 �仗�舒于�于舒�亠 �仂 ��sip�� URL, 舒从仂 �仂舒 亠 仂于仂亰仄仂亢亠仆仂." +msgstr "�仂仄舒仆亟舒�舒 从仂�舒 �亠 从仂�亳��亳 亰舒 �仗�舒于�于舒�亠 �仂 ��sip�� URL, 舒从仂 �仂舒 亠 仂于仂亰仄仂亢亠仆仂." #: ../libpurple/gconf/purple.schemas.in.h:8 msgid "The command used to handle \"xmpp\" URLs, if enabled." -msgstr "" -"�仂仄舒仆亟舒�舒 从仂�舒 �亠 从仂�亳��亳 亰舒 �仗�舒于�于舒�亠 �仂 ��xmpp�� URL, 舒从仂 �仂舒 亠 仂于仂亰仄仂亢亠仆仂." +msgstr "�仂仄舒仆亟舒�舒 从仂�舒 �亠 从仂�亳��亳 亰舒 �仗�舒于�于舒�亠 �仂 ��xmpp�� URL, 舒从仂 �仂舒 亠 仂于仂亰仄仂亢亠仆仂." #: ../libpurple/gconf/purple.schemas.in.h:9 msgid "The command used to handle \"ymsgr\" URLs, if enabled." -msgstr "" -"�仂仄舒仆亟舒�舒 从仂�舒 �亠 从仂�亳��亳 亰舒 �仗�舒于�于舒�亠 �仂 ��ymsgr�� URL, 舒从仂 �仂舒 亠 仂于仂亰仄仂亢亠仆仂." +msgstr "�仂仄舒仆亟舒�舒 从仂�舒 �亠 从仂�亳��亳 亰舒 �仗�舒于�于舒�亠 �仂 ��ymsgr�� URL, 舒从仂 �仂舒 亠 仂于仂亰仄仂亢亠仆仂." #: ../libpurple/gconf/purple.schemas.in.h:10 msgid "The handler for \"aim\" URLs" @@ -2675,8 +2650,7 @@ #: ../libpurple/log.c:1426 ../libpurple/log.c:1559 msgid "<font color=\"red\"><b>Unable to find log path!</b></font>" -msgstr "" -"<font color=\"red\"><b>�亠 仄仂亢舒仄 亟舒 �舒 仆舒�亟舒仄 仗舒�亠从舒�舒 仆舒 仍仂亞仂�!</b></font>" +msgstr "<font color=\"red\"><b>�亠 仄仂亢舒仄 亟舒 �舒 仆舒�亟舒仄 仗舒�亠从舒�舒 仆舒 仍仂亞仂�!</b></font>" #: ../libpurple/log.c:1438 ../libpurple/log.c:1568 #, c-format @@ -2754,8 +2728,7 @@ #: ../libpurple/plugins/autoaccept.c:80 #, c-format msgid "Autoaccepted file transfer of \"%s\" from \"%s\" completed." -msgstr "" -"�于�仂仄舒��从亳 仗�亳�舒�亠仆亳仂� 仗�亠仆仂� 仆舒 亟舒�仂�亠从亳 仆舒 \"%s\" 仂亟 \"%s\" 亠 亰舒于��亠仆." +msgstr "�于�仂仄舒��从亳 仗�亳�舒�亠仆亳仂� 仗�亠仆仂� 仆舒 亟舒�仂�亠从亳 仆舒 \"%s\" 仂亟 \"%s\" 亠 亰舒于��亠仆." #: ../libpurple/plugins/autoaccept.c:82 msgid "Autoaccept complete" @@ -3090,8 +3063,7 @@ #: ../libpurple/plugins/log_reader.c:1643 msgid "Message could not be sent because the maximum length was exceeded." -msgstr "" -"�仂�舒从舒�舒 仆亠 仄仂亢亠 亟舒 �亠 亳�仗�舒�亳 弍亳亟亠��亳 亠 仆舒亟仄亳仆舒�舒 仄舒从�亳仄舒仍仆舒�舒 亟仂仍亢亳仆舒." +msgstr "�仂�舒从舒�舒 仆亠 仄仂亢亠 亟舒 �亠 亳�仗�舒�亳 弍亳亟亠��亳 亠 仆舒亟仄亳仆舒�舒 仄舒从�亳仄舒仍仆舒�舒 亟仂仍亢亳仆舒." #: ../libpurple/plugins/log_reader.c:1648 msgid "Message could not be sent." @@ -3241,8 +3213,7 @@ #: ../libpurple/plugins/offlinemsg.c:25 ../libpurple/plugins/offlinemsg.c:26 msgid "Save messages sent to an offline user as pounce." -msgstr "" -"�舒��于舒� 亞亳 仗仂�舒从亳�亠 亳�仗�舒�亠仆亳 亟仂 仂�仍舒�仆 从仂�亳�仆亳�亳�亠 从舒从仂 亟亠���于仂 亰舒 仗�亳�舒�亠仍." +msgstr "�舒��于舒� 亞亳 仗仂�舒从亳�亠 亳�仗�舒�亠仆亳 亟仂 仂�仍舒�仆 从仂�亳�仆亳�亳�亠 从舒从仂 亟亠���于仂 亰舒 仗�亳�舒�亠仍." #: ../libpurple/plugins/offlinemsg.c:95 msgid "" @@ -3267,8 +3238,7 @@ #: ../libpurple/plugins/offlinemsg.c:161 msgid "You can edit/delete the pounce from the `Buddy Pounces' dialog" -msgstr "" -"�仂亢亠�亠 亟舒 亞仂 ��亠亟�于舒�亠/弍�亳�亠�亠 亟亠���于仂�仂 仂亟 亟亳�舒仍仂亞仂� ���亠���于舒 亰舒 仗�亳�舒�亠仍亳��" +msgstr "�仂亢亠�亠 亟舒 亞仂 ��亠亟�于舒�亠/弍�亳�亠�亠 亟亠���于仂�仂 仂亟 亟亳�舒仍仂亞仂� ���亠���于舒 亰舒 仗�亳�舒�亠仍亳��" #: ../libpurple/plugins/offlinemsg.c:165 #: ../libpurple/protocols/msn/dialog.c:133 @@ -3540,10 +3510,8 @@ msgstr "�亠 仄仂亢舒仄 亟舒 �仍��舒仄 亰舒 亟仂舒�舒�从亳 于��从亳\n" #: ../libpurple/protocols/bonjour/bonjour.c:137 -msgid "" -"Unable to establish connection with the local mDNS server. Is it running?" -msgstr "" -"�亠 仄仂亢舒仄 亟舒 于仂�仗仂��舒于舒仄 于��从舒 �仂 仍仂从舒仍仆亳仂� mDNS �亠�于亠�. �舒仍亳 �亠 亳亰于���于舒?" +msgid "Unable to establish connection with the local mDNS server. Is it running?" +msgstr "�亠 仄仂亢舒仄 亟舒 于仂�仗仂��舒于舒仄 于��从舒 �仂 仍仂从舒仍仆亳仂� mDNS �亠�于亠�. �舒仍亳 �亠 亳亰于���于舒?" #. Creating the options for the protocol #: ../libpurple/protocols/bonjour/bonjour.c:351 @@ -3671,8 +3639,7 @@ #: ../libpurple/protocols/gg/gg.c:270 msgid "Your buddylist is empty, nothing was written to the file." -msgstr "" -"�舒�舒�舒 仍亳��舒 �仂 仗�亳�舒�亠仍亳 亠 仗�舒亰仆舒, 仗舒 仆亳��仂 仆亠 �亠 亰舒仗亳�舒 于仂 亟舒�仂�亠从舒�舒." +msgstr "�舒�舒�舒 仍亳��舒 �仂 仗�亳�舒�亠仍亳 亠 仗�舒亰仆舒, 仗舒 仆亳��仂 仆亠 �亠 亰舒仗亳�舒 于仂 亟舒�仂�亠从舒�舒." #: ../libpurple/protocols/gg/gg.c:276 ../libpurple/protocols/gg/gg.c:278 msgid "Couldn't open file" @@ -4632,8 +4599,7 @@ #: ../libpurple/protocols/irc/parse.c:150 msgid "umode <+|-><A-Za-z>: Set or unset a user mode." -msgstr "" -"umode <+|-><A-Za-z>: �仂��舒于亳 亞仂 亳仍亳 ��亞仆亳 亞仂 从仂�亳�仆亳�从亳仂� �亠亢亳仄." +msgstr "umode <+|-><A-Za-z>: �仂��舒于亳 亞仂 亳仍亳 ��亞仆亳 亞仂 从仂�亳�仆亳�从亳仂� �亠亢亳仄." #: ../libpurple/protocols/irc/parse.c:151 msgid "version [nick]: send CTCP VERSION request to a user" @@ -4661,8 +4627,7 @@ #: ../libpurple/protocols/irc/parse.c:155 msgid "whowas <nick>: Get information on a user that has logged off." -msgstr "" -"whowas <nick>: �仂弍亳��亠 亳仆�仂�仄舒�亳亳 亰舒 从仂�亳�仆亳从 从仂� ��仂 �亠 仂亟�舒于亳仍." +msgstr "whowas <nick>: �仂弍亳��亠 亳仆�仂�仄舒�亳亳 亰舒 从仂�亳�仆亳从 从仂� ��仂 �亠 仂亟�舒于亳仍." #: ../libpurple/protocols/irc/parse.c:465 #, c-format @@ -4693,14 +4658,12 @@ #: ../libpurple/protocols/jabber/adhoccommands.c:139 #: ../libpurple/protocols/jabber/adhoccommands.c:140 -#, fuzzy msgid "Ad-Hoc Command Failed" -msgstr "�仂仄舒仆亟舒�舒 亠 亳�从仍��亠仆舒" +msgstr "�亟-�仂从 从仂仄舒仆亟舒�舒 仆亠 ��仗亠舒" #: ../libpurple/protocols/jabber/adhoccommands.c:173 -#, fuzzy msgid "execute" -msgstr "�亠 亠 仂�亠从�于舒仆仂" +msgstr "亳亰于��亳" #: ../libpurple/protocols/jabber/auth.c:53 msgid "Server requires TLS/SSL for login. No TLS/SSL support found." @@ -4708,8 +4671,7 @@ #: ../libpurple/protocols/jabber/auth.c:116 msgid "Server requires plaintext authentication over an unencrypted stream" -msgstr "" -"弌亠�于亠�仂� 弍舒�舒 仗�仂于亠�从舒 仆舒 舒于�亠仆�亳�仆仂�� �仂 �亳�� �亠从�� 仗�亠从� 仆亠亠仆从�亳仗�亳�舒仆 �亠从" +msgstr "弌亠�于亠�仂� 弍舒�舒 仗�仂于亠�从舒 仆舒 舒于�亠仆�亳�仆仂�� �仂 �亳�� �亠从�� 仗�亠从� 仆亠亠仆从�亳仗�亳�舒仆 �亠从" #: ../libpurple/protocols/jabber/auth.c:319 #: ../libpurple/protocols/jabber/auth.c:508 @@ -4883,13 +4845,12 @@ #: ../libpurple/protocols/jabber/buddy.c:815 #: ../libpurple/protocols/jabber/buddy.c:975 msgid "Last Activity" -msgstr "" +msgstr "�仂�仍亠亟仆舒 舒从�亳于仆仂��" #: ../libpurple/protocols/jabber/buddy.c:817 #: ../libpurple/protocols/jabber/buddy.c:977 -#, fuzzy msgid "Service Discovery Info" -msgstr "�仂��舒于亳 亳仆�仂�仄舒�亳亳 亰舒 亟亳�亠从�仂�亳�仄仂�" +msgstr "�仆�仂�仄舒�亳亳 亰舒 仂�从�亳于舒�亠 仆舒 �亠�于亳�亳" #: ../libpurple/protocols/jabber/buddy.c:819 #: ../libpurple/protocols/jabber/buddy.c:979 @@ -4898,21 +4859,18 @@ #: ../libpurple/protocols/jabber/buddy.c:821 #: ../libpurple/protocols/jabber/buddy.c:981 -#, fuzzy msgid "Extended Stanza Addressing" -msgstr "��仂�亳�亠仆舒 舒亟�亠�舒" +msgstr "��仂�亳�亠仆舒 stanza 舒亟�亠�舒" #: ../libpurple/protocols/jabber/buddy.c:823 #: ../libpurple/protocols/jabber/buddy.c:983 -#, fuzzy msgid "Multi-User Chat" -msgstr "�仍亳�舒� �舒亰亞仂于仂�" +msgstr "��仍�亳-从仂�亳�仆亳�从亳 �舒亰亞仂于仂�" #: ../libpurple/protocols/jabber/buddy.c:825 #: ../libpurple/protocols/jabber/buddy.c:985 -#, fuzzy msgid "Multi-User Chat Extended Presence Information" -msgstr "�仂�亳�仆亳从仂� 仆亠仄舒 亳仆�仂�仄舒�亳亳 亰舒 亟亳�亠从�仂�亳�仄仂�." +msgstr "�仆�仂�仄舒�亳亳 亰舒 仗�仂亟仂仍亠亢仆仂 仗�亳����于仂 亰舒 仄�仍�亳-从仂�亳�仆亳�从亳 �舒亰亞仂于仂�" #: ../libpurple/protocols/jabber/buddy.c:827 #: ../libpurple/protocols/jabber/buddy.c:987 @@ -4921,9 +4879,8 @@ #: ../libpurple/protocols/jabber/buddy.c:829 #: ../libpurple/protocols/jabber/buddy.c:989 -#, fuzzy msgid "Ad-Hoc Commands" -msgstr "�仂仄舒仆亟舒" +msgstr "�亟-�仂从 从仂仄舒仆亟亳" #: ../libpurple/protocols/jabber/buddy.c:831 #: ../libpurple/protocols/jabber/buddy.c:991 @@ -4942,45 +4899,38 @@ #: ../libpurple/protocols/jabber/buddy.c:837 #: ../libpurple/protocols/jabber/buddy.c:997 -#, fuzzy msgid "XHTML-IM" -msgstr "HTML" +msgstr "XHTML-IM" #: ../libpurple/protocols/jabber/buddy.c:839 #: ../libpurple/protocols/jabber/buddy.c:999 -#, fuzzy msgid "In-Band Registration" msgstr "��亠�从舒 于仂 �亠亞亳���舒�亳�舒�舒" #: ../libpurple/protocols/jabber/buddy.c:841 #: ../libpurple/protocols/jabber/buddy.c:1001 -#, fuzzy msgid "User Location" -msgstr "�仂从舒�亳�舒" +msgstr "�仂从舒�亳�舒 仆舒 从仂�亳�仆亳从仂�" #: ../libpurple/protocols/jabber/buddy.c:843 #: ../libpurple/protocols/jabber/buddy.c:1003 -#, fuzzy msgid "User Avatar" -msgstr "��亠弍舒��于舒�亠 仆舒 从仂�亳�仆亳�亳" +msgstr "�于舒�舒� 仆舒 从仂�亳�仆亳从仂�" #: ../libpurple/protocols/jabber/buddy.c:845 #: ../libpurple/protocols/jabber/buddy.c:1005 -#, fuzzy msgid "Chat State Notifications" -msgstr "�亰于亠���于舒�亠 亰舒 �仂��仂�弍舒�舒 仆舒 仗�亳�舒�亠仍仂�" +msgstr "�亰于亠���于舒�亠 亰舒 �仂��仂�弍舒�舒 仆舒 �舒亰亞仂于仂�仂�" #: ../libpurple/protocols/jabber/buddy.c:847 #: ../libpurple/protocols/jabber/buddy.c:1007 -#, fuzzy msgid "Software Version" -msgstr "�亠仗仂亟亟�亢舒仆舒 于亠�亰亳�舒" +msgstr "�亠�亰亳�舒 仆舒 �仂��于亠�仂�" #: ../libpurple/protocols/jabber/buddy.c:849 #: ../libpurple/protocols/jabber/buddy.c:1009 -#, fuzzy msgid "Stream Initiation" -msgstr "��亳亠仆�舒�亳�舒" +msgstr "�仆亳�亳�舒�亠 仆舒 ���亳仄仂�" #: ../libpurple/protocols/jabber/buddy.c:851 #: ../libpurple/protocols/jabber/buddy.c:1011 @@ -4990,21 +4940,18 @@ #: ../libpurple/protocols/jabber/buddy.c:853 #: ../libpurple/protocols/jabber/buddy.c:1013 -#, fuzzy msgid "User Mood" -msgstr "�仂�亳�仆亳�从亳 �亠亢亳仄亳" +msgstr "�舒�仗仂仍仂亢亠仆亳亠 仆舒 从仂�亳�仆亳从仂�" #: ../libpurple/protocols/jabber/buddy.c:855 #: ../libpurple/protocols/jabber/buddy.c:1015 -#, fuzzy msgid "User Activity" -msgstr "�亳仄亳� 仆舒 从仂�亳�仆亳�亳" +msgstr "�从�亳于仆仂�� 仆舒 从仂�亳�仆亳从仂�" #: ../libpurple/protocols/jabber/buddy.c:857 #: ../libpurple/protocols/jabber/buddy.c:1017 -#, fuzzy msgid "Entity Capabilities" -msgstr "�仂亢仆仂��亳" +msgstr "" #: ../libpurple/protocols/jabber/buddy.c:859 #: ../libpurple/protocols/jabber/buddy.c:1019 @@ -5013,106 +4960,93 @@ #: ../libpurple/protocols/jabber/buddy.c:861 #: ../libpurple/protocols/jabber/buddy.c:1021 -#, fuzzy msgid "User Tune" -msgstr "�仂�亳�仆亳�从仂 亳仄亠" +msgstr "" #: ../libpurple/protocols/jabber/buddy.c:863 #: ../libpurple/protocols/jabber/buddy.c:1023 -#, fuzzy msgid "Roster Item Exchange" -msgstr "�仆��舒仆� 仗仂�舒从舒 �仂 �舒亰仄亠仆舒 仆舒 从仍��" +msgstr "" #: ../libpurple/protocols/jabber/buddy.c:865 #: ../libpurple/protocols/jabber/buddy.c:1025 -#, fuzzy msgid "Reachability Address" -msgstr "�亟�亠�舒 亰舒 亠-仗仂��舒" +msgstr "" #: ../libpurple/protocols/jabber/buddy.c:867 #: ../libpurple/protocols/jabber/buddy.c:1027 -#, fuzzy msgid "User Profile" -msgstr "��仂�亳仍" +msgstr "�仂�亳�仆亳�从亳 仗�仂�亳仍" #: ../libpurple/protocols/jabber/buddy.c:869 #: ../libpurple/protocols/jabber/buddy.c:1029 -#, fuzzy msgid "Jingle" -msgstr "��亳从仍��亳 �亠" +msgstr "Jingle" #: ../libpurple/protocols/jabber/buddy.c:871 #: ../libpurple/protocols/jabber/buddy.c:1031 msgid "Jingle Audio" -msgstr "" +msgstr "Jingle 舒�亟亳仂" #: ../libpurple/protocols/jabber/buddy.c:873 #: ../libpurple/protocols/jabber/buddy.c:1033 -#, fuzzy msgid "User Nickname" -msgstr "�仂�亳�仆亳�从仂 亳仄亠" +msgstr "�仂�亳�仆亳�从亳 仗�亠从舒�" #: ../libpurple/protocols/jabber/buddy.c:875 #: ../libpurple/protocols/jabber/buddy.c:1035 msgid "Jingle ICE UDP" -msgstr "" +msgstr "Jingle ICE UDP" #: ../libpurple/protocols/jabber/buddy.c:877 #: ../libpurple/protocols/jabber/buddy.c:1037 msgid "Jingle ICE TCP" -msgstr "" +msgstr "Jingle ICE TCP" #: ../libpurple/protocols/jabber/buddy.c:879 #: ../libpurple/protocols/jabber/buddy.c:1039 msgid "Jingle Raw UDP" -msgstr "" +msgstr "Jingle Raw UDP" #: ../libpurple/protocols/jabber/buddy.c:881 #: ../libpurple/protocols/jabber/buddy.c:1041 -#, fuzzy msgid "Jingle Video" -msgstr "�亳亟亠仂 于仂 亢亳于仂" +msgstr "Jingle 于亳亟亠仂" #: ../libpurple/protocols/jabber/buddy.c:883 #: ../libpurple/protocols/jabber/buddy.c:1043 msgid "Jingle DTMF" -msgstr "" +msgstr "Jingle DTMF" #: ../libpurple/protocols/jabber/buddy.c:885 #: ../libpurple/protocols/jabber/buddy.c:1045 -#, fuzzy msgid "Message Receipts" -msgstr "��亳仄亠仆舒 亠 仗仂�舒从舒" +msgstr "��亳仄舒�亳 仆舒 仗仂�舒从舒�舒" #: ../libpurple/protocols/jabber/buddy.c:887 #: ../libpurple/protocols/jabber/buddy.c:1047 -#, fuzzy msgid "Public Key Publishing" -msgstr "�舒于亠仆 仂�仗亠�舒�仂从 仂亟 从仍��仂�" +msgstr "�弍�舒于�于舒�亠 仆舒 �舒于仆亳仂� 从仍��" #: ../libpurple/protocols/jabber/buddy.c:889 #: ../libpurple/protocols/jabber/buddy.c:1049 -#, fuzzy msgid "User Chatting" -msgstr "�仗�亳亳 亰舒 从仂�亳�仆亳从仂�" +msgstr "�仂�亳�仆亳从仂� �舒亰亞仂于舒�舒" #: ../libpurple/protocols/jabber/buddy.c:891 #: ../libpurple/protocols/jabber/buddy.c:1051 -#, fuzzy msgid "User Browsing" -msgstr "�仂�亳�仆亳�从亳 �亠亢亳仄亳" +msgstr "�仂�亳�仆亳从仂� ����舒" #: ../libpurple/protocols/jabber/buddy.c:893 #: ../libpurple/protocols/jabber/buddy.c:1053 -#, fuzzy msgid "User Gaming" -msgstr "�仂�亳�仆亳�从仂 亳仄亠" +msgstr "�仂�亳�仆亳从仂� 亳亞�舒" #: ../libpurple/protocols/jabber/buddy.c:895 #: ../libpurple/protocols/jabber/buddy.c:1055 -#, fuzzy msgid "User Viewing" -msgstr "�亳仄亳� 仆舒 从仂�亳�仆亳�亳" +msgstr "�仂�亳�仆亳从仂� 亞仍亠亟舒" #: ../libpurple/protocols/jabber/buddy.c:897 #: ../libpurple/protocols/jabber/buddy.c:1057 @@ -5125,9 +5059,8 @@ #: ../libpurple/protocols/jabber/buddy.c:899 #: ../libpurple/protocols/jabber/buddy.c:1059 -#, fuzzy msgid "Stanza Encryption" -msgstr "Trillian 亠仆从�亳仗�亳�舒" +msgstr "Stanza 亠仆从�亳仗�亳�舒" #: ../libpurple/protocols/jabber/buddy.c:901 #: ../libpurple/protocols/jabber/buddy.c:1061 @@ -5238,14 +5171,12 @@ msgstr "��从舒亢亳" #: ../libpurple/protocols/jabber/buddy.c:1985 -#, fuzzy msgid "Log In" -msgstr "�舒�舒于亠仆" +msgstr "�舒�舒于舒" #: ../libpurple/protocols/jabber/buddy.c:1989 -#, fuzzy msgid "Log Out" -msgstr "�仂亞亳�舒� �舒亰亞仂于仂�亳" +msgstr "�亟�舒于舒" #: ../libpurple/protocols/jabber/buddy.c:2035 #: ../libpurple/protocols/jabber/jabber.c:1553 @@ -5448,7 +5379,7 @@ #: ../libpurple/protocols/jabber/jabber.c:145 msgid "You require encryption, but it is not available on this server." -msgstr "" +msgstr "�舒�舒�亠 亠仆从�亳仗�亳�舒, 仆仂 仆亠 亠 亟仂��舒仗仆舒 仆舒 仂于仂� �亠�于亠�." #: ../libpurple/protocols/jabber/jabber.c:259 #: ../libpurple/protocols/jabber/jabber.c:312 @@ -5492,9 +5423,9 @@ msgstr "�亠亞亳���亳�舒�亠�仂 仆舒 %s@%s 亠 ��仗亠�仆仂" #: ../libpurple/protocols/jabber/jabber.c:662 -#, fuzzy, c-format +#, c-format msgid "Registration to %s successful" -msgstr "�亠亞亳���亳�舒�亠�仂 仆舒 %s@%s 亠 ��仗亠�仆仂" +msgstr "�亠亞亳���舒�亳�舒�舒 仆舒 %s 亠 ��仗亠�仆舒" #: ../libpurple/protocols/jabber/jabber.c:664 #: ../libpurple/protocols/jabber/jabber.c:665 @@ -5507,21 +5438,19 @@ msgstr "�亠亞亳���亳�舒�亠�仂 仆亠 ��仗亠舒" #: ../libpurple/protocols/jabber/jabber.c:692 -#, fuzzy, c-format +#, c-format msgid "Registration from %s successfully removed" -msgstr "�亠亞亳���亳�舒�亠�仂 仆舒 %s@%s 亠 ��仗亠�仆仂" +msgstr "�亠亞亳���舒�亳�舒�舒 仂亟 %s 亠 ��仗亠�仆仂 仂����舒仆亠�舒" #: ../libpurple/protocols/jabber/jabber.c:694 #: ../libpurple/protocols/jabber/jabber.c:695 -#, fuzzy msgid "Unregistration Successful" -msgstr "�亠亞亳���亳�舒�亠�仂 亠 ��仗亠�仆仂" +msgstr "�亠�亠亞亳���亳�舒�亠�仂 亠 ��仗亠�仆仂" #: ../libpurple/protocols/jabber/jabber.c:703 #: ../libpurple/protocols/jabber/jabber.c:704 -#, fuzzy msgid "Unregistration Failed" -msgstr "�亠亞亳���亳�舒�亠�仂 仆亠 ��仗亠舒" +msgstr "�亠�亠亞亳���舒�亳�舒�舒 仆亠 ��仗亠舒" #: ../libpurple/protocols/jabber/jabber.c:864 #: ../libpurple/protocols/jabber/jabber.c:865 @@ -5553,17 +5482,12 @@ msgstr "�舒��仄" #: ../libpurple/protocols/jabber/jabber.c:987 -#, fuzzy msgid "Unregister" -msgstr "�亠亞亳���亳�舒�" +msgstr "�亠�亠亞亳���亳�舒�" #: ../libpurple/protocols/jabber/jabber.c:994 -#, fuzzy -msgid "" -"Please fill out the information below to change your account registration." -msgstr "" -"�亠 仄仂仍舒仄, 仗仂仗仂仍仆亠�亠 亞亳 亳仆�仂�仄舒�亳亳�亠 仗仂亟仂仍� 亰舒 亟舒 �舒 �亠亞亳���亳�舒�亠 �舒�舒�舒 仆仂于舒 " -"�仄亠�从舒." +msgid "Please fill out the information below to change your account registration." +msgstr "�亠 仄仂仍舒仄, 仗仂仗仂仍仆亠�亠 亞亳 亳仆�仂�仄舒�亳亳�亠 仗仂亟仂仍� 亰舒 亟舒 �舒 �仄亠仆亳�亠 �亠亞亳���舒�亳�舒�舒 亰舒 �舒�舒�舒 �仄亠�从舒." #: ../libpurple/protocols/jabber/jabber.c:997 msgid "Please fill out the information below to register your new account." @@ -5582,40 +5506,36 @@ msgstr "�亠亞亳���亳�舒�" #: ../libpurple/protocols/jabber/jabber.c:1012 -#, fuzzy, c-format +#, c-format msgid "Change Account Registration at %s" -msgstr "��仂仄亠仆亳 从仂�亳�仆亳�从仂 亳仆�仂 亰舒 %s" +msgstr "弌仄亠仆亠�亠 �舒 �亠亞亳���舒�亳�舒�舒 亰舒 �仄亠�从舒�舒 仆舒 %s" #: ../libpurple/protocols/jabber/jabber.c:1013 -#, fuzzy, c-format +#, c-format msgid "Register New Account at %s" -msgstr "�亠亞亳���亳�舒� 仆仂于舒 XMPP �仄亠�从舒" +msgstr "�亠亞亳���亳�舒��亠 仆仂于舒 �仄亠�从舒 仆舒 %s" #: ../libpurple/protocols/jabber/jabber.c:1016 -#, fuzzy msgid "Change Registration" -msgstr "弌仄亠仆亳 亞仂 ��舒���仂� 于仂" +msgstr "弌仄亠仆亠�亠 �亠亞亳���舒�亳�舒" #: ../libpurple/protocols/jabber/jabber.c:1120 #: ../libpurple/protocols/jabber/jabber.c:1121 -#, fuzzy msgid "Error unregistering account" -msgstr "��亠�从舒 仗�亳 仄亠仆�于舒�亠 仆舒 亳仆�仂�仄舒�亳亳 亰舒 �仄亠�从舒�舒" +msgstr "��亠�从舒 仗�亳 亟亠�亠亞亳���舒�亳�舒 仆舒 �仄亠�从舒�舒" #: ../libpurple/protocols/jabber/jabber.c:1126 #: ../libpurple/protocols/jabber/jabber.c:1127 -#, fuzzy msgid "Account successfully unregistered" -msgstr "丕�仗亠�仆仂 从�亠亳�舒于�亠 Qun" +msgstr "弌仄亠�从舒�舒 亠 ��仗亠�仆仂 亟亠�亠亞亳���亳�舒仆舒" #: ../libpurple/protocols/jabber/jabber.c:1284 msgid "Initializing Stream" msgstr "�仂 亳仆亳�亳�舒仍亳亰亳�舒仄 �亳��亠仄仂�" #: ../libpurple/protocols/jabber/jabber.c:1289 -#, fuzzy msgid "Initializing SSL/TLS" -msgstr "�仂 亳仆亳�亳�舒仍亳亰亳�舒仄 �亳��亠仄仂�" +msgstr "�仆亳�亳�舒仄 SSL/TLS" #: ../libpurple/protocols/jabber/jabber.c:1293 #: ../libpurple/protocols/msn/session.c:351 @@ -5685,27 +5605,24 @@ #: ../libpurple/protocols/jabber/jabber.c:1580 #: ../libpurple/protocols/jabber/jabber.c:1603 #: ../libpurple/protocols/jabber/jabber.c:1626 -#, fuzzy msgid "Mood Text" -msgstr "��于仆舒 亞��仗舒" +msgstr "丐亠从�� 亰舒 �舒�仗仂仍仂亢亠仆亳亠" #: ../libpurple/protocols/jabber/jabber.c:1535 #: ../libpurple/protocols/jabber/jabber.c:1558 #: ../libpurple/protocols/jabber/jabber.c:1581 #: ../libpurple/protocols/jabber/jabber.c:1604 #: ../libpurple/protocols/jabber/jabber.c:1627 -#, fuzzy msgid "Tune Artist" -msgstr "���亳��亳" +msgstr "���亳�� 亰舒 仗亠�仆舒�舒" #: ../libpurple/protocols/jabber/jabber.c:1536 #: ../libpurple/protocols/jabber/jabber.c:1559 #: ../libpurple/protocols/jabber/jabber.c:1582 #: ../libpurple/protocols/jabber/jabber.c:1605 #: ../libpurple/protocols/jabber/jabber.c:1628 -#, fuzzy msgid "Tune Title" -msgstr "�舒�仍仂于" +msgstr "�舒�仍仂于 仆舒 仗亠�仆舒�舒" #: ../libpurple/protocols/jabber/jabber.c:1537 #: ../libpurple/protocols/jabber/jabber.c:1560 @@ -5713,7 +5630,7 @@ #: ../libpurple/protocols/jabber/jabber.c:1606 #: ../libpurple/protocols/jabber/jabber.c:1629 msgid "Tune Album" -msgstr "" +msgstr "�仍弍�仄 亰舒 仗亠�仆舒�舒" #: ../libpurple/protocols/jabber/jabber.c:1538 #: ../libpurple/protocols/jabber/jabber.c:1561 @@ -5721,16 +5638,15 @@ #: ../libpurple/protocols/jabber/jabber.c:1607 #: ../libpurple/protocols/jabber/jabber.c:1630 msgid "Tune Genre" -msgstr "" +msgstr "�舒仆� 亰舒 仗亠�仆舒�舒" #: ../libpurple/protocols/jabber/jabber.c:1539 #: ../libpurple/protocols/jabber/jabber.c:1562 #: ../libpurple/protocols/jabber/jabber.c:1585 #: ../libpurple/protocols/jabber/jabber.c:1608 #: ../libpurple/protocols/jabber/jabber.c:1631 -#, fuzzy msgid "Tune Comment" -msgstr "�仂仄亠仆�舒� 亰舒 仗�亳�舒�亠仍" +msgstr "�仂仄亠仆�舒� 亰舒 仗亠�仆舒�舒" #: ../libpurple/protocols/jabber/jabber.c:1540 #: ../libpurple/protocols/jabber/jabber.c:1563 @@ -5746,7 +5662,7 @@ #: ../libpurple/protocols/jabber/jabber.c:1610 #: ../libpurple/protocols/jabber/jabber.c:1633 msgid "Tune Time" -msgstr "" +msgstr "��亠仄亠 亰舒 仗亠�仆舒" #: ../libpurple/protocols/jabber/jabber.c:1542 #: ../libpurple/protocols/jabber/jabber.c:1565 @@ -5754,7 +5670,7 @@ #: ../libpurple/protocols/jabber/jabber.c:1611 #: ../libpurple/protocols/jabber/jabber.c:1634 msgid "Tune Year" -msgstr "" +msgstr "�仂亟亳仆舒 亰舒 仗亠�仆舒�舒" #: ../libpurple/protocols/jabber/jabber.c:1543 #: ../libpurple/protocols/jabber/jabber.c:1566 @@ -5762,16 +5678,15 @@ #: ../libpurple/protocols/jabber/jabber.c:1612 #: ../libpurple/protocols/jabber/jabber.c:1635 msgid "Tune URL" -msgstr "" +msgstr "URL 亰舒 仗亠�仆舒�舒" #: ../libpurple/protocols/jabber/jabber.c:1545 #: ../libpurple/protocols/jabber/jabber.c:1568 #: ../libpurple/protocols/jabber/jabber.c:1591 #: ../libpurple/protocols/jabber/jabber.c:1614 #: ../libpurple/protocols/jabber/jabber.c:1637 -#, fuzzy msgid "Allow Buzz" -msgstr "�仂亰于仂仍亳" +msgstr "�仂亰于仂仍亳 buzz" #: ../libpurple/protocols/jabber/jabber.c:1665 msgid "Password Changed" @@ -6049,9 +5964,9 @@ msgstr "�亠 ��仗亠舒于 亟舒 亞仂 亳���仍舒仄 从仂�亳�仆亳从仂� %s" #: ../libpurple/protocols/jabber/jabber.c:2185 -#, fuzzy, c-format +#, c-format msgid "Unable to ping user %s" -msgstr "�亠 仄仂亢舒仄 亟舒 亞仂 弍舒仆亳�舒仄 从仂�亳�仆亳从仂� %s" +msgstr "�亠 仄仂亢舒仄 亟舒 亞仂 仗亳仆亞仆舒仄 从仂�亳�仆亳从仂� %s" #: ../libpurple/protocols/jabber/jabber.c:2207 #: ../libpurple/protocols/jabber/jabber.c:2217 @@ -6065,9 +5980,9 @@ msgstr "" #: ../libpurple/protocols/jabber/jabber.c:2239 -#, fuzzy, c-format +#, c-format msgid "Unable to buzz, because the user %s does not support it." -msgstr "�亠 仄仂亢亠 亟舒 亳�仗�舒�亳�亠 亟舒�仂�亠从舒 亟o %s, 从仂�亳�仆亳从仂� 仆亠 仗仂亟亟�亢�于舒 仗�亠仆仂�" +msgstr "" #: ../libpurple/protocols/jabber/jabber.c:2253 msgid "config: Configure a chat room." @@ -6122,15 +6037,14 @@ msgstr "kick <从仂�亳�仆亳从> [�仂弍舒]: ����仍亳 从仂�亳�仆亳从 仂亟 �仂弍舒�舒." #: ../libpurple/protocols/jabber/jabber.c:2318 -msgid "" -"msg <user> <message>: Send a private message to another user." +msgid "msg <user> <message>: Send a private message to another user." msgstr "" "msg <从仂�亳�仆亳从> <仗仂�舒从舒>: ��仗�舒�亳 仗�亳于舒�仆舒 仗仂�舒从舒 亟仂 亟��亞 " "从仂�亳�仆亳从." #: ../libpurple/protocols/jabber/jabber.c:2324 msgid "ping <jid>:\tPing a user/component/server." -msgstr "" +msgstr "ping <jid>:\t�亳仆亞仆亳 从仂�亳�仆亳从/从仂仄仗仂仆亠仆�舒/�亠�于亠�." #: ../libpurple/protocols/jabber/jabber.c:2329 #: ../libpurple/protocols/yahoo/yahoo.c:4145 @@ -6159,7 +6073,7 @@ #: ../libpurple/protocols/jabber/libxmpp.c:210 msgid "Require SSL/TLS" -msgstr "" +msgstr "�舒�a SSL/TLS" #: ../libpurple/protocols/jabber/libxmpp.c:214 msgid "Force old (port 5223) SSL" @@ -6216,9 +6130,9 @@ #: ../libpurple/protocols/jabber/message.c:307 #: ../libpurple/protocols/yahoo/yahoo.c:4120 -#, fuzzy, c-format +#, c-format msgid "%s has buzzed you!" -msgstr "%s �亠 仆舒�舒于亳." +msgstr "%s �亳 亳�仗�舒�亳 buzz!" #: ../libpurple/protocols/jabber/message.c:407 #, c-format @@ -6293,8 +6207,7 @@ #: ../libpurple/protocols/jabber/si.c:857 #, c-format msgid "Please select which resource of %s you would like to send a file to" -msgstr "" -"�亠 仄仂仍舒仄 亳亰弍亠�亠�亠 仆舒 从仂� �亠���� 仂亟 %s �舒从舒�亠 亟舒 仄� �舒 亳�仗�舒�亳�亠 亟舒�仂�亠从舒�舒" +msgstr "�亠 仄仂仍舒仄 亳亰弍亠�亠�亠 仆舒 从仂� �亠���� 仂亟 %s �舒从舒�亠 亟舒 仄� �舒 亳�仗�舒�亳�亠 亟舒�仂�亠从舒�舒" #: ../libpurple/protocols/jabber/si.c:873 msgid "Select a Resource" @@ -6302,34 +6215,29 @@ #: ../libpurple/protocols/jabber/usermood.c:179 #: ../libpurple/protocols/jabber/usermood.c:180 -#, fuzzy msgid "Edit User Mood" -msgstr "�仂�亳�仆亳�从亳 �亠亢亳仄亳" +msgstr "丕�亠亟亳 �舒�仗仂仍仂 亢亠仆亳亠" #: ../libpurple/protocols/jabber/usermood.c:181 msgid "Please select your mood from the list." -msgstr "" +msgstr "�亠 仄仂仍舒仄 亳亰弍亠�亠�亠 亞仂 �舒�仗仂仍仂亢亠仆亳亠�仂 仂亟 仍亳��舒�舒." #: ../libpurple/protocols/jabber/usermood.c:183 #: ../libpurple/protocols/jabber/usernick.c:78 -#, fuzzy msgid "Set" -msgstr "_�仂��舒于亳" +msgstr "�仂��舒于亳" #: ../libpurple/protocols/jabber/usermood.c:191 -#, fuzzy msgid "Set Mood..." -msgstr "��仗�舒�亳 ��..." +msgstr "�仂��舒于亳 �舒�仗仂仍仂亢亠仆亳亠..." #: ../libpurple/protocols/jabber/usernick.c:76 -#, fuzzy msgid "Set User Nickname" -msgstr "�仂��舒于亳 仍亳仄亳� 仆舒 从仂�亳�仆亳�亳" +msgstr "�仂��舒于亳 从仂�亳�仆亳�从亳 仗�亠从舒�" #: ../libpurple/protocols/jabber/usernick.c:76 -#, fuzzy msgid "Please specify a new nickname for you." -msgstr "�亠 仄仂仍舒仄 于仆亠�亠�亠 仆仂于仂 亳仄亠 亰舒 %s" +msgstr "�亠 仄仂仍舒仄 仂亟�亠亟亠�亠 仆仂于 仗�亠从舒�." #: ../libpurple/protocols/jabber/usernick.c:77 msgid "" @@ -6338,19 +6246,16 @@ msgstr "" #: ../libpurple/protocols/jabber/usernick.c:99 -#, fuzzy msgid "Set Nickname..." -msgstr "��亠从舒�" +msgstr "�仂��舒于亳 仗�亠从舒�..." #: ../libpurple/protocols/jabber/xdata.c:378 -#, fuzzy msgid "Actions" -msgstr "�亠���于仂" +msgstr "�亠���于舒" #: ../libpurple/protocols/jabber/xdata.c:380 -#, fuzzy msgid "Select an action" -msgstr "�亰弍亠�亠�亠 亟舒�仂�亠从舒" +msgstr "�亰弍亠�亠�亠 亟亠���于仂" #: ../libpurple/protocols/msn/dialog.c:110 #, c-format @@ -6660,12 +6565,12 @@ #: ../libpurple/protocols/msn/msn.c:130 msgid "Nudge" -msgstr "" +msgstr "Nudge" #: ../libpurple/protocols/msn/msn.c:131 -#, fuzzy, c-format +#, c-format msgid "%s has nudged you!" -msgstr "%s �亠 仆舒�舒于亳." +msgstr "%s �亳 亳�仗�舒�亳 nudge!" #: ../libpurple/protocols/msn/msn.c:132 #, c-format @@ -7066,9 +6971,8 @@ msgstr "�仂�亳��亳 亞仂 HTTP 仄亠�仂亟仂�" #: ../libpurple/protocols/msn/msn.c:2199 -#, fuzzy msgid "HTTP Method Server" -msgstr "IPC �亠�� �亠�于亠�" +msgstr "HTTP 仄亠�仂亟 亰舒 �亠�于亠�" #: ../libpurple/protocols/msn/msn.c:2204 msgid "Show custom smileys" @@ -7231,8 +7135,7 @@ msgstr "�亠 仄仂亢舒仄 亟舒 �亠 仆舒�舒于舒仄: %s" #: ../libpurple/protocols/msn/session.c:325 -msgid "" -"Your MSN buddy list is temporarily unavailable. Please wait and try again." +msgid "Your MSN buddy list is temporarily unavailable. Please wait and try again." msgstr "" "�舒�舒�舒 仍亳��舒 仆舒 仗�亳�舒�亠仍亳 仂亟 MSN 亠 仄仂仄亠仆�舒仍仆仂 仆亠亟仂��舒仗仆舒. �亠 仄仂仍舒仄 仗仂�亠从舒��亠 " "亳 仗�仂弍舒��亠 仗舒从." @@ -7284,8 +7187,7 @@ #: ../libpurple/protocols/msn/switchboard.c:416 msgid "Message could not be sent because a connection error occurred:" -msgstr "" -"�仂�舒从舒�舒 仆亠 仄仂亢亠 亟舒 弍亳亟亠 亳�仗�舒�亠仆舒 弍亳亟亠��亳 �亠 仗仂�舒于亳 亞�亠�从舒 �仂 于��从舒�舒:" +msgstr "�仂�舒从舒�舒 仆亠 仄仂亢亠 亟舒 弍亳亟亠 亳�仗�舒�亠仆舒 弍亳亟亠��亳 �亠 仗仂�舒于亳 亞�亠�从舒 �仂 于��从舒�舒:" #: ../libpurple/protocols/msn/switchboard.c:420 msgid "Message could not be sent because we are sending too quickly:" @@ -7301,8 +7203,7 @@ "仄亳仆��亳." #: ../libpurple/protocols/msn/switchboard.c:431 -msgid "" -"Message could not be sent because an error with the switchboard occurred:" +msgid "Message could not be sent because an error with the switchboard occurred:" msgstr "" "�仂�舒从舒�舒 仆亠 仄仂亢亠�亠 亟舒 �亠 亳�仗�舒�亳 弍亳亟亠��亳 �亠 �仍��亳 亞�亠�从舒 �仂 从仂仆��仂仍仆舒�舒 " "�舒弍仍舒:" @@ -7331,9 +7232,8 @@ msgstr "�仄亠�仂 亰舒 亠从�舒仆仂� 亠 仆亠于舒仍亳亟仆仂." #: ../libpurple/protocols/myspace/myspace.c:111 -#, fuzzy msgid "Missing Cipher" -msgstr "丿亳��舒" +msgstr "�亠亟仂��舒��于舒 cipher" #: ../libpurple/protocols/myspace/myspace.c:112 msgid "The RC4 cipher could not be found" @@ -7356,22 +7256,19 @@ #: ../libpurple/protocols/myspace/myspace.c:292 #: ../libpurple/protocols/myspace/myspace.c:1801 msgid "MySpaceIM Error" -msgstr "" +msgstr "��亠�从舒 �仂 MySpaceIM" #: ../libpurple/protocols/myspace/myspace.c:349 -#, fuzzy msgid "Reading challenge" -msgstr "��亠�从舒 于仂 �亳�舒�亠�仂" +msgstr "" #: ../libpurple/protocols/myspace/myspace.c:355 -#, fuzzy msgid "Unexpected challenge length from server" -msgstr "�亠于舒仍亳亟亠仆 仗�亠亟亳亰于亳从 仂亟 �亠�于亠�仂�" +msgstr "�亠于舒仍亳亟亠仆 亟仂仍亢亳仆舒 仆舒 仗�亠亟亳亰于亳从 仂亟 �亠�于亠�仂�" #: ../libpurple/protocols/myspace/myspace.c:359 -#, fuzzy msgid "Logging in" -msgstr "�仂亞亳�舒�亠" +msgstr "弌亠 仆舒�舒于�于舒仄" #: ../libpurple/protocols/myspace/myspace.c:1286 #, c-format @@ -7380,29 +7277,28 @@ #. Can't write _()'d strings in array initializers. Workaround. #: ../libpurple/protocols/myspace/myspace.c:1328 -#, fuzzy msgid "New mail messages" -msgstr "��仗�舒�亳 仗仂�舒从舒" +msgstr "�仂于舒 仗仂��舒" #: ../libpurple/protocols/myspace/myspace.c:1329 msgid "New blog comments" -msgstr "" +msgstr "�仂于亳 从仂仄亠仆�舒�亳 仆舒 弍仍仂亞" #: ../libpurple/protocols/myspace/myspace.c:1330 msgid "New profile comments" -msgstr "" +msgstr "�仂于亳 从仂仄亠仆�舒�亳 仆舒 仗�仂�亳仍仂�" #: ../libpurple/protocols/myspace/myspace.c:1331 msgid "New friend requests!" -msgstr "" +msgstr "�仂于亳 弍舒�舒�舒 亰舒 仗�亳�舒�亠仍亳!" #: ../libpurple/protocols/myspace/myspace.c:1332 msgid "New picture comments" -msgstr "" +msgstr "�仂于亳 从仂仄亠仆�舒�亳 仆舒 �仍亳从舒" #: ../libpurple/protocols/myspace/myspace.c:1360 msgid "MySpace" -msgstr "" +msgstr "MySpace" #. The session is now set up, ready to be connected. This emits the #. * signedOn signal, so clients can now do anything with msimprpl, and @@ -7414,90 +7310,81 @@ #: ../libpurple/protocols/myspace/myspace.c:1554 #: ../libpurple/protocols/myspace/myspace.c:1556 -#, fuzzy msgid "No username set" -msgstr "�亠仄舒 亳仄亠" +msgstr "�亠 亠 仗仂��舒于亠仆仂 从仂�亳�仆亳�从仂 亳仄亠" #: ../libpurple/protocols/myspace/myspace.c:1555 msgid "" "Please go to http://editprofile.myspace.com/index.cfm?fuseaction=profile." "username and choose a username and try to login again." msgstr "" +"�亠 仄仂仍舒仄 仂亟亠�亠 仆舒 http://editprofile.myspace.com/index.cfm?fuseaction=profile." +"username 亳 仂亟弍亠�亠�亠 从仂�亳�仆亳�从仂 亳仄亠 亳 仗�仂弍舒��亠 亟舒 �亠 仆舒�舒于亳�亠." #: ../libpurple/protocols/myspace/myspace.c:1782 -#, fuzzy, c-format +#, c-format msgid "Protocol error, code %d: %s" -msgstr "��仂�亠�仂� 于�舒�亳 从仂亟 仆舒 亞�亠�从舒 %d" +msgstr "��亠�从舒 于仂 仗�仂�仂从仂仍仂�, 从仂亟 %d: %s" #: ../libpurple/protocols/myspace/myspace.c:1972 #: ../libpurple/protocols/myspace/myspace.c:2006 -#, fuzzy msgid "Failed to add buddy" -msgstr "�亠 仄仂亢舒仄 亟舒 仗�亳从仍��舒仄 仗�亳�舒�亠仍 于仂 �舒亰亞仂于仂�仂�" +msgstr "�亠 ��仗亠舒于 亟舒 亞仂 亟仂亟舒亟舒仄 仗�亳�舒�亠仍仂�" #: ../libpurple/protocols/myspace/myspace.c:1972 -#, fuzzy msgid "'addbuddy' command failed." -msgstr "��亳�舒� �舒 仍亳��舒�舒 �仂 仗�亳�舒�亠仍亳 仂亟 亟舒�仂�亠从舒..." +msgstr "从仂仄舒仆亟舒�舒 'addbuddy' 仆亠 ��仗亠舒." #: ../libpurple/protocols/myspace/myspace.c:2006 #: ../libpurple/protocols/myspace/myspace.c:2247 -#, fuzzy msgid "persist command failed" -msgstr "�仂仆��仂仍仆舒�舒 �舒弍仍舒 仆亠 ��仗亠舒" +msgstr "从仂仄舒仆亟舒�舒 persist 仆亠 ��仗亠舒" #: ../libpurple/protocols/myspace/myspace.c:2115 #, c-format msgid "No such user: %s" -msgstr "" +msgstr "�亠仄舒 �舒从仂于 从仂�亳�仆亳从: %s" #: ../libpurple/protocols/myspace/myspace.c:2116 -#, fuzzy msgid "User lookup" -msgstr "�仂�亳�仆亳�从亳 �仂弍亳" +msgstr "��仂于亠�从舒 仆舒 从仂�亳�仆亳从仂�" #: ../libpurple/protocols/myspace/myspace.c:2228 #: ../libpurple/protocols/myspace/myspace.c:2247 #: ../libpurple/protocols/myspace/myspace.c:2269 -#, fuzzy msgid "Failed to remove buddy" -msgstr "�亠 仄仂亢舒仄 亟舒 仗�亳从仍��舒仄 仗�亳�舒�亠仍 于仂 �舒亰亞仂于仂�仂�" +msgstr "�亠 ��仗亠舒于 亟舒 亞仂 仂����舒仆舒仄 仗�亳�舒�亠仍仂�" #: ../libpurple/protocols/myspace/myspace.c:2228 msgid "'delbuddy' command failed" msgstr "" #: ../libpurple/protocols/myspace/myspace.c:2269 -#, fuzzy msgid "blocklist command failed" -msgstr "�仂仆��仂仍仆舒�舒 �舒弍仍舒 仆亠 ��仗亠舒" +msgstr "从仂仄舒仆亟舒�舒 blocklist 仆亠 ��仗亠舒" #: ../libpurple/protocols/myspace/myspace.c:2315 -#, fuzzy msgid "Invalid input condition" -msgstr "��亳于���于舒�亠 仆舒 仗仂于�亰�于舒�亠�仂" +msgstr "�亠于舒仍亳亟亠仆 于仍亠亰亠仆 ��仍仂于" #. TODO: g_realloc like msn, yahoo, irc, jabber? #: ../libpurple/protocols/myspace/myspace.c:2333 #: ../libpurple/protocols/myspace/myspace.c:2364 -#, fuzzy msgid "Read buffer full" -msgstr "�亠亟仂� 亠 仗仂仍仆" +msgstr "�舒�亠�仂� 亠 仗仂仍仆" #: ../libpurple/protocols/myspace/myspace.c:2402 -#, fuzzy msgid "Unparseable message" -msgstr "�亠 仄仂亢舒仄 亟舒 �舒 舒仆舒仍亳亰亳�舒仄 仗仂�舒从舒�舒" +msgstr "�仂�舒从舒 ��仂 仆亠 仄仂亢亠 亟舒 �亠 仗舒��亳�舒" #: ../libpurple/protocols/myspace/myspace.c:2471 -#, fuzzy, c-format +#, c-format msgid "Couldn't connect to host: %s (%d)" -msgstr "�亠 仄仂亢亠 亟舒 �亠 于�亰亠 �仂 �亠�于亠�仂�" +msgstr "�亠 仄仂亢舒仄 亟舒 �亠 仗仂于�亰舒仄 �仂 �仂��仂�: %s (%d)" #: ../libpurple/protocols/myspace/myspace.c:2642 -#, fuzzy msgid "IM Friends" -msgstr "_��仂亰仂��亳 亰舒 仗仂�舒从亳" +msgstr "IM 仗�亳�舒�亠仍亳" #: ../libpurple/protocols/myspace/myspace.c:2741 #, c-format @@ -7507,30 +7394,26 @@ msgstr "" #: ../libpurple/protocols/myspace/myspace.c:2742 -#, fuzzy msgid "Add contacts from server" -msgstr "�亠于舒仍亳亟亠仆 仂亟亞仂于仂� 仂亟 �亠�于亠�仂�." +msgstr "�仂亟舒� 从仂仆�舒从�亳 仂亟 �亠�于亠�仂�" #: ../libpurple/protocols/myspace/myspace.c:2794 #: ../libpurple/protocols/myspace/myspace.c:2859 msgid "Add friends from MySpace.com" -msgstr "" +msgstr "�仂亟舒� 仗�亳�舒�亠仍亳 仂亟 MySpace.com" #: ../libpurple/protocols/myspace/myspace.c:2795 -#, fuzzy msgid "Importing friends failed" -msgstr "于�亳��于舒�亠�仂 仆舒 亟仂亟舒�仂从仂� 仆亠 ��仗亠舒" +msgstr "丕于仂亰仂� 仆舒 仗�亳�舒�亠仍亳 仆亠 ��仗亠舒" #. TODO: find out how #: ../libpurple/protocols/myspace/myspace.c:2851 -#, fuzzy msgid "Find people..." msgstr "�舒�亟亳 仗�亳�舒�亠仍亳..." #: ../libpurple/protocols/myspace/myspace.c:2854 -#, fuzzy msgid "Change IM name..." -msgstr "��仂仄亠仆亳 �舒 仍仂亰亳仆从舒�舒..." +msgstr "��仂仄亠仆亳 亞仂 IM 亳仄亠�仂..." #: ../libpurple/protocols/myspace/myspace.c:3156 msgid "myim URL handler" @@ -7553,17 +7436,16 @@ msgstr "" #: ../libpurple/protocols/myspace/myspace.c:3289 -#, fuzzy msgid "Send emoticons" -msgstr "�仗�亳亳 亰舒 亰于�从" +msgstr "��仗�舒�亳 亠仄仂�亳亳" #: ../libpurple/protocols/myspace/myspace.c:3294 msgid "Screen resolution (dots per inch)" -msgstr "" +msgstr "�亠亰仂仍��亳�舒 仆舒 亠从�舒仆仂� (�仂�从亳 仗仂 亳仆�)" #: ../libpurple/protocols/myspace/myspace.c:3297 msgid "Base font size (points)" -msgstr "" +msgstr "��仆仂于仆舒 亞仂仍亠仄亳仆舒 仆舒 �仂仆� (points)" #: ../libpurple/protocols/myspace/user.c:95 #: ../libpurple/protocols/zephyr/zephyr.c:786 @@ -7578,36 +7460,33 @@ msgstr "��仂�亳仍" #: ../libpurple/protocols/myspace/user.c:124 -#, fuzzy msgid "Headline" -msgstr "_��亠从舒�:" +msgstr "�舒�仍仂于" #: ../libpurple/protocols/myspace/user.c:129 -#, fuzzy msgid "Song" -msgstr "�于��亳" +msgstr "�亠�仆舒" #: ../libpurple/protocols/myspace/user.c:134 msgid "Total Friends" -msgstr "" +msgstr "�从�仗仆仂 仗�亳�舒�亠仍亳" #: ../libpurple/protocols/myspace/user.c:145 #: ../libpurple/protocols/myspace/user.c:148 #: ../libpurple/protocols/myspace/user.c:151 -#, fuzzy msgid "Client Version" -msgstr "�舒�于仂�亳 �舒亰亞仂于仂�" +msgstr "�亠�亰亳�舒 仆舒 从仍亳亠仆�仂�" #. TODO: icons for each zap #: ../libpurple/protocols/myspace/zap.c:44 #: ../libpurple/protocols/myspace/zap.c:177 msgid "Zap" -msgstr "" +msgstr "Zap" #: ../libpurple/protocols/myspace/zap.c:44 -#, fuzzy, c-format +#, c-format msgid "%s has zapped you!" -msgstr "%s �亠 仆舒�舒于亳." +msgstr "" #: ../libpurple/protocols/myspace/zap.c:44 #, c-format @@ -7619,24 +7498,23 @@ msgstr "" #: ../libpurple/protocols/myspace/zap.c:45 -#, fuzzy, c-format +#, c-format msgid "%s has whacked you!" -msgstr "�仂�亳�仆亳从仂� �亠 弍仍仂从亳�舒仍" +msgstr "%s �亠 ��亠�仆舒!" #: ../libpurple/protocols/myspace/zap.c:45 #, c-format msgid "Whacking %s..." -msgstr "" +msgstr "�仂 ��亠�从舒仄 %s..." #: ../libpurple/protocols/myspace/zap.c:46 -#, fuzzy msgid "Torch" -msgstr "�舒�仍仂于" +msgstr "个舒从亠仍" #: ../libpurple/protocols/myspace/zap.c:46 -#, fuzzy, c-format +#, c-format msgid "%s has torched you!" -msgstr "�仂�亳�仆亳从仂� �亠 弍仍仂从亳�舒仍" +msgstr "" #: ../libpurple/protocols/myspace/zap.c:46 #, c-format @@ -7648,9 +7526,9 @@ msgstr "" #: ../libpurple/protocols/myspace/zap.c:47 -#, fuzzy, c-format +#, c-format msgid "%s has smooched you!" -msgstr "%s �亠 仆舒�舒于亳." +msgstr "" #: ../libpurple/protocols/myspace/zap.c:47 #, c-format @@ -7659,27 +7537,26 @@ #: ../libpurple/protocols/myspace/zap.c:48 msgid "Hug" -msgstr "" +msgstr "���从舒" #: ../libpurple/protocols/myspace/zap.c:48 -#, fuzzy, c-format +#, c-format msgid "%s has hugged you!" -msgstr "%s �亠 仆舒�舒于亳." +msgstr "%s �亠 亞��仆舒!" #: ../libpurple/protocols/myspace/zap.c:48 #, c-format msgid "Hugging %s..." -msgstr "" +msgstr "�仂/�舒 亞��从舒仄 %s..." #: ../libpurple/protocols/myspace/zap.c:49 -#, fuzzy msgid "Slap" -msgstr "弌仂仆仍亳于" +msgstr "丿舒仄舒�" #: ../libpurple/protocols/myspace/zap.c:49 -#, fuzzy, c-format +#, c-format msgid "%s has slapped you!" -msgstr "%s �亠 仆舒�舒于亳." +msgstr "%s �亳 �亟�亳 �舒仄舒�!" #: ../libpurple/protocols/myspace/zap.c:49 #, c-format @@ -7687,28 +7564,27 @@ msgstr "" #: ../libpurple/protocols/myspace/zap.c:50 -#, fuzzy msgid "Goose" -msgstr "弌亳 亰舒仄亳仆舒" +msgstr "" #: ../libpurple/protocols/myspace/zap.c:50 -#, fuzzy, c-format +#, c-format msgid "%s has goosed you!" -msgstr "%s �亳 亰舒仄亳仆舒." +msgstr "" #: ../libpurple/protocols/myspace/zap.c:50 -#, fuzzy, c-format +#, c-format msgid "Goosing %s..." -msgstr "�仂 弍舒�舒仄 %s" +msgstr "" #: ../libpurple/protocols/myspace/zap.c:51 msgid "High-five" msgstr "" #: ../libpurple/protocols/myspace/zap.c:51 -#, fuzzy, c-format +#, c-format msgid "%s has high-fived you!" -msgstr "%s �亠 仆舒�舒于亳." +msgstr "" #: ../libpurple/protocols/myspace/zap.c:51 #, c-format @@ -7720,9 +7596,9 @@ msgstr "" #: ../libpurple/protocols/myspace/zap.c:52 -#, fuzzy, c-format +#, c-format msgid "%s has punk'd you!" -msgstr "%s �亠 仆舒�舒于亳." +msgstr "" #: ../libpurple/protocols/myspace/zap.c:52 #, c-format @@ -7734,9 +7610,9 @@ msgstr "" #: ../libpurple/protocols/myspace/zap.c:53 -#, fuzzy, c-format +#, c-format msgid "%s has raspberried you!" -msgstr "%s �亠 仆舒�舒于亳." +msgstr "" #: ../libpurple/protocols/myspace/zap.c:53 #, c-format @@ -7878,14 +7754,12 @@ #: ../libpurple/protocols/novell/novell.c:247 #, c-format msgid "Unable to send message. Could not get details for user (%s)." -msgstr "" -"�亠 仄仂亢舒仄 亟舒 亳�仗�舒�舒仄 仗仂�舒从舒. �亠 仄仂亢舒仄 亟舒 亟仂弍亳�舒仄 亟亠�舒仍亳 亰舒 从仂�亳�仆亳从仂� (%s)." +msgstr "�亠 仄仂亢舒仄 亟舒 亳�仗�舒�舒仄 仗仂�舒从舒. �亠 仄仂亢舒仄 亟舒 亟仂弍亳�舒仄 亟亠�舒仍亳 亰舒 从仂�亳�仆亳从仂� (%s)." #: ../libpurple/protocols/novell/novell.c:396 #, c-format msgid "Unable to add %s to your buddy list (%s)." -msgstr "" -"�亠 仄仂亢舒仄 亟舒 亞仂 亟仂亟舒亟舒仄 仗�亳�舒�亠仍仂� %s 仆舒舒 �舒�舒�舒 仍亳��舒 �仂 仗�亳�舒�亠仍亳 (%s)." +msgstr "�亠 仄仂亢舒仄 亟舒 亞仂 亟仂亟舒亟舒仄 仗�亳�舒�亠仍仂� %s 仆舒舒 �舒�舒�舒 仍亳��舒 �仂 仗�亳�舒�亠仍亳 (%s)." #. TODO: Improve this! message to who or for what conference? #: ../libpurple/protocols/novell/novell.c:422 @@ -7909,8 +7783,7 @@ #: ../libpurple/protocols/novell/novell.c:537 #, c-format msgid "Unable to send message. Could not create the conference (%s)." -msgstr "" -"�亠 仄仂亢舒仄 亟舒 亳�仗�舒�舒仄 仗仂�舒从舒. �亠 仄仂亢舒仄 亟舒 �舒 从�亠亳�舒仄 从仂仆�亠�亠仆�亳�舒�舒 (%s)." +msgstr "�亠 仄仂亢舒仄 亟舒 亳�仗�舒�舒仄 仗仂�舒从舒. �亠 仄仂亢舒仄 亟舒 �舒 从�亠亳�舒仄 从仂仆�亠�亠仆�亳�舒�舒 (%s)." #: ../libpurple/protocols/novell/novell.c:584 #, c-format @@ -8053,10 +7926,8 @@ #: ../libpurple/protocols/novell/novell.c:2069 #, c-format -msgid "" -"%s appears to be offline and did not receive the message that you just sent." -msgstr "" -"%s 亳亰亞仍亠亟舒 亟亠从舒 亠 亳�从仍��亠仆(a) 亳 仆亠 �舒 仗�亳仄亳 仗仂�舒从舒�舒 从仂�舒 ��仂 �舒 亳�仗�舒�亳于�亠." +msgid "%s appears to be offline and did not receive the message that you just sent." +msgstr "%s 亳亰亞仍亠亟舒 亟亠从舒 亠 亳�从仍��亠仆(a) 亳 仆亠 �舒 仗�亳仄亳 仗仂�舒从舒�舒 从仂�舒 ��仂 �舒 亳�仗�舒�亳于�亠." #. TODO: Would be nice to prompt if not set! #. * purple_request_fields(gc, _("Server Address"),...); @@ -8536,8 +8407,7 @@ #: ../libpurple/protocols/oscar/oscar.c:1371 #, c-format msgid "The client version you are using is too old. Please upgrade at %s" -msgstr "" -"�亠�亰亳�舒�舒 仆舒 从仍亳亠仆�仂� 从仂� 亞仂 从仂�亳��亳�亠 亠 仗�亠��舒�舒. �亠 仄仂仍舒仄, 仆舒亟亞�舒亟亠�亠 仆舒 %s" +msgstr "�亠�亰亳�舒�舒 仆舒 从仍亳亠仆�仂� 从仂� 亞仂 从仂�亳��亳�亠 亠 仗�亠��舒�舒. �亠 仄仂仍舒仄, 仆舒亟亞�舒亟亠�亠 仆舒 %s" #: ../libpurple/protocols/oscar/oscar.c:1410 msgid "Could Not Connect" @@ -8604,8 +8474,7 @@ #: ../libpurple/protocols/oscar/oscar.c:2202 msgid "Please authorize me so I can add you to my buddy list." -msgstr "" -"丐亠 仄仂仍舒仄 舒于�仂�亳亰亳�舒� 仄亠 亰舒 亟舒 仄仂亢舒仄 亟舒 �亠 亟仂亟舒亟舒仄 于仂 仍亳��舒�舒 �仂 仗�亳�舒�亠仍亳." +msgstr "丐亠 仄仂仍舒仄 舒于�仂�亳亰亳�舒� 仄亠 亰舒 亟舒 仄仂亢舒仄 亟舒 �亠 亟仂亟舒亟舒仄 于仂 仍亳��舒�舒 �仂 仗�亳�舒�亠仍亳." #: ../libpurple/protocols/oscar/oscar.c:2230 msgid "Authorization Request Message:" @@ -8724,27 +8593,19 @@ #: ../libpurple/protocols/oscar/oscar.c:2614 #, c-format -msgid "" -"You missed %hu message from %s because the rate limit has been exceeded." -msgid_plural "" -"You missed %hu messages from %s because the rate limit has been exceeded." -msgstr[0] "" -"��仂仗���亳于�亠 %hu 仗仂�舒从舒 仂亟 %s, 弍亳亟亠��亳 仍亳仄亳�仂� 亰舒 �亠��仂�舒 弍亠�亠 仆舒亟仄亳仆舒�." -msgstr[1] "" -"��仂仗���亳于�亠 %hu 仗仂�舒从亳 仂亟 %s, 弍亳亟亠��亳 仍亳仄亳�仂� 亰舒 �亠��仂�舒 弍亠�亠 仆舒亟仄亳仆舒�." -msgstr[2] "" -"��仂仗���亳于�亠 %hu 仗仂�舒从亳 仂亟 %s, 弍亳亟亠��亳 仍亳仄亳�仂� 亰舒 �亠��仂�舒 弍亠�亠 仆舒亟仄亳仆舒�." +msgid "You missed %hu message from %s because the rate limit has been exceeded." +msgid_plural "You missed %hu messages from %s because the rate limit has been exceeded." +msgstr[0] "��仂仗���亳于�亠 %hu 仗仂�舒从舒 仂亟 %s, 弍亳亟亠��亳 仍亳仄亳�仂� 亰舒 �亠��仂�舒 弍亠�亠 仆舒亟仄亳仆舒�." +msgstr[1] "��仂仗���亳于�亠 %hu 仗仂�舒从亳 仂亟 %s, 弍亳亟亠��亳 仍亳仄亳�仂� 亰舒 �亠��仂�舒 弍亠�亠 仆舒亟仄亳仆舒�." +msgstr[2] "��仂仗���亳于�亠 %hu 仗仂�舒从亳 仂亟 %s, 弍亳亟亠��亳 仍亳仄亳�仂� 亰舒 �亠��仂�舒 弍亠�亠 仆舒亟仄亳仆舒�." #: ../libpurple/protocols/oscar/oscar.c:2623 #, c-format msgid "You missed %hu message from %s because he/she was too evil." msgid_plural "You missed %hu messages from %s because he/she was too evil." -msgstr[0] "" -"��仂仗���亳于�亠 %hu 仗仂�舒从舒 仂亟 %s, 弍亳亟亠��亳 �仂�/�舒舒 弍亠�亠 仗�亠仄仆仂亞� 亰仍仂弍亠仆/亰仍仂弍仆舒." -msgstr[1] "" -"��仂仗���亳于�亠 %hu 仗仂�舒从亳 仂亟 %s, 弍亳亟亠��亳 �仂�/�舒舒 弍亠�亠 仗�亠仄仆仂亞� 亰仍仂弍亠仆/亰仍仂弍仆舒." -msgstr[2] "" -"��仂仗���亳于�亠 %hu 仗仂�舒从亳 仂亟 %s, 弍亳亟亠��亳 �仂�/�舒舒 弍亠�亠 仗�亠仄仆仂亞� 亰仍仂弍亠仆/亰仍仂弍仆舒." +msgstr[0] "��仂仗���亳于�亠 %hu 仗仂�舒从舒 仂亟 %s, 弍亳亟亠��亳 �仂�/�舒舒 弍亠�亠 仗�亠仄仆仂亞� 亰仍仂弍亠仆/亰仍仂弍仆舒." +msgstr[1] "��仂仗���亳于�亠 %hu 仗仂�舒从亳 仂亟 %s, 弍亳亟亠��亳 �仂�/�舒舒 弍亠�亠 仗�亠仄仆仂亞� 亰仍仂弍亠仆/亰仍仂弍仆舒." +msgstr[2] "��仂仗���亳于�亠 %hu 仗仂�舒从亳 仂亟 %s, 弍亳亟亠��亳 �仂�/�舒舒 弍亠�亠 仗�亠仄仆仂亞� 亰仍仂弍亠仆/亰仍仂弍仆舒." #: ../libpurple/protocols/oscar/oscar.c:2632 #, c-format @@ -8964,8 +8825,7 @@ msgstr "�仆�仂�仄舒�亳亳 亰舒 �仄亠�从舒�舒" #: ../libpurple/protocols/oscar/oscar.c:4218 -msgid "" -"Your IM Image was not sent. You must be Direct Connected to send IM Images." +msgid "Your IM Image was not sent. You must be Direct Connected to send IM Images." msgstr "" "�舒�舒�舒 亳仆��舒仆� 仗仂�舒从舒 仆亠 弍亠�亠 亳�仗�舒�亠仆舒. �仂�舒 亟舒 弍亳亟亠�亠 亟亳�亠从�仆仂 仗仂于�亰舒仆亳 亰舒 " "亟舒 亳�仗�舒�亳�亠 �仍亳从亳 于仂 亳仆��舒仆� 仗仂�舒从亳." @@ -10055,8 +9915,7 @@ #: ../libpurple/protocols/sametime/sametime.c:1645 #, c-format -msgid "" -"A Sametime administrator has issued the following announcement on server %s" +msgid "A Sametime administrator has issued the following announcement on server %s" msgstr "�亟仄亳仆亳���舒�仂� 仆舒 Sametime �舒 亳亰亟舒亟亠 �仍亠亟仆舒于舒 仆舒�舒于舒 仆舒 �亠�于亠�仂� %s" #: ../libpurple/protocols/sametime/sametime.c:1650 @@ -10387,8 +10246,7 @@ #: ../libpurple/protocols/sametime/sametime.c:5564 #, c-format msgid "The identifier '%s' did not match any users in your Sametime community." -msgstr "" -"�亰仆舒从舒�舒 ��%s�� 仆亠 �亠 �仂于仗舒亟仆舒 �仂 仆亳亠亟亠仆 从仂�亳�仆亳从 于仂 �舒�舒�舒 Sametime 亰舒亠亟仆亳�舒." +msgstr "�亰仆舒从舒�舒 ��%s�� 仆亠 �亠 �仂于仗舒亟仆舒 �仂 仆亳亠亟亠仆 从仂�亳�仆亳从 于仂 �舒�舒�舒 Sametime 亰舒亠亟仆亳�舒." #: ../libpurple/protocols/sametime/sametime.c:5568 msgid "No Matches" @@ -11129,8 +10987,7 @@ #: ../libpurple/protocols/silc/chat.c:1045 #: ../libpurple/protocols/silc10/chat.c:1102 #, c-format -msgid "" -"You have to join the %s channel before you are able to join the private group" +msgid "You have to join the %s channel before you are able to join the private group" msgstr "" "�仂�舒 亟舒 �亠 仗�亳从仍��亳�亠 从仂仆 从舒仆舒仍仂� %s 仗�亠亟 亟舒 仄仂亢亠�亠 亟舒 �亠 仗�亳从仍��亳�亠 于仂 " "仗�亳于舒�仆舒�舒 亞��仗舒" @@ -11549,8 +11406,7 @@ #: ../libpurple/protocols/silc/pk.c:103 ../libpurple/protocols/silc10/pk.c:109 #, c-format msgid "Received %s's public key. Would you like to accept this public key?" -msgstr "" -"�仂 仗�亳仄亳于 �舒于仆亳仂� 从仍�� 仆舒 %s. �舒仍亳 �舒从舒�亠 亟舒 亞仂 仗�亳�舒�亳�亠 仂于仂� �舒于亠仆 从仍��?" +msgstr "�仂 仗�亳仄亳于 �舒于仆亳仂� 从仍�� 仆舒 %s. �舒仍亳 �舒从舒�亠 亟舒 亞仂 仗�亳�舒�亳�亠 仂于仂� �舒于亠仆 从仍��?" #: ../libpurple/protocols/silc/pk.c:107 ../libpurple/protocols/silc10/pk.c:113 #, c-format @@ -11596,8 +11452,7 @@ #: ../libpurple/protocols/silc/silc.c:238 #: ../libpurple/protocols/silc10/ops.c:1714 -msgid "" -"Resuming detached session failed. Press Reconnect to create new connection." +msgid "Resuming detached session failed. Press Reconnect to create new connection." msgstr "" "��仂亟仂仍亢�于舒�亠�仂 仆舒 仂亟亟亠仍亠仆舒�舒 �亠�亳�舒 仆亠 ��仗亠舒. ��亳�亳�仆亠�亠 仆舒 ���仂于�亰亳 �亠 " "仗仂于�仂�仆仂�� 亰舒 亟舒 从�亠亳�舒�亠 仆仂于舒 于��从舒." @@ -11880,8 +11735,7 @@ #: ../libpurple/protocols/silc/silc.c:1666 #: ../libpurple/protocols/silc10/silc.c:1595 msgid "join <channel> [<password>]: Join a chat on this network" -msgstr "" -"join <从舒仆舒仍> [<仍仂亰亳仆从舒>]: ��亳从仍��亳 �亠 从仂仆 �舒亰亞仂于仂� 仆舒 仄�亠亢舒�舒" +msgstr "join <从舒仆舒仍> [<仍仂亰亳仆从舒>]: ��亳从仍��亳 �亠 从仂仆 �舒亰亞仂于仂� 仆舒 仄�亠亢舒�舒" #: ../libpurple/protocols/silc/silc.c:1670 #: ../libpurple/protocols/silc10/silc.c:1599 @@ -11897,14 +11751,12 @@ #: ../libpurple/protocols/silc10/silc.c:1607 #: ../libpurple/protocols/zephyr/zephyr.c:2685 msgid "msg <nick> <message>: Send a private message to a user" -msgstr "" -"msg <仗�亠从舒�> <仗仂�舒从舒>: ��仗�舒�亳 仗�亳于舒�仆舒 仗仂�舒从舒 亟仂 从仂�亳�仆亳从" +msgstr "msg <仗�亠从舒�> <仗仂�舒从舒>: ��仗�舒�亳 仗�亳于舒�仆舒 仗仂�舒从舒 亟仂 从仂�亳�仆亳从" #: ../libpurple/protocols/silc/silc.c:1682 #: ../libpurple/protocols/silc10/silc.c:1611 msgid "query <nick> [<message>]: Send a private message to a user" -msgstr "" -"query <仗�亠从舒�> [<仗仂�舒从舒>]: ��仗�舒�亳 仗�亳于舒�仆舒 仗仂�舒从舒 亟仂 从仂�亳�仆亳从" +msgstr "query <仗�亠从舒�> [<仗仂�舒从舒>]: ��仗�舒�亳 仗�亳于舒�仆舒 仗仂�舒从舒 亟仂 从仂�亳�仆亳从" #: ../libpurple/protocols/silc/silc.c:1686 #: ../libpurple/protocols/silc10/silc.c:1615 @@ -12250,8 +12102,7 @@ #: ../libpurple/protocols/silc10/ops.c:1934 #, c-format msgid "Failure: Remote does not trust/support your public key" -msgstr "" -"�亠��仗亠�: �亟亟舒仍亠�亠仆亳仂� �仂�� 仆亠 亞仂 仗仂亟亟�亢�于舒/仆亠仄舒 亟仂于亠�弍舒 于仂 �舒�亳仂� �舒于亠仆 从仍��" +msgstr "�亠��仗亠�: �亟亟舒仍亠�亠仆亳仂� �仂�� 仆亠 亞仂 仗仂亟亟�亢�于舒/仆亠仄舒 亟仂于亠�弍舒 于仂 �舒�亳仂� �舒于亠仆 从仍��" #: ../libpurple/protocols/silc10/ops.c:1937 #, c-format @@ -12321,9 +12172,8 @@ msgstr "�亠 仄仂亢舒仄 亟舒 �亠 仗仂于�亰舒仄" #: ../libpurple/protocols/simple/simple.c:1059 -#, fuzzy msgid "Unknown server response." -msgstr "�亠仗仂亰仆舒�舒 仗�亳�亳仆舒." +msgstr "�亠仗仂亰仆舒� 仂亟亞仂于仂� 仂亟 �亠�于亠�仂�." #: ../libpurple/protocols/simple/simple.c:1563 #: ../libpurple/protocols/simple/simple.c:1605 @@ -12342,8 +12192,7 @@ #: ../libpurple/protocols/simple/simple.c:1694 msgid "SIP screen names may not contain whitespaces or @ symbols" -msgstr "" -"SIP 亳仄亳�舒�舒 仆舒 从仂�亳�仆亳�亳 仆亠 �仄亠舒� 亟舒 �仂亟�亢舒� 仗�舒亰仆亳 仄亠��舒 亳仍亳 �亳仄弍仂仍仂� @" +msgstr "SIP 亳仄亳�舒�舒 仆舒 从仂�亳�仆亳�亳 仆亠 �仄亠舒� 亟舒 �仂亟�亢舒� 仗�舒亰仆亳 仄亠��舒 亳仍亳 �亳仄弍仂仍仂� @" #. *< type #. *< ui_requirement @@ -12686,8 +12535,7 @@ #: ../libpurple/protocols/yahoo/yahoo.c:2129 msgid "Your account is locked, please log in to the Yahoo! website." -msgstr "" -"�舒�舒�舒 �仄亠�从舒 亠 亰舒从仍��亠仆舒. �亠 仄仂仍舒仄, 仆舒�舒于亠�亠 �亠 仆舒 ���舒仆亳�舒�舒 仆舒 Yahoo!." +msgstr "�舒�舒�舒 �仄亠�从舒 亠 亰舒从仍��亠仆舒. �亠 仄仂仍舒仄, 仆舒�舒于亠�亠 �亠 仆舒 ���舒仆亳�舒�舒 仆舒 Yahoo!." #: ../libpurple/protocols/yahoo/yahoo.c:2132 #, c-format @@ -12817,9 +12665,8 @@ msgstr "�仂� ID. 亟舒 亞仂 舒从�亳于亳�舒仄?" #: ../libpurple/protocols/yahoo/yahoo.c:3506 -#, fuzzy msgid "Join whom in chat?" -msgstr "�仂亞仂 亟舒 仗�亳从仍��舒仄 于仂 �舒亰亞仂于仂�仂�?" +msgstr "�舒 从仂� 亟舒 仄� �亠 仗�亳从仍��舒仄 于仂 �舒亰亞仂于仂�仂�?" #: ../libpurple/protocols/yahoo/yahoo.c:3518 msgid "Activate ID..." @@ -13003,8 +12850,7 @@ msgid "" "Sorry, this profile seems to be in a language or format that is not " "supported at this time." -msgstr "" -"�亰于亳仆亠�亠 仆仂 仂于仂� 仗�仂�亳仍 亳亰亞仍亠亟舒 亠 仆舒 �舒亰亳从 从仂� 仆亠 亠 仗仂亟亟�亢舒仆 仄仂仄亠仆�舒仍仆仂." +msgstr "�亰于亳仆亠�亠 仆仂 仂于仂� 仗�仂�亳仍 亳亰亞仍亠亟舒 亠 仆舒 �舒亰亳从 从仂� 仆亠 亠 仗仂亟亟�亢舒仆 仄仂仄亠仆�舒仍仆仂." #: ../libpurple/protocols/yahoo/yahoo_profile.c:1221 msgid "" @@ -13032,8 +12878,7 @@ #: ../libpurple/protocols/yahoo/yahoochat.c:217 #, c-format msgid "%s declined your conference invitation to room \"%s\" because \"%s\"." -msgstr "" -"%s �舒 仂亟弍亳 �舒�舒�舒 仗仂从舒仆舒 亰舒 从仂仆�亠�亠仆�亳�舒 于仂 �仂弍舒�舒 \"%s\" 仗仂�舒亟亳 \"%s\"." +msgstr "%s �舒 仂亟弍亳 �舒�舒�舒 仗仂从舒仆舒 亰舒 从仂仆�亠�亠仆�亳�舒 于仂 �仂弍舒�舒 \"%s\" 仗仂�舒亟亳 \"%s\"." #: ../libpurple/protocols/yahoo/yahoochat.c:219 msgid "Invitation Rejected" @@ -13176,13 +13021,11 @@ #: ../libpurple/protocols/zephyr/zephyr.c:2705 msgid "inst <instance>: Set the instance to be used on this class" -msgstr "" -"inst <instance>: �仂��舒于亳 �舒 亳仆��舒仆�舒�舒 亟舒 弍亳亟亠 从仂�亳��亠仆舒 仆舒 仂于舒舒 从仍舒�舒" +msgstr "inst <instance>: �仂��舒于亳 �舒 亳仆��舒仆�舒�舒 亟舒 弍亳亟亠 从仂�亳��亠仆舒 仆舒 仂于舒舒 从仍舒�舒" #: ../libpurple/protocols/zephyr/zephyr.c:2710 msgid "topic <instance>: Set the instance to be used on this class" -msgstr "" -"topic <instance>: �仂��舒于亳 �舒 亳仆��舒仆�舒�舒 亟舒 弍亳亟亠 从仂�亳��亠仆舒 仆舒 仂于舒舒 从仍舒�舒" +msgstr "topic <instance>: �仂��舒于亳 �舒 亳仆��舒仆�舒�舒 亟舒 弍亳亟亠 从仂�亳��亠仆舒 仆舒 仂于舒舒 从仍舒�舒" #: ../libpurple/protocols/zephyr/zephyr.c:2716 msgid "sub <class> <instance> <recipient>: Join a new chat" @@ -13191,10 +13034,8 @@ "�舒亰亞仂于仂�" #: ../libpurple/protocols/zephyr/zephyr.c:2721 -msgid "" -"zi <instance>: Send a message to <message,<i>instance</i>,*>" -msgstr "" -"zi <instance>: ��仗�舒�亳 仗仂�舒从舒 亟仂 <message,<i>instance</i>,*>" +msgid "zi <instance>: Send a message to <message,<i>instance</i>,*>" +msgstr "zi <instance>: ��仗�舒�亳 仗仂�舒从舒 亟仂 <message,<i>instance</i>,*>" #: ../libpurple/protocols/zephyr/zephyr.c:2727 msgid "" @@ -13377,9 +13218,8 @@ msgstr "��亳�舒�亳 �舒 仗仂从舒仆舒�舒 亰舒 �舒亰亞仂于仂�?" #: ../libpurple/sslconn.c:164 -#, fuzzy msgid "SSL Connection Failed" -msgstr "�仂于�亰�于舒�亠�仂 仆亠 ��仗亠舒" +msgstr "SSL 于��从舒�舒 仆亠 ��仗亠舒" #: ../libpurple/sslconn.c:166 msgid "SSL Handshake Failed" @@ -13390,9 +13230,8 @@ msgstr "" #: ../libpurple/sslconn.c:171 -#, fuzzy msgid "Unknown SSL error" -msgstr "�亠仗仂亰仆舒�舒 亞�亠�从舒" +msgstr "�亠仗仂亰仆舒�舒 SSL 亞�亠�从舒" #: ../libpurple/status.c:153 msgid "Unset" @@ -13682,9 +13521,8 @@ msgstr "�仂_亰亳仆从舒:" #: ../pidgin/gtkaccount.c:1195 -#, fuzzy msgid "Unable to save new account" -msgstr "�亠 仄仂亢舒仄 亟舒 从�亠亳�舒仄 于��从舒" +msgstr "�亠 仄仂亢舒仄 亟舒 �舒 亰舒��于舒仄 仆仂于舒�舒 �仄亠�从舒" #: ../pidgin/gtkaccount.c:1196 msgid "An account already exists with the specified criteria." @@ -13775,9 +13613,8 @@ msgstr "�仂�舒从舒" #: ../pidgin/gtkblist.c:1148 -#, fuzzy msgid "_Send File" -msgstr "��仗�舒�亳 亟舒�仂�亠从舒" +msgstr "_��仗�舒�亳 亟舒�仂�亠从舒" #: ../pidgin/gtkblist.c:1155 msgid "Add Buddy _Pounce" @@ -13839,10 +13676,8 @@ #: ../pidgin/gtkblist.c:2057 ../pidgin/gtkconv.c:4840 #: ../pidgin/gtkpounce.c:430 -msgid "" -"You are not currently signed on with an account that can add that buddy." -msgstr "" -"�亠 ��亠 仄仂仄亠仆�舒仍仆仂 仆舒�舒于亠仆亳 �仂 �仄亠�从舒 从仂�舒 仄仂亢亠 亟舒 亞仂 亟仂亟舒亟亠 �仂� 仗�亳�舒�亠仍." +msgid "You are not currently signed on with an account that can add that buddy." +msgstr "�亠 ��亠 仄仂仄亠仆�舒仍仆仂 仆舒�舒于亠仆亳 �仂 �仄亠�从舒 从仂�舒 仄仂亢亠 亟舒 亞仂 亟仂亟舒亟亠 �仂� 仗�亳�舒�亠仍." #. Buddies menu #: ../pidgin/gtkblist.c:2869 @@ -13866,34 +13701,28 @@ msgstr "/��亳�舒�亠仍亳/��亠亞仍亠亟舒� _仍仂亞..." #: ../pidgin/gtkblist.c:2875 -#, fuzzy msgid "/Buddies/Show" -msgstr "/_��亳�舒�亠仍亳" +msgstr "/��亳�舒�亠仍亳/�仂从舒亢亳" #: ../pidgin/gtkblist.c:2876 -#, fuzzy msgid "/Buddies/Show/_Offline Buddies" -msgstr "/��亳�舒�亠仍亳/�仂从舒亢亳 亳�从仍��亠仆亳 仗�亳�舒�亠仍亳" +msgstr "/��亳�舒�亠仍亳/�仂从舒亢亳/_��从仍��亠仆亳 仗�亳�舒�亠仍亳" #: ../pidgin/gtkblist.c:2877 -#, fuzzy msgid "/Buddies/Show/_Empty Groups" -msgstr "/��亳�舒�亠仍亳/�仂从舒亢亳 仗�舒亰仆亳 亞��仗亳" +msgstr "/��亳�舒�亠仍亳/�仂从舒亢亳/_��舒亰仆亳 亞��仗亳" #: ../pidgin/gtkblist.c:2878 -#, fuzzy msgid "/Buddies/Show/Buddy _Details" -msgstr "/��亳�舒�亠仍亳/�仂从舒亢亳 亟亠�舒仍亳 亰舒 _仗�亳�舒�亠仍" +msgstr "/��亳�舒�亠仍亳/�仂从舒亢亳/_�亠�舒仍亳 亰舒 _仗�亳�舒�亠仍" #: ../pidgin/gtkblist.c:2879 -#, fuzzy msgid "/Buddies/Show/Idle _Times" -msgstr "/��亳�舒�亠仍亳/�仂从舒亢亳 于�亠仄亠 仆舒 _仆亠舒从�亳于仆仂��" +msgstr "/��亳�舒�亠仍亳/�仂从舒亢亳/_��亠仄亠 仆舒 _仆亠舒从�亳于仆仂��" #: ../pidgin/gtkblist.c:2880 -#, fuzzy msgid "/Buddies/Show/_Protocol Icons" -msgstr "/��亳�舒�亠仍亳/�仂从舒亢亳 仗�舒亰仆亳 亞��仗亳" +msgstr "/��亳�舒�亠仍亳/�仂从舒亢亳/_�从仂仆亳 亰舒 仗�仂�仂从仂仍亳�亠" #: ../pidgin/gtkblist.c:2881 msgid "/Buddies/_Sort Buddies" @@ -13934,9 +13763,8 @@ msgstr "/�仍舒�从亳/�亠���于舒 亰舒 _仗�亳�舒�亠仍" #: ../pidgin/gtkblist.c:2896 -#, fuzzy msgid "/Tools/_Certificates" -msgstr "/�仍舒�从亳/��_亠�亠�亠仆�亳" +msgstr "/�仍舒�从亳/_弌亠��亳�亳从舒�亳" #: ../pidgin/gtkblist.c:2897 msgid "/Tools/Plu_gins" @@ -14115,7 +13943,7 @@ #. Translators: Please maintain the use of -> and <- to refer to menu heirarchy #: ../pidgin/gtkblist.c:4334 -#, fuzzy, c-format +#, c-format msgid "" "<span weight='bold' size='larger'>Welcome to %s!</span>\n" "\n" @@ -14134,29 +13962,24 @@ #. * after the treeview or faceprint gets mad. -Robot101 #. #: ../pidgin/gtkblist.c:4597 -#, fuzzy msgid "/Buddies/Show/Offline Buddies" -msgstr "/��亳�舒�亠仍亳/�仂从舒亢亳 亳�从仍��亠仆亳 仗�亳�舒�亠仍亳" +msgstr "/��亳�舒�亠仍亳/�仂从舒亢亳/��从仍��亠仆亳 仗�亳�舒�亠仍亳" #: ../pidgin/gtkblist.c:4600 -#, fuzzy msgid "/Buddies/Show/Empty Groups" -msgstr "/��亳�舒�亠仍亳/�仂从舒亢亳 仗�舒亰仆亳 亞��仗亳" +msgstr "/��亳�舒�亠仍亳/�仂从舒亢亳/��舒亰仆亳 亞��仗亳" #: ../pidgin/gtkblist.c:4606 -#, fuzzy msgid "/Buddies/Show/Buddy Details" -msgstr "/��亳�舒�亠仍亳/�仂从舒亢亳 亟亠�舒仍亳 亰舒 仗�亳�舒�亠仍亳" +msgstr "/��亳�舒�亠仍亳/�仂从舒亢亳/�亠�舒仍亳 亰舒 仗�亳�舒�亠仍亳" #: ../pidgin/gtkblist.c:4609 -#, fuzzy msgid "/Buddies/Show/Idle Times" -msgstr "/��亳�舒�亠仍亳/��亠仄亠 仆舒 仆亠舒从�亳于仆仂��" +msgstr "/��亳�舒�亠仍亳/�仂从舒亢亳/��亠仄亠 仆舒 仆亠舒从�亳于仆仂��" #: ../pidgin/gtkblist.c:4612 -#, fuzzy msgid "/Buddies/Show/Protocol Icons" -msgstr "/��亳�舒�亠仍亳/�仂从舒亢亳 仗�舒亰仆亳 亞��仗亳" +msgstr "/��亳�舒�亠仍亳/�仂从舒亢亳/�从仂仆亳 亰舒 仗�仂�仂从仂仍亳�亠" #: ../pidgin/gtkblist.c:5507 msgid "" @@ -14234,9 +14057,8 @@ #. Widget creation function #: ../pidgin/gtkcertmgr.c:530 -#, fuzzy msgid "SSL Servers" -msgstr "弌亠�于亠�" +msgstr "SSL �亠�于亠�亳" #: ../pidgin/gtkconn.c:180 #, c-format @@ -14260,10 +14082,8 @@ msgstr "�于仂� 仗�亳�舒�亠仍 仆亠 亠 仆舒 亳��亳仂� 仗�仂�仂从仂仍 从舒从仂 于仂 仂于仂� �舒亰亞仂于仂�." #: ../pidgin/gtkconv.c:774 -msgid "" -"You are not currently signed on with an account that can invite that buddy." -msgstr "" -"�亠 ��亠 仄仂仄亠仆�舒仍仆仂 仆舒�舒于亠仆亳 �仂 �仄亠�从舒 从仂�舒 仄仂亢亠 亟舒 亞仂 仗仂从舒仆亳 仂于仂� 仗�亳�舒�亠仍." +msgid "You are not currently signed on with an account that can invite that buddy." +msgstr "�亠 ��亠 仄仂仄亠仆�舒仍仆仂 仆舒�舒于亠仆亳 �仂 �仄亠�从舒 从仂�舒 仄仂亢亠 亟舒 亞仂 仗仂从舒仆亳 仂于仂� 仗�亳�舒�亠仍." #: ../pidgin/gtkconv.c:827 msgid "Invite Buddy Into Chat Room" @@ -14837,9 +14657,8 @@ msgstr "Spanish" #: ../pidgin/gtkdialogs.c:161 -#, fuzzy msgid "Estonian" -msgstr "Bosnian" +msgstr "Estonian" #: ../pidgin/gtkdialogs.c:162 ../pidgin/gtkdialogs.c:163 msgid "Euskera(Basque)" @@ -14926,9 +14745,8 @@ msgstr "Kurdish" #: ../pidgin/gtkdialogs.c:185 -#, fuzzy msgid "Lao" -msgstr "�舒于" +msgstr "Lao" #: ../pidgin/gtkdialogs.c:186 ../pidgin/gtkdialogs.c:252 #: ../pidgin/gtkdialogs.c:253 @@ -15055,7 +14873,7 @@ msgstr "�舒 %s" #: ../pidgin/gtkdialogs.c:400 -#, fuzzy, c-format +#, c-format msgid "" "%s is a graphical modular messaging client based on libpurple which is " "capable of connecting to AIM, MSN, Yahoo!, XMPP, ICQ, IRC, SILC, SIP/SIMPLE, " @@ -15069,7 +14887,7 @@ msgstr "" "%s 亠 亞�舒�亳�从亳 仄仂亟�仍舒�亠仆 从仍亳亠仆� 亰舒 亳�仗�舒�舒�亠 仆舒 仗仂�舒从亳 弍舒亰亳�舒仆 仆舒 libpurple " "从仂� ��仂 亠 �仗仂�仂弍亠仆 亟舒 �亠 于�亰�于舒 仆舒 AIM, MSN, Yahoo!, XMPP, ICQ, IRC, SILC, " -"SIP/SIMPLE, Novell GroupWise, Lotus Sametime, Bonjour, Zephyr, Gadu-Gadu, 亳 " +"SIP/SIMPLE, Novell GroupWise, Lotus Sametime, Bonjour, Zephyr, MySpaceIM, Gadu-Gadu, 亳 " "QQ 仂亟亠亟仆舒�. �舒仗亳�舒仆 亠 �仂 从仂�亳��亠�亠 仆舒 GTK+. <BR><BR>弌仄亠亠�亠 亟舒 �舒 仄亠仆�于舒�亠 亳 " "�亠亟亳���亳弍�亳�舒�亠 仗�仂亞�舒仄舒�舒 �仗仂�亠亟 ��仍仂于亳�亠 于仂 GPL (于亠�亰亳�舒 2 亳仍亳 仗仂仆仂于舒). " "�仂仗亳�舒 仂亟 GPL 亟仂舒�舒 于仂 亟舒�仂�亠从舒�舒 'COPYING' 从仂�舒 ��仂 �亠 亟亳���亳弍�亳�舒 亰舒亠亟仆仂 " @@ -15134,8 +14952,7 @@ msgid "" "Please enter the screen name or alias of the person whose log you would like " "to view." -msgstr "" -"�仆亠�亠�亠 亞仂 亳仄亠�仂 亳仍亳 舒仍亳�舒�仂� 仆舒 仗�亳�舒�亠仍仂� �亳� 仍仂亞 �舒从舒�亠 亟舒 亞仂 仗�亠亞仍亠亟舒�亠." +msgstr "�仆亠�亠�亠 亞仂 亳仄亠�仂 亳仍亳 舒仍亳�舒�仂� 仆舒 仗�亳�舒�亠仍仂� �亳� 仍仂亞 �舒从舒�亠 亟舒 亞仂 仗�亠亞仍亠亟舒�亠." #: ../pidgin/gtkdialogs.c:1020 msgid "Alias Contact" @@ -15224,8 +15041,7 @@ #: ../pidgin/gtkdialogs.c:1247 #, c-format -msgid "" -"You are about to remove %s from your buddy list. Do you want to continue?" +msgid "You are about to remove %s from your buddy list. Do you want to continue?" msgstr "" "丿�仂��从� �亠 仂弍亳亟仂于�亠 亟舒 亞仂/�舒 仂����舒仆亠�亠 %s 仂亟 �舒�舒�舒 仍亳��舒 �仂 仗�亳�舒�亠仍亳. " "�舒仍亳 �舒从舒�亠 亟舒 仗�仂亟仂仍亢亠�亠?" @@ -15276,7 +15092,6 @@ msgstr "�舒仄仂仍�亳 亰于��亳" #: ../pidgin/gtkdocklet.c:535 -#, fuzzy msgid "Blink on new message" msgstr "丐�亠仗从舒� 仆舒 仆仂于舒 仗仂�舒从舒" @@ -15520,9 +15335,8 @@ msgstr "_个仂仆�" #: ../pidgin/gtkimhtmltoolbar.c:1054 -#, fuzzy msgid "Group Items" -msgstr "�亟. 仆舒 亞��仗舒�舒" +msgstr "���仗亳�舒� 仗�亠亟仄亠�亳" #: ../pidgin/gtkimhtmltoolbar.c:1054 msgid "Ungroup Items" @@ -15553,34 +15367,28 @@ msgstr "" #: ../pidgin/gtkimhtmltoolbar.c:1096 -#, fuzzy msgid "Font Face" -msgstr "_�亰亞仍亠亟 仆舒 �仂仆�" +msgstr "�亰亞仍亠亟 仆舒 �仂仆�" #: ../pidgin/gtkimhtmltoolbar.c:1097 -#, fuzzy msgid "Background Color" -msgstr "�仂�_舒 仆舒 仗仂亰舒亟亳仆舒" +msgstr "�仂�舒 仆舒 仗仂亰舒亟亳仆舒" #: ../pidgin/gtkimhtmltoolbar.c:1098 -#, fuzzy msgid "Foreground Color" -msgstr "�仂�舒 仆舒 _�仂仆�" +msgstr "�仂�舒 仆舒 �仂仆�" #: ../pidgin/gtkimhtmltoolbar.c:1100 -#, fuzzy msgid "Reset Formatting" -msgstr "_���亳��亳 �仂�仄舒�亳�舒�亠" +msgstr "�亠�亠�亳�舒� �仂�仄舒�亳�舒�亠" #: ../pidgin/gtkimhtmltoolbar.c:1103 -#, fuzzy msgid "Insert IM Image" msgstr "�仆亠�亳 �仍亳从舒" #: ../pidgin/gtkimhtmltoolbar.c:1104 -#, fuzzy msgid "Insert Smiley" -msgstr "�仆亠�亳 �仍亳从舒" +msgstr "�仆亠�亳 �仄舒�仍亳" #: ../pidgin/gtkimhtmltoolbar.c:1179 msgid "<b>_Bold</b>" @@ -15595,9 +15403,8 @@ msgstr "<u>_�仂亟于仍亠�亠仆仂</u>" #: ../pidgin/gtkimhtmltoolbar.c:1182 -#, fuzzy msgid "<span strikethrough='true'>Strikethrough</span>" -msgstr "<span size='larger'>_�仂亞仂仍亠仄仂</span>" +msgstr "<span size='larger'>��亠�从��舒仆仂</span>" #: ../pidgin/gtkimhtmltoolbar.c:1183 msgid "<span size='larger'>_Larger</span>" @@ -15700,8 +15507,7 @@ "仗�亠�亠�亠仆�舒�舒 亠 仂于仂亰仄仂亢亠仆舒." #: ../pidgin/gtklog.c:557 -msgid "" -"Chats will only be logged if the \"Log all chats\" preference is enabled." +msgid "Chats will only be logged if the \"Log all chats\" preference is enabled." msgstr "" "�舒亰亞仂于仂�亳�亠 �亠 弍亳亟舒� 仍仂亞亳�舒仆亳 �舒仄仂 舒从仂 亠 亳亰弍�舒仆仂 \"�仂亞亳�舒� 亞亳 �亳�亠 �舒亰亞仂于仂�亳" "\"." @@ -15739,7 +15545,7 @@ msgstr "%s %s. ��仂弍舒��亠 `%s -h' 亰舒 仗仂于亠�亠 亳仆�仂�仄舒�亳亳.\n" #: ../pidgin/gtkmain.c:388 -#, fuzzy, c-format +#, c-format msgid "" "%s %s\n" "Usage: %s [OPTION]...\n" @@ -15754,7 +15560,7 @@ " -v, --version display the current version and exit\n" msgstr "" "%s %s\n" -"丕仗仂��亠弍舒: %s [OPTION]...\n" +"丕仗仂��亠弍舒: %s [��丶���]...\n" "\n" " -c, --config=DIR use DIR for config files\n" " -d, --debug print debugging messages to stdout\n" @@ -15766,7 +15572,7 @@ " -v, --version display the current version and exit\n" #: ../pidgin/gtkmain.c:512 -#, fuzzy, c-format +#, c-format msgid "" "%s has segfaulted and attempted to dump a core file.\n" "This is a bug in the software and has happened through\n" @@ -15792,7 +15598,7 @@ "\n" "�从仂 仄仂亢亠�亠 亟舒 �舒 �亠仗�仂亟��亳�舒�亠 亞�亠�从舒�舒, �亠 仄仂仍舒仄, 亳亰于亠��亠�亠\n" "亞亳 �舒亰于亳于舒�亳�亠 �仂 仗�亳�舒于�于舒�亠 仆舒 弍�弍舒�从舒 仆舒:\n" -"%snewticket/\n" +"%ssimpleticket/\n" "\n" "��亳亞��亠�亠 �亠 亟亠从舒 �仂�仆仂 仆舒于亠亟亳于�亠 ��仂 仗�舒于亠于�亠 于仂 �仂舒 于�亠仄亠\n" "亳 亳�仗�舒�亠�亠 �舒 ��舒亞舒�舒 仂亟 亟舒�仂�亠从舒�舒 �仂 �舒亟�仂�仂(core). �从仂 仆亠 亰仆舒亠�亠\n" @@ -15827,12 +15633,12 @@ msgstr[2] "%s 亳仄舒 %d 仆仂于亳 仗仂�舒从亳." #: ../pidgin/gtknotify.c:564 -#, fuzzy, c-format +#, c-format msgid "<b>You have %d new e-mail.</b>" msgid_plural "<b>You have %d new e-mails.</b>" -msgstr[0] "<b>�仄舒�亠 %d 仆仂于舒 亠-仗仂��舒.</b>" -msgstr[1] "<b>�仄舒�亠 %d 仆仂于亳 亠-仗仂��亳.</b>" -msgstr[2] "<b>�仄舒�亠 %d 仆仂于亳 亠-仗仂��亳.</b>" +msgstr[0] "<b>�仄舒�亠 %d 仆仂于舒 仗仂�舒从舒.</b>" +msgstr[1] "<b>�仄舒�亠 %d 仆仂于亳 仗仂�舒从亳.</b>" +msgstr[2] "<b>�仄舒�亠 %d 仆仂于亳 仗仂�舒从亳.</b>" #: ../pidgin/gtknotify.c:989 #, c-format @@ -15850,8 +15656,7 @@ msgstr "��亠�从舒 仗�亳 仍舒仆�亳�舒�亠 仆舒 \"%s\": %s" #: ../pidgin/gtknotify.c:1145 -msgid "" -"The 'Manual' browser command has been chosen, but no command has been set." +msgid "The 'Manual' browser command has been chosen, but no command has been set." msgstr "�亰弍�舒仆舒 亠 �舒�仆舒�舒 从仂仄舒仆亟舒 仆舒 仗�亠仍亳���于舒�仂�, 仆仂 仆亠 亠 仗仂��舒于亠仆舒 从仂仄舒仆亟舒." #: ../pidgin/gtkplugin.c:265 @@ -16460,8 +16265,7 @@ #: ../pidgin/gtkprivacy.c:559 msgid "Please enter the name of the user you wish to be able to contact you." -msgstr "" -"�仆亠�亠�亠 亞仂 亳仄亠�仂 仆舒 从仂�亳�仆亳从仂� �仂 从仂亞仂 仗仂�舒从�于舒�亠 亟舒 仄仂亢亠�亠 亟舒 从仂仆�舒从�亳�舒�亠." +msgstr "�仆亠�亠�亠 亞仂 亳仄亠�仂 仆舒 从仂�亳�仆亳从仂� �仂 从仂亞仂 仗仂�舒从�于舒�亠 亟舒 仄仂亢亠�亠 亟舒 从仂仆�舒从�亳�舒�亠." #: ../pidgin/gtkprivacy.c:562 ../pidgin/gtkprivacy.c:578 msgid "_Permit" @@ -16540,8 +16344,7 @@ #: ../pidgin/gtksavedstatuses.c:337 msgid "Are you sure you want to delete the selected saved statuses?" -msgstr "" -"�舒仍亳 ��亠 �亳亞��仆亳 亟亠从舒 �舒从舒�亠 亟舒 亞亳 亳亰弍�亳�亠�亠 亳亰弍�舒仆亳�亠 亰舒��于舒仆亳 ��舒���亳?" +msgstr "�舒仍亳 ��亠 �亳亞��仆亳 亟亠从舒 �舒从舒�亠 亟舒 亞亳 亳亰弍�亳�亠�亠 亳亰弍�舒仆亳�亠 亰舒��于舒仆亳 ��舒���亳?" #. Use button #: ../pidgin/gtksavedstatuses.c:620 ../pidgin/gtksavedstatuses.c:1266 @@ -16686,8 +16489,7 @@ #: ../pidgin/gtkutils.c:2641 #, c-format msgid "The file '%s' is too large for %s. Please try a smaller image.\n" -msgstr "" -"�舒�仂�亠从舒�舒 ��%s�� 亠 仗�亠亞仂仍亠仄舒 亰舒 %s. �亠 仄仂仍舒仄, 仗�仂弍舒��亠 �仂 仗仂仄舒仍舒 �仍亳从舒.\n" +msgstr "�舒�仂�亠从舒�舒 ��%s�� 亠 仗�亠亞仂仍亠仄舒 亰舒 %s. �亠 仄仂仍舒仄, 仗�仂弍舒��亠 �仂 仗仂仄舒仍舒 �仍亳从舒.\n" #: ../pidgin/gtkutils.c:2643 msgid "Icon Error" @@ -16704,8 +16506,7 @@ #: ../pidgin/gtkutils.c:2793 #, c-format -msgid "" -"Failed to load image '%s': reason not known, probably a corrupt image file" +msgid "Failed to load image '%s': reason not known, probably a corrupt image file" msgstr "" "�亠 ��仗亠舒于 亟舒 �舒 于�亳�舒仄 �仍亳从舒�舒 ��%s��: 仗�亳�亳仆亳�亠 仆亠 �亠 仗仂亰仆舒�亳, 仆舒�于亠�仂�舒�仆仂 " "�仍亳从舒�舒 亠 仂��亠�亠仆舒" @@ -16870,8 +16671,7 @@ #. *< version #. *< summary #: ../pidgin/plugins/contact_priority.c:190 -msgid "" -"Allows for controlling the values associated with different buddy states." +msgid "Allows for controlling the values associated with different buddy states." msgstr "" "�于仂亰仄仂亢�于舒 从仂仆��仂仍舒 仆舒 于�亠亟仆仂��亳�亠 舒�仂�亳�舒仆亳 �仂 �舒亰仍亳�仆亳 �仂��仂�弍亳 仆舒 " "仗�亳�舒�亠仍亳�亠." @@ -16953,8 +16753,7 @@ #: ../pidgin/plugins/extplacement.c:117 msgid "Separate IM and Chat windows when placing by number" -msgstr "" -"�亟亟亠仍仆亳 仗�仂亰仂��亳 亰舒 IM 亳 仗�仂亰仂��亳 亰舒 �舒亰亞仂于仂�亳 从仂亞舒 �亠 仗仂��舒于�于舒舒� 仗仂 弍�仂�" +msgstr "�亟亟亠仍仆亳 仗�仂亰仂��亳 亰舒 IM 亳 仗�仂亰仂��亳 亰舒 �舒亰亞仂于仂�亳 从仂亞舒 �亠 仗仂��舒于�于舒舒� 仗仂 弍�仂�" #. *< type #. *< ui_requirement @@ -17707,8 +17506,7 @@ #. * description #: ../pidgin/plugins/timestamp.c:207 msgid "Display iChat-style timestamps every N minutes." -msgstr "" -"�仂亟舒于舒 于�亠仄亠仆�从亳 仂亰仆舒从亳 于仂 ��亳仍仂� 仆舒 iChat 于仂 �舒亰亞仂于仂�亳�亠 仆舒 �亠从仂亳 N 仄亳仆��亳." +msgstr "�仂亟舒于舒 于�亠仄亠仆�从亳 仂亰仆舒从亳 于仂 ��亳仍仂� 仆舒 iChat 于仂 �舒亰亞仂于仂�亳�亠 仆舒 �亠从仂亳 N 仄亳仆��亳." #: ../pidgin/plugins/timestamp_format.c:23 msgid "Timestamp Format Options" @@ -17879,8 +17677,7 @@ msgstr "�仗�亳亳 仆舒仄亠仆亠�亳 亰舒 Pidgin 亰舒 Windows." #: ../pidgin/plugins/win32/winprefs/winprefs.c:374 -msgid "" -"Provides options specific to Pidgin for Windows , such as buddy list docking." +msgid "Provides options specific to Pidgin for Windows , such as buddy list docking." msgstr "" "�于仂亰仄仂亢�于舒 仂仗�亳亳 仆舒仄亠仆亠�亳 亰舒 Pidgin 亰舒 Windows, 从舒从仂 ��仂 �亠 仗�亳从舒��于舒�亠 仆舒 " "仍亳��舒�舒 �仂 仗�亳�舒�亠仍亳 亳 ��亠仗从舒�亠 仆舒 �舒亰亞仂于仂�亳�亠." @@ -17932,130 +17729,3 @@ msgid "This plugin is useful for debbuging XMPP servers or clients." msgstr "�于仂� 仗�亳从仍��仂从 亠 从仂�亳�亠仆 亰舒 亟亠弍舒亞亳�舒�亠 仆舒 XMPP �亠�于亠�亳 亳仍亳 从仍亳亠仆�亳." -#, fuzzy -#~ msgid "Offline buddies" -#~ msgstr "�仂从舒亢亳 亳�从仍��亠仆亳 仗�亳�舒�亠仍亳" - -#, fuzzy -#~ msgid "Sort" -#~ msgstr "�仂��舒" - -#, fuzzy -#~ msgid "By Status" -#~ msgstr "�仂 ��舒���" - -#, fuzzy -#~ msgid "By Log Size" -#~ msgstr "�仂 亞仂仍亠仄亳仆舒 仆舒 仍仂亞" - -#, fuzzy -#~ msgid "Unable to connect to contact server" -#~ msgstr "�亠 仄仂亢舒仄 亟舒 �亠 仗仂于�亰舒仄 �仂 �亠�于亠�仂�." - -#, fuzzy -#~ msgid "Unable to retrieve MSN Address Book" -#~ msgstr "�亟弍亠�亠�亠 舒亟�亠�舒� 亰舒 弍亠仍亠�从亳" - -#, fuzzy -#~ msgid "Current media" -#~ msgstr "丐亠从仂于亠仆 亰仆舒从" - -#, fuzzy -#~ msgid "Windows Live Messenger Protocol Plugin" -#~ msgstr "�仂亟舒�仂从 亰舒 Novell GroupWise Messenger" - -#, fuzzy -#~ msgid "Windows Live ID authentication Failed" -#~ msgstr "�亠��仗亠�: �于�仂�亳亰亳�舒�亠�仂 仆亠 ��仗亠舒" - -#~ msgid "%s just sent you a Nudge!" -#~ msgstr "%s ��仂��从� �亳 亳�仗�舒�亳 Nudge!" - -#, fuzzy -#~ msgid "Unknown error (%d)" -#~ msgstr "�亠仗仂亰仆舒�舒 亞�亠�从舒" - -#, fuzzy -#~ msgid "Unable to connect to OIM server" -#~ msgstr "�亠 仄仂亢舒仄 亟舒 �亠 仗仂于�亰舒仄 �仂 �亠�于亠�仂�." - -#, fuzzy -#~ msgid "%s (%s) changed status from %s to %s" -#~ msgstr "%s 亞仂 �仄亠仆亳 ��舒���仂� 仂亟 %s 于仂 %s" - -#, fuzzy -#~ msgid "%s (%s) is now %s" -#~ msgstr "%s �亠亞舒 亠 %s" - -#, fuzzy -#~ msgid "%s (%s) is no longer %s" -#~ msgstr "%s 仆亠 亠 于亠�亠 %s" - -#, fuzzy -#~ msgid "_Merge" -#~ msgstr "_�仂�舒从舒:" - -#, fuzzy -#~ msgid "_Send File..." -#~ msgstr "_��仗�舒�亳 亟舒�仂�亠从舒" - -#, fuzzy -#~ msgid "Add Buddy _Pounce..." -#~ msgstr "�仂亟舒� 亟亠���于仂 亰舒 仗�亳�舒�亠仍..." - -#, fuzzy -#~ msgid "Hide when offline" -#~ msgstr "�亠 亠 亟仂亰于仂仍亠仆 亟仂亟亠从舒 ��亠 亳�从仍��亠仆亳" - -#, fuzzy -#~ msgid "Show when offline" -#~ msgstr "�亠 亠 亟仂亰于仂仍亠仆 亟仂亟亠从舒 ��亠 亳�从仍��亠仆亳" - -#, fuzzy -#~ msgid "Add _Buddy..." -#~ msgstr "�仂亟舒� 仗�亳�舒�亠仍" - -#, fuzzy -#~ msgid "Add C_hat..." -#~ msgstr "�仂亟舒� �舒亰亞仂于仂�" - -#, fuzzy -#~ msgid "Persistent" -#~ msgstr "Persian" - -#, fuzzy -#~ msgid "/Accounts/Manage" -#~ msgstr "/弌仄亠�从亳" - -#, fuzzy -#~ msgid "A_ccount:" -#~ msgstr "弌仄亠�从舒:" - -#, fuzzy -#~ msgid "S_end To" -#~ msgstr "��仗�舒�亳 仆舒" - -#, fuzzy -#~ msgid "_Smile!" -#~ msgstr "弌仄舒�仍亳!" - -#~ msgid "You have just sent a Nudge!" -#~ msgstr "弌舒仄仂 ��仂 亳�仗�舒�亳于�亠 Nudge!" - -#~ msgid "Would like to add him?" -#~ msgstr "�舒仍亳 �舒从舒�亠 亟舒 亞仂 亟仂亟舒亟亠�亠?" - -#~ msgid "%s just sent you a Buzz!" -#~ msgstr "%s ��仂��从� �亳 亳�仗�舒�亳 Buzz!" - -#~ msgid "You have just sent a Buzz!" -#~ msgstr "弌舒仄仂 ��仂 亳�仗�舒�亳于�亠 Buzz!" - -#~ msgid "/Options/Show Buddy _Icon" -#~ msgstr "/�仗�亳亳/�仂从舒亢亳 亳从仂仆舒 仆舒 _仗�亳�舒�亠仍" - -#~ msgid "/Options/Show Buddy Icon" -#~ msgstr "/�仗�亳亳/�仂从舒亢亳 亳从仂仆舒 仆舒 仗�亳�舒�亠仍" - -#~ msgid "Norwegian" -#~ msgstr "Norwegian"