# HG changeset patch # User Marcus Lundblad # Date 1229382639 0 # Node ID 16b901793d7ccdfe9e7d65f70be339b3d7453906 # Parent 694591875bc936de837c3f0a0d840c5cf6ec7223# Parent 841eb21e96fe4ad9df505d871d4ee5da5d462028 propagate from branch 'im.pidgin.pidgin' (head 932c83e821824239896f933e32349175efb85741) to branch 'im.pidgin.cpw.malu.xmpp.ibb_ft' (head eaa42a57f083078db328e6931d9bb4e0db8180c6) diff -r 841eb21e96fe -r 16b901793d7c COPYRIGHT --- a/COPYRIGHT Sat Dec 13 10:52:10 2008 +0000 +++ b/COPYRIGHT Mon Dec 15 23:10:39 2008 +0000 @@ -272,6 +272,7 @@ David Mohr Andrew Molloy Michael Monreal +Laurent Montaron Marco Monteiro Benjamin Moody John Moody diff -r 841eb21e96fe -r 16b901793d7c ChangeLog --- a/ChangeLog Sat Dec 13 10:52:10 2008 +0000 +++ b/ChangeLog Mon Dec 15 23:10:39 2008 +0000 @@ -1,18 +1,12 @@ Pidgin and Finch: The Pimpin' Penguin IM Clients That're Good for the Soul -version 2.5.3 (??/??/????): +version 2.5.3 (12/??/2008): libpurple: - * Fix an error with MSN offline messages by shipping the *new* - "Microsoft Secure Server Authority" and the - "Microsoft Internet Authority" certificates. People that use - --with-system-ssl-certs and GnuTLS need to include these in the - system certs directory. * Corrected maximum message lengths for Yahoo! * The Buddy State Notification plugin no longer prints duplicate notifications when the same buddy is in multiple groups (Florian Quèze) * The Buddy State Notification plugin no longer turns JID's, MSN Passport ID's, etc. into links (Florian Quèze) - * Fix a crash in SIMPLE when a malformed message is received. * purple-remote now has a "getstatusmessage" command to retrieve the text of the current status message. * Various fixes to the nullprpl (Paul Aurich) @@ -20,14 +14,16 @@ connected (Paul Aurich) * Fix a crash in purple_accounts_delete that happens when this function is called before the buddy list is initialized (Florian Quèze) - * On MSN, the Games and Office media can now be set and displayed (in - addition to the previous Music media). The Media status text now shows - the album, if possible. * Fix use of av_len in perl bindings to fix some off-by-one bugs (Paul Aurich) * On ICQ, advertise the ICQ 6 typing capability. This should fix the reports of typing notifications not working with third-party clients (Jaromír Karmazín) + * Many QQ fixes and improvements, including the ability to connect + using QQ2008 protocol and sending/receiving of long messages. + * Fix a crash with DNS SRV lookups (Florian Quèze) + * Fix insanely long idle times for Sametime 7.5 buddies by assuming 0 idle + time if the idle timestamp is in the future (Laurent Montaron) Gadu-Gadu: * Fix some problems with Gadu-Gadu buddy icons (Adam Strzelecki) @@ -35,6 +31,26 @@ * Gadu-Gadu now does proper charset translations where needed (Adam Strzelecki) + MSN: + * Fix an error with offline messages by shipping the *new* "Microsoft + Secure Server Authority" and the "Microsoft Internet Authority" + certificates. These are now always installed even when using + --with-system-ssl-certs because most systems don't ship those + intermediate certificates. + * The Games and Office media can now be set and displayed (in addition + to the previous Music media). The Media status text now shows the + album, if possible. + * Messages sent from a mobile device while you were offline are now + correctly received. + * Server transfers after you've been connected for a long time should + now be handled correctly. + * Many other fixes and code cleanup. + + SIMPLE: + * Fix a crash when a malformed message is received. + * Don't allow connecting accounts if no server name has been specified + (Florian Quèze) + XMPP: * Fix the namespace URL we look for in PEP reply stanzas to match the URL used in the 'get' requests (Paul Aurich) diff -r 841eb21e96fe -r 16b901793d7c libpurple/certificate.c --- a/libpurple/certificate.c Sat Dec 13 10:52:10 2008 +0000 +++ b/libpurple/certificate.c Mon Dec 15 23:10:39 2008 +0000 @@ -748,9 +748,9 @@ # ifdef SSL_CERTIFICATES_DIR x509_ca_paths = g_list_append(NULL, g_strdup(SSL_CERTIFICATES_DIR)); # else - x509_ca_paths = g_list_append(NULL, g_build_filename(DATADIR, - "purple", "ca-certs", NULL)); # endif + x509_ca_paths = g_list_append(x509_ca_paths, + g_build_filename(DATADIR, "purple", "ca-certs", NULL)); #endif } diff -r 841eb21e96fe -r 16b901793d7c libpurple/dnssrv.c --- a/libpurple/dnssrv.c Sat Dec 13 10:52:10 2008 +0000 +++ b/libpurple/dnssrv.c Mon Dec 15 23:10:39 2008 +0000 @@ -336,6 +336,12 @@ static gboolean initialized = FALSE; #endif + if (!protocol || !*protocol || !transport || !*transport || !domain || !*domain) { + purple_debug_error("dnssrv", "Wrong arguments\n"); + cb(NULL, 0, extradata); + g_return_val_if_reached(NULL); + } + query = g_strdup_printf("_%s._%s.%s", protocol, transport, domain); purple_debug_info("dnssrv","querying SRV record for %s\n", query); diff -r 841eb21e96fe -r 16b901793d7c libpurple/protocols/jabber/message.c --- a/libpurple/protocols/jabber/message.c Sat Dec 13 10:52:10 2008 +0000 +++ b/libpurple/protocols/jabber/message.c Mon Dec 15 23:10:39 2008 +0000 @@ -571,12 +571,39 @@ for(child = packet->child; child; child = child->next) { const char *xmlns = xmlnode_get_namespace(child); - if(!xmlns) - xmlns = ""; if(child->type != XMLNODE_TYPE_TAG) continue; - if(!strcmp(child->name, "subject") && !strcmp(xmlns,"jabber:client")) { + if(!strcmp(child->name, "error")) { + const char *code = xmlnode_get_attrib(child, "code"); + char *code_txt = NULL; + char *text = xmlnode_get_data(child); + if (!text) { + xmlnode *enclosed_text_node; + + if ((enclosed_text_node = xmlnode_get_child(child, "text"))) + text = xmlnode_get_data(enclosed_text_node); + } + + if(code) + code_txt = g_strdup_printf(_("(Code %s)"), code); + + if(!jm->error) + jm->error = g_strdup_printf("%s%s%s", + text ? text : "", + text && code_txt ? " " : "", + code_txt ? code_txt : ""); + + g_free(code_txt); + g_free(text); + } else if (xmlns == NULL) { + /* QuLogic: Not certain this is correct, but it would have happened + with the previous code. */ + if(!strcmp(child->name, "x")) + jm->etc = g_list_append(jm->etc, child); + /* The following tests expect xmlns != NULL */ + continue; + } else if(!strcmp(child->name, "subject") && !strcmp(xmlns,"jabber:client")) { if(!jm->subject) jm->subject = xmlnode_get_data(child); } else if(!strcmp(child->name, "thread") && !strcmp(xmlns,"jabber:client")) { @@ -706,46 +733,24 @@ jm->eventitems = g_list_append(jm->eventitems, items); } else if(!strcmp(child->name, "attention") && !strcmp(xmlns,"http://www.xmpp.org/extensions/xep-0224.html#ns")) { jm->hasBuzz = TRUE; - } else if(!strcmp(child->name, "error")) { - const char *code = xmlnode_get_attrib(child, "code"); - char *code_txt = NULL; - char *text = xmlnode_get_data(child); - if (!text) { - xmlnode *enclosed_text_node; - - if ((enclosed_text_node = xmlnode_get_child(child, "text"))) - text = xmlnode_get_data(enclosed_text_node); - } - - if(code) - code_txt = g_strdup_printf(_("(Code %s)"), code); - - if(!jm->error) - jm->error = g_strdup_printf("%s%s%s", - text ? text : "", - text && code_txt ? " " : "", - code_txt ? code_txt : ""); - - g_free(code_txt); - g_free(text); - } else if(!strcmp(child->name, "delay") && xmlns && !strcmp(xmlns,"urn:xmpp:delay")) { + } else if(!strcmp(child->name, "delay") && !strcmp(xmlns,"urn:xmpp:delay")) { const char *timestamp = xmlnode_get_attrib(child, "stamp"); jm->delayed = TRUE; if(timestamp) jm->sent = purple_str_to_time(timestamp, TRUE, NULL, NULL, NULL); } else if(!strcmp(child->name, "x")) { - if(xmlns && !strcmp(xmlns, "jabber:x:event")) { + if(!strcmp(xmlns, "jabber:x:event")) { if(xmlnode_get_child(child, "composing")) { if(jm->chat_state == JM_STATE_ACTIVE) jm->chat_state = JM_STATE_COMPOSING; jm->typing_style |= JM_TS_JEP_0022; } - } else if(xmlns && !strcmp(xmlns, "jabber:x:delay")) { + } else if(!strcmp(xmlns, "jabber:x:delay")) { const char *timestamp = xmlnode_get_attrib(child, "stamp"); jm->delayed = TRUE; if(timestamp) jm->sent = purple_str_to_time(timestamp, TRUE, NULL, NULL, NULL); - } else if(xmlns && !strcmp(xmlns, "jabber:x:conference") && + } else if(!strcmp(xmlns, "jabber:x:conference") && jm->type != JABBER_MESSAGE_GROUPCHAT_INVITE && jm->type != JABBER_MESSAGE_ERROR) { const char *jid = xmlnode_get_attrib(child, "jid"); @@ -754,8 +759,7 @@ g_free(jm->to); jm->to = g_strdup(jid); } - } else if(xmlns && !strcmp(xmlns, - "http://jabber.org/protocol/muc#user") && + } else if(!strcmp(xmlns, "http://jabber.org/protocol/muc#user") && jm->type != JABBER_MESSAGE_ERROR) { xmlnode *invite = xmlnode_get_child(child, "invite"); if(invite) { diff -r 841eb21e96fe -r 16b901793d7c libpurple/protocols/jabber/presence.c --- a/libpurple/protocols/jabber/presence.c Sat Dec 13 10:52:10 2008 +0000 +++ b/libpurple/protocols/jabber/presence.c Mon Dec 15 23:10:39 2008 +0000 @@ -502,17 +502,19 @@ priority = atoi(p); g_free(p); } + } else if(xmlns == NULL) { + /* The rest of the cases used to check xmlns individually. */ + continue; } else if(!strcmp(y->name, "delay") && !strcmp(xmlns, "urn:xmpp:delay")) { /* XXX: compare the time. jabber:x:delay can happen on presence packets that aren't really and truly delayed */ delayed = TRUE; - } else if(xmlns && !strcmp(y->name, "c") && !strcmp(xmlns, "http://jabber.org/protocol/caps")) { + } else if(!strcmp(y->name, "c") && !strcmp(xmlns, "http://jabber.org/protocol/caps")) { caps = y; /* store for later, when creating buddy resource */ } else if(!strcmp(y->name, "x")) { - const char *xmlns = xmlnode_get_namespace(y); - if(xmlns && !strcmp(xmlns, "jabber:x:delay")) { + if(!strcmp(xmlns, "jabber:x:delay")) { /* XXX: compare the time. jabber:x:delay can happen on presence packets that aren't really and truly delayed */ delayed = TRUE; - } else if(xmlns && !strcmp(xmlns, "http://jabber.org/protocol/muc#user")) { + } else if(!strcmp(xmlns, "http://jabber.org/protocol/muc#user")) { xmlnode *z; muc = TRUE; @@ -555,7 +557,7 @@ flags |= PURPLE_CBFLAGS_VOICE; } } - } else if(xmlns && !strcmp(xmlns, "vcard-temp:x:update")) { + } else if(!strcmp(xmlns, "vcard-temp:x:update")) { xmlnode *photo = xmlnode_get_child(y, "photo"); if(photo) { g_free(avatar_hash); diff -r 841eb21e96fe -r 16b901793d7c libpurple/protocols/msn/contact.c --- a/libpurple/protocols/msn/contact.c Sat Dec 13 10:52:10 2008 +0000 +++ b/libpurple/protocols/msn/contact.c Mon Dec 15 23:10:39 2008 +0000 @@ -224,19 +224,24 @@ char *member_id = xmlnode_get_data(xmlnode_get_child(member, "MembershipId")); MsnUser *user = msn_userlist_find_add_user(session->userlist, passport, NULL); xmlnode *annotation; - guint nid = MSN_NETWORK_PASSPORT; + guint nid = MSN_NETWORK_UNKNOWN; - for (annotation = xmlnode_get_child(member, "Annotations/Annotation"); - annotation; - annotation = xmlnode_get_next_twin(annotation)) { - char *name = xmlnode_get_data(xmlnode_get_child(annotation, "Name")); - if (name && !strcmp(name, "MSN.IM.BuddyType")) { - char *value = xmlnode_get_data(xmlnode_get_child(annotation, "Value")); - if (value != NULL) - nid = strtoul(value, NULL, 10); - g_free(value); + /* For EmailMembers, the network must be found in the annotations. */ + if (!strcmp(node, "PassportName")) { + nid = MSN_NETWORK_PASSPORT; + } else { + for (annotation = xmlnode_get_child(member, "Annotations/Annotation"); + annotation; + annotation = xmlnode_get_next_twin(annotation)) { + char *name = xmlnode_get_data(xmlnode_get_child(annotation, "Name")); + if (name && !strcmp(name, "MSN.IM.BuddyType")) { + char *value = xmlnode_get_data(xmlnode_get_child(annotation, "Value")); + if (value != NULL) + nid = strtoul(value, NULL, 10); + g_free(value); + } + g_free(name); } - g_free(name); } purple_debug_info("msn", "CL: %s name: %s, Type: %s, MembershipID: %s, NetworkID: %u\n", diff -r 841eb21e96fe -r 16b901793d7c libpurple/protocols/msn/msg.c --- a/libpurple/protocols/msn/msg.c Sat Dec 13 10:52:10 2008 +0000 +++ b/libpurple/protocols/msn/msg.c Mon Dec 15 23:10:39 2008 +0000 @@ -231,6 +231,25 @@ { const char *key, *value; + /* If this line starts with whitespace, it's been folded from the + previous line and won't have ':'. */ + if ((**cur == ' ') || (**cur == '\t')) { + tokens = g_strsplit(g_strchug(*cur), "=\"", 2); + key = tokens[0]; + value = tokens[1]; + + /* The only one I care about is 'boundary' (which is folded from + the key 'Content-Type'), so only process that. */ + if (!strcmp(key, "boundary")) { + char *end = strchr(value, '\"'); + *end = '\0'; + msn_message_set_attr(msg, key, value); + } + + g_strfreev(tokens); + continue; + } + tokens = g_strsplit(*cur, ": ", 2); key = tokens[0]; diff -r 841eb21e96fe -r 16b901793d7c libpurple/protocols/msn/msn.c --- a/libpurple/protocols/msn/msn.c Sat Dec 13 10:52:10 2008 +0000 +++ b/libpurple/protocols/msn/msn.c Mon Dec 15 23:10:39 2008 +0000 @@ -1418,6 +1418,7 @@ MsnSession *session; MsnUserList *userlist; const char *who; + MsnUser *user; session = gc->proto_data; userlist = session->userlist; @@ -1446,9 +1447,10 @@ /* XXX - Would group ever be NULL here? I don't think so... * shx: Yes it should; MSN handles non-grouped buddies, and this is only * internal. */ - if (msn_userlist_find_user(userlist, who) != NULL) { - /* We already know this buddy. This function takes care of users - already in the list and stuff... */ + user = msn_userlist_find_user(userlist, who); + if ((user != NULL) && (user->networkid != MSN_NETWORK_UNKNOWN)) { + /* We already know this buddy and their network. This function knows + what to do with users already in the list and stuff... */ msn_userlist_add_buddy(userlist, who, group ? group->name : NULL); } else { /* We need to check the network for this buddy first */ diff -r 841eb21e96fe -r 16b901793d7c libpurple/protocols/msn/notification.c --- a/libpurple/protocols/msn/notification.c Sat Dec 13 10:52:10 2008 +0000 +++ b/libpurple/protocols/msn/notification.c Mon Dec 15 23:10:39 2008 +0000 @@ -1958,7 +1958,7 @@ void msn_notification_add_buddy_to_list(MsnNotification *notification, MsnListId list_id, - const char *who) + MsnUser *user) { MsnCmdProc *cmdproc; MsnListOp list_op = 1 << list_id; @@ -1971,8 +1971,8 @@ adl_node = xmlnode_new("ml"); adl_node->child = NULL; - msn_add_contact_xml(notification->session, adl_node, who, list_op, - MSN_NETWORK_PASSPORT); + msn_add_contact_xml(notification->session, adl_node, user->passport, + list_op, user->networkid); payload = xmlnode_to_str(adl_node,&payload_len); xmlnode_free(adl_node); @@ -1984,7 +1984,7 @@ void msn_notification_rem_buddy_from_list(MsnNotification *notification, MsnListId list_id, - const char *who) + MsnUser *user) { MsnCmdProc *cmdproc; MsnTransaction *trans; @@ -1998,7 +1998,8 @@ rml_node = xmlnode_new("ml"); rml_node->child = NULL; - msn_add_contact_xml(notification->session, rml_node, who, list_op, MSN_NETWORK_PASSPORT); + msn_add_contact_xml(notification->session, rml_node, user->passport, + list_op, user->networkid); payload = xmlnode_to_str(rml_node, &payload_len); xmlnode_free(rml_node); diff -r 841eb21e96fe -r 16b901793d7c libpurple/protocols/msn/notification.h --- a/libpurple/protocols/msn/notification.h Sat Dec 13 10:52:10 2008 +0000 +++ b/libpurple/protocols/msn/notification.h Mon Dec 15 23:10:39 2008 +0000 @@ -42,6 +42,7 @@ #include "session.h" #include "servconn.h" #include "cmdproc.h" +#include "user.h" struct _MsnNotification { @@ -64,9 +65,9 @@ void msn_notification_init(void); void msn_notification_add_buddy_to_list(MsnNotification *notification, - MsnListId list_id, const char *who); + MsnListId list_id, MsnUser *user); void msn_notification_rem_buddy_from_list(MsnNotification *notification, - MsnListId list_id, const char *who); + MsnListId list_id, MsnUser *user); void msn_notification_send_fqy(MsnSession *session, const char *passport); diff -r 841eb21e96fe -r 16b901793d7c libpurple/protocols/msn/oim.c --- a/libpurple/protocols/msn/oim.c Sat Dec 13 10:52:10 2008 +0000 +++ b/libpurple/protocols/msn/oim.c Mon Dec 15 23:10:39 2008 +0000 @@ -594,47 +594,91 @@ msn_oim_report_to_user(MsnOimRecvData *rdata, const char *msg_str) { MsnMessage *message; - char *date,*from,*decode_msg; + const char *date; + const char *from; + char *decode_msg = NULL; gsize body_len; char **tokens; - char *start,*end; - int has_nick = 0; - char *passport_str, *passport; + char *passport = NULL; 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); + MSG_OIM_LINE_DEM, MSG_OIM_BODY_DEM); purple_debug_info("msn", "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"); - if (strstr(from," ")) { - has_nick = 1; - } - if (has_nick) { - tokens = g_strsplit(from , " " , 2); - passport_str = g_strdup(tokens[1]); - purple_debug_info("msn", "oim Date:{%s},nickname:{%s},tokens[1]:{%s} passport{%s}\n", - date, tokens[0], tokens[1], passport_str); + + if (!strcmp(msn_message_get_attr(message, "X-OIMProxy"), "MOSMS")) { + char *boundary; + char **part; + + from = msn_message_get_attr(message, "X-OIM-originatingSource"); + + /* Match number to user's mobile number, FROM is a phone number + if the other side pages you using your phone number */ + if (!strncmp(from, "tel:+", 5)) { + MsnUser *user = msn_userlist_find_user_with_mobile_phone( + rdata->oim->session->userlist, from + 4); + + if (user && user->passport) + passport = g_strdup(user->passport); + } + if (passport == NULL) + passport = g_strdup(from); + + boundary = g_strdup_printf("--%s" MSG_OIM_LINE_DEM, + msn_message_get_attr(message, "boundary")); + tokens = g_strsplit(message->body, boundary, 0); + + /* tokens+1 to skip the "This is a multipart message..." text */ + for (part = tokens+1; *part != NULL; part++) { + MsnMessage *multipart; + const char *type; + multipart = msn_message_new(MSN_MSG_UNKNOWN); + msn_message_parse_payload(multipart, *part, strlen(*part), + MSG_OIM_LINE_DEM, MSG_OIM_BODY_DEM); + + type = msn_message_get_content_type(multipart); + if (type && !strcmp(type, "text/plain")) { + decode_msg = (char *)purple_base64_decode(multipart->body, &body_len); + msn_message_destroy(multipart); + break; + } + msn_message_destroy(multipart); + } + g_strfreev(tokens); + g_free(boundary); + + if (decode_msg == NULL) { + purple_debug_error("msn", "Couldn't find text/plain OIM message.\n"); + g_free(passport); + return; + } } else { - passport_str = g_strdup(from); - purple_debug_info("msn", "oim Date:{%s},passport{%s}\n", - date, passport_str); + char *start, *end; + + from = msn_message_get_attr(message, "From"); + decode_msg = (char *)purple_base64_decode(message->body, &body_len); + + tokens = g_strsplit(from, " ", 2); + if (tokens[1] != NULL) + from = (const char *)tokens[1]; + + start = strchr(from, '<') + 1; + end = strchr(from, '>'); + passport = g_strndup(start, end - start); + + g_strfreev(tokens); } - start = strstr(passport_str,"<"); - start += 1; - end = strstr(passport_str,">"); - passport = g_strndup(start,end - start); - g_free(passport_str); - purple_debug_info("msn", "oim Date:{%s},passport{%s}\n", date, passport); + date = msn_message_get_attr(message, "Date"); stamp = msn_oim_parse_timestamp(date); + purple_debug_info("msn", "oim Date:{%s},passport{%s}\n", + date, passport); serv_got_im(rdata->oim->session->account->gc, passport, decode_msg, 0, - stamp); + 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 diff -r 841eb21e96fe -r 16b901793d7c libpurple/protocols/msn/session.c --- a/libpurple/protocols/msn/session.c Sat Dec 13 10:52:10 2008 +0000 +++ b/libpurple/protocols/msn/session.c Mon Dec 15 23:10:39 2008 +0000 @@ -448,25 +448,23 @@ PurpleConnection *gc; PurpleStoredImage *img; - if (session->logged_in) - return; - - account = session->account; - gc = purple_account_get_connection(account); + if (!session->logged_in) { + account = session->account; + gc = purple_account_get_connection(account); - img = purple_buddy_icons_find_account_icon(session->account); - /* TODO: Do we really want to call this if img is NULL? */ - msn_user_set_buddy_icon(session->user, img); - if (img != NULL) - purple_imgstore_unref(img); + img = purple_buddy_icons_find_account_icon(session->account); + /* TODO: Do we really want to call this if img is NULL? */ + msn_user_set_buddy_icon(session->user, img); + if (img != NULL) + purple_imgstore_unref(img); - session->logged_in = TRUE; + session->logged_in = TRUE; + purple_connection_set_state(gc, PURPLE_CONNECTED); + + /* Sync users */ + msn_session_sync_users(session); + } msn_change_status(session); - - purple_connection_set_state(gc, PURPLE_CONNECTED); - - /* Sync users */ - msn_session_sync_users(session); } diff -r 841eb21e96fe -r 16b901793d7c libpurple/protocols/msn/soap.c --- a/libpurple/protocols/msn/soap.c Sat Dec 13 10:52:10 2008 +0000 +++ b/libpurple/protocols/msn/soap.c Mon Dec 15 23:10:39 2008 +0000 @@ -505,7 +505,7 @@ purple_debug_info("soap", "read: %s\n", g_strerror(perrno)); #ifndef MSN_UNSAFE_DEBUG - if (conn->current_request->secure) + if (conn->current_request && conn->current_request->secure) purple_debug_misc("soap", "Received secure request.\n"); else #endif diff -r 841eb21e96fe -r 16b901793d7c libpurple/protocols/msn/userlist.c --- a/libpurple/protocols/msn/userlist.c Sat Dec 13 10:52:10 2008 +0000 +++ b/libpurple/protocols/msn/userlist.c Mon Dec 15 23:10:39 2008 +0000 @@ -668,7 +668,7 @@ msn_user_unset_op(user, list_op); - msn_notification_rem_buddy_from_list(userlist->session->notification, list_id, who); + msn_notification_rem_buddy_from_list(userlist->session->notification, list_id, user); } /*add buddy*/ @@ -775,6 +775,7 @@ /*MsnNetwork*/ int network) { MsnUser *user = NULL; + MsnUser *user2; GList *l; char *group; @@ -793,13 +794,18 @@ return; } - /* Bit of a hack, but by adding to userlist now, the rest of the code - * will know what network to use. - */ + group = msn_user_remove_pending_group(user); + + user2 = msn_userlist_find_user(userlist, who); + if (user2 != NULL) { + /* User already in userlist, so just update it. */ + msn_user_destroy(user); + user = user2; + } else { + msn_userlist_add_user(userlist, user); + } + msn_user_set_network(user, network); - msn_userlist_add_user(userlist, user); - - group = msn_user_remove_pending_group(user); msn_userlist_add_buddy(userlist, who, group); g_free(group); } @@ -829,7 +835,7 @@ msn_user_set_op(user, list_op); - msn_notification_add_buddy_to_list(userlist->session->notification, list_id, who); + msn_notification_add_buddy_to_list(userlist->session->notification, list_id, user); } gboolean diff -r 841eb21e96fe -r 16b901793d7c libpurple/protocols/myspace/markup.c --- a/libpurple/protocols/myspace/markup.c Sat Dec 13 10:52:10 2008 +0000 +++ b/libpurple/protocols/myspace/markup.c Mon Dec 15 23:10:39 2008 +0000 @@ -81,7 +81,9 @@ * 1 2 3 4 5 6 7 */ static gdouble _font_scale[] = { .85, .95, 1, 1.2, 1.44, 1.728, 2.0736 }; -#define MAX_FONT_SIZE 7 /* Purple maximum font size */ +/* Purple maximum font size. Equivalent to sizeof(_font_scale) / sizeof(_font_scale[0]) */ +#define MAX_FONT_SIZE 7 + #define POINTS_PER_INCH 72 /* How many pt's in an inch */ /* Text formatting bits for */ @@ -116,15 +118,11 @@ msim_point_to_purple_size(MsimSession *session, guint point) { guint size, this_point, base; - gdouble scale; base = purple_account_get_int(session->account, "base_font_size", MSIM_BASE_FONT_POINT_SIZE); - for (size = 0; - size < sizeof(_font_scale) / sizeof(_font_scale[0]); - ++size) { - scale = _font_scale[CLAMP(size, 1, MAX_FONT_SIZE) - 1]; - this_point = (guint)msim_round(scale * base); + for (size = 0; size < MAX_FONT_SIZE; ++size) { + this_point = (guint)msim_round(base * _font_scale[size]); if (this_point >= point) { purple_debug_info("msim", "msim_point_to_purple_size: %d pt -> size=%d\n", @@ -194,35 +192,38 @@ height_str = xmlnode_get_attrib(root, "h"); decor_str = xmlnode_get_attrib(root, "s"); - if (height_str) { - height = atol(height_str); + /* Validate the font face, to avoid constructing invalid HTML later */ + if (strchr(face, '\'') != NULL) + face = NULL; + + height = height_str != NULL ? atol(height_str) : 12; + decor = decor_str != NULL ? atol(decor_str) : 0; + + /* + * The HTML we're constructing here is a bit redudant. Ideally we + * would use only the font-family and font-size CSS span, but Pidgin + * doesn't support it (it's included for other UIs). For Pidgin we + * wrap the whole thing in an ugly font tag, and Pidgin will happily + * ignore the . + */ + gs_begin = g_string_new(""); + if (height && !face) { + guint point_size = msim_height_to_point(session, height); + g_string_printf(gs_begin, + "", + msim_point_to_purple_size(session, point_size), + point_size); + } else if (height && face) { + guint point_size = msim_height_to_point(session, height); + g_string_printf(gs_begin, + "", + face, msim_point_to_purple_size(session, point_size), + face, point_size); } else { - height = 12; - } - - if (decor_str) { - decor = atol(decor_str); - } else { - decor = 0; + g_string_printf(gs_begin, ""); } - gs_begin = g_string_new(""); - /* TODO: get font size working */ - if (height && !face) { - g_string_printf(gs_begin, "", - msim_point_to_purple_size(session, msim_height_to_point(session, height))); - } else if (height && face) { - g_string_printf(gs_begin, "", face, - msim_point_to_purple_size(session, msim_height_to_point(session, height))); - } else { - g_string_printf(gs_begin, ""); - } - - /* No support for font-size CSS? */ - /* g_string_printf(gs_begin, "", face, - msim_height_to_point(height)); */ - - gs_end = g_string_new(""); + gs_end = g_string_new(""); if (decor & MSIM_TEXT_BOLD) { g_string_append(gs_begin, ""); @@ -239,7 +240,6 @@ g_string_append(gs_end, ""); } - *begin = g_string_free(gs_begin, FALSE); *end = g_string_free(gs_end, FALSE); } diff -r 841eb21e96fe -r 16b901793d7c libpurple/protocols/myspace/message.c --- a/libpurple/protocols/myspace/message.c Sat Dec 13 10:52:10 2008 +0000 +++ b/libpurple/protocols/myspace/message.c Mon Dec 15 23:10:39 2008 +0000 @@ -19,17 +19,15 @@ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1301 USA */ +#include "message.h" #include "myspace.h" -#include "message.h" -static void msim_msg_free_element(gpointer data, gpointer user_data); static void msim_msg_debug_string_element(gpointer data, gpointer user_data); -static gchar *msim_msg_pack_using(MsimMessage *msg, GFunc gf, const gchar *sep, const gchar *begin, const gchar *end); -static GList *msim_msg_get_node(MsimMessage *msg, const gchar *name); -static MsimMessage *msim_msg_new_v(gchar *first_key, va_list argp); -/* Escape codes and associated replacement text, used for protocol message - * escaping and unescaping. */ +/** + * Escape codes and associated replacement text, used for protocol message + * escaping and unescaping. + */ static struct MSIM_ESCAPE_REPLACEMENT { gchar *code; gchar text; @@ -53,7 +51,7 @@ guint msg_len; gs = g_string_new(""); - msg_len = strlen(msg); + msg_len = strlen(msg); for (i = 0; i < msg_len; ++i) { struct MSIM_ESCAPE_REPLACEMENT *replacement; @@ -97,7 +95,7 @@ guint msg_len; gs = g_string_new(""); - msg_len = strlen(msg); + msg_len = strlen(msg); for (i = 0; i < msg_len; ++i) { struct MSIM_ESCAPE_REPLACEMENT *replacement; @@ -126,27 +124,8 @@ return g_string_free(gs, FALSE); } -/** Create a new MsimMessage. - * - * @param first_key The first key in the sequence, or NULL for an empty message. - * @param ... A sequence of gchar* key/type/value triplets, terminated with NULL. - * - * See msim_msg_append() documentation for details on types. - */ -MsimMessage * -msim_msg_new(gchar *first_key, ...) -{ - va_list argp; - - if (first_key) { - va_start(argp, first_key); - return msim_msg_new_v(first_key, argp); - } else { - return NULL; - } -} - -/** Create a new message from va_list and its first argument. +/** + * Create a new message from va_list and its first argument. * * @param first_key The first argument (a key), or NULL to take all arguments * from argp. @@ -189,11 +168,11 @@ /* Interpret variadic arguments. */ switch (type) { - case MSIM_TYPE_INTEGER: - case MSIM_TYPE_BOOLEAN: + case MSIM_TYPE_INTEGER: + case MSIM_TYPE_BOOLEAN: msg = msim_msg_append(msg, key, type, GUINT_TO_POINTER(va_arg(argp, int))); break; - + case MSIM_TYPE_STRING: value = va_arg(argp, char *); @@ -210,7 +189,7 @@ /* msim_msg_free() will free this GString the caller created. */ msg = msim_msg_append(msg, key, type, gs); break; - + case MSIM_TYPE_LIST: gl = va_arg(argp, GList *); @@ -237,9 +216,310 @@ return msg; } -/** Perform a deep copy on a GList * of gchar * strings. Free with msim_msg_list_free(). */ -GList * -msim_msg_list_copy(GList *old) +/** + * Create a new MsimMessage. + * + * @param first_key The first key in the sequence, or NULL for an empty message. + * @param ... A sequence of gchar* key/type/value triplets, terminated with NULL. + * + * See msim_msg_append() documentation for details on types. + */ +MsimMessage * +msim_msg_new(gchar *first_key, ...) +{ + va_list argp; + + if (first_key) { + va_start(argp, first_key); + return msim_msg_new_v(first_key, argp); + } else { + return NULL; + } +} + +/** + * Pack a string using the given GFunc and seperator. + * Used by msim_msg_dump() and msim_msg_pack(). + */ +static gchar * +msim_msg_pack_using(MsimMessage *msg, + GFunc gf, + const gchar *sep, + const gchar *begin, const gchar *end) +{ + int num_items; + gchar **strings; + gchar **strings_tmp; + gchar *joined; + gchar *final; + int i; + + g_return_val_if_fail(msg != NULL, NULL); + + num_items = g_list_length(msg); + + /* Add one for NULL terminator for g_strjoinv(). */ + strings = (gchar **)g_new0(gchar *, num_items + 1); + + strings_tmp = strings; + g_list_foreach(msg, gf, &strings_tmp); + + joined = g_strjoinv(sep, strings); + final = g_strconcat(begin, joined, end, NULL); + g_free(joined); + + /* Clean up. */ + for (i = 0; i < num_items; ++i) { + g_free(strings[i]); + } + + g_free(strings); + + return final; +} + +/** + * Return a human-readable string of the message. + * + * @return A new gchar *, must be g_free()'d. + */ +static gchar * +msim_msg_dump_to_str(MsimMessage *msg) +{ + gchar *debug_str; + + if (!msg) { + debug_str = g_strdup(""); + } else { + debug_str = msim_msg_pack_using(msg, msim_msg_debug_string_element, + "\n", ""); + } + + return debug_str; +} + +/** + * Store a human-readable string describing the element. + * + * @param data Pointer to an MsimMessageElement. + * @param user_data + */ +static void +msim_msg_debug_string_element(gpointer data, gpointer user_data) +{ + MsimMessageElement *elem; + gchar *string; + GString *gs; + gchar *binary; + gchar ***items; /* wow, a pointer to a pointer to a pointer */ + + gchar *s; + GList *gl; + guint i; + + elem = (MsimMessageElement *)data; + items = user_data; + + switch (elem->type) { + case MSIM_TYPE_INTEGER: + string = g_strdup_printf("%s(integer): %d", elem->name, + GPOINTER_TO_UINT(elem->data)); + break; + + case MSIM_TYPE_RAW: + string = g_strdup_printf("%s(raw): %s", elem->name, + elem->data ? (gchar *)elem->data : "(NULL)"); + break; + + case MSIM_TYPE_STRING: + string = g_strdup_printf("%s(string): %s", elem->name, + elem->data ? (gchar *)elem->data : "(NULL)"); + break; + + case MSIM_TYPE_BINARY: + gs = (GString *)elem->data; + binary = purple_base64_encode((guchar*)gs->str, gs->len); + string = g_strdup_printf("%s(binary, %d bytes): %s", elem->name, (int)gs->len, binary); + g_free(binary); + break; + + case MSIM_TYPE_BOOLEAN: + string = g_strdup_printf("%s(boolean): %s", elem->name, + elem->data ? "TRUE" : "FALSE"); + break; + + case MSIM_TYPE_DICTIONARY: + if (!elem->data) { + s = g_strdup("(NULL)"); + } else { + s = msim_msg_dump_to_str((MsimMessage *)elem->data); + } + + if (!s) { + s = g_strdup("(NULL, couldn't msim_msg_dump_to_str)"); + } + + string = g_strdup_printf("%s(dict): %s", elem->name, s); + + g_free(s); + break; + + case MSIM_TYPE_LIST: + gs = g_string_new(""); + g_string_append_printf(gs, "%s(list): \n", elem->name); + + i = 0; + for (gl = (GList *)elem->data; gl != NULL; gl = g_list_next(gl)) { + g_string_append_printf(gs, " %d. %s\n", i, (gchar *)(gl->data)); + ++i; + } + + string = g_string_free(gs, FALSE); + break; + + default: + string = g_strdup_printf("%s(unknown type %d", + elem->name ? elem->name : "(NULL)", elem->type); + break; + } + + **items = string; + ++(*items); +} + +/** + * Search for and return the node in msg, matching name, or NULL. + * + * @param msg Message to search within. + * @param name Field name to search for. + * + * @return The GList * node for the MsimMessageElement with the given name, or NULL if not found or name is NULL. + * + * For internal use - users probably want to use msim_msg_get() to + * access the MsimMessageElement *, instead of the GList * container. + * + */ +static GList * +msim_msg_get_node(MsimMessage *msg, const gchar *name) +{ + GList *node; + + if (!name || !msg) { + return NULL; + } + + /* Linear search for the given name. O(n) but n is small. */ + for (node = msg; node != NULL; node = g_list_next(node)) { + MsimMessageElement *elem; + + elem = (MsimMessageElement *)node->data; + + g_return_val_if_fail(elem != NULL, NULL); + g_return_val_if_fail(elem->name != NULL, NULL); + + if (strcmp(elem->name, name) == 0) { + return node; + } + } + return NULL; +} + +/** + * Create a new MsimMessageElement * - must be g_free()'d. + * + * For internal use; users probably want msim_msg_append() or msim_msg_insert_before(). + * + * @param dynamic_name Whether 'name' should be freed when the message is destroyed. + */ +static MsimMessageElement * +msim_msg_element_new(const gchar *name, MsimMessageType type, gpointer data, gboolean dynamic_name) +{ + MsimMessageElement *elem; + + elem = g_new0(MsimMessageElement, 1); + + elem->name = name; + elem->dynamic_name = dynamic_name; + elem->type = type; + elem->data = data; + + return elem; +} + +/** + * Append a new element to a message. + * + * @param name Textual name of element (static string, neither copied nor freed). + * @param type An MSIM_TYPE_* code. + * @param data Pointer to data, see below. + * + * @return The new message - must be assigned to as with GList*. For example: + * + * msg = msim_msg_append(msg, ...) + * + * The data parameter depends on the type given: + * + * * MSIM_TYPE_INTEGER: Use GUINT_TO_POINTER(x). + * + * * MSIM_TYPE_BINARY: Same as integer, non-zero is TRUE and zero is FALSE. + * + * * MSIM_TYPE_STRING: gchar *. The data WILL BE FREED - use g_strdup() if needed. + * + * * MSIM_TYPE_RAW: gchar *. The data WILL BE FREED - use g_strdup() if needed. + * + * * MSIM_TYPE_BINARY: g_string_new_len(data, length). The data AND GString will be freed. + * + * * MSIM_TYPE_DICTIONARY: An MsimMessage *. Freed when message is destroyed. + * + * * MSIM_TYPE_LIST: GList * of gchar *. Again, everything will be freed. + * + * */ +MsimMessage * +msim_msg_append(MsimMessage *msg, const gchar *name, + MsimMessageType type, gpointer data) +{ + return g_list_append(msg, msim_msg_element_new(name, type, data, FALSE)); +} + +/** + * Append a new element, but with a dynamically-allocated name. + * Exactly the same as msim_msg_append(), except 'name' will be freed when + * the message is destroyed. Normally, it isn't, because a static string is given. + */ +static MsimMessage * +msim_msg_append_dynamic_name(MsimMessage *msg, gchar *name, + MsimMessageType type, gpointer data) +{ + return g_list_append(msg, msim_msg_element_new(name, type, data, TRUE)); +} + +/** + * Insert a new element into a message, before the given element name. + * + * @param name_before Name of the element to insert the new element before. If + * could not be found or NULL, new element will be inserted at end. + * + * See msim_msg_append() for usage of other parameters, and an important note about return value. + */ +MsimMessage * +msim_msg_insert_before(MsimMessage *msg, const gchar *name_before, + const gchar *name, MsimMessageType type, gpointer data) +{ + MsimMessageElement *new_elem; + GList *node_before; + + new_elem = msim_msg_element_new(name, type, data, FALSE); + + node_before = msim_msg_get_node(msg, name_before); + + return g_list_insert_before(msg, node_before, new_elem); +} + +/** + * Perform a deep copy on a GList * of gchar * strings. Free with msim_msg_list_free(). + */ +static GList * +msim_msg_list_copy(const GList *old) { GList *new_list; @@ -253,65 +533,13 @@ return new_list; } -/** Free a GList * of MsimMessageElement *'s. */ -void -msim_msg_list_free(GList *l) -{ - - for (; l != NULL; l = g_list_next(l)) { - MsimMessageElement *elem; - - elem = (MsimMessageElement *)l->data; - - /* Note that name is almost never dynamically allocated elsewhere; - * it is usually a static string, but not in lists. So cast it. */ - g_free((gchar *)elem->name); - g_free(elem->data); - g_free(elem); - } - g_list_free(l); -} - -/** Parse a |-separated string into a new GList. Free with msim_msg_list_free(). */ -GList * -msim_msg_list_parse(const gchar *raw) -{ - gchar **array; - GList *list; - guint i; - - array = g_strsplit(raw, "|", 0); - list = NULL; - - /* TODO: escape/unescape /3 <-> | within list elements */ - - for (i = 0; array[i] != NULL; ++i) { - MsimMessageElement *elem; - - /* Freed in msim_msg_list_free() */ - elem = g_new0(MsimMessageElement, 1); - - /* Give the element a name for debugging purposes. - * Not supposed to be looked up by this name; instead, - * lookup the elements by indexing the array. */ - elem->name = g_strdup_printf("(list item #%d)", i); - elem->type = MSIM_TYPE_RAW; - elem->data = g_strdup(array[i]); - - list = g_list_append(list, elem); - } - - g_strfreev(array); - - return list; -} - -/** Clone an individual element. +/** + * Clone an individual element. * * @param data MsimMessageElement * to clone. * @param user_data Pointer to MsimMessage * to add cloned element to. */ -static void +static void msim_msg_clone_element(gpointer data, gpointer user_data) { MsimMessageElement *elem; @@ -357,10 +585,14 @@ /* Append cloned data. Note that the 'name' field is a static string, so it * never needs to be copied nor freed. */ - *new = msim_msg_append(*new, elem->name, elem->type, new_data); + if (elem->dynamic_name) + *new = msim_msg_append_dynamic_name(*new, g_strdup(elem->name), elem->type, new_data); + else + *new = msim_msg_append(*new, elem->name, elem->type, new_data); } -/** Clone an existing MsimMessage. +/** + * Clone an existing MsimMessage. * * @return Cloned message; caller should free with msim_msg_free(). */ @@ -380,7 +612,8 @@ return new; } -/** Free the data of a message element. +/** + * Free the data of a message element. * * @param elem The MsimMessageElement * * @@ -411,7 +644,7 @@ case MSIM_TYPE_DICTIONARY: msim_msg_free((MsimMessage *)elem->data); break; - + case MSIM_TYPE_LIST: g_list_free((GList *)elem->data); break; @@ -423,7 +656,29 @@ } } -/** Free an individual message element. +/** + * Free a GList * of MsimMessageElement *'s. + */ +void +msim_msg_list_free(GList *l) +{ + + for (; l != NULL; l = g_list_next(l)) { + MsimMessageElement *elem; + + elem = (MsimMessageElement *)l->data; + + /* Note that name is almost never dynamically allocated elsewhere; + * it is usually a static string, but not in lists. So cast it. */ + g_free((gchar *)elem->name); + g_free(elem->data); + g_free(elem); + } + g_list_free(l); +} + +/** + * Free an individual message element. * * @param data MsimMessageElement * to free. * @param user_data Not used; required to match g_list_foreach() callback prototype. @@ -431,7 +686,7 @@ * Frees both the element data and the element itself. * Also frees the name if dynamic_name is TRUE. */ -static void +static void msim_msg_free_element(gpointer data, gpointer user_data) { MsimMessageElement *elem; @@ -449,8 +704,10 @@ g_free(elem); } -/** Free a complete message. */ -void +/** + * Free a complete message. + */ +void msim_msg_free(MsimMessage *msg) { if (!msg) { @@ -466,422 +723,8 @@ g_list_free(msg); } -/** Send an existing MsimMessage. */ -gboolean -msim_msg_send(MsimSession *session, MsimMessage *msg) -{ - gchar *raw; - gboolean success; - - raw = msim_msg_pack(msg); - g_return_val_if_fail(raw != NULL, FALSE); - success = msim_send_raw(session, raw); - g_free(raw); - - msim_msg_dump("msim_msg_send()ing %s\n", msg); - - return success; -} - /** - * - * Send a message to the server, whose contents is specified using - * variable arguments. - * - * @param session - * @param ... A sequence of gchar* key/type/value triplets, terminated with NULL. - * - * This function exists for coding convenience: it allows a message to be created - * and sent in one line of code. Internally it calls msim_msg_send(). - * - * IMPORTANT: See msim_msg_append() documentation for details on element types. - * - */ -gboolean -msim_send(MsimSession *session, ...) -{ - gboolean success; - MsimMessage *msg; - va_list argp; - - va_start(argp, session); - msg = msim_msg_new_v(NULL, argp); - - /* Actually send the message. */ - success = msim_msg_send(session, msg); - - /* Cleanup. */ - msim_msg_free(msg); - - return success; -} - -/** Create a new MsimMessageElement * - must be g_free()'d. - * - * For internal use; users probably want msim_msg_append() or msim_msg_insert_before(). - * - * @param dynamic_name Whether 'name' should be freed when the message is destroyed. - */ -static MsimMessageElement * -msim_msg_element_new(const gchar *name, MsimMessageType type, gpointer data, gboolean dynamic_name) -{ - MsimMessageElement *elem; - - elem = g_new0(MsimMessageElement, 1); - - elem->name = name; - elem->dynamic_name = dynamic_name; - elem->type = type; - elem->data = data; - - return elem; -} - - -/** Append a new element to a message. - * - * @param name Textual name of element (static string, neither copied nor freed). - * @param type An MSIM_TYPE_* code. - * @param data Pointer to data, see below. - * - * @return The new message - must be assigned to as with GList*. For example: - * - * msg = msim_msg_append(msg, ...) - * - * The data parameter depends on the type given: - * - * * MSIM_TYPE_INTEGER: Use GUINT_TO_POINTER(x). - * - * * MSIM_TYPE_BINARY: Same as integer, non-zero is TRUE and zero is FALSE. - * - * * MSIM_TYPE_STRING: gchar *. The data WILL BE FREED - use g_strdup() if needed. - * - * * MSIM_TYPE_RAW: gchar *. The data WILL BE FREED - use g_strdup() if needed. - * - * * MSIM_TYPE_BINARY: g_string_new_len(data, length). The data AND GString will be freed. - * - * * MSIM_TYPE_DICTIONARY: An MsimMessage *. Freed when message is destroyed. - * - * * MSIM_TYPE_LIST: GList * of gchar *. Again, everything will be freed. - * - * */ -MsimMessage * -msim_msg_append(MsimMessage *msg, const gchar *name, - MsimMessageType type, gpointer data) -{ - return g_list_append(msg, msim_msg_element_new(name, type, data, FALSE)); -} - -/** Append a new element, but with a dynamically-allocated name. - * Exactly the same as msim_msg_append(), except 'name' will be freed when - * the message is destroyed. Normally, it isn't, because a static string is given. - */ -static MsimMessage * -msim_msg_append_dynamic_name(MsimMessage *msg, gchar *name, - MsimMessageType type, gpointer data) -{ - return g_list_append(msg, msim_msg_element_new(name, type, data, TRUE)); -} - -/** Insert a new element into a message, before the given element name. - * - * @param name_before Name of the element to insert the new element before. If - * could not be found or NULL, new element will be inserted at end. - * - * See msim_msg_append() for usage of other parameters, and an important note about return value. - */ -MsimMessage * -msim_msg_insert_before(MsimMessage *msg, const gchar *name_before, - const gchar *name, MsimMessageType type, gpointer data) -{ - MsimMessageElement *new_elem; - GList *node_before; - - new_elem = msim_msg_element_new(name, type, data, FALSE); - - node_before = msim_msg_get_node(msg, name_before); - - return g_list_insert_before(msg, node_before, new_elem); -} - -/** Pack a string using the given GFunc and seperator. - * Used by msim_msg_dump() and msim_msg_pack(). - */ -gchar * -msim_msg_pack_using(MsimMessage *msg, - GFunc gf, - const gchar *sep, - const gchar *begin, const gchar *end) -{ - int num_items; - gchar **strings; - gchar **strings_tmp; - gchar *joined; - gchar *final; - int i; - - g_return_val_if_fail(msg != NULL, NULL); - - num_items = g_list_length(msg); - - /* Add one for NULL terminator for g_strjoinv(). */ - strings = (gchar **)g_new0(gchar *, num_items + 1); - - strings_tmp = strings; - g_list_foreach(msg, gf, &strings_tmp); - - joined = g_strjoinv(sep, strings); - final = g_strconcat(begin, joined, end, NULL); - g_free(joined); - - /* Clean up. */ - for (i = 0; i < num_items; ++i) { - g_free(strings[i]); - } - - g_free(strings); - - return final; -} -/** Store a human-readable string describing the element. - * - * @param data Pointer to an MsimMessageElement. - * @param user_data - */ -static void -msim_msg_debug_string_element(gpointer data, gpointer user_data) -{ - MsimMessageElement *elem; - gchar *string; - GString *gs; - gchar *binary; - gchar ***items; /* wow, a pointer to a pointer to a pointer */ - - gchar *s; - GList *gl; - guint i; - - elem = (MsimMessageElement *)data; - items = user_data; - - switch (elem->type) { - case MSIM_TYPE_INTEGER: - string = g_strdup_printf("%s(integer): %d", elem->name, - GPOINTER_TO_UINT(elem->data)); - break; - - case MSIM_TYPE_RAW: - string = g_strdup_printf("%s(raw): %s", elem->name, - elem->data ? (gchar *)elem->data : "(NULL)"); - break; - - case MSIM_TYPE_STRING: - string = g_strdup_printf("%s(string): %s", elem->name, - elem->data ? (gchar *)elem->data : "(NULL)"); - break; - - case MSIM_TYPE_BINARY: - gs = (GString *)elem->data; - binary = purple_base64_encode((guchar*)gs->str, gs->len); - string = g_strdup_printf("%s(binary, %d bytes): %s", elem->name, (int)gs->len, binary); - g_free(binary); - break; - - case MSIM_TYPE_BOOLEAN: - string = g_strdup_printf("%s(boolean): %s", elem->name, - elem->data ? "TRUE" : "FALSE"); - break; - - case MSIM_TYPE_DICTIONARY: - if (!elem->data) { - s = g_strdup("(NULL)"); - } else { - s = msim_msg_dump_to_str((MsimMessage *)elem->data); - } - - if (!s) { - s = g_strdup("(NULL, couldn't msim_msg_dump_to_str)"); - } - - string = g_strdup_printf("%s(dict): %s", elem->name, s); - - g_free(s); - break; - - case MSIM_TYPE_LIST: - gs = g_string_new(""); - g_string_append_printf(gs, "%s(list): \n", elem->name); - - i = 0; - for (gl = (GList *)elem->data; gl != NULL; gl = g_list_next(gl)) { - g_string_append_printf(gs, " %d. %s\n", i, (gchar *)(gl->data)); - ++i; - } - - string = g_string_free(gs, FALSE); - break; - - default: - string = g_strdup_printf("%s(unknown type %d", - elem->name ? elem->name : "(NULL)", elem->type); - break; - } - - **items = string; - ++(*items); -} - -/** Print a human-readable string of the message to Purple's debug log. - * - * @param fmt_string A static string, in which '%s' will be replaced. - */ -void -msim_msg_dump(const gchar *fmt_string, MsimMessage *msg) -{ - gchar *debug_str; - - g_return_if_fail(fmt_string != NULL); - - debug_str = msim_msg_dump_to_str(msg); - - g_return_if_fail(debug_str != NULL); - - purple_debug_info("msim", fmt_string, debug_str); - - g_free(debug_str); -} - -/** Return a human-readable string of the message. - * - * @return A new gchar *, must be g_free()'d. - */ -gchar * -msim_msg_dump_to_str(MsimMessage *msg) -{ - gchar *debug_str; - - if (!msg) { - debug_str = g_strdup(""); - } else { - debug_str = msim_msg_pack_using(msg, msim_msg_debug_string_element, - "\n", ""); - } - - return debug_str; -} - -/** Return a message element data as a new string for a raw protocol message, converting from other types (integer, etc.) if necessary. - * - * @return const gchar * The data as a string, or NULL. Caller must g_free(). - * - * Returns a string suitable for inclusion in a raw protocol message, not necessarily - * optimal for human consumption. For example, strings are escaped. Use - * msim_msg_get_string() if you want a string, which in some cases is same as this. - */ -gchar * -msim_msg_pack_element_data(MsimMessageElement *elem) -{ - GString *gs; - GList *gl; - - g_return_val_if_fail(elem != NULL, NULL); - - switch (elem->type) { - case MSIM_TYPE_INTEGER: - return g_strdup_printf("%d", GPOINTER_TO_UINT(elem->data)); - - case MSIM_TYPE_RAW: - /* Not un-escaped - this is a raw element, already escaped if necessary. */ - return (gchar *)g_strdup((gchar *)elem->data); - - case MSIM_TYPE_STRING: - /* Strings get escaped. msim_escape() creates a new string. */ - g_return_val_if_fail(elem->data != NULL, NULL); - return elem->data ? msim_escape((gchar *)elem->data) : - g_strdup("(NULL)"); - - case MSIM_TYPE_BINARY: - gs = (GString *)elem->data; - /* Do not escape! */ - return purple_base64_encode((guchar *)gs->str, gs->len); - - case MSIM_TYPE_BOOLEAN: - /* Not used by messages in the wire protocol * -- see msim_msg_pack_element. - * Only used by dictionaries, see msim_msg_pack_element_dict. */ - return elem->data ? g_strdup("On") : g_strdup("Off"); - - case MSIM_TYPE_DICTIONARY: - return msim_msg_pack_dict((MsimMessage *)elem->data); - - case MSIM_TYPE_LIST: - /* Pack using a|b|c|d|... */ - gs = g_string_new(""); - - for (gl = (GList *)elem->data; gl != NULL; gl = g_list_next(gl)) { - g_string_append_printf(gs, "%s", (gchar*)(gl->data)); - - /* All but last element is separated by a bar. */ - if (g_list_next(gl)) - g_string_append(gs, "|"); - } - - return g_string_free(gs, FALSE); - - default: - purple_debug_info("msim", "field %s, unknown type %d\n", - elem->name ? elem->name : "(NULL)", - elem->type); - return NULL; - } -} - -/** Pack an element into its protcol representation inside a dictionary. - * - * See msim_msg_pack_element(). - */ -static void -msim_msg_pack_element_dict(gpointer data, gpointer user_data) -{ - MsimMessageElement *elem; - gchar *string, *data_string, ***items; - - elem = (MsimMessageElement *)data; - items = (gchar ***)user_data; - - /* Exclude elements beginning with '_' from packed protocol messages. */ - if (elem->name[0] == '_') { - return; - } - - data_string = msim_msg_pack_element_data(elem); - - g_return_if_fail(data_string != NULL); - - switch (elem->type) { - /* These types are represented by key name/value pairs (converted above). */ - case MSIM_TYPE_INTEGER: - case MSIM_TYPE_RAW: - case MSIM_TYPE_STRING: - case MSIM_TYPE_BINARY: - case MSIM_TYPE_DICTIONARY: - case MSIM_TYPE_LIST: - case MSIM_TYPE_BOOLEAN: /* Boolean is On or Off */ - string = g_strconcat(elem->name, "=", data_string, NULL); - break; - - default: - g_free(data_string); - g_return_if_fail(FALSE); - break; - } - - g_free(data_string); - - **items = string; - ++(*items); -} - -/** Pack an element into its protocol representation. + * Pack an element into its protocol representation. * * @param data Pointer to an MsimMessageElement. * @param user_data Pointer to a gchar ** array of string items. @@ -891,7 +734,7 @@ * is responsible for creating array to correct dimensions, and * freeing each string element of the array added by this function. */ -static void +static void msim_msg_pack_element(gpointer data, gpointer user_data) { MsimMessageElement *elem; @@ -942,8 +785,55 @@ ++(*items); } +/** + * Pack an element into its protcol representation inside a dictionary. + * + * See msim_msg_pack_element(). + */ +static void +msim_msg_pack_element_dict(gpointer data, gpointer user_data) +{ + MsimMessageElement *elem; + gchar *string, *data_string, ***items; -/** Return a packed string of a message suitable for sending over the wire. + elem = (MsimMessageElement *)data; + items = (gchar ***)user_data; + + /* Exclude elements beginning with '_' from packed protocol messages. */ + if (elem->name[0] == '_') { + return; + } + + data_string = msim_msg_pack_element_data(elem); + + g_return_if_fail(data_string != NULL); + + switch (elem->type) { + /* These types are represented by key name/value pairs (converted above). */ + case MSIM_TYPE_INTEGER: + case MSIM_TYPE_RAW: + case MSIM_TYPE_STRING: + case MSIM_TYPE_BINARY: + case MSIM_TYPE_DICTIONARY: + case MSIM_TYPE_LIST: + case MSIM_TYPE_BOOLEAN: /* Boolean is On or Off */ + string = g_strconcat(elem->name, "=", data_string, NULL); + break; + + default: + g_free(data_string); + g_return_if_fail(FALSE); + break; + } + + g_free(data_string); + + **items = string; + ++(*items); +} + +/** + * Return a packed string of a message suitable for sending over the wire. * * @return A string. Caller must g_free(). */ @@ -955,11 +845,12 @@ return msim_msg_pack_using(msg, msim_msg_pack_element, "\\", "\\", "\\final\\"); } -/** Return a packed string of a dictionary, suitable for embedding in MSIM_TYPE_DICTIONARY. +/** + * Return a packed string of a dictionary, suitable for embedding in MSIM_TYPE_DICTIONARY. * * @return A string; caller must g_free(). */ -gchar * +static gchar * msim_msg_pack_dict(MsimMessage *msg) { g_return_val_if_fail(msg != NULL, NULL); @@ -967,7 +858,146 @@ return msim_msg_pack_using(msg, msim_msg_pack_element_dict, "\034", "", ""); } -/** +/** + * Send an existing MsimMessage. + */ +gboolean +msim_msg_send(MsimSession *session, MsimMessage *msg) +{ + gchar *raw; + gboolean success; + + raw = msim_msg_pack(msg); + g_return_val_if_fail(raw != NULL, FALSE); + success = msim_send_raw(session, raw); + g_free(raw); + + msim_msg_dump("msim_msg_send()ing %s\n", msg); + + return success; +} + +/** + * Return a message element data as a new string for a raw protocol message, + * converting from other types (integer, etc.) if necessary. + * + * @return const gchar * The data as a string, or NULL. Caller must g_free(). + * + * Returns a string suitable for inclusion in a raw protocol message, not necessarily + * optimal for human consumption. For example, strings are escaped. Use + * msim_msg_get_string() if you want a string, which in some cases is same as this. + */ +gchar * +msim_msg_pack_element_data(MsimMessageElement *elem) +{ + GString *gs; + GList *gl; + + g_return_val_if_fail(elem != NULL, NULL); + + switch (elem->type) { + case MSIM_TYPE_INTEGER: + return g_strdup_printf("%d", GPOINTER_TO_UINT(elem->data)); + + case MSIM_TYPE_RAW: + /* Not un-escaped - this is a raw element, already escaped if necessary. */ + return (gchar *)g_strdup((gchar *)elem->data); + + case MSIM_TYPE_STRING: + /* Strings get escaped. msim_escape() creates a new string. */ + g_return_val_if_fail(elem->data != NULL, NULL); + return elem->data ? msim_escape((gchar *)elem->data) : + g_strdup("(NULL)"); + + case MSIM_TYPE_BINARY: + gs = (GString *)elem->data; + /* Do not escape! */ + return purple_base64_encode((guchar *)gs->str, gs->len); + + case MSIM_TYPE_BOOLEAN: + /* Not used by messages in the wire protocol * -- see msim_msg_pack_element. + * Only used by dictionaries, see msim_msg_pack_element_dict. */ + return elem->data ? g_strdup("On") : g_strdup("Off"); + + case MSIM_TYPE_DICTIONARY: + return msim_msg_pack_dict((MsimMessage *)elem->data); + + case MSIM_TYPE_LIST: + /* Pack using a|b|c|d|... */ + gs = g_string_new(""); + + for (gl = (GList *)elem->data; gl != NULL; gl = g_list_next(gl)) { + g_string_append_printf(gs, "%s", (gchar*)(gl->data)); + + /* All but last element is separated by a bar. */ + if (g_list_next(gl)) + g_string_append(gs, "|"); + } + + return g_string_free(gs, FALSE); + + default: + purple_debug_info("msim", "field %s, unknown type %d\n", + elem->name ? elem->name : "(NULL)", + elem->type); + return NULL; + } +} + +/** + * Send a message to the server, whose contents is specified using + * variable arguments. + * + * @param session + * @param ... A sequence of gchar* key/type/value triplets, terminated with NULL. + * + * This function exists for coding convenience: it allows a message to be created + * and sent in one line of code. Internally it calls msim_msg_send(). + * + * IMPORTANT: See msim_msg_append() documentation for details on element types. + * + */ +gboolean +msim_send(MsimSession *session, ...) +{ + gboolean success; + MsimMessage *msg; + va_list argp; + + va_start(argp, session); + msg = msim_msg_new_v(NULL, argp); + + /* Actually send the message. */ + success = msim_msg_send(session, msg); + + /* Cleanup. */ + msim_msg_free(msg); + + return success; +} + +/** + * Print a human-readable string of the message to Purple's debug log. + * + * @param fmt_string A static string, in which '%s' will be replaced. + */ +void +msim_msg_dump(const gchar *fmt_string, MsimMessage *msg) +{ + gchar *debug_str; + + g_return_if_fail(fmt_string != NULL); + + debug_str = msim_msg_dump_to_str(msg); + + g_return_if_fail(debug_str != NULL); + + purple_debug_info("msim", fmt_string, debug_str); + + g_free(debug_str); +} + +/** * Parse a raw protocol message string into a MsimMessage *. * * @param raw The raw message string to parse, will be g_free()'d. @@ -1002,7 +1032,7 @@ msg = msim_msg_new(FALSE); - for (tokens = g_strsplit(raw + 1, "\\", 0), i = 0; + for (tokens = g_strsplit(raw + 1, "\\", 0), i = 0; (token = tokens[i]); i++) { #ifdef MSIM_DEBUG_PARSE @@ -1012,7 +1042,7 @@ /* Odd-numbered ordinal is a value. */ value = token; - + /* Incoming protocol messages get tagged as MSIM_TYPE_RAW, which * represents an untyped piece of data. msim_msg_get_* will * convert to appropriate types for caller, and handle unescaping if needed. */ @@ -1033,43 +1063,8 @@ return msg; } -/** Search for and return the node in msg, matching name, or NULL. - * - * @param msg Message to search within. - * @param name Field name to search for. - * - * @return The GList * node for the MsimMessageElement with the given name, or NULL if not found or name is NULL. - * - * For internal use - users probably want to use msim_msg_get() to - * access the MsimMessageElement *, instead of the GList * container. - * - */ -static GList * -msim_msg_get_node(MsimMessage *msg, const gchar *name) -{ - GList *node; - - if (!name || !msg) { - return NULL; - } - - /* Linear search for the given name. O(n) but n is small. */ - for (node = msg; node != NULL; node = g_list_next(node)) { - MsimMessageElement *elem; - - elem = (MsimMessageElement *)node->data; - - g_return_val_if_fail(elem != NULL, NULL); - g_return_val_if_fail(elem->name != NULL, NULL); - - if (strcmp(elem->name, name) == 0) { - return node; - } - } - return NULL; -} - -/** Return the first MsimMessageElement * with given name in the MsimMessage *. +/** + * Return the first MsimMessageElement * with given name in the MsimMessage *. * * @param name Name to search for. * @@ -1092,30 +1087,6 @@ } } -/** Return the data of an element of a given name, as a string. - * - * @param name Name of element. - * - * @return gchar * The data as a string, or NULL if not found. - * Caller must g_free(). - * - * Note that msim_msg_pack_element_data() is similar, but returns a string - * for inclusion into a raw protocol string (escaped and everything). - * This function unescapes the string for you, if needed. - */ -gchar * -msim_msg_get_string(MsimMessage *msg, const gchar *name) -{ - MsimMessageElement *elem; - - elem = msim_msg_get(msg, name); - if (!elem) { - return NULL; - } - - return msim_msg_get_string_from_element(elem); -} - gchar * msim_msg_get_string_from_element(MsimMessageElement *elem) { @@ -1140,9 +1111,20 @@ } } -/** Return an element as a new list. Caller frees with msim_msg_list_free(). */ -GList * -msim_msg_get_list(MsimMessage *msg, const gchar *name) +/** + * Return the data of an element of a given name, as a string. + * + * @param name Name of element. + * + * @return gchar * The data as a string, or NULL if not found. + * Caller must g_free(). + * + * Note that msim_msg_pack_element_data() is similar, but returns a string + * for inclusion into a raw protocol string (escaped and everything). + * This function unescapes the string for you, if needed. + */ +gchar * +msim_msg_get_string(MsimMessage *msg, const gchar *name) { MsimMessageElement *elem; @@ -1151,10 +1133,46 @@ return NULL; } - return msim_msg_get_list_from_element(elem); + return msim_msg_get_string_from_element(elem); } -GList * +/** + * Parse a |-separated string into a new GList. Free with msim_msg_list_free(). + */ +static GList * +msim_msg_list_parse(const gchar *raw) +{ + gchar **array; + GList *list; + guint i; + + array = g_strsplit(raw, "|", 0); + list = NULL; + + /* TODO: escape/unescape /3 <-> | within list elements */ + + for (i = 0; array[i] != NULL; ++i) { + MsimMessageElement *elem; + + /* Freed in msim_msg_list_free() */ + elem = g_new0(MsimMessageElement, 1); + + /* Give the element a name for debugging purposes. + * Not supposed to be looked up by this name; instead, + * lookup the elements by indexing the array. */ + elem->name = g_strdup_printf("(list item #%d)", i); + elem->type = MSIM_TYPE_RAW; + elem->data = g_strdup(array[i]); + + list = g_list_append(list, elem); + } + + g_strfreev(array); + + return list; +} + +static GList * msim_msg_get_list_from_element(MsimMessageElement *elem) { g_return_val_if_fail(elem != NULL, NULL); @@ -1173,6 +1191,22 @@ } /** + * Return an element as a new list. Caller frees with msim_msg_list_free(). + */ +GList * +msim_msg_get_list(MsimMessage *msg, const gchar *name) +{ + MsimMessageElement *elem; + + elem = msim_msg_get(msg, name); + if (!elem) { + return NULL; + } + + return msim_msg_get_list_from_element(elem); +} + +/** * Parse a \x1c-separated "dictionary" of key=value pairs into a hash table. * * @param raw The text of the dictionary to parse. Often the @@ -1192,8 +1226,8 @@ g_return_val_if_fail(raw != NULL, NULL); dict = msim_msg_new(NULL); - - for (items = g_strsplit(raw, "\x1c", 0), i = 0; + + for (items = g_strsplit(raw, "\x1c", 0), i = 0; (item = items[i]); i++) { gchar *key, *value; @@ -1202,7 +1236,7 @@ key = elements[0]; if (!key) { - purple_debug_info("msim", "msim_msg_parse_dictionary(%s): null key\n", + purple_debug_info("msim", "msim_msg_dictionary_parse(%s): null key\n", raw); g_strfreev(elements); break; @@ -1210,14 +1244,14 @@ value = elements[1]; if (!value) { - purple_debug_info("msim", "msim_msg_parse_dictionary(%s): null value\n", + purple_debug_info("msim", "msim_msg_dictionary_prase(%s): null value\n", raw); g_strfreev(elements); break; } #ifdef MSIM_DEBUG_PARSE - purple_debug_info("msim_msg_parse_dictionary","-- %s: %s\n", key ? key : "(NULL)", + purple_debug_info("msim_msg_dictionary_parse","-- %s: %s\n", key ? key : "(NULL)", value ? value : "(NULL)"); #endif /* Append with _dynamic_name since g_strdup(key) is dynamic, and @@ -1232,7 +1266,27 @@ return dict; } -/** Return an element as a new dictionary. Caller frees with msim_msg_free(). */ +static MsimMessage * +msim_msg_get_dictionary_from_element(MsimMessageElement *elem) +{ + g_return_val_if_fail(elem != NULL, NULL); + switch (elem->type) { + case MSIM_TYPE_DICTIONARY: + return msim_msg_clone((MsimMessage *)elem->data); + + case MSIM_TYPE_RAW: + return msim_msg_dictionary_parse((gchar *)elem->data); + + default: + purple_debug_info("msim_msg_get_dictionary", "type %d unknown, name %s\n", + elem->type, elem->name ? elem->name : "(NULL)"); + return NULL; + } +} + +/** + * Return an element as a new dictionary. Caller frees with msim_msg_free(). + */ MsimMessage * msim_msg_get_dictionary(MsimMessage *msg, const gchar *name) { @@ -1246,49 +1300,6 @@ return msim_msg_get_dictionary_from_element(elem); } -MsimMessage * -msim_msg_get_dictionary_from_element(MsimMessageElement *elem) -{ - g_return_val_if_fail(elem != NULL, NULL); - switch (elem->type) { - case MSIM_TYPE_DICTIONARY: - return msim_msg_clone((MsimMessage *)elem->data); - - case MSIM_TYPE_RAW: - return msim_msg_dictionary_parse((gchar *)elem->data); - - default: - purple_debug_info("msim_msg_get_dictionary", "type %d unknown, name %s\n", - elem->type, elem->name ? elem->name : "(NULL)"); - return NULL; - } -} - -/** Return the data of an element of a given name, as an unsigned integer. - * - * @param name Name of element. - * - * @return guint Numeric representation of data, or 0 if could not be converted / not found. - * - * Useful to obtain an element's data if you know it should be an integer, - * even if it is not stored as an MSIM_TYPE_INTEGER. MSIM_TYPE_STRING will - * be converted handled correctly, for example. - */ -guint -msim_msg_get_integer(MsimMessage *msg, const gchar *name) -{ - MsimMessageElement *elem; - - elem = msim_msg_get(msg, name); - - if (!elem) { - return 0; - } - - return msim_msg_get_integer_from_element(elem); -} - - guint msim_msg_get_integer_from_element(MsimMessageElement *elem) { @@ -1307,29 +1318,32 @@ } } -/** Return the data of an element of a given name, as a binary GString. +/** + * Return the data of an element of a given name, as an unsigned integer. * - * @param binary_data A pointer to a new pointer, which will be filled in with the binary data. CALLER MUST g_free(). + * @param name Name of element. * - * @param binary_length A pointer to an integer, which will be set to the binary data length. + * @return guint Numeric representation of data, or 0 if could not be converted / not found. * - * @return TRUE if successful, FALSE if not. + * Useful to obtain an element's data if you know it should be an integer, + * even if it is not stored as an MSIM_TYPE_INTEGER. MSIM_TYPE_STRING will + * be converted handled correctly, for example. */ -gboolean -msim_msg_get_binary(MsimMessage *msg, const gchar *name, - gchar **binary_data, gsize *binary_length) +guint +msim_msg_get_integer(MsimMessage *msg, const gchar *name) { MsimMessageElement *elem; - + elem = msim_msg_get(msg, name); + if (!elem) { - return FALSE; + return 0; } - return msim_msg_get_binary_from_element(elem, binary_data, binary_length); + return msim_msg_get_integer_from_element(elem); } -gboolean +static gboolean msim_msg_get_binary_from_element(MsimMessageElement *elem, gchar **binary_data, gsize *binary_length) { GString *gs; @@ -1344,7 +1358,7 @@ * by msimprpl code for things like instant messages - stuff that should be * escaped if needed). DWIM. */ - + /* Previously, incoming messages were stored as MSIM_TYPE_STRING. * This was fine for integers and strings, since they can easily be * converted in msim_get_*, as desirable. However, it does not work @@ -1372,7 +1386,7 @@ /* Rejected because if it isn't already a GString, have to g_new0 it and - * then caller has to ALSO free the GString! + * then caller has to ALSO free the GString! * * return (GString *)elem->data; */ @@ -1382,3 +1396,26 @@ return FALSE; } } + +/** + * Return the data of an element of a given name, as a binary GString. + * + * @param binary_data A pointer to a new pointer, which will be filled in with the binary data. CALLER MUST g_free(). + * + * @param binary_length A pointer to an integer, which will be set to the binary data length. + * + * @return TRUE if successful, FALSE if not. + */ +gboolean +msim_msg_get_binary(MsimMessage *msg, const gchar *name, + gchar **binary_data, gsize *binary_length) +{ + MsimMessageElement *elem; + + elem = msim_msg_get(msg, name); + if (!elem) { + return FALSE; + } + + return msim_msg_get_binary_from_element(elem, binary_data, binary_length); +} diff -r 841eb21e96fe -r 16b901793d7c libpurple/protocols/myspace/message.h --- a/libpurple/protocols/myspace/message.h Sat Dec 13 10:52:10 2008 +0000 +++ b/libpurple/protocols/myspace/message.h Mon Dec 15 23:10:39 2008 +0000 @@ -24,17 +24,20 @@ #include +#define MsimMessage GList /* #define instead of typedef to avoid casting */ +typedef gchar MsimMessageType; +typedef struct _MsimMessageElement MsimMessageElement; + +#include "session.h" + /* Types */ -#define MsimMessage GList /* #define instead of typedef to avoid casting */ -typedef struct _MsimMessageElement +struct _MsimMessageElement { const gchar *name; /**< Textual name of element. */ gboolean dynamic_name; /**< TRUE if 'name' is a dynamic string to be freed, not static. */ guint type; /**< MSIM_TYPE_* code. */ gpointer data; /**< Pointer to data, or GUINT_TO_POINTER for int/bool. */ -} MsimMessageElement; - -typedef gchar MsimMessageType; +}; #define msim_msg_get_next_element_node(msg) ((MsimMessage *)(msg->next)) @@ -58,20 +61,13 @@ void msim_msg_free(MsimMessage *msg); MsimMessage *msim_msg_append(MsimMessage *msg, const gchar *name, MsimMessageType type, gpointer data); MsimMessage *msim_msg_insert_before(MsimMessage *msg, const gchar *name_before, const gchar *name, MsimMessageType type, gpointer data); -gchar *msim_msg_dump_to_str(MsimMessage *msg); gchar *msim_msg_pack_element_data(MsimMessageElement *elem); void msim_msg_dump(const char *fmt_string, MsimMessage *msg); gchar *msim_msg_pack(MsimMessage *msg); -gchar *msim_msg_pack_dict(MsimMessage *msg); -GList *msim_msg_list_copy(GList *old); void msim_msg_list_free(GList *l); -GList *msim_msg_list_parse(const gchar *raw); -/* Defined in myspace.h */ -struct _MsimSession; - -/* Based on http://permalink.gmane.org/gmane.comp.parsers.sparse/695 +/* Based on http://permalink.gmane.org/gmane.comp.parsers.sparse/695 * Define macros for useful gcc attributes. */ #ifdef __GNUC__ #define GCC_VERSION (__GNUC__ * 1000 + __GNUC_MINOR__) @@ -87,7 +83,7 @@ #define FORMAT_ATTR(pos) #define NORETURN_ATTR #define SENTINEL_ATTR -#endif +#endif /* Cause gcc to emit "a missing sentinel in function call" if forgot * to write NULL as last, terminating parameter. */ @@ -109,10 +105,6 @@ /* Retrieve data by element (MsimMessageElement *), returned from msim_msg_get() */ gchar *msim_msg_get_string_from_element(MsimMessageElement *elem); -GList *msim_msg_get_list_from_element(MsimMessageElement *elem); -MsimMessage *msim_msg_get_dictionary_from_element(MsimMessageElement *elem); guint msim_msg_get_integer_from_element(MsimMessageElement *elem); -gboolean msim_msg_get_binary_from_element(MsimMessageElement *elem, - gchar **binary_data, gsize *binary_length); #endif /* _MYSPACE_MESSAGE_H */ diff -r 841eb21e96fe -r 16b901793d7c libpurple/protocols/myspace/session.h --- a/libpurple/protocols/myspace/session.h Sat Dec 13 10:52:10 2008 +0000 +++ b/libpurple/protocols/myspace/session.h Mon Dec 15 23:10:39 2008 +0000 @@ -20,6 +20,8 @@ #ifndef _MYSPACE_SESSION_H #define _MYSPACE_SESSION_H +#include "account.h" + /* Random number in every MsimSession, to ensure it is valid. */ #define MSIM_SESSION_STRUCT_MAGIC 0xe4a6752b diff -r 841eb21e96fe -r 16b901793d7c libpurple/protocols/myspace/user.c --- a/libpurple/protocols/myspace/user.c Sat Dec 13 10:52:10 2008 +0000 +++ b/libpurple/protocols/myspace/user.c Mon Dec 15 23:10:39 2008 +0000 @@ -174,8 +174,12 @@ /* TODO: link to username, if available */ char *profile; purple_notify_user_info_add_section_break(user_info); - profile = g_strdup_printf("%s", - user->id, _("View web profile")); + if (user->buddy != NULL) + profile = g_strdup_printf("%s", + purple_buddy_get_name(user->buddy), _("View web profile")); + else + profile = g_strdup_printf("%s", + user->id, _("View web profile")); purple_notify_user_info_add_pair(user_info, NULL, profile); g_free(profile); } diff -r 841eb21e96fe -r 16b901793d7c libpurple/protocols/myspace/user.h --- a/libpurple/protocols/myspace/user.h Sat Dec 13 10:52:10 2008 +0000 +++ b/libpurple/protocols/myspace/user.h Mon Dec 15 23:10:39 2008 +0000 @@ -25,6 +25,7 @@ typedef struct _MsimUser { PurpleBuddy *buddy; + /* Note: id is also &buddy->node (set_blist_node_int), when buddy is non-NULL */ int id; guint client_cv; gchar *client_info; @@ -34,7 +35,6 @@ guint total_friends; gchar *headline; gchar *display_name; - /* Note: uid is in &buddy->node (set_blist_node_int), since it never changes */ gchar *username; gchar *band_name, *song_name; gchar *image_url; diff -r 841eb21e96fe -r 16b901793d7c libpurple/protocols/oscar/family_auth.c --- a/libpurple/protocols/oscar/family_auth.c Sat Dec 13 10:52:10 2008 +0000 +++ b/libpurple/protocols/oscar/family_auth.c Mon Dec 15 23:10:39 2008 +0000 @@ -597,18 +597,18 @@ { if (od->authinfo != NULL) { - free(od->authinfo->sn); - free(od->authinfo->bosip); - free(od->authinfo->errorurl); - free(od->authinfo->email); - free(od->authinfo->chpassurl); - free(od->authinfo->latestrelease.name); - free(od->authinfo->latestrelease.url); - free(od->authinfo->latestrelease.info); - free(od->authinfo->latestbeta.name); - free(od->authinfo->latestbeta.url); - free(od->authinfo->latestbeta.info); - free(od->authinfo); + g_free(od->authinfo->sn); + g_free(od->authinfo->bosip); + g_free(od->authinfo->errorurl); + g_free(od->authinfo->email); + g_free(od->authinfo->chpassurl); + g_free(od->authinfo->latestrelease.name); + g_free(od->authinfo->latestrelease.url); + g_free(od->authinfo->latestrelease.info); + g_free(od->authinfo->latestbeta.name); + g_free(od->authinfo->latestbeta.url); + g_free(od->authinfo->latestbeta.info); + g_free(od->authinfo); } } diff -r 841eb21e96fe -r 16b901793d7c libpurple/protocols/qq/group_im.c --- a/libpurple/protocols/qq/group_im.c Sat Dec 13 10:52:10 2008 +0000 +++ b/libpurple/protocols/qq/group_im.c Mon Dec 15 23:10:39 2008 +0000 @@ -378,7 +378,7 @@ g_return_val_if_fail(id != 0 && what != NULL, -1); qd = (qq_data *) gc->proto_data; - purple_debug_info("QQ", "Send chat IM to %u, len %d:\n%s\n", id, strlen(what), what); + purple_debug_info("QQ", "Send chat IM to %u, len %" G_GSIZE_FORMAT ":\n%s\n", id, strlen(what), what); /* qq_show_packet("chat IM UTF8", (guint8 *)what, strlen(what)); */ diff -r 841eb21e96fe -r 16b901793d7c libpurple/protocols/qq/im.c --- a/libpurple/protocols/qq/im.c Sat Dec 13 10:52:10 2008 +0000 +++ b/libpurple/protocols/qq/im.c Mon Dec 15 23:10:39 2008 +0000 @@ -1258,7 +1258,7 @@ g_return_val_if_fail(who != NULL && what != NULL, -1); qd = (qq_data *) gc->proto_data; - purple_debug_info("QQ", "Send IM to %s, len %d:\n%s\n", who, strlen(what), what); + purple_debug_info("QQ", "Send IM to %s, len %" G_GSIZE_FORMAT ":\n%s\n", who, strlen(what), what); uid_to = purple_name_to_uid(who); if (uid_to == qd->uid) { diff -r 841eb21e96fe -r 16b901793d7c libpurple/protocols/sametime/sametime.c --- a/libpurple/protocols/sametime/sametime.c Sat Dec 13 10:52:10 2008 +0000 +++ b/libpurple/protocols/sametime/sametime.c Mon Dec 15 23:10:39 2008 +0000 @@ -514,6 +514,11 @@ idle_len = time(NULL) - idle; ugly_idle_len = ((time(NULL) * 1000) - idle) / 1000; + if(idle > ugly_idle_len) + ugly_idle_len = 0; + else + ugly_idle_len = (ugly_idle_len - idle) / 1000; + /* what's the deal here? Well, good clients are smart enough to publish their idle time by using an attribute to indicate that diff -r 841eb21e96fe -r 16b901793d7c libpurple/protocols/simple/simple.c --- a/libpurple/protocols/simple/simple.c Sat Dec 13 10:52:10 2008 +0000 +++ b/libpurple/protocols/simple/simple.c Mon Dec 15 23:10:39 2008 +0000 @@ -1939,6 +1939,13 @@ sip->txbuf = purple_circ_buffer_new(0); userserver = g_strsplit(username, "@", 2); + if (userserver[1] == NULL || userserver[1][0] == '\0') { + purple_connection_error_reason(gc, + PURPLE_CONNECTION_ERROR_INVALID_SETTINGS, + _("SIP connect server not specified")); + return; + } + purple_connection_set_display_name(gc, userserver[0]); sip->username = g_strdup(userserver[0]); sip->servername = g_strdup(userserver[1]); diff -r 841eb21e96fe -r 16b901793d7c libpurple/protocols/yahoo/yahoo_picture.c --- a/libpurple/protocols/yahoo/yahoo_picture.c Sat Dec 13 10:52:10 2008 +0000 +++ b/libpurple/protocols/yahoo/yahoo_picture.c Mon Dec 15 23:10:39 2008 +0000 @@ -408,8 +408,10 @@ if (ret < 0 && errno == EAGAIN) return; else if (ret <= 0) { - purple_debug_info("yahoo", "Buddy icon upload response (%d) bytes (> ~400 indicates failure):\n%.*s\n", - d->str->len, d->str->len, d->str->str); + /* There are other problems if d->str->len overflows, so shut up the + * warning on 64-bit. */ + purple_debug_info("yahoo", "Buddy icon upload response (%" G_GSIZE_FORMAT ") bytes (> ~400 indicates failure):\n%.*s\n", + d->str->len, (guint)d->str->len, d->str->str); yahoo_buddy_icon_upload_data_free(d); return; @@ -517,7 +519,8 @@ g_string_prepend(d->str, header); g_free(header); - purple_debug_info("yahoo", "Buddy icon upload data:\n%.*s\n", d->str->len, d->str->str); + /* There are other problems if we're uploading over 4GB of data */ + purple_debug_info("yahoo", "Buddy icon upload data:\n%.*s\n", (guint)d->str->len, d->str->str); d->fd = source; d->watcher = purple_input_add(d->fd, PURPLE_INPUT_WRITE, yahoo_buddy_icon_upload_pending, d); diff -r 841eb21e96fe -r 16b901793d7c pidgin/gtkimhtml.c --- a/pidgin/gtkimhtml.c Sat Dec 13 10:52:10 2008 +0000 +++ b/pidgin/gtkimhtml.c Mon Dec 15 23:10:39 2008 +0000 @@ -3126,9 +3126,15 @@ font->size = 6; else if (g_ascii_strcasecmp(size, "xx-large") == 0) font->size = 7; - else - font->size = 3; - gtk_imhtml_font_set_size(imhtml, font->size); + + /* + * TODO: Handle other values, like percentages, or + * lengths specified as em, ex, px, in, cm, mm, pt + * or pc. Or even better, use an actual HTML + * renderer like webkit. + */ + if (font->size > 0) + gtk_imhtml_font_set_size(imhtml, font->size); } else if (oldfont) { diff -r 841eb21e96fe -r 16b901793d7c pidgin/gtkutils.c --- a/pidgin/gtkutils.c Sat Dec 13 10:52:10 2008 +0000 +++ b/pidgin/gtkutils.c Mon Dec 15 23:10:39 2008 +0000 @@ -1502,16 +1502,16 @@ break; } - free(data->filename); - free(data->who); - free(data); + g_free(data->filename); + g_free(data->who); + g_free(data); } static void dnd_image_cancel_callback(_DndData *data, int choice) { - free(data->filename); - free(data->who); - free(data); + g_free(data->filename); + g_free(data->who); + g_free(data); } static void dnd_set_icon_ok_cb(_DndData *data) @@ -1521,9 +1521,9 @@ static void dnd_set_icon_cancel_cb(_DndData *data) { - free(data->filename); - free(data->who); - free(data); + g_free(data->filename); + g_free(data->who); + g_free(data); } void diff -r 841eb21e96fe -r 16b901793d7c po/ca.po --- a/po/ca.po Sat Dec 13 10:52:10 2008 +0000 +++ b/po/ca.po Mon Dec 15 23:10:39 2008 +0000 @@ -3,7 +3,7 @@ # Copyright (C) unknown, Robert Millan # Copyright (C) December 2003 (from 2003-12-12 until 2003-12-18), # January (2004-01-07,12), Xan -# Copyright (c) 2004, 2005, 2006, 2007 +# Copyright (c) 2004, 2005, 2006, 2007, 2008 # Josep Puigdemont i Casamajó # # This file is distributed under the same license as the Pidgin package. @@ -27,14 +27,14 @@ # # NOTE: adjectives in catalan go [almost] always to the end, for instance: # NOTA: els adjectius en català acostumen a anar al final, per exemple: -# "New file" --> "Fitxer nou" +# "New file" --> "Fitxer nou" # msgid "" msgstr "" "Project-Id-Version: Pidgin\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2008-12-01 15:52-0800\n" -"PO-Revision-Date: 2008-05-11 13:00+0200\n" +"POT-Creation-Date: 2008-12-14 17:46+0100\n" +"PO-Revision-Date: 2008-12-15 00:07+0100\n" "Last-Translator: Josep Puigdemont i Casamajó \n" "Language-Team: Catalan \n" "MIME-Version: 1.0\n" @@ -96,7 +96,6 @@ msgid "Remember password" msgstr "Recorda la contrasenya" -#, fuzzy msgid "There are no protocol plugins installed." msgstr "No hi ha connectors de protocol instal·lats." @@ -122,9 +121,8 @@ msgstr "Àlies:" #. Register checkbox -#, fuzzy msgid "Create this account on the server" -msgstr "Crea aquest compte nou al servidor" +msgstr "Crea aquest compte al servidor" #. Cancel button #. Cancel @@ -434,9 +432,8 @@ msgid "View Log..." msgstr "Mostra el registre..." -#, fuzzy msgid "View All Logs" -msgstr "Visualitza el registre" +msgstr "Visualitza tots els registres" msgid "Show" msgstr "Mostra" @@ -641,21 +638,18 @@ msgid "Send To" msgstr "Envia a" -# FIXME -#, fuzzy msgid "Invite message" -msgstr "Missatge de sortida" +msgstr "Missatge d'invitació" msgid "Invite" msgstr "Convida" -#, fuzzy msgid "" "Please enter the name of the user you wish to invite,\n" "along with an optional invite message." msgstr "" -"Introduïu el nom de l'usuari que vulgueu convidar, així com un missatge " -"d'invitació opcional." +"Introduïu el nom de l'usuari que vulgueu convidar,\n" +"així com un missatge d'invitació opcional." msgid "Conversation" msgstr "Conversa" @@ -670,9 +664,8 @@ msgid "Add Buddy Pounce..." msgstr "Afegeix un avís per a l'amic..." -#, fuzzy msgid "Invite..." -msgstr "Convida" +msgstr "Convida..." msgid "Enable Logging" msgstr "Habilita el registre" @@ -683,11 +676,11 @@ msgid " " msgstr " " -#, fuzzy, c-format +#, c-format msgid "List of %d user:\n" msgid_plural "List of %d users:\n" -msgstr[0] "Llista d'usuaris:\n" -msgstr[1] "Llista d'usuaris:\n" +msgstr[0] "Llista d'%d usuari:\n" +msgstr[1] "Llista de %d usuaris:\n" msgid "Supported debug options are: version" msgstr "Les opcions de depuració disponibles són: version" @@ -707,10 +700,14 @@ "%s is not a valid message class. See '/help msgcolor' for valid message " "classes." msgstr "" +"%s no és una classe de missatge vàlida. Vegeu '/help msgcolor' per a llistar " +"les classes de missatge vàlides." #, c-format msgid "%s is not a valid color. See '/help msgcolor' for valid colors." msgstr "" +"%s no és un color vàlid. Vegei '/help msgcolor' per a llistar els colors " +"vàlids." msgid "" "say <message>: Send a message normally as if you weren't using a " @@ -763,6 +760,13 @@ "background>: black, red, green, blue, white, gray, darkgray, magenta, " "cyan, default

