# HG changeset patch # User Paul Aurich # Date 1238563585 0 # Node ID d6b2944f04b32a1e642fb7ff66ef18b0442c77d2 # Parent 9d0bad6f4b0d1c8f2c4289d1435275488af458e3 s/category/type/ and s/muc/chat/ in the core and gateway type is a string. 'type' seems a more reasonable name (category and type are fairly specific XMPP-isms even though this is basically only ever going to be useful for XMPP). Changing the gateway type (i.e. prpl identifier) to a string means adding them doesn't require minor bumps (and sane fallback methods should be implementable). diff -r 9d0bad6f4b0d -r d6b2944f04b3 libpurple/disco.c --- a/libpurple/disco.c Tue Mar 31 18:32:33 2009 +0000 +++ b/libpurple/disco.c Wed Apr 01 05:26:25 2009 +0000 @@ -56,8 +56,8 @@ gchar *name; /**< The name of the service. */ gchar *description; /**< The name of the service. */ - PurpleDiscoServiceCategory category; /**< The category of service. */ PurpleDiscoServiceType type; /**< The type of service. */ + gchar *gateway_type; /**< The type of the gateway service. */ PurpleDiscoServiceFlags flags; }; @@ -93,6 +93,7 @@ { g_free(r->name); g_free(r->description); + g_free(r->gateway_type); g_free(r); } @@ -141,16 +142,15 @@ ops->add_service(list, service, parent); } -PurpleDiscoService *purple_disco_list_service_new(PurpleDiscoServiceCategory category, const gchar *name, - PurpleDiscoServiceType type, const gchar *description, PurpleDiscoServiceFlags flags) +PurpleDiscoService *purple_disco_list_service_new(PurpleDiscoServiceType type, const gchar *name, + const gchar *description, PurpleDiscoServiceFlags flags) { PurpleDiscoService *s; g_return_val_if_fail(name != NULL, NULL); - g_return_val_if_fail(category != PURPLE_DISCO_SERVICE_CAT_UNSET, NULL); + g_return_val_if_fail(type != PURPLE_DISCO_SERVICE_TYPE_UNSET, NULL); s = g_new0(PurpleDiscoService, 1); - s->category = category; s->name = g_strdup(name); s->type = type; s->description = g_strdup(description); @@ -235,18 +235,10 @@ return service->description; } -PurpleDiscoServiceCategory -purple_disco_service_get_category(PurpleDiscoService *service) -{ - g_return_val_if_fail(service != NULL, PURPLE_DISCO_SERVICE_CAT_UNSET); - - return service->category; -} - PurpleDiscoServiceType purple_disco_service_get_type(PurpleDiscoService *service) { - g_return_val_if_fail(service != NULL, PURPLE_DISCO_SERVICE_TYPE_NONE); + g_return_val_if_fail(service != NULL, PURPLE_DISCO_SERVICE_TYPE_UNSET); return service->type; } @@ -259,6 +251,21 @@ return service->flags; } +void purple_disco_service_set_gateway_type(PurpleDiscoService *service, const gchar *type) +{ + g_return_if_fail(service != NULL); + + g_free(service->gateway_type); + service->gateway_type = g_strdup(type); +} + +const gchar *purple_disco_service_get_gateway_type(PurpleDiscoService *service) +{ + g_return_val_if_fail(service != NULL, NULL); + + return service->gateway_type; +} + PurpleAccount* purple_disco_list_get_account(PurpleDiscoList *list) { g_return_val_if_fail(list != NULL, NULL); diff -r 9d0bad6f4b0d -r d6b2944f04b3 libpurple/disco.h --- a/libpurple/disco.h Tue Mar 31 18:32:33 2009 +0000 +++ b/libpurple/disco.h Wed Apr 01 05:26:25 2009 +0000 @@ -40,34 +40,31 @@ typedef void (*PurpleDiscoCloseCallback) (PurpleDiscoList *list); /** - * The categories of services. - */ -typedef enum -{ - PURPLE_DISCO_SERVICE_CAT_UNSET, - PURPLE_DISCO_SERVICE_CAT_GATEWAY, - PURPLE_DISCO_SERVICE_CAT_DIRECTORY, - PURPLE_DISCO_SERVICE_CAT_MUC, - PURPLE_DISCO_SERVICE_CAT_OTHER -} PurpleDiscoServiceCategory; - -/** * The types of services. */ typedef enum { - PURPLE_DISCO_SERVICE_TYPE_NONE, - PURPLE_DISCO_SERVICE_TYPE_AIM, - PURPLE_DISCO_SERVICE_TYPE_GG, - PURPLE_DISCO_SERVICE_TYPE_GTALK, - PURPLE_DISCO_SERVICE_TYPE_ICQ, - PURPLE_DISCO_SERVICE_TYPE_IRC, - PURPLE_DISCO_SERVICE_TYPE_MAIL, - PURPLE_DISCO_SERVICE_TYPE_MSN, - PURPLE_DISCO_SERVICE_TYPE_USER, - PURPLE_DISCO_SERVICE_TYPE_QQ, - PURPLE_DISCO_SERVICE_TYPE_XMPP, - PURPLE_DISCO_SERVICE_TYPE_YAHOO + PURPLE_DISCO_SERVICE_TYPE_UNSET, + /** + * A registerable gateway to another protocol. An example would be + * XMPP legacy transports. + */ + PURPLE_DISCO_SERVICE_TYPE_GATEWAY, + + /** + * A directory (e.g. allows the user to search for other users). + */ + PURPLE_DISCO_SERVICE_TYPE_DIRECTORY, + + /** + * A chat (multi-user conversation). + */ + PURPLE_DISCO_SERVICE_TYPE_CHAT, + + /** + * Something else. Do we need more categories? + */ + PURPLE_DISCO_SERVICE_TYPE_OTHER } PurpleDiscoServiceType; /** @@ -147,8 +144,10 @@ /** * Create new service object */ -PurpleDiscoService *purple_disco_list_service_new(PurpleDiscoServiceCategory category, const gchar *name, - PurpleDiscoServiceType type, const gchar *description, PurpleDiscoServiceFlags flags); +PurpleDiscoService * +purple_disco_list_service_new(PurpleDiscoServiceType type, const gchar *name, + const gchar *description, + PurpleDiscoServiceFlags flags); /** * Add service to list @@ -182,16 +181,6 @@ const gchar* purple_disco_service_get_description(PurpleDiscoService *service); /** - * Return a service's category. - * - * @param service The service. - * @return The category. - * - * @since TODO - */ -PurpleDiscoServiceCategory purple_disco_service_get_category(PurpleDiscoService *service); - -/** * Return a service's type. * * @param service The service. @@ -210,6 +199,32 @@ * @since TODO */ PurpleDiscoServiceFlags purple_disco_service_get_flags(PurpleDiscoService *service); + +/** + * Set the gateway type for a gateway service. The gateway type is a string + * that represents a canonical name of the protocol to which this service is + * a gateway. For example, for an XMPP legacy transport to AIM, this would + * be "aim". + * + * These strings should conform to the names of the libpurple prpls where + * possible (so a UI can easily map types to icons) and, as a backup, the + * XMPP registry list of gateways at + * http://xmpp.org/registrar/disco-categories.html#gateway. + */ +void purple_disco_service_set_gateway_type(PurpleDiscoService *service, + const gchar *type); + +/** + * Get the gateway type for a gateway service. + * + * @param service The service. + * @returns The gateway type or NULL if none was set or service is not + * a gateway. + * + * @see purple_disco_service_set_gateway_type(). + */ +const gchar *purple_disco_service_get_gateway_type(PurpleDiscoService *service); + /** * Get the account associated with a service list. * diff -r 9d0bad6f4b0d -r d6b2944f04b3 libpurple/protocols/jabber/disco.c --- a/libpurple/protocols/jabber/disco.c Tue Mar 31 18:32:33 2009 +0000 +++ b/libpurple/protocols/jabber/disco.c Wed Apr 01 05:26:25 2009 +0000 @@ -602,44 +602,43 @@ jabber_disco_list_data_destroy(data); } -static PurpleDiscoServiceCategory +static PurpleDiscoServiceType jabber_disco_category_from_string(const gchar *str) { - if (!strcasecmp(str, "gateway")) - return PURPLE_DISCO_SERVICE_CAT_GATEWAY; - else if (!strcasecmp(str, "directory")) - return PURPLE_DISCO_SERVICE_CAT_DIRECTORY; - else if (!strcasecmp(str, "conference")) - return PURPLE_DISCO_SERVICE_CAT_MUC; + if (!g_ascii_strcasecmp(str, "gateway")) + return PURPLE_DISCO_SERVICE_TYPE_GATEWAY; + else if (!g_ascii_strcasecmp(str, "directory")) + return PURPLE_DISCO_SERVICE_TYPE_DIRECTORY; + else if (!g_ascii_strcasecmp(str, "conference")) + return PURPLE_DISCO_SERVICE_TYPE_CHAT; - return PURPLE_DISCO_SERVICE_CAT_OTHER; + return PURPLE_DISCO_SERVICE_TYPE_OTHER; } -static PurpleDiscoServiceType +static const gchar * jabber_disco_type_from_string(const gchar *str) { if (!strcasecmp(str, "xmpp")) - return PURPLE_DISCO_SERVICE_TYPE_XMPP; + return "jabber"; else if (!strcasecmp(str, "icq")) - return PURPLE_DISCO_SERVICE_TYPE_ICQ; + return "icq"; else if (!strcasecmp(str, "smtp")) - return PURPLE_DISCO_SERVICE_TYPE_MAIL; - else if (!strcasecmp(str, "user")) - return PURPLE_DISCO_SERVICE_TYPE_USER; + return "smtp"; else if (!strcasecmp(str, "yahoo")) - return PURPLE_DISCO_SERVICE_TYPE_YAHOO; + return "yahoo"; else if (!strcasecmp(str, "irc")) - return PURPLE_DISCO_SERVICE_TYPE_IRC; + return "irc"; else if (!strcasecmp(str, "gadu-gadu")) - return PURPLE_DISCO_SERVICE_TYPE_GG; + return "gg"; else if (!strcasecmp(str, "aim")) - return PURPLE_DISCO_SERVICE_TYPE_AIM; + return "aim"; else if (!strcasecmp(str, "qq")) - return PURPLE_DISCO_SERVICE_TYPE_QQ; + return "qq"; else if (!strcasecmp(str, "msn")) - return PURPLE_DISCO_SERVICE_TYPE_MSN; + return "msn"; - return PURPLE_DISCO_SERVICE_TYPE_NONE; + /* fallback to the string itself */ + return str; } static void @@ -743,8 +742,8 @@ const char *acat, *atype, *adesc, *anode; char *aname; PurpleDiscoService *s; - PurpleDiscoServiceCategory cat; PurpleDiscoServiceType type; + const char *gateway_type = NULL; PurpleDiscoServiceFlags flags = PURPLE_DISCO_ADD; list_data = disco_data->list_data; @@ -787,8 +786,9 @@ aname = g_strdup(from); } - cat = jabber_disco_category_from_string(acat); - type = jabber_disco_type_from_string(atype); + type = jabber_disco_category_from_string(acat); + if (type == PURPLE_DISCO_SERVICE_TYPE_GATEWAY) + gateway_type = jabber_disco_type_from_string(atype); for (child = xmlnode_get_child(query, "feature"); child; child = xmlnode_get_next_twin(child)) { @@ -804,16 +804,19 @@ flags |= PURPLE_DISCO_BROWSE; if (!strcmp(var, "http://jabber.org/protocol/muc")) - cat = PURPLE_DISCO_SERVICE_CAT_MUC; + type = PURPLE_DISCO_SERVICE_TYPE_CHAT; } - purple_debug_info("disco", "service %s, category %s (%d), type %s (%d), description %s, flags %04x\n", + purple_debug_info("disco", "service %s, category %s (%d), type %s (%s), description %s, flags %04x\n", aname, - acat, cat, - atype, type, + acat, type, + atype, gateway_type ? gateway_type : "(null)", adesc, flags); - s = purple_disco_list_service_new(cat, aname, type, adesc, flags); + s = purple_disco_list_service_new(type, aname, adesc, flags); + if (type == PURPLE_DISCO_SERVICE_TYPE_GATEWAY) + purple_disco_service_set_gateway_type(s, gateway_type); + purple_disco_list_service_add(list, s, parent); /* if (flags & PURPLE_DISCO_FLAG_BROWSE) - not all browsable services has this future */ diff -r 9d0bad6f4b0d -r d6b2944f04b3 pidgin/gtkdisco.c --- a/pidgin/gtkdisco.c Tue Mar 31 18:32:33 2009 +0000 +++ b/pidgin/gtkdisco.c Wed Apr 01 05:26:25 2009 +0000 @@ -130,7 +130,7 @@ account = purple_disco_list_get_account(info->list); name = purple_disco_service_get_name(info->service); - if (purple_disco_service_get_category(info->service) == PURPLE_DISCO_SERVICE_CAT_MUC) + if (purple_disco_service_get_type(info->service) == PURPLE_DISCO_SERVICE_TYPE_CHAT) purple_blist_request_add_chat(account, NULL, NULL, name); else purple_blist_request_add_buddy(account, name, NULL, NULL); @@ -459,8 +459,8 @@ { PidginDiscoList *pdl; PidginDiscoDialog *dialog; - PurpleDiscoServiceCategory category; PurpleDiscoServiceType type; + const char *gateway_type; GtkTreeIter iter, parent_iter; GtkTreeRowReference *rr; GtkTreePath *path; @@ -485,30 +485,18 @@ gtk_tree_store_append(pdl->model, &iter, (parent ? &parent_iter : NULL)); - category = purple_disco_service_get_category(service); type = purple_disco_service_get_type(service); + gateway_type = purple_disco_service_get_gateway_type(service); - if (type == PURPLE_DISCO_SERVICE_TYPE_XMPP) - filename = g_build_filename(DATADIR, "pixmaps", "pidgin", "protocols", "22", "jabber.png", NULL); - else if (type == PURPLE_DISCO_SERVICE_TYPE_ICQ) - filename = g_build_filename(DATADIR, "pixmaps", "pidgin", "protocols", "22", "icq.png", NULL); - else if (type == PURPLE_DISCO_SERVICE_TYPE_YAHOO) - filename = g_build_filename(DATADIR, "pixmaps", "pidgin", "protocols", "22", "yahoo.png", NULL); - else if (type == PURPLE_DISCO_SERVICE_TYPE_GTALK) - filename = g_build_filename(DATADIR, "pixmaps", "pidgin", "protocols", "22", "google-talk.png", NULL); - else if (type == PURPLE_DISCO_SERVICE_TYPE_IRC) - filename = g_build_filename(DATADIR, "pixmaps", "pidgin", "protocols", "22", "irc.png", NULL); - else if (type == PURPLE_DISCO_SERVICE_TYPE_GG) - filename = g_build_filename(DATADIR, "pixmaps", "pidgin", "protocols", "22", "gadu-gadu.png", NULL); - else if (type == PURPLE_DISCO_SERVICE_TYPE_AIM) - filename = g_build_filename(DATADIR, "pixmaps", "pidgin", "protocols", "22", "aim.png", NULL); - else if (type == PURPLE_DISCO_SERVICE_TYPE_QQ) - filename = g_build_filename(DATADIR, "pixmaps", "pidgin", "protocols", "22", "qq.png", NULL); - else if (type == PURPLE_DISCO_SERVICE_TYPE_MSN) - filename = g_build_filename(DATADIR, "pixmaps", "pidgin", "protocols", "22", "msn.png", NULL); - else if (type == PURPLE_DISCO_SERVICE_TYPE_USER) + if (type == PURPLE_DISCO_SERVICE_TYPE_GATEWAY && gateway_type) { + char *tmp = g_strconcat(gateway_type, ".png", NULL); + filename = g_build_filename(DATADIR, "pixmaps", "pidgin", "protocols", "22", tmp, NULL); + g_free(tmp); +#if 0 + } else if (type == PURPLE_DISCO_SERVICE_TYPE_USER) { filename = g_build_filename(DATADIR, "pixmaps", "pidgin", "status", "22", "person.png", NULL); - else if (category == PURPLE_DISCO_SERVICE_CAT_MUC) +#endif + } else if (type == PURPLE_DISCO_SERVICE_TYPE_CHAT) filename = g_build_filename(DATADIR, "pixmaps", "pidgin", "status", "22", "chat.png", NULL); if (filename) {