EXAMPLE:
msgcolor send cyan default" msgstr "" +"msgcolor <classe> <primer pla> <fons>: estableix el color " +"de les diferents classes de missatge en les finestres de conversa.
" +"<classe>: receive (rep), send (envia), highlight (ressalta), action " +"(acció), timestamp (marca de temps)
<primer pla/fons>: black " +"(negre), red (vermell), green (verd), blue (blau), white (blanc), gray " +"(gris), darkgray (gris fosc), magenta, cyan (cian), default (per defecte)" +"

EXEMPLE:
msgcolor send cyan default" msgid "Unable to open file." msgstr "No s'ha pogut obrir el fitxer." @@ -783,10 +787,10 @@ msgid "Pause" msgstr "Fes una pausa" -#, fuzzy, c-format +#, c-format msgid "File Transfers - %d%% of %d file" msgid_plural "File Transfers - %d%% of %d files" -msgstr[0] "Transferència de fitxers - %d%% de %d fitxers" +msgstr[0] "Transferència de fitxers - %d%% de %d fitxer" msgstr[1] "Transferència de fitxers - %d%% de %d fitxers" #. Create the window. @@ -904,9 +908,8 @@ msgid "Conversations with %s" msgstr "Converses amb %s" -#, fuzzy msgid "All Conversations" -msgstr "Converses" +msgstr "Totes les converses" msgid "System Log" msgstr "Registre del sistema" @@ -1542,10 +1545,10 @@ msgstr "Sense agrupament" msgid "Nested Subgroup" -msgstr "" +msgstr "Subgrup imbricat" msgid "Nested Grouping (experimental)" -msgstr "" +msgstr "Subgrup imbricat (experimental)" msgid "Provides alternate buddylist grouping options." msgstr "Proporciona opcions alternatives per a l'agrupament d'amics." @@ -1868,7 +1871,7 @@ #, c-format msgid "Resolver process exited without answering our request" -msgstr "" +msgstr "El procés resoledor ha acabat sense respondre la nostra sol·licitud" #, c-format msgid "Thread creation failure: %s" @@ -2177,10 +2180,11 @@ msgid "ABI version mismatch %d.%d.x (need %d.%d.x)" msgstr "Hi ha un error de coincidència de l'ABI %d.%d.x (cal %d.%d.x)" -#, fuzzy msgid "" "Plugin does not implement all required functions (list_icon, login and close)" -msgstr "El connector no implementa totes les funcions requerides" +msgstr "" +"El connector no implementa totes les funcions requerides (list_icon, login i " +"close)" #, c-format msgid "" @@ -2266,9 +2270,8 @@ "s'hagi transferit completament (només quan no hi ha conversa amb qui\n" "l'envia)" -#, fuzzy msgid "Create a new directory for each user" -msgstr "Seleccioneu quin directori d'usuari cercar" +msgstr "Crea un directori nou per a cada usuari" msgid "Notes" msgstr "Notes" @@ -2433,7 +2436,7 @@ msgstr "Temps d'espera d'inactivitat del usuaris (en minuts)" msgid "Apply hiding rules to buddies" -msgstr "" +msgstr "Aplica les normes d'ocultació als amics" #. *< type #. *< ui_requirement @@ -2846,14 +2849,13 @@ "No s'ha pogut detectar la instal·lació d'ActiveTCL. Si voleu emprar " "connectors TCL, instal·leu l'ActiveTCL de http://www.activestate.com\n" -#, fuzzy msgid "" "The Apple Bonjour For Windows toolkit wasn't found, see the FAQ at: http://d." "pidgin.im/BonjourWindows for more information." msgstr "" "No s'ha pogut trobar el joc d'eines per a Windows de l'Apple Bonjour, " -"consulteu les preguntes més freqüents a http://developer.pidgin.im/wiki/Using" -"%20Pidgin#CanIusePidginforBonjourLink-LocalMessaging per a més informació." +"consulteu les preguntes més freqüents a http://developer.pidgin.im/" +"BonjourWindows per a més informació." msgid "Unable to listen for incoming IM connections\n" msgstr "No es poden escoltar connexions entrants de MI\n" @@ -3257,7 +3259,7 @@ msgstr "Codificacions" msgid "Auto-detect incoming UTF-8" -msgstr "" +msgstr "Detecta UTF-8 entrant automàticament" msgid "Real name" msgstr "Nom real" @@ -3272,9 +3274,9 @@ msgid "Bad mode" msgstr "Mode dolent" -#, fuzzy, c-format +#, c-format msgid "Ban on %s by %s, set %s ago" -msgstr "Bandejament a %s de %s, establert fa %ld segons" +msgstr "Bandejament a %s de %s, establert fa %s" #, c-format msgid "Ban on %s" @@ -3445,7 +3447,7 @@ "missatge el treu." msgid "ctcp : sends ctcp msg to nick." -msgstr "" +msgstr "ctcp : envia un missatge ctcp a sobrenom" msgid "chanserv: Send a command to chanserv" msgstr "chanserv: envia una ordre al chanserv" @@ -3750,9 +3752,9 @@ msgid "Service Discovery Items" msgstr "Elements del servei de descoberta" -#, fuzzy +# http://xmpp.org/extensions/xep-0033.html msgid "Extended Stanza Addressing" -msgstr "Adreça (cont.)" +msgstr "Bloc d'adressament estès" msgid "Multi-User Chat" msgstr "Xat multi-usuari" @@ -3812,17 +3814,18 @@ msgstr "Negociacions de la sessió xifrada" # Pot ser també música, cançó... (josep) -#, fuzzy +# Vegeu: http://xmpp.org/extensions/xep-0118.html msgid "User Tune" msgstr "Melodia de l'usuari" -#, fuzzy +# Nota: "Roster" en XMPP és la llista de contactes (josep) msgid "Roster Item Exchange" -msgstr "MI amb intercanvi de clau" - -#, fuzzy +msgstr "Intercanvi d'element de la llista de contactes" + +# Vegeu: http://xmpp.org/extensions/xep-0152.html (josep) +# Nota: codi mort msgid "Reachability Address" -msgstr "Adreça de correu" +msgstr "Adreça de localització" msgid "User Profile" msgstr "Perfil de l'usuari" @@ -3875,8 +3878,11 @@ msgid "Ping" msgstr "Ping" +# Vegeu: http://xmpp.org/extensions/xep-0200.html +# Nota: Això es refereix a les capabilitats de l'altre interlocutor +# No apareix a l'aplicació final, és codi mort dins un #if 0 ... #endif (josep) msgid "Stanza Encryption" -msgstr "Xifratge de paràgrafs" +msgstr "Blocs xifrats" msgid "Entity Time" msgstr "Hora de l'entitat" @@ -3909,9 +3915,9 @@ msgid "Resource" msgstr "Recurs" -# FIXME +# Segons la viquipèdia msgid "Middle Name" -msgstr "Primer cognom" +msgstr "Nom del mig" msgid "Address" msgstr "Adreça" @@ -4421,8 +4427,9 @@ msgid "Unsupported Encoding" msgstr "La codificació no està implementada" +# FIXME msgid "Unsupported Stanza Type" -msgstr "El tipus de permanència no està implementada" +msgstr "Aquest tipus de bloc no està implementat" msgid "Unsupported Version" msgstr "Aquesta versió no està implementada" @@ -4580,7 +4587,6 @@ #. this should probably be part of global smiley theme settings later on, #. shared with MSN -#, fuzzy msgid "Show Custom Smileys" msgstr "Mostra emoticones personalitzades" @@ -4607,9 +4613,9 @@ msgid "XMPP Message Error" msgstr "Missatge d'error de l'XMPP" -#, fuzzy, c-format +#, c-format msgid "(Code %s)" -msgstr " (Codi %s)" +msgstr "(Codi %s)" msgid "XML Parse error" msgstr "Error en l'anàlisi de l'XML" @@ -4709,6 +4715,19 @@ msgid "Unable to retrieve MSN Address Book" msgstr "No s'ha pogut obtenir la llibreta d'adreces MSN" +#. only notify the user about problems adding to the friends list +#. * maybe we should do something else for other lists, but it probably +#. * won't cause too many problems if we just ignore it +#, c-format +msgid "Unable to add \"%s\"." +msgstr "No s'ha pogut afegir «%s»." + +msgid "Buddy Add error" +msgstr "Error en afegir un amic" + +msgid "The username specified does not exist." +msgstr "El nom d'usuari especificat no existeix." + #, c-format msgid "Buddy list synchronization issue in %s (%s)" msgstr "Problema de sincronització de la llista d'amics a %s (%s)" @@ -4936,9 +4955,9 @@ msgid "Passport account not yet verified" msgstr "El compte de passaport encara no està verificat" -#, fuzzy, c-format +#, c-format msgid "Passport account suspended" -msgstr "El compte de passaport encara no està verificat" +msgstr "El compte de passaport s'ha suspès" #, c-format msgid "Bad ticket" @@ -4952,13 +4971,11 @@ msgid "MSN Error: %s\n" msgstr "Error d'MSN: %s\n" -#, fuzzy msgid "Other Contacts" -msgstr "Contacte preferit" - -#, fuzzy +msgstr "Altres contactes" + msgid "Non-IM Contacts" -msgstr "Suprimeix el contacte" +msgstr "Contactes que no són de MI" msgid "Nudge" msgstr "Donar un cop de colze" @@ -4971,9 +4988,8 @@ msgid "Nudging %s..." msgstr "S'està donant un cop de colze a %s..." -#, fuzzy msgid "Email Address..." -msgstr "Adreça de correu electrònic" +msgstr "Correu electrònic..." msgid "Your new MSN friendly name is too long." msgstr "El vostre nom amistós nou d'MSN és massa llarg." @@ -5009,22 +5025,20 @@ msgid "Disallow" msgstr "Denega" -#, fuzzy, c-format +#, c-format msgid "Blocked Text for %s" -msgstr "Comentari sobre l'amic %s" - -#, fuzzy +msgstr "Text blocat de %s" + msgid "No text is blocked for this account." -msgstr "Utilitza aquesta _icona d'amic per a aquest compte:" +msgstr "No hi ha text blocat per aquest compte." #, c-format msgid "" "MSN servers are currently blocking the following regular expressions:
%s" -msgstr "" - -#, fuzzy +msgstr "Actualment, sevidors MSN bloquen aquestes expressions regulars:
%s" + msgid "This account does not have email enabled." -msgstr "Pot ser que aquest compte Hotmail no sigui actiu." +msgstr "Aquest compte no té el correu habilitat." msgid "Send a mobile message." msgstr "Envia un missatge de mòbil." @@ -5032,6 +5046,12 @@ msgid "Page" msgstr "Pàgina" +msgid "Playing a game" +msgstr "Jugant a un joc" + +msgid "Working" +msgstr "Treballant" + msgid "Has you" msgstr "Us té" @@ -5068,6 +5088,12 @@ msgid "Album" msgstr "Àlbum" +msgid "Game Title" +msgstr "Títol del joc" + +msgid "Office Title" +msgstr "Títol oficial" + msgid "Set Friendly Name..." msgstr "Estableix el nom amistós..." @@ -5087,7 +5113,7 @@ msgstr "Permet/denega pàgines de mòbil..." msgid "View Blocked Text..." -msgstr "" +msgstr "Mostra el text blocat..." msgid "Open Hotmail Inbox" msgstr "Obre la safata d'entrada de Hotmail" @@ -5259,8 +5285,8 @@ "No s'ha pogut trobar informació del perfil de l'usuari. El més segur és que " "l'usuari no existeixi." -msgid "Profile URL" -msgstr "URL del perfil" +msgid "View web profile" +msgstr "Mostra el perfil web" #. *< type #. *< ui_requirement @@ -5289,9 +5315,8 @@ msgid "Windows Live ID authentication:Unable to connect" msgstr "Autenticació amb el Windows Live ID: no s'ha pogut connectar" -#, fuzzy msgid "Windows Live ID authentication:Invalid response" -msgstr "Autenticació amb el Windows Live ID: no s'ha pogut connectar" +msgstr "Autenticació amb el Windows Live ID: la resposta no és vàlida" #, c-format msgid "%s is not a valid group." @@ -5316,9 +5341,8 @@ msgid "Unable to add user" msgstr "No s'ha pogut afegir l'usuari" -#, fuzzy msgid "The following users are missing from your addressbook" -msgstr "El que segueix són els resultats de la vostra cerca" +msgstr "Manquen aquests usuaris a la vostra llista d'amics" #, c-format msgid "Unable to add user on %s (%s)" @@ -5343,9 +5367,8 @@ msgid "Service Temporarily Unavailable." msgstr "El servei no està disponible temporalment." -#, fuzzy msgid "Mobile message was not sent because it was too long." -msgstr "El missatge no s'ha enviat perquè no esteu connectat." +msgstr "No s'ha enviat el missatge al mòbil perquè era massa llarg." msgid "Unable to rename group" msgstr "No s'ha pogut canviar el nom del grup" @@ -5385,21 +5408,21 @@ "Message was not sent because the system is unavailable. This normally " "happens when the user is blocked or does not exist." msgstr "" - -#, fuzzy +"No s'ha pogut enviar el missatge perquè el sistema no està disponible. Això " +"normalment passa quan l'usuari està blocat o no existeix." + msgid "Message was not sent because messages are being sent too quickly." msgstr "" -"El missatge no s'ha pogut enviar perquè s'està enviant massa de pressa:" - -#, fuzzy +"No s'ha pogut enviar el missatge perquè se n'estan enviant massa depressa." + msgid "Message was not sent because an unknown encoding error occurred." msgstr "" -"No s'ha pogut enviar el missatge perquè s'ha produït un error desconegut:" - -#, fuzzy +"No s'ha pogut enviar el missatge perquè s'ha produït un error desconegut en " +"la codificació." + msgid "Message was not sent because an unknown error occurred." msgstr "" -"No s'ha pogut enviar el missatge perquè s'ha produït un error desconegut:" +"No s'ha pogut enviar el missatge perquè s'ha produït un error desconegut." msgid "Unable to connect" msgstr "No s'ha pogut connectar" @@ -5518,20 +5541,11 @@ msgid "%s has removed you from his or her buddy list." msgstr "%s us ha suprimit de la seva llista d'amics." -#, fuzzy msgid "Delete Buddy from Address Book?" -msgstr "Afegeix a la llibreta d'adreces" - -#, fuzzy +msgstr "Voleu suprimir l'amic de la llibreta d'adreces?" + msgid "Do you want to delete this buddy from your address book as well?" -msgstr "Voleu afegir aquest amic a la vostra llista d'amics?" - -#. only notify the user about problems adding to the friends list -#. * maybe we should do something else for other lists, but it probably -#. * won't cause too many problems if we just ignore it -#, c-format -msgid "Unable to add \"%s\"." -msgstr "No s'ha pogut afegir «%s»." +msgstr "Voleu suprimir aquest amic de la vostra llista d'amics també?" msgid "The username specified is invalid." msgstr "El nom d'usuari especificat no és vàlid." @@ -5539,6 +5553,9 @@ msgid "This Hotmail account may not be active." msgstr "Pot ser que aquest compte Hotmail no sigui actiu." +msgid "Profile URL" +msgstr "URL del perfil" + #. *< type #. *< ui_requirement #. *< flags @@ -5575,13 +5592,8 @@ msgid "Logging in" msgstr "S'està entrant" -#, fuzzy, c-format -msgid "Connection to server lost (no data received within %d second)" -msgid_plural "Connection to server lost (no data received within %d seconds)" -msgstr[0] "" -"S'ha perdut la connexió al servidor (fa %d segons que no s'hi reben dades)" -msgstr[1] "" -"S'ha perdut la connexió al servidor (fa %d segons que no s'hi reben dades)" +msgid "Lost connection with server" +msgstr "S'ha perdut la connexió amb el servidor" #. Can't write _()'d strings in array initializers. Workaround. msgid "New mail messages" @@ -5676,7 +5688,7 @@ msgid "IM Friends" msgstr "Amics de MI" -#, fuzzy, c-format +#, c-format msgid "" "%d buddy was added or updated from the server (including buddies already on " "the server-side list)" @@ -5684,8 +5696,8 @@ "%d buddies were added or updated from the server (including buddies already " "on the server-side list)" msgstr[0] "" -"S'han afegit o actualitzat %d amics al servidor (incloent els amics que ja " -"són a la llista del servidor)" +"S'ha afegit o actualitzat %d amic al servidor (incloent els amics que ja són " +"a la llista del servidor)" msgstr[1] "" "S'han afegit o actualitzat %d amics al servidor (incloent els amics que ja " "són a la llista del servidor)" @@ -5740,9 +5752,6 @@ msgid "User" msgstr "Usuari" -msgid "Profile" -msgstr "Perfil" - msgid "Headline" msgstr "Titular" @@ -6237,9 +6246,8 @@ msgid "AIM Protocol Plugin" msgstr "Connector per al protocol AIM" -#, fuzzy msgid "ICQ UIN..." -msgstr "ICQ UIN" +msgstr "ICQ UIN..." #. *< type #. *< ui_requirement @@ -6339,10 +6347,10 @@ msgstr "En la llista de permès/denegat local" msgid "Warning level too high (sender)" -msgstr "" +msgstr "Nivell d'avís massa alt (remitent)" msgid "Warning level too high (receiver)" -msgstr "" +msgstr "Nivell d'avís massa alt (receptor)" msgid "User temporarily unavailable" msgstr "Usuari no disponible temporalment" @@ -6446,9 +6454,8 @@ msgid "Camera" msgstr "Càmera" -#, fuzzy msgid "Screen Sharing" -msgstr "Nom d'usuari" +msgstr "Compartició de pantalla" #, c-format msgid "Free For Chat" @@ -6697,27 +6704,30 @@ msgstr[0] "S'ha perdut %hu missatge de %s perquè no era vàlid." msgstr[1] "S'han perdut %hu missatges de %s perquè no eren vàlids." -#, fuzzy, c-format +#, c-format msgid "" "You missed %hu message from %s because his/her warning level is too high." msgid_plural "" "You missed %hu messages from %s because his/her warning level is too high." -msgstr[0] "S'ha perdut %hu missatge de %s perquè ell/ella era massa dolent/a." +msgstr[0] "" +"Heu perdut %hu missatge de %s perquè el seu nivell d'avís és massa alt." msgstr[1] "" -"S'han perdut %hu missatges de %s perquè ell/ella era massa dolent/a." - -#, fuzzy, c-format +"Heu perdut %hu missatges de %s perquè el seu nivell d'avís és massa alt." + +#, c-format msgid "You missed %hu message from %s because your warning level is too high." msgid_plural "" "You missed %hu messages from %s because your warning level is too high." -msgstr[0] "S'ha perdut %hu missatge de %s perquè sou massa dolent." -msgstr[1] "S'han perdut %hu missatges de %s perquè sou massa dolent." +msgstr[0] "" +"Heu perdut %hu missatge de %s perquè el vostre nivell d'avís és massa alt." +msgstr[1] "" +"Heu perdut %hu missatges de %s perquè el vostre nivell d'avís és massa alt." #, c-format msgid "You missed %hu message from %s for an unknown reason." msgid_plural "You missed %hu messages from %s for an unknown reason." -msgstr[0] "S'ha perdut %hu missatge de %s per motius desconeguts." -msgstr[1] "S'han perdut %hu missatges de %s per motius desconeguts." +msgstr[0] "Heu perdut %hu missatge de %s per motius desconeguts." +msgstr[1] "Heu perdut %hu missatges de %s per motius desconeguts." #. Data is assumed to be the destination sn #, c-format @@ -6741,6 +6751,9 @@ msgid "Member Since" msgstr "Membre des de" +msgid "Profile" +msgstr "Perfil" + msgid "Your AIM connection may be lost." msgstr "La vostra connexió d'AIM es pot perdre." @@ -6928,11 +6941,9 @@ "d'usuari han de ser adreces de correu vàlides, o començar amb una lletra i " "contenir només lletres, nombres i espais, o només nombres." -#, fuzzy msgid "Unable to Add" msgstr "No s'ha pogut afegir" -#, fuzzy msgid "Unable to Retrieve Buddy List" msgstr "No s'ha pogut obtenir la llista d'amics" @@ -7126,8 +7137,9 @@ "per a la transferència de fitxers\n" "(és més lent, però acostuma a funcionar)" +# FIXME: entrades/registres? msgid "Allow multiple simultaneous logins" -msgstr "" +msgstr "Permet diverses entrades simultànies" #, c-format msgid "Asking %s to connect to us at %s:%hu for Direct IM." @@ -7230,16 +7242,14 @@ msgid "Other" msgstr "Altres" -#, fuzzy msgid "Visible" -msgstr "Invisible" - -msgid "Firend Only" -msgstr "" - -#, fuzzy +msgstr "Visible" + +msgid "Friend Only" +msgstr "Només amic" + msgid "Private" -msgstr "Privadesa" +msgstr "Privat" msgid "QQ Number" msgstr "Número QQ" @@ -7256,9 +7266,8 @@ msgid "Phone Number" msgstr "Número de telèfon" -#, fuzzy msgid "Authorize adding" -msgstr "Voleu autoritzar l'amic?" +msgstr "Autoritzar que us afegeixin" msgid "Cellphone Number" msgstr "Número de mòbil" @@ -7266,131 +7275,110 @@ msgid "Personal Introduction" msgstr "Introducció personal" -#, fuzzy msgid "City/Area" -msgstr "Ciutat" - -#, fuzzy +msgstr "Ciutat/Àrea" + msgid "Publish Mobile" -msgstr "Mòbil personal" - -#, fuzzy +msgstr "Publica el mòbil" + msgid "Publish Contact" -msgstr "Posa un àlies al contacte" +msgstr "Publica el contacte" msgid "College" msgstr "Col·legi" -#, fuzzy msgid "Horoscope" -msgstr "Signe de l'horòscop" - -#, fuzzy +msgstr "Horòscop" + msgid "Zodiac" -msgstr "Signe del zodíac" - -#, fuzzy +msgstr "Zodíac" + msgid "Blood" -msgstr "Blocat" - -#, fuzzy +msgstr "Sang" + msgid "True" -msgstr "Taure" - -#, fuzzy +msgstr "Cert" + msgid "False" -msgstr "Ha fallat" - -#, fuzzy +msgstr "Fals" + msgid "Modify Contact" -msgstr "Modifica el compte" - -#, fuzzy +msgstr "Modifica el contacte" + msgid "Modify Address" -msgstr "Adreça de casa" - -#, fuzzy +msgstr "Modifica l'adreça" + msgid "Modify Extended Information" -msgstr "Modifica la meva informació" - -#, fuzzy +msgstr "Modifica la informació estesa" + msgid "Modify Information" -msgstr "Modifica la meva informació" +msgstr "Modifica la informació" msgid "Update" msgstr "Actualitza" -#, fuzzy msgid "Could not change buddy information." -msgstr "Introduïu informació sobre l'amic." - -#, c-format -msgid "%d needs Q&A" -msgstr "" - -#, fuzzy -msgid "Add buddy Q&A" -msgstr "Afegeix un amic" - -#, fuzzy -msgid "Input answer here" -msgstr "Introduïu la sol·licitud aquí" +msgstr "No s'ha pogut canviar la informació l'amic." + +#, c-format +msgid "%u requires verification" +msgstr "Cal verificació per a %u" + +# Nota: títol de finestra +msgid "Add buddy question" +msgstr "Afegir una pregunta" + +msgid "Enter answer here" +msgstr "Introduïu la resposta aquí" msgid "Send" msgstr "Envia" -#, fuzzy msgid "Invalid answer." -msgstr "La contrasenya no és vàlida" +msgstr "La resposta no és vàlida" msgid "Authorization denied message:" msgstr "Missatge de denegació de l'autorització:" -#, fuzzy -msgid "Sorry, You are not my style." -msgstr "Em sap greu, no sou el meu tipus..." - -#, fuzzy, c-format -msgid "%d needs authentication" -msgstr "L'usuari %d necessita autenticació" - -#, fuzzy +msgid "Sorry, you're not my style." +msgstr "Em sap greu, no sou el meu tipus." + +#, c-format +msgid "%u needs authorization" +msgstr "Cal autorització per a %u" + +# Nota: títol de finestra (josep) msgid "Add buddy authorize" -msgstr "Voleu afegir l'amic a la llista?" - -msgid "Input request here" +msgstr "Autorització per a afegir un amic" + +msgid "Enter request here" msgstr "Introduïu la sol·licitud aquí" msgid "Would you be my friend?" msgstr "Voleu ser el meu amic?" -#, fuzzy msgid "QQ Buddy" -msgstr "Amic" - -#, fuzzy +msgstr "Amic QQ" + msgid "Add buddy" msgstr "Afegeix un amic" -#, fuzzy msgid "Invalid QQ Number" -msgstr "El nom de la cara QQ no és vàlida" - -#, fuzzy +msgstr "El nombre QQ no és vàlid" + msgid "Failed sending authorize" -msgstr "Autoritzeu-me, si us plau." - -#, fuzzy, c-format -msgid "Failed removing buddy %d" -msgstr "No s'ha pogut suprimir l'amic" - -#, fuzzy, c-format +msgstr "No s'ha pogut enviar l'autorizació" + +#, c-format +msgid "Failed removing buddy %u" +msgstr "No s'ha pogut suprimir l'amic %u" + +#, c-format msgid "Failed removing me from %d's buddy list" -msgstr "Suprimeix l'usuari de la llista d'amics" - -#, fuzzy +msgstr "No us heu pogut suprimir de la llista d'amics de %d" + msgid "No reason given" -msgstr "No s'ha indicat cap motiu." +msgstr "No s'ha indicat cap motiu" #. only need to get value #, c-format @@ -7400,9 +7388,9 @@ msgid "Would you like to add him?" msgstr "Voleu afegir-lo?" -#, fuzzy, c-format +#, c-format msgid "Rejected by %s" -msgstr "S'ha connectat a %s" +msgstr "Rebutjat per %s" #, c-format msgid "Message: %s" @@ -7417,82 +7405,73 @@ msgid "QQ Qun" msgstr "QQ Qun" -#, fuzzy msgid "Please enter Qun number" -msgstr "Introduïu un nou nom per a %s" - -#, fuzzy +msgstr "Introduïu el número Qun" + msgid "You can only search for permanent Qun\n" -msgstr "Només podeu cercar grups QQ permanents\n" - -#, fuzzy +msgstr "Només podeu cercar Quns permanents\n" + +msgid "(Invalid UTF-8 string)" +msgstr "(No és una cadena UTF-8 vàlida)" + msgid "Not member" msgstr "No en sóc membre" -#, fuzzy msgid "Member" -msgstr "Membre des de" - -#, fuzzy +msgstr "Membre" + msgid "Requesting" -msgstr "Diàleg de sol·licitud" - -#, fuzzy +msgstr "Demanant" + msgid "Admin" -msgstr "Alerta d'administració" - -#, fuzzy +msgstr "Administrador" + msgid "Notice" -msgstr "Nota" - -#, fuzzy +msgstr "Avís" + msgid "Detail" msgstr "Detalls" msgid "Creator" msgstr "Creador" -#, fuzzy msgid "About me" -msgstr "Quant al %s" - -#, fuzzy +msgstr "Quant a mi" + msgid "Category" -msgstr "Error en el xat" - -#, fuzzy +msgstr "Categoria" + msgid "The Qun does not allow others to join" -msgstr "Aquest grup no permet que s'hi afegeixi ningú" - -#, fuzzy +msgstr "Aquest Qun no permet que s'hi afegeixi ningú" + msgid "Join QQ Qun" -msgstr "Entra a un xat" - -#, c-format -msgid "Successfully joined Qun %s (%d)" -msgstr "" - -#, fuzzy +msgstr "Entra al Qun QQ" + +msgid "Input request here" +msgstr "Introduïu la sol·licitud aquí" + +#, c-format +msgid "Successfully joined Qun %s (%u)" +msgstr "S'ha entrat al Qun %s (%u)" + msgid "Successfully joined Qun" -msgstr "Heu modificat amb èxit el membre del Qun" - -#, c-format -msgid "Qun %d denied to join" -msgstr "" +msgstr "S'ha entrat al Qun" + +#, c-format +msgid "Qun %u denied from joining" +msgstr "No se us ha permès entrar al Qun %u" msgid "QQ Qun Operation" msgstr "Operació Qun QQ" -#, fuzzy msgid "Failed:" -msgstr "Ha fallat" - -msgid "Join Qun, Unknow Reply" -msgstr "" - -#, fuzzy +msgstr "Ha fallat:" + +msgid "Join Qun, Unknown Reply" +msgstr "Resposta desconeguda en entrar al Qun" + msgid "Quit Qun" -msgstr "QQ Qun" +msgstr "Surt del Qun" msgid "" "Note, if you are the creator, \n" @@ -7501,51 +7480,47 @@ "Nota, si en sou el creador, \n" "aquesta operació suprimirà aquest Qun." -#, fuzzy -msgid "Sorry, you are not our style ..." -msgstr "Em sap greu, no sou el meu tipus..." - -#, fuzzy -msgid "Successfully changed Qun member" -msgstr "Heu modificat amb èxit el membre del Qun" - -#, fuzzy +msgid "Sorry, you are not our style" +msgstr "Em sap greu, no sou el meu tipus" + +msgid "Successfully changed Qun members" +msgstr "S'ha canviat els membres del Qun" + msgid "Successfully changed Qun information" -msgstr "Heu modificat amb èxit la informació del Qun" +msgstr "S'ha canviat la iformació del Qun correctament" msgid "You have successfully created a Qun" msgstr "Heu creat un Qun" -#, fuzzy -msgid "Would you like to set detailed information now?" -msgstr "Voleu establir-la els detalls del Qun ara?" +msgid "Would you like to set up detailed information now?" +msgstr "Voleu establir informació detallada ara?" msgid "Setup" -msgstr "Instal·lació" - -#, fuzzy, c-format -msgid "%d requested to join Qun %d for %s" -msgstr "L'usuari %d ha sol·licitat unir-se al grup %d" - -#, fuzzy, c-format -msgid "%d request to join Qun %d" -msgstr "L'usuari %d ha sol·licitat unir-se al grup %d" - -#, fuzzy, c-format -msgid "Failed to join Qun %d, operated by admin %d" -msgstr "No s'ha pogut entrar al xat de l'amic." - -#, c-format -msgid "Joining Qun %d is approved by admin %d for %s" -msgstr "" - -#, fuzzy, c-format -msgid "Removed buddy %d." -msgstr "Suprimeix l'amic" - -#, c-format -msgid "New buddy %d joined." -msgstr "" +msgstr "Configuració" + +#, c-format +msgid "%u requested to join Qun %u for %s" +msgstr "%u ha sol·licitat unir-se al Qun %u per %s" + +#, c-format +msgid "%u request to join Qun %u" +msgstr "%u ha sol·licitat unir-se al Qun %u" + +#, c-format +msgid "Failed to join Qun %u, operated by admin %u" +msgstr "No s'ha pogut entrar al Qun %u, administrat per %u" + +#, c-format +msgid "Joining Qun %u is approved by admin %u for %s" +msgstr "L'administrador %2$u us ha permès unir-vos al Qun %1$u per %3$s" + +#, c-format +msgid "Removed buddy %u." +msgstr "S'ha suprimit l'amic %u." + +#, c-format +msgid "New buddy %u joined." +msgstr "El nou amic %u ha entrat." #, c-format msgid "Unknown-%d" @@ -7555,10 +7530,10 @@ msgstr "Nivell" msgid " VIP" -msgstr "" +msgstr " VIP" msgid " TCP" -msgstr "" +msgstr " TCP" #, fuzzy msgid " FromMobile" @@ -7568,128 +7543,122 @@ msgid " BindMobile" msgstr "Mòbil" -#, fuzzy msgid " Video" -msgstr "Vídeo en directe" - -#, fuzzy +msgstr " Vídeo" + msgid " Zone" -msgstr "Cap" - +msgstr " Zona" + +# Nota: només apareix si es defineix DEBUG msgid "Flag" -msgstr "" - +msgstr "Bandera" + +# Nota: només apareix si es defineix DEBUG msgid "Ver" -msgstr "" +msgstr "Ver" msgid "Invalid name" msgstr "QQ: El nom d'usuari no és vàlid" -#, fuzzy msgid "Select icon..." -msgstr "Selecciona una carpeta..." - -#, fuzzy, c-format +msgstr "Selecciona una icona..." + +#, c-format msgid "Login time: %d-%d-%d, %d:%d:%d
\n" -msgstr "Temps de connexió: %s
\n" - -#, fuzzy, c-format +msgstr "Temps d'entrada: %d-%d-%d, %d:%d:%d
\n" + +#, c-format msgid "Total Online Buddies: %d
\n" -msgstr "En línia ara: %d
\n" - -#, fuzzy, c-format +msgstr "Amic en línia: %d
\n" + +#, c-format msgid "Last Refresh: %d-%d-%d, %d:%d:%d
\n" -msgstr "Actualitzat per darrer cop: %s
\n" - -#, fuzzy, c-format +msgstr "Actualitzat per darrer cop: %d-%d-%d, %d:%d:%d
\n" + +#, c-format msgid "Server: %s
\n" -msgstr "ID del servidor: %s: %d
\n" - -#, fuzzy, c-format +msgstr "Servidor: %s
\n" + +#, c-format msgid "Client Tag: %s
\n" -msgstr "Temps de connexió: %s
\n" +msgstr "Etiqueta del client: %s
\n" #, c-format msgid "Connection Mode: %s
\n" msgstr "Mode de connexió: %s
\n" -#, fuzzy, c-format +#, c-format msgid "My Internet IP: %s:%d
\n" -msgstr "Adreça IP: %s
" - -#, fuzzy, c-format +msgstr "La meva adreça IP: %s:%d
\n" + +#, c-format msgid "Sent: %lu
\n" -msgstr "En línia ara: %d
\n" - -#, fuzzy, c-format +msgstr "Enviats: %lu
\n" + +#, c-format msgid "Resend: %lu
\n" -msgstr "Usuari: %s
" - -#, fuzzy, c-format +msgstr "Reenviats: %lu
\n" + +#, c-format msgid "Lost: %lu
\n" -msgstr "%s: %s
" - -#, fuzzy, c-format +msgstr "Perduts: %lu
\n" + +#, c-format msgid "Received: %lu
\n" -msgstr "Actualitzat per darrer cop: %s
\n" - -#, fuzzy, c-format +msgstr "Rebuta: %lu
\n" + +#, c-format msgid "Received Duplicate: %lu
\n" -msgstr "La meva IP pública: %s
\n" - -#, fuzzy, c-format +msgstr "Rebuts duplicats: %lu
\n" + +#, c-format msgid "Time: %d-%d-%d, %d:%d:%d
\n" -msgstr "Temps de connexió: %s
\n" - -#, fuzzy, c-format +msgstr "Temps: %d-%d-%d, %d:%d:%d
\n" + +#, c-format msgid "IP: %s
\n" -msgstr "ID del servidor: %s: %d
\n" +msgstr "IP: %s
\n" msgid "Login Information" msgstr "Informació de la connexió" -#, fuzzy msgid "

Original Author:
\n" -msgstr "Usuari extern
" +msgstr "

Autor original:
\n" msgid "

Code Contributors:
\n" -msgstr "" - -#, fuzzy +msgstr "

Col·laboradors del codi:
\n" + msgid "

Lovely Patch Writers:
\n" -msgstr "Actualitzat per darrer cop: %s
\n" - -#, fuzzy +msgstr "

Encantadors apedaçadors (de codi):
\n" + msgid "

Acknowledgement:
\n" -msgstr "En línia ara: %d
\n" - +msgstr "

Reconeixement:
\n" + +# FIXME: ush... traducció lliure... msgid "

And, all the boys in the backroom...
\n" -msgstr "" +msgstr "

I tothom que ho ha fet possible...
\n" msgid "Feel free to join us! :)" -msgstr "" - -#, fuzzy, c-format -msgid "About OpenQ r%s" -msgstr "Quant al %s" - -#, fuzzy +msgstr "No dubteu a col·laborar amb nosaltres! :)" + +#, c-format +msgid "About OpenQ %s" +msgstr "Quant a l'OpenQ %s" + msgid "Change Icon" -msgstr "Desa la icona" +msgstr "Canvia la icona" msgid "Change Password" msgstr "Canvia la contrasenya" -#, fuzzy msgid "Account Information" -msgstr "Informació de la connexió" +msgstr "Informació del compte" msgid "Update all QQ Quns" -msgstr "" - -#, fuzzy +msgstr "Actualitza tots els Quns QQ" + msgid "About OpenQ" -msgstr "Quant al %s" +msgstr "Quant a l'OpenQ" #. *< type #. *< ui_requirement @@ -7701,116 +7670,102 @@ #. *< version #. * summary #. * description -#, fuzzy msgid "QQ Protocol Plugin" msgstr "Connector per al protocol QQ" -#, fuzzy msgid "Auto" -msgstr "Autor" - -#, fuzzy +msgstr "Auto" + msgid "Select Server" -msgstr "Seleccioneu un usuari" +msgstr "Seleccioneu un servidor" msgid "QQ2005" -msgstr "" +msgstr "QQ2005" msgid "QQ2007" -msgstr "" +msgstr "QQ2007" msgid "QQ2008" -msgstr "" - -#. #endif -#, fuzzy +msgstr "QQ2008" + msgid "Connect by TCP" msgstr "Connecta amb TCP" -#, fuzzy msgid "Show server notice" -msgstr "Mostra menys opcions" - -#, fuzzy +msgstr "Mostra els avisos del servidor" + msgid "Show server news" -msgstr "Mostra menys opcions" - -#, fuzzy +msgstr "Mostra les notícies del servidor" + +# FIXME: keep alive -> permanència msgid "Keep alive interval (seconds)" -msgstr "Error de permanència" - -#, fuzzy +msgstr "Interval de permanència (en segons)" + msgid "Update interval (seconds)" -msgstr "Error de permanència" - -#, fuzzy -msgid "Can not decrypt server reply" -msgstr "No s'ha pogut obtenir informació del servidor" - -#, fuzzy -msgid "Can not decrypt get server reply" -msgstr "No s'ha pogut obtenir informació del servidor" +msgstr "Interval d'actualització (en segons)" + +msgid "Cannot decrypt server reply" +msgstr "No es pot desxifrar la resposta del servidor" #, c-format msgid "Failed requesting token, 0x%02X" -msgstr "" - -#, fuzzy, c-format +msgstr "S'ha produït un error en sol·licitar el testimoni, 0x%02X" + +#, c-format msgid "Invalid token len, %d" -msgstr "El títol no és vàlid" +msgstr "La longiud del testimoni no és vàlida, %d" #. extend redirect used in QQ2006 msgid "Redirect_EX is not currently supported" -msgstr "" +msgstr "Redirect_EX no està implementat" #. need activation #. need activation #. need activation -#, fuzzy msgid "Activation required" -msgstr "Cal registre" - -#, c-format -msgid "Unknow reply code when login (0x%02X)" -msgstr "" - -msgid "Keep alive error" -msgstr "Error de permanència" - -#, fuzzy -msgid "Requesting captcha ..." -msgstr "S'està cridant l'atenció de %s..." - -msgid "Checking code of captcha ..." -msgstr "" - -msgid "Failed captcha verify" -msgstr "" - -#, fuzzy +msgstr "Cal activació" + +#, c-format +msgid "Unknown reply code when logging in (0x%02X)" +msgstr "No s'ha reconegut el codi de resposta en entrar (0x%02X)" + +msgid "Could not decrypt server reply" +msgstr "No s'ha pogut desxifrar la resposta del servidor" + +# FIXME: captcha +msgid "Requesting captcha" +msgstr "S'està sol·licitant un capcha" + +msgid "Checking captcha" +msgstr "S'està comprovant el captcha" + +msgid "Failed captcha verification" +msgstr "Ha fallat la verificació del captcha" + msgid "Captcha Image" -msgstr "Desa imatge" - -#, fuzzy +msgstr "Imatge captcha" + msgid "Enter code" -msgstr "Introduïu la contrasenya" - -msgid "QQ Captcha Verifing" -msgstr "" - -#, fuzzy +msgstr "Introduïu el codi" + +msgid "QQ Captcha Verification" +msgstr "Verificació del captcha QQ" + msgid "Enter the text from the image" -msgstr "Introduïu el nom del grup" - -#, c-format -msgid "Unknow reply code when checking password (0x%02X)" -msgstr "" - -#, c-format -msgid "" -"Unknow reply code when login (0x%02X):\n" +msgstr "Introduïu el text de la imatge" + +#, c-format +msgid "Unknown reply when checking password (0x%02X)" +msgstr "" +"No s'ha reconegut el codi de resposta en comprovar la contrasenya (0x%02X)" + +#, c-format +msgid "" +"Unknown reply code when logging in (0x%02X):\n" "%s" msgstr "" +"No s'ha reconegut el codi de resposta en entrar (0x%02X):\n" +"%s" #. we didn't successfully connect. tdt->toc_fd is valid here msgid "Unable to connect." @@ -7819,14 +7774,6 @@ msgid "Socket error" msgstr "Error del sòcol" -#, fuzzy, c-format -msgid "" -"Lost connection with server:\n" -"%d, %s" -msgstr "" -"S'ha perdut la connexió amb el servidor:\n" -"%s" - msgid "Unable to read from socket" msgstr "No s'ha pogut llegir el sòcol" @@ -7836,77 +7783,74 @@ msgid "Connection lost" msgstr "S'ha perdut la connexió" -#, fuzzy -msgid "Get server ..." -msgstr "Estableix informació d'usuari..." - -#, fuzzy -msgid "Request token" -msgstr "Petició denegada" +msgid "Getting server" +msgstr "S'està obtenint el servidor" + +msgid "Requesting token" +msgstr "S'està sol·licitant un testimoni" msgid "Couldn't resolve host" msgstr "No s'ha pogut obtenir l'adreça de l'ordinador" -#, fuzzy msgid "Invalid server or port" -msgstr "El nom d'usuari o la contrasenya no són vàlides" - -#, fuzzy -msgid "Connecting server ..." -msgstr "Servidor al qual connectar-se" - -#, fuzzy +msgstr "El servidor o el port no són vàlids" + +msgid "Connecting to server" +msgstr "S'està connectant al servidor" + msgid "QQ Error" -msgstr "Error del QQid" - -msgid "Failed to send IM." -msgstr "No s'ha pogut enviar la MI." - -#, fuzzy, c-format +msgstr "Error del QQ" + +#, c-format msgid "" "Server News:\n" "%s\n" "%s\n" "%s" -msgstr "Servidor repetidor d'ICQ" - -#, fuzzy, c-format +msgstr "" +"Notícies del servidor:\n" +"%s\n" +"%s\n" +"%s" + +#, c-format +msgid "%s:%s" +msgstr "%s:%s" + +#, c-format msgid "From %s:" -msgstr "De" - -#, fuzzy, c-format +msgstr "De %s:" + +#, c-format msgid "" "Server notice From %s: \n" "%s" -msgstr "Instruccions del servidor: %s" - -msgid "Unknow SERVER CMD" -msgstr "" +msgstr "" +"Avís del servidor de %s: \n" +"%s" + +msgid "Unknown SERVER CMD" +msgstr "Ordre del servidor desconeguda" #, c-format msgid "" "Error reply of %s(0x%02X)\n" -"Room %d, reply 0x%02X" -msgstr "" - -#, fuzzy +"Room %u, reply 0x%02X" +msgstr "" +"Resposta d'error de %s(0x%02X)\n" +"Sala %u, resposta 0x%02X" + msgid "QQ Qun Command" -msgstr "Ordre" - -#, c-format -msgid "Not a member of room \"%s\"\n" -msgstr "" - -msgid "Can not decrypt login reply" -msgstr "" - -#, fuzzy -msgid "Unknow LOGIN CMD" -msgstr "Motiu desconegut" - -#, fuzzy -msgid "Unknow CLIENT CMD" -msgstr "Motiu desconegut" +msgstr "Ordre QQ Qun" + +msgid "Could not decrypt login reply" +msgstr "No s'ha pogut desxifrar la resposta d'entrada" + +msgid "Unknown LOGIN CMD" +msgstr "Ordre d'entrada desconeguda" + +msgid "Unknown CLIENT CMD" +msgstr "Ordre de client desconeguda" #, c-format msgid "%d has declined the file %s" @@ -8931,9 +8875,9 @@ msgid "Error loading SILC key pair" msgstr "S'ha produït un error en carregar el parell de claus claus SILC" -#, fuzzy, c-format +#, c-format msgid "Download %s: %s" -msgstr "Usuaris a %s: %s" +msgstr "Baixada %s: %s" msgid "Your Current Mood" msgstr "El vostre estat d'ànim actual" @@ -9195,7 +9139,8 @@ msgid "Private Key file" msgstr "Fitxer de la clau privada" -# FIXME +# El recull diu "xifra", però aquí no es refereix a una xifra sinó a un +# mètode de xifratge msgid "Cipher" msgstr "Codi" @@ -9779,9 +9724,8 @@ msgid "doodle: Request user to start a Doodle session" msgstr "doodle: fa una petició a l'usuari per iniciar una sessió Doodle" -#, fuzzy msgid "Yahoo ID..." -msgstr "ID de Yahoo!" +msgstr "ID de Yahoo..." #. *< type #. *< ui_requirement @@ -9891,16 +9835,9 @@ msgid "Last Update" msgstr "Darrera actualització" -#, c-format -msgid "User information for %s unavailable" -msgstr "Dades de l'usuari %s no disponibles" - -msgid "" -"Sorry, this profile seems to be in a language or format that is not " -"supported at this time." -msgstr "" -"Disculpeu, aquest perfil deu estar en una llengua que actualment no està " -"implementada." +msgid "" +"This profile is in a language or format that is not supported at this time." +msgstr "Aquest perfil és en una llengua que actualment no està implementada." msgid "" "Could not retrieve the user's profile. This most likely is a temporary " @@ -10153,11 +10090,11 @@ #, c-format msgid "Requesting %s's attention..." -msgstr "S'està cridant l'atenció de %s..." +msgstr "S'està reclamant l'atenció de %s..." #, c-format msgid "%s has requested your attention!" -msgstr "%s us ha cridat l'atenció!" +msgstr "%s us ha demanat l'atenció!" #. * #. * A wrapper for purple_request_action() that uses @c Yes and @c No buttons. @@ -10203,21 +10140,18 @@ msgstr "Voleu acceptar la invitació al xat?" #. Shortcut -#, fuzzy msgid "Shortcut" -msgstr "Ordena" - -#, fuzzy +msgstr "Drecera" + msgid "The text-shortcut for the smiley" -msgstr "Tema de la drecera de text de GTK+" +msgstr "La drecera de text per a l'emoticona" #. Stored Image -#, fuzzy msgid "Stored Image" -msgstr "Desa imatge" +msgstr "Imatge desada" msgid "Stored Image. (that'll have to do for now)" -msgstr "" +msgstr "Imatge desada. (de moment hem de passar amb això)" msgid "SSL Connection Failed" msgstr "No s'ha pogut connectar amb SSL" @@ -10347,9 +10281,11 @@ msgid "Unable to connect to %s" msgstr "No s'ha pogut connectar a %s" -#, fuzzy, c-format +#, c-format msgid "Error reading from %s: response too long (%d bytes limit)" -msgstr "S'ha produït un error en llegir de %s: %s" +msgstr "" +"S'ha produït un error en llegir de %s: la resposta és massa llarga (%d bytes " +"de límit)" #, c-format msgid "" @@ -10400,9 +10336,9 @@ msgstr "S'ha refusat la connexió." #. 10048 -#, fuzzy, c-format +#, c-format msgid "Address already in use." -msgstr "Aquest nom de xat ja existeix" +msgstr "Aquesta adreça ja s'està fent servir" msgid "Internet Messenger" msgstr "Missatger d'Internet" @@ -10511,9 +10447,8 @@ msgid "_Basic" msgstr "_Bàsic" -#, fuzzy msgid "Create _this new account on the server" -msgstr "Crea aquest compte nou al servidor" +msgstr "Crea _aquest compte nou al servidor" msgid "_Advanced" msgstr "_Avançat" @@ -10524,7 +10459,7 @@ msgid "Protocol" msgstr "Protocol" -#, fuzzy, c-format +#, c-format msgid "" "Welcome to %s!\n" "\n" @@ -10539,12 +10474,12 @@ "Benvingut al %s!\n" "\n" "No teniu cap compte de MI configurat. Per a connectar-vos amb el %s premeu " -"el botó Afegeix de sota, i configureu el vostre primer compte. Si " -"voleu que el %s es connecti amb més comptes de MI, torneu a prémer " -"Afegeix fins a configurar-los tots.\n" +"el botó Afegeix d'aquí sota, i configureu el vostre primer compte. Si " +"voleu que el %s es connecti amb més comptes de missatgeria instantània (MI), " +"torneu a prémer Afegeix fins a configurar-los tots.\n" "\n" "Podeu tornar a aquesta finestra per afegir, editar o suprimir comptes, a " -"partir del menú Comptes->Afegeix/Edita de la finestra de la llista " +"partir del menú Comptes->Gestiona els comptes a finestra de la llista " "d'amics." #, c-format @@ -10613,9 +10548,8 @@ msgid "_Remove" msgstr "Sup_rimeix" -#, fuzzy msgid "Set Custom Icon" -msgstr "Estableix una icona personalitzada..." +msgstr "Estableix una icona personalitzada" msgid "Remove Custom Icon" msgstr "Suprimeix la icona personalitzada" @@ -10717,9 +10651,8 @@ msgid "/_Accounts" msgstr "/_Comptes" -#, fuzzy msgid "/Accounts/Manage Accounts" -msgstr "/Comptes/Gestió" +msgstr "/Comptes/Gestió de comptes" # Accelerador a la "n" com en la resta de programes #. Tools @@ -10736,14 +10669,13 @@ msgstr "/Eines/_Connectors" msgid "/Tools/Pr_eferences" -msgstr "/Eines/Pr_eferències" +msgstr "/Eines/Preferè_ncies" msgid "/Tools/Pr_ivacy" msgstr "/Eines/_Privadesa" -#, fuzzy msgid "/Tools/Smile_y" -msgstr "/Eines/_Absent" +msgstr "/Eines/Em_oticona" msgid "/Tools/_File Transfers" msgstr "/Eines/Transferència de _fitxers" @@ -10904,7 +10836,7 @@ msgstr "/Comptes" #. Translators: Please maintain the use of -> and <- to refer to menu heirarchy -#, fuzzy, c-format +#, c-format msgid "" "Welcome to %s!\n" "\n" @@ -10915,9 +10847,9 @@ "Benvingut al %s!\n" "\n" "No teniu cap compte habilitat. Podeu habilitar comptes de MI des del menú " -"Comptes->Gestió de la finestra de Comptes. Quan hagueu " -"habilitat algun compte, podreu connectar-vos, establir el vostre estat, i " -"parlar amb amics." +"Comptes->Gestió de comptes de la finestra de Comptes. Quan " +"hagueu habilitat algun compte podreu connectar-vos-hi, establir el vostre " +"estat, i parlar amb amics." #. set the Show Offline Buddies option. must be done #. * after the treeview or faceprint gets mad. -Robot101 @@ -10970,9 +10902,8 @@ msgid "Auto_join when account becomes online." msgstr "Entra _automàticament quant el compte estigui connectat." -#, fuzzy msgid "_Remain in chat after window is closed." -msgstr "_Oculta el xat quan la finestra es tanqui." +msgstr "_Continua al xat quan la finestra es tanqui." msgid "Please enter the name of the group to be added." msgstr "Introduïu el nom del grup que vulgueu afegir." @@ -11348,23 +11279,22 @@ msgid "Fatal Error" msgstr "Error fatal" +# Fixme msgid "bug master" -msgstr "" - -#, fuzzy +msgstr "bug master" + msgid "artist" -msgstr "Artista" +msgstr "artista" #. feel free to not translate this msgid "Ka-Hing Cheung" -msgstr "" +msgstr "Ka-Hing Cheung" msgid "support" msgstr "suport" -#, fuzzy msgid "webmaster" -msgstr "desenvolupador i mantenidor de la pàgina web" +msgstr "administrador del web" msgid "Senior Contributor/QA" msgstr "Col·laborador veterà/CQ" @@ -11387,7 +11317,7 @@ msgstr "suport/CQ" msgid "XMPP" -msgstr "" +msgstr "XMPP" msgid "original author" msgstr "autor original" @@ -11466,9 +11396,8 @@ msgid "French" msgstr "Francès" -#, fuzzy msgid "Irish" -msgstr "Kurd" +msgstr "Irlandès" msgid "Galician" msgstr "Gallec" @@ -11537,7 +11466,7 @@ msgstr "Noruec (Nynorsk)" msgid "Occitan" -msgstr "" +msgstr "Occità" msgid "Punjabi" msgstr "Punjabi" @@ -11779,45 +11708,35 @@ msgid "Right-click for more unread messages...\n" msgstr "Feu clic amb el botó principal per a més missatges per llegir...\n" -#, fuzzy msgid "_Change Status" -msgstr "Canvia d'estat" - -#, fuzzy +msgstr "_Canvia d'estat" + msgid "Show Buddy _List" -msgstr "Mostra la llista d'amics" - -#, fuzzy +msgstr "Mostra la _llista d'amics" + msgid "_Unread Messages" -msgstr "Missatges sense llegir" - -#, fuzzy +msgstr "Missatges _sense llegir" + msgid "New _Message..." -msgstr "Missatge nou..." - -#, fuzzy +msgstr "_Missatge nou..." + msgid "_Accounts" -msgstr "/_Comptes" - -#, fuzzy +msgstr "_Comptes" + msgid "Plu_gins" -msgstr "Connectors" - -#, fuzzy +msgstr "Co_nnectors" + msgid "Pr_eferences" -msgstr "Preferències" - -#, fuzzy +msgstr "Pr_eferències" + msgid "Mute _Sounds" -msgstr "Inhabilita els sons" - -#, fuzzy +msgstr "Inhabilita els _sons" + msgid "_Blink on New Message" -msgstr "Parpelleja si hi ha missatges nous" - -#, fuzzy +msgstr "_Parpelleja si hi ha missatges nous" + msgid "_Quit" -msgstr "Surt" +msgstr "_Surt" msgid "Not started" msgstr "No s'ha iniciat" @@ -11900,14 +11819,13 @@ msgid "Color to draw hyperlinks." msgstr "El color amb què pintar els enllaços." -#, fuzzy msgid "Hyperlink visited color" -msgstr "Color dels enllaços" - -#, fuzzy +msgstr "Color dels enllaços visitats" + msgid "Color to draw hyperlinks after it has been visited (or activated)." msgstr "" -"El color amb què es pintaran els enllaços quan el ratolí hi estigui a sobre." +"El color amb el qual es pintaran els enllaços que ja s'hagin visitat (o " +"activat)." # FIXME: prelight? (josep) msgid "Hyperlink prelight color" @@ -11943,13 +11861,11 @@ msgid "Color to draw the name of an action message." msgstr "Color amb el qual es pintaran els missatges d'acció." -#, fuzzy msgid "Action Message Name Color for Whispered Message" -msgstr "Nom del color dels missatges d'acció" - -#, fuzzy +msgstr "Color del nom del missatge d'acció per a missatges xiuxiuejats" + msgid "Whisper Message Name Color" -msgstr "Nom del color per als missatges enviats" +msgstr "Color dels missatges xiuxiuejats enviats" msgid "Typing notification color" msgstr "Color per a les notificacions de quan s'escriu" @@ -12025,9 +11941,9 @@ msgid "_Save Image..." msgstr "_Desa la imatge..." -#, fuzzy, c-format +#, c-format msgid "_Add Custom Smiley..." -msgstr "Mostra emoticones personalitzades" +msgstr "_Afegeix una emoticones personalitzada..." msgid "Select Font" msgstr "Selecciona el tipus de lletra" @@ -12072,13 +11988,15 @@ "This smiley is disabled because a custom smiley exists for this shortcut:\n" " %s" msgstr "" +"Aquesta emoticona està inhabilitada perquè hi ha una emoticona " +"personalitzada per aquesta drecera:\n" +" %s" msgid "Smile!" msgstr "Somrieu!" -#, fuzzy msgid "_Manage custom smileys" -msgstr "Mostra emoticones personalitzades" +msgstr "_Gestiona les emoticones personalitzades" msgid "This theme has no available smileys." msgstr "Aquest tema no disposa d'emoticones." @@ -12290,7 +12208,7 @@ " -v, --version mostra la versió actual i surt\n" # FIXME: backtrace -> traça (bug-buddy) ? -#, fuzzy, c-format +#, c-format msgid "" "%s %s has segfaulted and attempted to dump a core file.\n" "This is a bug in the software and has happened through\n" @@ -12311,17 +12229,12 @@ "\n" "Si podeu reproduir aquest error, feu-ho saber als desenvolupadors,\n" "enviant-los un error de programació a:\n" -"%ssimpleticket\n" +"%ssimpleticket/\n" "\n" "Assegureu-vos que indiqueu el que estàveu fent, i envieu una traça\n" "(backtrace) del fitxer core. Si no sabeu com obtenir una traça,\n" "llegiu les instruccions que hi ha a:\n" "%swiki/GetABacktrace\n" -"\n" -"Si necessiteu ajuda, envieu un missatge instantani a SeanEgn o\n" -"bé a LSchiere (per AIM). La informació per a contactar en Sean o\n" -"en Luke a través d'altres protocols és aquí:\n" -"%swiki/DeveloperPages\n" #. Translators may want to transliterate the name. #. It is not to be translated. @@ -12329,7 +12242,7 @@ msgstr "Pidgin" msgid "Open All Messages" -msgstr "Obre els _missatges" +msgstr "Obre tots els missatges" msgid "You have mail!" msgstr "Teniu correu electrònic." @@ -12360,8 +12273,7 @@ msgid "" "The 'Manual' browser command has been chosen, but no command has been set." msgstr "" -"S'ha triat l'ordre per al navegador 'manualment', però no se n'ha indicat " -"cap." +"S'ha triat l'ordre per al navegador «manualment», però no se n'ha indicat cap." msgid "The following plugins will be unloaded." msgstr "Es descarregaran els connectors següents." @@ -12794,31 +12706,26 @@ "Ordre per al so\n" "(%s per al nom de fitxer)" -#, fuzzy msgid "M_ute sounds" -msgstr "Inhabilita els sons" +msgstr "In_habilita els sons" msgid "Sounds when conversation has _focus" msgstr "Sons quan la conversa tingui el _focus" -#, fuzzy msgid "_Enable sounds:" -msgstr "Habilita els sons:" - -#, fuzzy +msgstr "_Habilita els sons:" + msgid "V_olume:" -msgstr "Volum:" +msgstr "V_olum:" msgid "Play" msgstr "Reprodueix" -#, fuzzy msgid "_Browse..." msgstr "Nav_ega..." -#, fuzzy msgid "_Reset" -msgstr "Reinicia" +msgstr "_Reinicia" msgid "_Report idle time:" msgstr "Informa del _temps d'inactivitat:" @@ -12990,61 +12897,52 @@ msgid "Status for %s" msgstr "Estat per a %s" -#, fuzzy msgid "Custom Smiley" -msgstr "Insereix una emoticona" +msgstr "Emoticona personalitzada" msgid "More Data needed" -msgstr "" +msgstr "Calen més dades" msgid "Please provide a shortcut to associate with the smiley." -msgstr "" - -#, fuzzy +msgstr "Especifiqueu una drecera associada a l'emoticona." + msgid "Duplicate Shortcut" -msgstr "Duplicació de la correcció" +msgstr "Drecera duplicada" msgid "" "A custom smiley for the selected shortcut already exists. Please specify a " "different shortcut." msgstr "" - -#, fuzzy +"Hi ha una emoticona personalitzada per la drecera que heu seleccionat. " +"Indiqueu-ne una de diferent." + msgid "Please select an image for the smiley." -msgstr "Seleccioneu l'estat d'ànim de la llista." - -#, fuzzy +msgstr "Seleccioneu una imatge per a l'emoticona." + msgid "Edit Smiley" -msgstr "Insereix una emoticona" - -#, fuzzy +msgstr "Edita l'emoticona" + msgid "Add Smiley" -msgstr "_Emoticona" - -#, fuzzy +msgstr "Afegeix una emoticona" + msgid "Smiley _Image" -msgstr "Desa imatge" +msgstr "_Imatge de l'emoticona" #. Smiley shortcut -#, fuzzy msgid "Smiley S_hortcut" -msgstr "Dreceres de teclat" - -#, fuzzy +msgstr "_Dreceres de l'emoticona" + msgid "Smiley" -msgstr "_Emoticona" - -#, fuzzy +msgstr "Emoticona" + msgid "Custom Smiley Manager" -msgstr "Gestor de certificats" - -#, fuzzy +msgstr "Gestor d'emoticones personalitzades" + msgid "Click to change your buddyicon for this account." -msgstr "Utilitza aquesta _icona d'amic per a aquest compte:" - -#, fuzzy +msgstr "Feu clic per canviar la icona d'amic d'aquest compte." + msgid "Click to change your buddyicon for all accounts." -msgstr "Utilitza aquesta _icona d'amic per a aquest compte:" +msgstr "Feu clic per canviar la icona d'amic de tots els comptes." msgid "Waiting for network connection" msgstr "S'està esperant la connexió de xarxa" @@ -13182,20 +13080,17 @@ msgid "_Invite" msgstr "Conv_ida" -#, fuzzy msgid "_Modify..." -msgstr "_Modifica" - -#, fuzzy +msgstr "_Modifica..." + msgid "_Add..." -msgstr "_Afegeix" +msgstr "_Afegeix..." msgid "_Open Mail" msgstr "_Obre el correu" -#, fuzzy msgid "_Edit" -msgstr "Edita" +msgstr "_Edita" msgid "Pidgin Tooltip" msgstr "Indicador de funció del Pidgin" @@ -13214,12 +13109,11 @@ msgid "none" msgstr "cap" -#, fuzzy msgid "Small" -msgstr "Correu electrònic" +msgstr "Petites" msgid "Smaller versions of the default smilies" -msgstr "" +msgstr "Versions més petites de les emoticones per defecte" msgid "Response Probability:" msgstr "Probabilitat de resposta:" @@ -13693,9 +13587,9 @@ msgid "Set window manager \"_URGENT\" hint" msgstr "Aplica l'opció «_URGENT» del gestor de finestres" -#, fuzzy +# (gnome) msgid "_Flash window" -msgstr "Finestres de _xat" +msgstr "Finestres _flash" #. Raise window method button msgid "R_aise conversation window" @@ -13783,9 +13677,8 @@ msgid "Hyperlink Color" msgstr "Color dels hiperenllaços" -#, fuzzy msgid "Visited Hyperlink Color" -msgstr "Color dels hiperenllaços" +msgstr "Color dels enllaços visitats" msgid "Highlighted Message Name Color" msgstr "Nom del color per als missatges ressaltats" @@ -13880,18 +13773,16 @@ #, c-format msgid "You can upgrade to %s %s today." -msgstr "" +msgstr "Podeu actualitzar-vos a %s %s avui." msgid "New Version Available" msgstr "Nova versió disponible" -#, fuzzy msgid "Later" -msgstr "Data" - -#, fuzzy +msgstr "Més tard" + msgid "Download Now" -msgstr "Usuaris a %s: %s" +msgstr "Baixa-la ara" #. *< type #. *< ui_requirement @@ -14190,24 +14081,64 @@ # FIXME: stanza -> estrofa (literal) (Josep) msgid "Insert an stanza." -msgstr "Insereix una estrofa " +msgstr "Insereix un bloc ." msgid "Insert a stanza." -msgstr "Insereix una estrofa " +msgstr "Insereix un bloc ." msgid "Insert a stanza." -msgstr "Insereix una estrofa " +msgstr "Insereix un bloc ." #. *< name #. *< version #. * summary msgid "Send and receive raw XMPP stanzas." -msgstr "Envia i rep estrofes XMPP en brut." +msgstr "Envia i rep blocs XMPP en brut." #. * description msgid "This plugin is useful for debbuging XMPP servers or clients." msgstr "Aquest connector és útil per a depurar servidors i clients XMPP." +#~ msgid "Connection to server lost (no data received within %d second)" +#~ msgid_plural "" +#~ "Connection to server lost (no data received within %d seconds)" +#~ msgstr[0] "" +#~ "S'ha perdut la connexió al servidor (fa %d segon que no s'hi reben dades)" +#~ msgstr[1] "" +#~ "S'ha perdut la connexió al servidor (fa %d segons que no s'hi reben dades)" + +#~ msgid "Keep alive error" +#~ msgstr "Error de permanència" + +#~ msgid "" +#~ "Lost connection with server:\n" +#~ "%d, %s" +#~ msgstr "" +#~ "S'ha perdut la connexió amb el servidor:\n" +#~ "%d, %s" + +#~ msgid "Connecting server ..." +#~ msgstr "S'està connectant al servidor..." + +#~ msgid "Failed to send IM." +#~ msgstr "No s'ha pogut enviar la MI." + +#~ msgid "Not a member of room \"%s\"\n" +#~ msgstr "No sou un membre de la sala «%s»\n" + +#~ msgid "User information for %s unavailable" +#~ msgstr "Dades de l'usuari %s no disponibles" + +#~ msgid "" +#~ "You are using %s version %s. The current version is %s. You can get it " +#~ "from %s


" +#~ msgstr "" +#~ "Esteu emprant la versió %s del %s. La versió actual és %s, la podeu " +#~ "obtenir de %s
" + +#~ msgid "ChangeLog:
%s" +#~ msgstr "Registre de canvis:
%s" + #~ msgid "A group with the name already exists." #~ msgstr "Ja existeix un grup amb aquest nom." @@ -14217,13 +14148,8 @@ #~ msgid "Blood Type" #~ msgstr "Tipus de sang" -#, fuzzy #~ msgid "Update information" -#~ msgstr "Actualitza la meva informació" - -#, fuzzy -#~ msgid "Successed:" -#~ msgstr "Velocitat:" +#~ msgstr "Actualitza la informació" #~ msgid "" #~ "Setting custom faces is not currently supported. Please choose an image " @@ -14244,14 +14170,6 @@ #~ msgid "Add buddy with auth request failed" #~ msgstr "Ha fallat la sol·licitut per afegir un amic amb autorització" -#, fuzzy -#~ msgid "Add into %d's buddy list" -#~ msgstr "No s'ha pogut carregar la llista d'amics" - -#, fuzzy -#~ msgid "QQ Number Error" -#~ msgstr "Número QQ" - #~ msgid "Group Description" #~ msgstr "Descripció del grup" @@ -14261,26 +14179,12 @@ #~ msgid "Approve" #~ msgstr "Aprova" -#, fuzzy -#~ msgid "Successed to join Qun %d, operated by admin %d" -#~ msgstr "" -#~ "L'administrador %2$d ha rebutjat la vostra sol·liciut per entrar al grup %" -#~ "1$d" - -#, fuzzy -#~ msgid "[%d] removed from Qun \"%d\"" -#~ msgstr "Vós [%d] heu sortit del grup «%d»" - -#, fuzzy -#~ msgid "[%d] added to Qun \"%d\"" -#~ msgstr "Vós [%d] heu estat afegit al grup «%d»" - #~ msgid "I am a member" #~ msgstr "En sóc membre" -#, fuzzy +# FIXME? (hi demano [entrar]?) #~ msgid "I am requesting" -#~ msgstr "Sol·licitud incorrecta" +#~ msgstr "Demano" #~ msgid "I am the admin" #~ msgstr "En sóc l'administrador" @@ -14288,10 +14192,6 @@ #~ msgid "Unknown status" #~ msgstr "Estat desconegut" -#, fuzzy -#~ msgid "Remove from Qun" -#~ msgstr "Suprimeix el grup" - #~ msgid "You entered a group ID outside the acceptable range" #~ msgstr "Heu entrat un identificador de grup fora del rang" @@ -14301,24 +14201,6 @@ #~ msgid "Do you want to approve the request?" #~ msgstr "Voleu aprovar aquesta sol·licitud?" -#, fuzzy -#~ msgid "Change Qun member" -#~ msgstr "Número de telèfon" - -#, fuzzy -#~ msgid "Change Qun information" -#~ msgstr "Informació del canal" - -# Gnome_2.6_Extras [rhythmbox.HEAD.ca.po] -#, fuzzy -#~ msgid "" -#~ "%s\n" -#~ "\n" -#~ "%s" -#~ msgstr "" -#~ "%s:\n" -#~ "%s" - #~ msgid "System Message" #~ msgstr "Missatge del sistema" @@ -14331,64 +14213,47 @@ #~ msgid "Set My Information" #~ msgstr "Estableix la meva informació" -#, fuzzy -#~ msgid "Leave the QQ Qun" -#~ msgstr "Surt d'aquest Qun QQ" - #~ msgid "Block this buddy" #~ msgstr "Bloca aquest usuari" -#, fuzzy #~ msgid "Error password: %s" -#~ msgstr "S'ha produït un error en canviar la contrasenya" - -#, fuzzy +#~ msgstr "Error en la contrasenya: %s" + #~ msgid "Failed to connect all servers" -#~ msgstr "No s'ha pogut connectar al servidor." - -#, fuzzy +#~ msgstr "No s'han pogut connectar tots els servidors" + #~ msgid "Connecting server %s, retries %d" -#~ msgstr "" -#~ "S'ha produït un error de connexió del servidor %s:\n" -#~ "%s" - -#, fuzzy +#~ msgstr "S'està connectant al servidor %s, %d reintents" + #~ msgid "Do you approve the requestion?" #~ msgstr "Voleu aprovar aquesta sol·licitud?" -#, fuzzy #~ msgid "Do you add the buddy?" #~ msgstr "Voleu afegir aquest amic?" -#, fuzzy #~ msgid "%s added you [%s] to buddy list" #~ msgstr "%s us ha afegit [%s] a la seva llista d'amics" -#, fuzzy #~ msgid "QQ Budy" -#~ msgstr "Amic" +#~ msgstr "Amic QQ" + +#~ msgid "Requestion approved by %s" +#~ msgstr "%s ha aprovat la sol.licitud" #~ msgid "%s wants to add you [%s] as a friend" #~ msgstr "%s us vol afegir [%s] com a amic" -#, fuzzy #~ msgid "%s is not in buddy list" #~ msgstr "%s no és a la vostra llista d'amics" -#, fuzzy #~ msgid "Would you add?" #~ msgstr "Voleu afegir-lo?" #~ msgid "%s" #~ msgstr "%s" -#, fuzzy -#~ msgid "QQ Server Notice" -#~ msgstr "Port en el servidor" - -#, fuzzy #~ msgid "Network disconnected" -#~ msgstr "El remot s'ha desconnectat" +#~ msgstr "La xarxa s'ha desconnectat" #~ msgid "developer" #~ msgstr "desenvolupador" @@ -14399,33 +14264,6 @@ #~ msgid "Artists" #~ msgstr "Artistes" -#~ msgid "" -#~ "You are using %s version %s. The current version is %s. You can get it " -#~ "from %s
" -#~ msgstr "" -#~ "Esteu emprant la versió %s del %s. La versió actual és %s, la podeu " -#~ "obtenir de %s
" - -#~ msgid "ChangeLog:
%s" -#~ msgstr "Registre de canvis:
%s" - -#~ msgid "EOF while reading from resolver process" -#~ msgstr "" -#~ "S'ha arribat al final del fitxer (EOF) en llegir del procés resoledor" - -#~ msgid "Error setting socket options" -#~ msgstr "S'ha produït un error en establir les opcions del sòcol" - -#~ msgid "" -#~ "Windows Live ID authentication: cannot find authenticate token in server " -#~ "response" -#~ msgstr "" -#~ "Autenticació amb el Windows Live ID: no s'ha pogut trobar el testimoni " -#~ "d'autenticació al servidor" - -#~ msgid "Windows Live ID authentication Failed" -#~ msgstr "No s'ha pogut autenticar amb el Windows Live ID" - #~ msgid "Too evil (sender)" #~ msgstr "Massa malvat (remitent)" @@ -14441,86 +14279,6 @@ #~ msgid "(retrieving)" #~ msgstr "(s'està recuperant)" -#~ msgid "Your information has been updated" -#~ msgstr "S'ha actualitzat la vostra informació" - -#~ msgid "Input your reason:" -#~ msgstr "Indiqueu-ne el motiu:" - -#~ msgid "You have successfully removed a buddy" -#~ msgstr "Heu suprimit amb èxit un amic" - -#~ msgid "You have successfully removed yourself from your friend's buddy list" -#~ msgstr "Us heu suprimit amb èxit de la llista d'amics del vostre amic" - -#~ msgid "You have added %d to buddy list" -#~ msgstr "Heu afegit %d a la llista d'amics" - -#~ msgid "Invalid QQid" -#~ msgstr "QQid invàlid" - -#~ msgid "Please enter external group ID" -#~ msgstr "Introduïu l'ID del grup extern" - -#~ msgid "Reason: %s" -#~ msgstr "Motiu: %s" - -#~ msgid "Your request to join group %d has been approved by admin %d" -#~ msgstr "" -#~ "L'administrador %2$d ha aprovat la vostra sol·liciud per entrar al grup %1" -#~ "$d" - -#~ msgid "This group has been added to your buddy list" -#~ msgstr "S'ha afegit aquest grup a la vostra llista d'amics" - -#~ msgid "I am applying to join" -#~ msgstr "Estic sol·licitant entrar-hi" - -#~ msgid "You have successfully left the group" -#~ msgstr "Heu sortit del grup correctament" - -#~ msgid "QQ Group Auth" -#~ msgstr "Autorització de grup QQ" - -#~ msgid "Your authorization request has been accepted by the QQ server" -#~ msgstr "El servidor QQ ha acceptat la sol·licitud d'autorització" - -#~ msgid "Code [0x%02X]: %s" -#~ msgstr "Codi [0x%02X]: %s" - -#~ msgid "Group Operation Error" -#~ msgstr "S'ha produït un error d'orientació del grup" - -#~ msgid "Enter your reason:" -#~ msgstr "Indiqueu-ne el motiu:" - -#~ msgid "Error requesting login token" -#~ msgstr "S'ha produït un error en sol·licitar un testimoni d'entrada" - -#~ msgid "Unable to login. Check debug log." -#~ msgstr "No s'ha pogut connectar, comproveu el registre de depuració." - -#~ msgid "Unable to login" -#~ msgstr "No s'ha connectar" - -#~ msgid "TCP Address" -#~ msgstr "Adreça TCP" - -#~ msgid "UDP Address" -#~ msgstr "Adreça UDP" - -#~ msgid "Show Login Information" -#~ msgstr "Mostra informació de la connexió" - -#~ msgid "Login failed, no reply" -#~ msgstr "Ha fallat l'entrada, no s'ha obtingut resposta" - -#~ msgid "User %s rejected your request" -#~ msgstr "L'usuari %s ha declinat la vostra sol·licitud" - -#~ msgid "User %s approved your request" -#~ msgstr "L'usuari %s ha acceptat la vostra sol·licitud" - #~ msgid "Screen name:" #~ msgstr "Nom d'usuari:" @@ -15521,6 +15279,9 @@ #~ msgid "Reject Call" #~ msgstr "Rebutja la trucada" +#~ msgid "Connected to %s" +#~ msgstr "S'ha connectat a %s" + #~ msgid "_Mute" #~ msgstr "_Silencia" @@ -15941,9 +15702,6 @@ #~ msgid "Away title: " #~ msgstr "Motiu de l'absència: " -#~ msgid "Buddy List Error" -#~ msgstr "Error en la llista d'amics" - #~ msgid "" #~ "\n" #~ "Mark all accounts as \"away\" with the default message.\n" diff -r 841eb21e96fe -r 16b901793d7c po/de.po --- a/po/de.po Sat Dec 13 10:52:10 2008 +0000 +++ b/po/de.po Mon Dec 15 23:10:39 2008 +0000 @@ -12,8 +12,8 @@ msgstr "" "Project-Id-Version: de\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2008-12-12 17:46+0100\n" -"PO-Revision-Date: 2008-12-12 17:42+0100\n" +"POT-Creation-Date: 2008-12-15 10:46+0100\n" +"PO-Revision-Date: 2008-12-15 10:46+0100\n" "Last-Translator: Jochen Kemnade \n" "Language-Team: German \n" "MIME-Version: 1.0\n" @@ -2907,10 +2907,10 @@ msgstr "Hostname oder Portnummer ihres Proxys sind falsch angegeben." msgid "Token Error" -msgstr "Kürzel-Fehler" +msgstr "Token-Fehler" msgid "Unable to fetch the token.\n" -msgstr "Kann das Kürzel nicht abholen.\n" +msgstr "Kann das Token nicht abholen.\n" msgid "Save Buddylist..." msgstr "Buddy-Liste speichern..." @@ -2962,10 +2962,10 @@ msgstr "Passwort (nochmal)" msgid "Enter current token" -msgstr "Geben Sie das aktuelle Kürzel ein" +msgstr "Geben Sie das aktuelle Token ein" msgid "Current token" -msgstr "Aktuelles Kürzel" +msgstr "Aktuelles Token" msgid "Register New Gadu-Gadu Account" msgstr "Registrierung eines neuen Gadu-Gadu-Kontos" @@ -4311,7 +4311,7 @@ msgstr "Server überlastet" msgid "Service Unavailable" -msgstr "Dienst nicht erreichbar" +msgstr "Dienst nicht verfügbar" msgid "Subscription Required" msgstr "Abonnement erforderlich" @@ -4691,7 +4691,7 @@ msgstr "Kann „%s“ nicht hinzufügen." msgid "Buddy Add error" -msgstr "" +msgstr "Fehler beim Hinzufügen des Buddys" msgid "The username specified does not exist." msgstr "Der angegebene Benutzername existiert nicht." @@ -4964,11 +4964,10 @@ msgstr "Nachricht" msgid "Playing a game" -msgstr "" - -#, fuzzy +msgstr "Spielt ein Spiel" + msgid "Working" -msgstr "Geschäftlich" +msgstr "Arbeitet" msgid "Has you" msgstr "Hat Sie" @@ -5006,13 +5005,11 @@ msgid "Album" msgstr "Album" -#, fuzzy msgid "Game Title" -msgstr "Titel anpassen" - -#, fuzzy +msgstr "Spieltitel" + msgid "Office Title" -msgstr "Titel anpassen" +msgstr "Dienststellenbezeichnung" msgid "Set Friendly Name..." msgstr "Setze Spitzname..." @@ -7184,7 +7181,7 @@ msgstr "Sichtbar" msgid "Friend Only" -msgstr "" +msgstr "Nur Freund" msgid "Private" msgstr "Privat" @@ -7204,9 +7201,8 @@ msgid "Phone Number" msgstr "Telefonnummer" -#, fuzzy msgid "Authorize adding" -msgstr "Buddy autorisieren?" +msgstr "Hinzufügen autorisieren?" msgid "Cellphone Number" msgstr "Handy-Telefonnummer" @@ -7221,9 +7217,8 @@ msgid "Publish Mobile" msgstr "Handy (privat)" -#, fuzzy msgid "Publish Contact" -msgstr "Kontakt-Alias" +msgstr "Kontakt veröffentlichen" msgid "College" msgstr "College" @@ -7234,17 +7229,14 @@ msgid "Zodiac" msgstr "Sternzeichen" -#, fuzzy msgid "Blood" -msgstr "Blockiert" - -#, fuzzy +msgstr "Blutgruppe" + msgid "True" -msgstr "Stier" - -#, fuzzy +msgstr "Wahr" + msgid "False" -msgstr "Gescheitert" +msgstr "Falsch" msgid "Modify Contact" msgstr "Kontakt bearbeiten" @@ -7268,9 +7260,8 @@ msgid "%u requires verification" msgstr "%u erfordert Autorisierung" -#, fuzzy msgid "Add buddy question" -msgstr "Benutzer zu Ihrer Buddy-Liste hinzufügen?" +msgstr "Buddy-Frage hinzufügen" msgid "Enter answer here" msgstr "Antwort hier eingeben" @@ -7279,22 +7270,20 @@ msgstr "Senden" msgid "Invalid answer." -msgstr "Ungültige Antwort" +msgstr "Ungültige Antwort." msgid "Authorization denied message:" msgstr "Nachricht für die Ablehnung der Autorisierung:" -#, fuzzy msgid "Sorry, you're not my style." -msgstr "Tut mir Leid, du bist nicht mein Typ..." +msgstr "Tut mir Leid, du bist nicht mein Typ." #, c-format msgid "%u needs authorization" msgstr "%u benötigt Authorisierung" -#, fuzzy msgid "Add buddy authorize" -msgstr "Benutzer zu Ihrer Buddy-Liste hinzufügen?" +msgstr "Buddy-Autorisierung hinzufügen" msgid "Enter request here" msgstr "Anfrage hier eingeben" @@ -7311,9 +7300,8 @@ msgid "Invalid QQ Number" msgstr "Ungültige QQ-Nummer" -#, fuzzy msgid "Failed sending authorize" -msgstr "Bitte autorisiere mich!" +msgstr "Senden der Autorisierung fehlgeschlagen" #, c-format msgid "Failed removing buddy %u" @@ -7360,24 +7348,20 @@ msgid "(Invalid UTF-8 string)" msgstr "(Ungültige UTF8-Zeichenkette)" -#, fuzzy msgid "Not member" -msgstr "Ich bin kein Mitglied" +msgstr "Kein Mitglied" msgid "Member" msgstr "Mitglied" -#, fuzzy msgid "Requesting" -msgstr "Anfrage-Dialog" - -#, fuzzy +msgstr "Frage an" + msgid "Admin" -msgstr "Adium" - -#, fuzzy +msgstr "Admin" + msgid "Notice" -msgstr "Bemerkung:" +msgstr "Bemerkung" msgid "Detail" msgstr "Detail" @@ -7430,9 +7414,8 @@ "Beachten Sie, dass diese Operation den Qun entfernen könnte, \n" "wenn Sie der Ersteller sind." -#, fuzzy msgid "Sorry, you are not our style" -msgstr "Tut mir Leid, du bist nicht mein Typ..." +msgstr "Tut mir Leid, du bist nicht unser Typ" msgid "Successfully changed Qun members" msgstr "Qun-Mitglieder erfolgreich geändert" @@ -7469,9 +7452,9 @@ msgid "Removed buddy %u." msgstr "Buddy %u entfernt" -#, fuzzy, c-format +#, c-format msgid "New buddy %u joined." -msgstr "Buddy entfernen" +msgstr "Neuer Buddy %u ist beigetreten." #, c-format msgid "Unknown-%d" @@ -7507,21 +7490,20 @@ msgid "Invalid name" msgstr "QQ: Ungültiger Name" -#, fuzzy msgid "Select icon..." -msgstr "Ordner auswählen..." - -#, fuzzy, c-format +msgstr "Icon wählen..." + +#, c-format msgid "Login time: %d-%d-%d, %d:%d:%d
\n" -msgstr "Anmeldezeit: %s
\n" - -#, fuzzy, c-format +msgstr "Anmeldezeit: %d-%d-%d, %d:%d:%d
\n" + +#, c-format msgid "Total Online Buddies: %d
\n" -msgstr "Aktuell online: %d
\n" - -#, fuzzy, c-format +msgstr "Insgesamt online: %d
\n" + +#, c-format msgid "Last Refresh: %d-%d-%d, %d:%d:%d
\n" -msgstr "Letzte Aktualisierung: %s
\n" +msgstr "Letzte Aktualisierung: %d-%d-%d, %d:%d:%d
\n" #, c-format msgid "Server: %s
\n" @@ -7535,9 +7517,9 @@ msgid "Connection Mode: %s
\n" msgstr "Verbindungsmodus: %s
\n" -#, fuzzy, c-format +#, c-format msgid "My Internet IP: %s:%d
\n" -msgstr "Meine Internet-Adresse: %s
\n" +msgstr "Meine Internet-IP: %s:%d
\n" #, c-format msgid "Sent: %lu
\n" @@ -7559,9 +7541,9 @@ msgid "Received Duplicate: %lu
\n" msgstr "Duplikat empfangen: %lu
\n" -#, fuzzy, c-format +#, c-format msgid "Time: %d-%d-%d, %d:%d:%d
\n" -msgstr "Anmeldezeit: %s
\n" +msgstr "Zeit: %d-%d-%d, %d:%d:%d
\n" #, c-format msgid "IP: %s
\n" @@ -7574,21 +7556,19 @@ msgstr "

Original-Autor:
\n" msgid "

Code Contributors:
\n" -msgstr "" - -#, fuzzy +msgstr "

Code-Mitwirkende:
\n" + msgid "

Lovely Patch Writers:
\n" -msgstr "Letzte Aktualisierung: %s
\n" - -#, fuzzy +msgstr "

Wunderbare Patch-Schreiber:
\n" + msgid "

Acknowledgement:
\n" -msgstr "Gesendet: %lu
\n" +msgstr "

Bestätigung:
\n" msgid "

And, all the boys in the backroom...
\n" -msgstr "" +msgstr "

Und all die Jungs im Hinterzimmer...
\n" msgid "Feel free to join us! :)" -msgstr "" +msgstr "Treten Sie uns bei, wenn Sie mögen! :)" #, c-format msgid "About OpenQ %s" @@ -7657,7 +7637,7 @@ #, c-format msgid "Failed requesting token, 0x%02X" -msgstr "" +msgstr "Fehler beim Anfordern des Tokens, 0x%02X" #, c-format msgid "Invalid token len, %d" @@ -7665,7 +7645,7 @@ #. extend redirect used in QQ2006 msgid "Redirect_EX is not currently supported" -msgstr "" +msgstr "Redirect_EX wird im Moment nicht unterstützt" #. need activation #. need activation @@ -7673,49 +7653,45 @@ msgid "Activation required" msgstr "Aktivierung erforderlich" -#, fuzzy, c-format +#, c-format msgid "Unknown reply code when logging in (0x%02X)" -msgstr "Anmeldung nicht möglich, unbekannter Antwort-Code 0x%02X" +msgstr "Unbekannte Antwort bei der Anmeldung (0x%02X)" msgid "Could not decrypt server reply" msgstr "Konnte die Antwort des Servers nicht entschlüsseln" -#, fuzzy msgid "Requesting captcha" -msgstr "Bitte um %ss Aufmerksamkeit..." - -#, fuzzy +msgstr "Captcha anfordern" + msgid "Checking captcha" -msgstr "Bitte um %ss Aufmerksamkeit..." - -#, fuzzy +msgstr "Captcha überprüfen" + msgid "Failed captcha verification" -msgstr "Yahoo-Authentifizierung fehlgeschlagen" - -#, fuzzy +msgstr "Captcha-Überprüfung fehlgeschlagen" + msgid "Captcha Image" -msgstr "Bild speichern" - -#, fuzzy +msgstr "Captcha-Bild" + msgid "Enter code" -msgstr "Geben Sie ein Passwort ein" - -#, fuzzy +msgstr "Geben Sie den Code ein" + msgid "QQ Captcha Verification" -msgstr "SSL-Zertifikatsüberprüfung" +msgstr "QQ-Captcha-Überprüfung" msgid "Enter the text from the image" msgstr "Bitte geben Sie den Text aus dem Bild ein" -#, fuzzy, c-format +#, c-format msgid "Unknown reply when checking password (0x%02X)" -msgstr "Anmeldung nicht möglich, unbekannter Antwort-Code 0x%02X" - -#, fuzzy, c-format +msgstr "Unbekannte Antwort bei Überprüfungen des Passwortes (0x%02X)" + +#, c-format msgid "" "Unknown reply code when logging in (0x%02X):\n" "%s" -msgstr "Anmeldung nicht möglich, unbekannter Antwort-Code 0x%02X" +msgstr "" +"Unbekannte Antwort bei der Anmeldung (0x%02X):\n" +"%s" #. we didn't successfully connect. tdt->toc_fd is valid here msgid "Unable to connect." @@ -7733,13 +7709,11 @@ msgid "Connection lost" msgstr "Verbindung verloren" -#, fuzzy msgid "Getting server" -msgstr "Benutzer-Info setzen..." - -#, fuzzy +msgstr "Hole server" + msgid "Requesting token" -msgstr "Anfragekürzel" +msgstr "Fordere Token an" msgid "Couldn't resolve host" msgstr "Kann den Hostnamen nicht auflösen" @@ -7773,22 +7747,24 @@ msgid "From %s:" msgstr "Von %s:" -#, fuzzy, c-format +#, c-format msgid "" "Server notice From %s: \n" "%s" -msgstr "Anleitung vom Server: %s" +msgstr "" +"Servernotiz von %s: \n" +"%s" msgid "Unknown SERVER CMD" msgstr "Unbekanntes SERVER-CMD" -#, fuzzy, c-format +#, c-format msgid "" "Error reply of %s(0x%02X)\n" "Room %u, reply 0x%02X" msgstr "" -"Fehlerantwort %s(0x%02X)\n" -"Raum %d, Antwort 0x%02X" +"Fehlerantwort von %s(0x%02X)\n" +"Raum %u, Antwort 0x%02X" msgid "QQ Qun Command" msgstr "QQ-Qun-Kommando" @@ -9288,6 +9264,9 @@ msgid "SIP usernames may not contain whitespaces or @ symbols" msgstr "SIP-Benutzernamen dürfen keine Leerzeichen oder @-Symbole enthalten" +msgid "SIP connect server not specified" +msgstr "SIP-Verbindungsserver nicht angegeben" + #. *< type #. *< ui_requirement #. *< flags @@ -10393,7 +10372,7 @@ msgid "Protocol" msgstr "Protokoll" -#, fuzzy, c-format +#, c-format msgid "" "Welcome to %s!\n" "\n" @@ -10408,9 +10387,9 @@ "Willkommen bei %s!\n" "\n" "Sie haben keine IM-Konten konfiguriert. Um sich mit %s zu verbinden, drücken " -"Sie unten auf den Hinzufügen-Button und konfigurieren Sie Ihr erstes " -"Konto. Wenn Sie mehrere IM-Konten mit %s benutzen wollen, drücken Sie erneut " -"auf Hinzufügen um sie einzurichten.\n" +"Sie unten auf den Hinzufügen...-Button und konfigurieren Sie Ihr " +"erstes Konto. Wenn Sie mehrere IM-Konten mit %s benutzen wollen, drücken Sie " +"erneut auf Hinzufügen... um sie einzurichten.\n" "\n" "Sie können später über Konten->Konten verwalten im Buddy-" "Listenfenster zu diesem Dialog zurückkehren und Konten hinzufügen, " diff -r 841eb21e96fe -r 16b901793d7c share/ca-certs/Makefile.am --- a/share/ca-certs/Makefile.am Sat Dec 13 10:52:10 2008 +0000 +++ b/share/ca-certs/Makefile.am Mon Dec 15 23:10:39 2008 +0000 @@ -3,19 +3,27 @@ CAcert_Class3.pem \ Equifax_Secure_CA.pem \ GTE_CyberTrust_Global_Root.pem \ - Microsoft_Internet_Authority.pem \ - Microsoft_Secure_Server_Authority.pem \ StartCom_Free_SSL_CA.pem \ Verisign_RSA_Secure_Server_CA.pem \ Verisign_Class3_Primary_CA.pem \ VeriSign_Class_3_Public_Primary_Certification_Authority_-_G5.pem -if INSTALL_SSL_CERTIFICATES +EXTRA_CERTS = \ + Microsoft_Internet_Authority.pem \ + Microsoft_Secure_Server_Authority.pem + + cacertsdir = $(datadir)/purple/ca-certs -cacerts_DATA = $(CERTIFICATES) + +if INSTALL_SSL_CERTIFICATES +cacerts_DATA = \ + $(CERTIFICATES) \ + $(EXTRA_CERTS) +else +cacerts_DATA = $(EXTRA_CERTS) endif EXTRA_DIST = \ Makefile.mingw \ - $(CERTIFICATES) - + $(CERTIFICATES) \ + $(EXTRA_CERTS) diff -r 841eb21e96fe -r 16b901793d7c share/ca-certs/Microsoft_Internet_Authority.pem --- a/share/ca-certs/Microsoft_Internet_Authority.pem Sat Dec 13 10:52:10 2008 +0000 +++ b/share/ca-certs/Microsoft_Internet_Authority.pem Mon Dec 15 23:10:39 2008 +0000 @@ -1,24 +1,29 @@ ------BEGIN CERTIFICATE----- -MIIECzCCA3SgAwIBAgIEBAAD/jANBgkqhkiG9w0BAQUFADB1MQswCQYDVQQGEwJV -UzEYMBYGA1UEChMPR1RFIENvcnBvcmF0aW9uMScwJQYDVQQLEx5HVEUgQ3liZXJU -cnVzdCBTb2x1dGlvbnMsIEluYy4xIzAhBgNVBAMTGkdURSBDeWJlclRydXN0IEds -b2JhbCBSb290MB4XDTA2MDQxOTE0MzUwMFoXDTA5MDQxOTIzNTkwMFowJzElMCMG -A1UEAxMcTWljcm9zb2Z0IEludGVybmV0IEF1dGhvcml0eTCCASIwDQYJKoZIhvcN -AQEBBQADggEPADCCAQoCggEBALUIbk0YdsTXnGPswqx8d/Ntrsjy8Wau8cKHBGBu -KZwAZe5qW+QOU4gRxiKbM/trspEu1lObU77PVtiZSqFQMkXOYNLhlq1a/eqh68RJ -Jxxev9KWmfppQ388ONqhi8wziHoXc66RUCiqabp751dbmwnnTN6GfIR952Zg+ab1 -wmGL3o7B1efCMCI9LIMKsId16yHiXKbTBHuWnkAe4Qx2BMAgoJQQ21EbTBhyvCfd -EiRdOdYo1OTe2xih4JUPmXf7xPNDjMCrpjEJ8woxgCnH12z7PNPqwrhnFe/6808t -axy4iNgObXcZS3ERcZBA9RFT1z3onQ2E2plkaBPmZQPiZu0CAwEAAaOCAXAwggFs -MEUGA1UdHwQ+MDwwOqA4oDaGNGh0dHA6Ly93d3cucHVibGljLXRydXN0LmNvbS9j -Z2ktYmluL0NSTC8yMDE4L2NkcC5jcmwwHQYDVR0OBBYEFDNf3Q+3nFzO7ofdcHCL -X33PIry5MFQGA1UdIARNMEswSQYKKoZIhvhjAQIBBTA7MDkGCCsGAQUFBwIBFi1o -dHRwOi8vd3d3LnB1YmxpYy10cnVzdC5jb20vQ1BTL09tbmlSb290Lmh0bWwwgYkG -A1UdIwSBgTB/oXmkdzB1MQswCQYDVQQGEwJVUzEYMBYGA1UEChMPR1RFIENvcnBv -cmF0aW9uMScwJQYDVQQLEx5HVEUgQ3liZXJUcnVzdCBTb2x1dGlvbnMsIEluYy4x -IzAhBgNVBAMTGkdURSBDeWJlclRydXN0IEdsb2JhbCBSb290ggIBpTAOBgNVHQ8B -Af8EBAMCAYYwEgYDVR0TAQH/BAgwBgEB/wIBAjANBgkqhkiG9w0BAQUFAAOBgQBj -SQlU7cXbnngZAIOa4zci+1Z2XFTTyOFc/Tfc0qU/xVWPZPBJdx2UVk2yCwmIHFBY -OJSQC+7Kn7GE5nE3rBAyBrnB0oymBcBeD8tT3B4B31jHfnFgsC9UYin9uJN144+e -tbzOegUg4qaNApAaWGre3YY7ALn1y/6XgqIEIEZcCQ== ------END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIFCjCCBHOgAwIBAgIEBycWdTANBgkqhkiG9w0BAQUFADB1MQswCQYDVQQGEwJV +UzEYMBYGA1UEChMPR1RFIENvcnBvcmF0aW9uMScwJQYDVQQLEx5HVEUgQ3liZXJU +cnVzdCBTb2x1dGlvbnMsIEluYy4xIzAhBgNVBAMTGkdURSBDeWJlclRydXN0IEds +b2JhbCBSb290MB4XDTA4MDIxOTE4MjcwMloXDTExMDIxOTE4MjQ1M1owJzElMCMG +A1UEAxMcTWljcm9zb2Z0IEludGVybmV0IEF1dGhvcml0eTCCAiIwDQYJKoZIhvcN +AQEBBQADggIPADCCAgoCggIBAKiloatvDehDG/rQriel2AC9qmSJdvjKb2fmJf30 +K7SaC3zQu8kGQxENUEFsHsH0jmBejJ9vvn9tHZ8hGL+kORvWUVBskdMzP65rC0V0 +VeVgUYzPZ7MvrLfhh9+v3yJ7qRuf1aNgmzJg5t1AA91X+aRrFT4lRzl9BFWhQ1VS +XaD7l6qoiyhD8FbrdLRAe61swsRmzWeXoy6NJpOBsGXaCSG1Jooylro+zkWxt97c +NkNf/wYqoYcIXo02YpFbwreveejW9a0Lh/1z9+e9aiMtC5QnPT57GTqNINt5R0rp +Iz4g3GJhmjXVoVF/tev5DMJuhRgPoz0W0aA3UnSmTWh2RFvgqawLqSRrKUhVjySi +/m5s62uG5xxIftO7/6ljzS061CFoV/RBl/I3WghYp04sr4cSXWa/rL449YhBT8BJ +jltefWCYAOcT1nA4oFXwXbl1qCUIkZ0bqwju2FGW5vl2qh6vmzcQjc3XxD0m2UqC +yJNFa9SUgVXtUCqeOI+KqgLW01tpqZteG10byWKmppTVAvdPwHoGE0bl6wBwXldE +f7Pn4lqu6Yp4bedP3Qv1sfp2H7D98cxSwYRt3UcXN2kjTPv+pby2fEHm9GWf3iE/ +7OtzUI7LYhP7+rGyuCYTtZKH1jDWHrTZBpnAPmrAQQHCI8/4TjF9ZQ1mqRi6x9I9 +9XGfAgMBAAGjggFvMIIBazASBgNVHRMBAf8ECDAGAQH/AgEBMFMGA1UdIARMMEow +SAYJKwYBBAGxPgEAMDswOQYIKwYBBQUHAgEWLWh0dHA6Ly9jeWJlcnRydXN0Lm9t +bmlyb290LmNvbS9yZXBvc2l0b3J5LmNmbTAOBgNVHQ8BAf8EBAMCAYYwgYkGA1Ud +IwSBgTB/oXmkdzB1MQswCQYDVQQGEwJVUzEYMBYGA1UEChMPR1RFIENvcnBvcmF0 +aW9uMScwJQYDVQQLEx5HVEUgQ3liZXJUcnVzdCBTb2x1dGlvbnMsIEluYy4xIzAh +BgNVBAMTGkdURSBDeWJlclRydXN0IEdsb2JhbCBSb290ggIBpTBFBgNVHR8EPjA8 +MDqgOKA2hjRodHRwOi8vd3d3LnB1YmxpYy10cnVzdC5jb20vY2dpLWJpbi9DUkwv +MjAxOC9jZHAuY3JsMB0GA1UdDgQWBBTG27vA2CAZkvFg/IjxWH+8G06PGjANBgkq +hkiG9w0BAQUFAAOBgQBnSDXCyiqGmHTAEJOtZYVm/IbzGtzCY423NF6/yuccYZkm +spJnDoh8nq3nx3P2KBEyPAqoQ1MEFC+ByQjV4AAQ9dMQALUGNRfHhFUhBeeIybYd +bzvKOxSlIYSwO2T56+oXyDlkbQWKmHec5qzCE0lwGHslsRU/CHwhuFu2nH+CxQ== +-----END CERTIFICATE----- diff -r 841eb21e96fe -r 16b901793d7c share/ca-certs/Microsoft_Secure_Server_Authority.pem --- a/share/ca-certs/Microsoft_Secure_Server_Authority.pem Sat Dec 13 10:52:10 2008 +0000 +++ b/share/ca-certs/Microsoft_Secure_Server_Authority.pem Mon Dec 15 23:10:39 2008 +0000 @@ -1,30 +1,35 @@ -----BEGIN CERTIFICATE----- -MIIFEzCCA/ugAwIBAgIKYQVOAQADAAAAHDANBgkqhkiG9w0BAQUFADAnMSUwIwYD -VQQDExxNaWNyb3NvZnQgSW50ZXJuZXQgQXV0aG9yaXR5MB4XDTA3MDkyODIyMDYz -N1oXDTA5MDQxOTIzNTkwMFowgYsxEzARBgoJkiaJk/IsZAEZFgNjb20xGTAXBgoJ +MIIGEzCCA/ugAwIBAgIKYRZtLwAEAAAAIDANBgkqhkiG9w0BAQUFADAnMSUwIwYD +VQQDExxNaWNyb3NvZnQgSW50ZXJuZXQgQXV0aG9yaXR5MB4XDTA4MDQwOTIxMzc1 +NFoXDTExMDIxOTE4MjQ1M1owgYsxEzARBgoJkiaJk/IsZAEZFgNjb20xGTAXBgoJ kiaJk/IsZAEZFgltaWNyb3NvZnQxFDASBgoJkiaJk/IsZAEZFgRjb3JwMRcwFQYK CZImiZPyLGQBGRYHcmVkbW9uZDEqMCgGA1UEAxMhTWljcm9zb2Z0IFNlY3VyZSBT ZXJ2ZXIgQXV0aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA -xcCphW3RnMyuq1EAwlSsUghQUuCSQAaeFBTro1qbeCJEALHQGrXg8SMnY9Om64WG -PnB9HhOb1LTOdkMVx6a3GU0mcv+LkefcW/CewIMfDXPoeGA4ULmY9wbraPwJY8Ba -H3PAvOVSTJ0k9ZX6tXjE0D/214kn0+ZN+Y+ZwoqFC5/lgQyUxxgfVA0FsR/NDNF6 -keBsoNz2vPghAsruLhkON+5KGQo0o+T+XcJ7xNs7eJR7MWZn2rNCM1J+qrR0o2vG -vz8QBSKogUXiPRXYVkNSkBEFZqGvEob1pDwC5fJEP71J6xEJHsSe0pcaa637RU04 -4BsjRHqJE3Rrlurb6Fc8vQIDAQABo4IB2jCCAdYwEgYDVR0TAQH/BAgwBgEB/wIB -ATAdBgNVHQ4EFgQUmY+l9x6Bb/p5wvAWP7JUsQhoR1UwCwYDVR0PBAQDAgGGMBIG -CSsGAQQBgjcVAQQFAgMEAAQwIwYJKwYBBAGCNxUCBBYEFBOB4Tms57aqAqhuDUms -pmqjrALsMBkGCSsGAQQBgjcUAgQMHgoAUwB1AGIAQwBBMB8GA1UdIwQYMBaAFDNf -3Q+3nFzO7ofdcHCLX33PIry5MIGjBgNVHR8EgZswgZgwgZWggZKggY+GNmh0dHA6 -Ly9tc2NybC5taWNyb3NvZnQuY29tL3BraS9tc2NvcnAvY3JsL21zd3d3KDMpLmNy +kYTz6fKXvrdfIr5o3Ue4CRIzhTE+8JE4hrLTQki3emjYn/CfHRPb7hmMiOZmWBdE +DUEymyXOyZ7Sy2tC6WaBC4onVYotPoSsaOZJv6EJeHPk64RiWTfX+XqufRndYOEC +DUmotYQNPV/8InioIBf9+gOSsAMdmyGZF6C1PkJqvPZTRxNv6hxuMMb6uOQIPoFX +/ceQvAOZcJx2qGsAVKsJHylYkC0GgVyFVhOI0vcZZBcP5T+NtOmyjVBWdxS413HL +D+8w+3wG0bOP8EyOeRnuf0KLXGBangte0ZFIRd28GXpo5UrcA/r5000e2RTHmhC4 +8YPMIoi+q9XZoF5R0Z069QIDAQABo4IB2jCCAdYwEgYDVR0TAQH/BAgwBgEB/wIB +ADAdBgNVHQ4EFgQUFFXEOeA9LtFVLkiWsNh+FCIGk7wwCwYDVR0PBAQDAgGGMBIG +CSsGAQQBgjcVAQQFAgMFAAUwIwYJKwYBBAGCNxUCBBYEFM7FoL4P/nlmdZEP8PeS +WzWYqBWzMBkGCSsGAQQBgjcUAgQMHgoAUwB1AGIAQwBBMB8GA1UdIwQYMBaAFMbb +u8DYIBmS8WD8iPFYf7wbTo8aMIGjBgNVHR8EgZswgZgwgZWggZKggY+GNmh0dHA6 +Ly9tc2NybC5taWNyb3NvZnQuY29tL3BraS9tc2NvcnAvY3JsL21zd3d3KDQpLmNy bIY0aHR0cDovL2NybC5taWNyb3NvZnQuY29tL3BraS9tc2NvcnAvY3JsL21zd3d3 -KDMpLmNybIYfaHR0cDovL2NvcnBwa2kvY3JsL21zd3d3KDMpLmNybDB5BggrBgEF +KDQpLmNybIYfaHR0cDovL2NvcnBwa2kvY3JsL21zd3d3KDQpLmNybDB5BggrBgEF BQcBAQRtMGswPAYIKwYBBQUHMAKGMGh0dHA6Ly93d3cubWljcm9zb2Z0LmNvbS9w -a2kvbXNjb3JwL21zd3d3KDMpLmNydDArBggrBgEFBQcwAoYfaHR0cDovL2NvcnBw -a2kvYWlhL21zd3d3KDMpLmNydDANBgkqhkiG9w0BAQUFAAOCAQEARSzU1qmSJczv -IiFrscxgYtzXekBWgm2rYVIqN996H5ZfMDaso0tZXmhWo0zX0z0r0H+IIGtJ+4D9 -t6dMTpB26jV/5EtMbtQu48ryCkMHBKNtCn7pQ5Mq2gqjq84KrVUlBFfPT4z4+Hqp -Q6gVghMggWNtiujdHh7w4ja3OqHkFZTX/wUSTb+BtH+GBZKYAGU6duakb3D0piFu -W5W6gZ4j15R12ys3ZYTKThZjW5blolA0lzuCSghoSfJHRA4jChIzDNojkf7OxqJw -yFl8+++iZwTiulCTgOucJxGCT1tEEwdfX2c+XKyJIS/d5Ndtk91WEWU+TzqX9ZT4 -SAMJpIZ1pg== +a2kvbXNjb3JwL21zd3d3KDQpLmNydDArBggrBgEFBQcwAoYfaHR0cDovL2NvcnBw +a2kvYWlhL21zd3d3KDQpLmNydDANBgkqhkiG9w0BAQUFAAOCAgEAempuzk/VLM4N +H9TAbFtCjKc95iGmyx2bHbEk9m2cbGxXjBre+N4cJoIYYmhLrZ6L712ov1NjM73b +m8fb2Fy8Yw8Cmwc8VtarPZT2yzGr8MhNUDVuZswaKfjCY3H7RYv/XKc7AOMd25WP +/M0WTT4Bna6hl9dUaDGwv5SZFFIJ17FLo4FR2H7IkOOI/WcUPAHeDXUewp4qRPE/ +560xZrLSeNH2lKnOAwwXxwnXSo5WOF5AQXh1nRdbBV9Nu7yI6jH1QV6fKf6oFU2Y +IOjpnJ0FihVB6XoZ0wNOUMzPEEQcTfIoVoc+t0iK02wcmTLgBgbYU703dHvvPTcn +IfdI2mscx8l9MjUOdklIIve0FhCxRPqHpEeKjM95gllbXmWgQxAXiog+A62fEo5d +M7nfeEyiweSlhj1cv+2dyhzyS5saKYkk3ocCnOMCyD0M+4gJx4n4b/zT3rcujyN+ +7m20PbBTjcdTT1+AxOs75rON2hhKUqqrk2MDCpnEJsNK4TuRyDUtm9r+AxaZ4XRK +MT8InY1Xl9hzrIK6MVERYH46kxg6odwpzJ8Urn4dREBiMy6Gzq8mtyXvpYEcmeGL +zz1aT7qNNbQ0qqbPb6RpOMHlUWOIhVWJC71T5WK1pynAc3P9zOm8BkUYvIyJvCbR +bufCGVng4FAtVZ1advxSVRoa4GyuFZ8= -----END CERTIFICATE-----