diff options
author | Krzysztof Klinikowski <kkszysiu@gmail.com> | 2010-03-06 16:51:30 +0000 |
---|---|---|
committer | Krzysztof Klinikowski <kkszysiu@gmail.com> | 2010-03-06 16:51:30 +0000 |
commit | 9b893fb1b2370eb326ba369687304e4a03285fb7 (patch) | |
tree | ac6402af9cbc3d207d21c668d7c455a31cdedf99 | |
parent | e5636788d00d18a0b0ea71d3880e2db026185fca (diff) | |
download | pidgin-cpw.rekkanoryo.ggupdate.tar.gz |
Finish making libgadu compile on Windows. Fixes #10542 finally!cpw.rekkanoryo.ggupdate
committer: John Bailey <rekkanoryo@rekkanoryo.org>
-rw-r--r-- | libpurple/protocols/gg/Makefile.mingw | 1 | ||||
-rw-r--r-- | libpurple/protocols/gg/buddylist.c | 2 | ||||
-rw-r--r-- | libpurple/protocols/gg/gg.c | 73 | ||||
-rw-r--r-- | libpurple/protocols/gg/lib/events.c | 6 | ||||
-rw-r--r-- | libpurple/protocols/gg/lib/libgadu.c | 6 | ||||
-rw-r--r-- | libpurple/protocols/gg/lib/libgadu.h | 1 | ||||
-rw-r--r-- | libpurple/protocols/gg/lib/resolver.c | 323 |
7 files changed, 383 insertions, 29 deletions
diff --git a/libpurple/protocols/gg/Makefile.mingw b/libpurple/protocols/gg/Makefile.mingw index d147398c23..43ce4044ed 100644 --- a/libpurple/protocols/gg/Makefile.mingw +++ b/libpurple/protocols/gg/Makefile.mingw @@ -50,6 +50,7 @@ C_SRC = \ lib/pubdir.c \ lib/pubdir50.c \ lib/resolver.c \ + lib/sha1.c \ buddylist.c \ confer.c \ gg.c \ diff --git a/libpurple/protocols/gg/buddylist.c b/libpurple/protocols/gg/buddylist.c index f83e6b0fad..4bad0c6228 100644 --- a/libpurple/protocols/gg/buddylist.c +++ b/libpurple/protocols/gg/buddylist.c @@ -82,7 +82,7 @@ void ggp_buddylist_load(PurpleConnection *gc, char *buddylist) gchar **users_tbl; int i; char *utf8buddylist = charset_convert(buddylist, "CP1250", "UTF-8"); - + /* Don't limit the number of records in a buddylist. */ users_tbl = g_strsplit(utf8buddylist, "\r\n", -1); diff --git a/libpurple/protocols/gg/gg.c b/libpurple/protocols/gg/gg.c index 21f2a136d3..2ec6a8983d 100644 --- a/libpurple/protocols/gg/gg.c +++ b/libpurple/protocols/gg/gg.c @@ -1000,8 +1000,8 @@ static void ggp_generic_status_handler(PurpleConnection *gc, uin_t uin, int status, const char *descr) { gchar *from; - const char *st; gchar *msg; + const char *st; gchar *avatarurl; PurpleUtilFetchUrlData *url_data; @@ -1018,29 +1018,37 @@ static void ggp_generic_status_handler(PurpleConnection *gc, uin_t uin, switch (status) { case GG_STATUS_NOT_AVAIL: case GG_STATUS_NOT_AVAIL_DESCR: - st = "offline"; + st = purple_primitive_get_id_from_type(PURPLE_STATUS_OFFLINE); + break; + case GG_STATUS_FFC: + case GG_STATUS_FFC_DESCR: + st = purple_primitive_get_id_from_type(PURPLE_STATUS_AVAILABLE); break; case GG_STATUS_AVAIL: case GG_STATUS_AVAIL_DESCR: - st = "available"; + st = purple_primitive_get_id_from_type(PURPLE_STATUS_AVAILABLE); break; case GG_STATUS_BUSY: case GG_STATUS_BUSY_DESCR: - st = "away"; + st = purple_primitive_get_id_from_type(PURPLE_STATUS_AWAY); break; + case GG_STATUS_DND: + case GG_STATUS_DND_DESCR: + st = purple_primitive_get_id_from_type(PURPLE_STATUS_UNAVAILABLE); case GG_STATUS_BLOCKED: /* user is blocking us.... */ st = "blocked"; break; default: - st = "available"; + st = purple_primitive_get_id_from_type(PURPLE_STATUS_AVAILABLE); purple_debug_info("gg", "GG_EVENT_NOTIFY: Unknown status: %d\n", status); break; } purple_debug_info("gg", "st = %s\n", st); - msg = charset_convert(descr, "CP1250", "UTF-8"); + //msg = charset_convert(descr, "CP1250", "UTF-8"); + msg = g_strdup_printf("%s", descr); purple_prpl_got_user_status(purple_connection_get_account(gc), from, st, "message", msg, NULL); g_free(from); @@ -1078,6 +1086,12 @@ static const char *ggp_status_by_id(unsigned int id) case GG_STATUS_AVAIL_DESCR: st = _("Available"); break; + case GG_STATUS_FFC: + case GG_STATUS_FFC_DESCR: + return _("Chatty"); + case GG_STATUS_DND: + case GG_STATUS_DND_DESCR: + return _("Do Not Disturb"); case GG_STATUS_BUSY: case GG_STATUS_BUSY_DESCR: st = _("Away"); @@ -1347,8 +1361,11 @@ static void ggp_recv_message_handler(PurpleConnection *gc, const struct gg_event from = g_strdup_printf("%lu", (unsigned long int)ev->event.msg.sender); + /* tmp = charset_convert((const char *)ev->event.msg.message, "CP1250", "UTF-8"); + */ + tmp = g_strdup_printf("%s", ev->event.msg.message); purple_str_strip_char(tmp, '\r'); msg = g_markup_escape_text(tmp, -1); g_free(tmp); @@ -1562,7 +1579,7 @@ static void ggp_callback_recv(gpointer _gc, gint fd, PurpleInputCondition cond) purple_debug_info("gg", "notify_pre: (%d) status: %d\n", ev->event.notify->uin, - ev->event.notify->status); + GG_S(ev->event.notify->status)); n = (ev->type == GG_EVENT_NOTIFY) ? ev->event.notify : ev->event.notify_descr.notify; @@ -1573,17 +1590,17 @@ static void ggp_callback_recv(gpointer _gc, gint fd, PurpleInputCondition cond) purple_debug_info("gg", "notify: (%d) status: %d; descr: %s\n", - n->uin, n->status, descr ? descr : "(null)"); + n->uin, GG_S(n->status), descr ? descr : "(null)"); ggp_generic_status_handler(gc, - n->uin, n->status, descr); + n->uin, GG_S(n->status), descr); } } break; case GG_EVENT_NOTIFY60: purple_debug_info("gg", "notify60_pre: (%d) status=%d; version=%d; descr=%s\n", - ev->event.notify60->uin, ev->event.notify60->status, + ev->event.notify60->uin, GG_S(ev->event.notify60->status), ev->event.notify60->version, ev->event.notify60->descr ? ev->event.notify60->descr : "(null)"); @@ -1602,7 +1619,7 @@ static void ggp_callback_recv(gpointer _gc, gint fd, PurpleInputCondition cond) break; case GG_EVENT_STATUS: purple_debug_info("gg", "status: (%d) status=%d; descr=%s\n", - ev->event.status.uin, ev->event.status.status, + ev->event.status.uin, GG_S(ev->event.status.status), ev->event.status.descr ? ev->event.status.descr : "(null)"); ggp_generic_status_handler(gc, ev->event.status.uin, @@ -1611,12 +1628,12 @@ static void ggp_callback_recv(gpointer _gc, gint fd, PurpleInputCondition cond) case GG_EVENT_STATUS60: purple_debug_info("gg", "status60: (%d) status=%d; version=%d; descr=%s\n", - ev->event.status60.uin, ev->event.status60.status, + ev->event.status60.uin, GG_S(ev->event.status60.status), ev->event.status60.version, ev->event.status60.descr ? ev->event.status60.descr : "(null)"); ggp_generic_status_handler(gc, ev->event.status60.uin, - ev->event.status60.status, ev->event.status60.descr); + GG_S(ev->event.status60.status), ev->event.status60.descr); break; case GG_EVENT_USERLIST: if (ev->event.userlist.type == GG_USERLIST_GET_REPLY) { @@ -1829,6 +1846,16 @@ static GList *ggp_status_types(PurpleAccount *account) NULL); types = g_list_append(types, type); + /* + * New statuses for GG 8.0 like PoGGadaj ze mna (not yet because + * libpurple can't support Chatty status) and Nie przeszkadzac + */ + type = purple_status_type_new_with_attrs( + PURPLE_STATUS_UNAVAILABLE, NULL, NULL, TRUE, TRUE, FALSE, + "message", _("Message"), purple_value_new(PURPLE_TYPE_STRING), + NULL); + types = g_list_append(types, type); + /* * This status is necessary to display guys who are blocking *us*. */ @@ -1930,6 +1957,9 @@ static void ggp_login(PurpleAccount *account) presence = purple_account_get_presence(account); status = purple_presence_get_active_status(presence); + glp->encoding = GG_ENCODING_UTF8; + glp->protocol_features = (GG_FEATURE_STATUS80|GG_FEATURE_DND_FFC); + glp->async = 1; glp->status = ggp_to_gg_status(status, &glp->status_descr); glp->tls = 0; @@ -2100,8 +2130,11 @@ static int ggp_send_im(PurpleConnection *gc, const char *who, const char *msg, plain = purple_unescape_html(msg); } + /* tmp = charset_convert(plain, "UTF-8", "CP1250"); - + */ + tmp = g_strdup_printf("%s", plain); + if (tmp && (format_length - sizeof(struct gg_msg_richtext))) { if(gg_send_message_richtext(info->session, GG_CLASS_CHAT, ggp_str_to_uin(who), (unsigned char *)tmp, format, format_length) < 0) { ret = -1; @@ -2160,6 +2193,9 @@ static int ggp_to_gg_status(PurpleStatus *status, char **msg) } else if (strcmp(status_id, "away") == 0) { new_status = GG_STATUS_BUSY; new_status_descr = GG_STATUS_BUSY_DESCR; + } else if (strcmp(status_id, "unavailable") == 0) { + new_status = GG_STATUS_DND; + new_status_descr = GG_STATUS_DND_DESCR; } else if (strcmp(status_id, "invisible") == 0) { new_status = GG_STATUS_INVISIBLE; new_status_descr = GG_STATUS_INVISIBLE_DESCR; @@ -2177,9 +2213,12 @@ static int ggp_to_gg_status(PurpleStatus *status, char **msg) new_msg = purple_status_get_attr_string(status, "message"); if(new_msg) { + /* char *tmp = purple_markup_strip_html(new_msg); *msg = charset_convert(tmp, "UTF-8", "CP1250"); g_free(tmp); + */ + *msg = purple_markup_strip_html(new_msg); return new_status_descr; } else { @@ -2279,7 +2318,8 @@ static int ggp_chat_send(PurpleConnection *gc, int id, const char *message, Purp GGPInfo *info = gc->proto_data; GGPChat *chat = NULL; GList *l; - char *msg, *plain; + /* char *msg, *plain; */ + gchar *msg; uin_t *uins; int count = 0; @@ -2310,9 +2350,12 @@ static int ggp_chat_send(PurpleConnection *gc, int id, const char *message, Purp uins[count++] = uin; } + /* plain = purple_unescape_html(message); msg = charset_convert(plain, "UTF-8", "CP1250"); g_free(plain); + */ + msg = purple_unescape_html(message); gg_send_message_confer(info->session, GG_CLASS_CHAT, count, uins, (unsigned char *)msg); g_free(msg); diff --git a/libpurple/protocols/gg/lib/events.c b/libpurple/protocols/gg/lib/events.c index cac52ca67e..b382362842 100644 --- a/libpurple/protocols/gg/lib/events.c +++ b/libpurple/protocols/gg/lib/events.c @@ -1143,13 +1143,12 @@ static int gg_watch_fd_connected(struct gg_session *sess, struct gg_event *e) case GG_NOTIFY_REPLY80: { struct gg_notify_reply80 *n = (void*) p; - unsigned int length = h->length, i = 0; + int length = h->length, i = 0; gg_debug_session(sess, GG_DEBUG_MISC, "// gg_watch_fd_connected() received a notify reply\n"); e->type = GG_EVENT_NOTIFY60; e->event.notify60 = malloc(sizeof(*e->event.notify60)); - if (!e->event.notify60) { gg_debug_session(sess, GG_DEBUG_MISC, "// gg_watch_fd_connected() not enough memory for notify data\n"); goto fail; @@ -1160,7 +1159,7 @@ static int gg_watch_fd_connected(struct gg_session *sess, struct gg_event *e) while (length >= sizeof(struct gg_notify_reply80)) { uint32_t descr_len; char *tmp; - + e->event.notify60[i].uin = gg_fix32(n->uin); e->event.notify60[i].status = gg_fix32(n->status); e->event.notify60[i].remote_ip = n->remote_ip; @@ -1170,6 +1169,7 @@ static int gg_watch_fd_connected(struct gg_session *sess, struct gg_event *e) e->event.notify60[i].version = 0x00; /* not-supported */ e->event.notify60[i].time = 0; /* not-supported */ + descr_len = gg_fix32(n->descr_len); length -= sizeof(struct gg_notify_reply80); diff --git a/libpurple/protocols/gg/lib/libgadu.c b/libpurple/protocols/gg/lib/libgadu.c index 3f2e2b1742..313afd23fc 100644 --- a/libpurple/protocols/gg/lib/libgadu.c +++ b/libpurple/protocols/gg/lib/libgadu.c @@ -29,6 +29,7 @@ */ #include "libgadu.h" +#include "libgadu-config.h" #include "libgadu-internal.h" #include <sys/types.h> @@ -411,8 +412,7 @@ void *gg_recv_packet(struct gg_session *sess) { struct gg_header h; char *buf = NULL; - int ret = 0; - unsigned int offset, size = 0; + int ret = 0, offset, size = 0; gg_debug_session(sess, GG_DEBUG_FUNCTION, "** gg_recv_packet(%p);\n", sess); @@ -609,7 +609,7 @@ int gg_send_packet(struct gg_session *sess, int type, ...) h->length = gg_fix32(tmp_length - sizeof(struct gg_header)); if ((gg_debug_level & GG_DEBUG_DUMP)) { - unsigned int i; + int i; gg_debug_session(sess, GG_DEBUG_DUMP, "// gg_send_packet(0x%.2x)", gg_fix32(h->type)); for (i = 0; i < tmp_length; ++i) diff --git a/libpurple/protocols/gg/lib/libgadu.h b/libpurple/protocols/gg/lib/libgadu.h index 52a1ce033f..163e4f3e25 100644 --- a/libpurple/protocols/gg/lib/libgadu.h +++ b/libpurple/protocols/gg/lib/libgadu.h @@ -179,6 +179,7 @@ typedef enum { GG_RESOLVER_DEFAULT = 0, /**< Domyślny sposób rozwiązywania nazw (jeden z poniższych) */ GG_RESOLVER_FORK, /**< Rozwiązywanie nazw bazujące na procesach */ GG_RESOLVER_PTHREAD, /**< Rozwiązywanie nazw bazujące na wątkach */ + GG_RESOLVER_WIN32, GG_RESOLVER_CUSTOM, /**< Funkcje rozwiązywania nazw dostarczone przed aplikację */ GG_RESOLVER_INVALID = -1 /**< Nieprawidłowy sposób rozwiązywania nazw (wynik \c gg_session_get_resolver) */ } gg_resolver_t; diff --git a/libpurple/protocols/gg/lib/resolver.c b/libpurple/protocols/gg/lib/resolver.c index ec2d3c0c3c..bf8370c330 100644 --- a/libpurple/protocols/gg/lib/resolver.c +++ b/libpurple/protocols/gg/lib/resolver.c @@ -215,6 +215,280 @@ struct gg_resolver_fork_data { int pid; /*< Identyfikator procesu */ }; + + +#ifdef _WIN32 +/** + * Deal with the fact that you can't select() on a win32 file fd. + * This makes it practically impossible to tie into purple's event loop. + * + * -This is thanks to Tor Lillqvist. + * XXX - Move this to where the rest of the the win32 compatiblity stuff goes when we push the changes back to libgadu. + */ +static int +socket_pipe (int *fds) +{ + SOCKET temp, socket1 = -1, socket2 = -1; + struct sockaddr_in saddr; + int len; + u_long arg; + fd_set read_set, write_set; + struct timeval tv; + + temp = socket(AF_INET, SOCK_STREAM, 0); + + if (temp == INVALID_SOCKET) { + goto out0; + } + + arg = 1; + if (ioctlsocket(temp, FIONBIO, &arg) == SOCKET_ERROR) { + goto out0; + } + + memset(&saddr, 0, sizeof(saddr)); + saddr.sin_family = AF_INET; + saddr.sin_port = 0; + saddr.sin_addr.s_addr = htonl(INADDR_LOOPBACK); + + if (bind(temp, (struct sockaddr *)&saddr, sizeof (saddr))) { + goto out0; + } + + if (listen(temp, 1) == SOCKET_ERROR) { + goto out0; + } + + len = sizeof(saddr); + if (getsockname(temp, (struct sockaddr *)&saddr, &len)) { + goto out0; + } + + socket1 = socket(AF_INET, SOCK_STREAM, 0); + + if (socket1 == INVALID_SOCKET) { + goto out0; + } + + arg = 1; + if (ioctlsocket(socket1, FIONBIO, &arg) == SOCKET_ERROR) { + goto out1; + } + + if (connect(socket1, (struct sockaddr *)&saddr, len) != SOCKET_ERROR || + WSAGetLastError() != WSAEWOULDBLOCK) { + goto out1; + } + + FD_ZERO(&read_set); + FD_SET(temp, &read_set); + + tv.tv_sec = 0; + tv.tv_usec = 0; + + if (select(0, &read_set, NULL, NULL, NULL) == SOCKET_ERROR) { + goto out1; + } + + if (!FD_ISSET(temp, &read_set)) { + goto out1; + } + + socket2 = accept(temp, (struct sockaddr *) &saddr, &len); + if (socket2 == INVALID_SOCKET) { + goto out1; + } + + FD_ZERO(&write_set); + FD_SET(socket1, &write_set); + + tv.tv_sec = 0; + tv.tv_usec = 0; + + if (select(0, NULL, &write_set, NULL, NULL) == SOCKET_ERROR) { + goto out2; + } + + if (!FD_ISSET(socket1, &write_set)) { + goto out2; + } + + arg = 0; + if (ioctlsocket(socket1, FIONBIO, &arg) == SOCKET_ERROR) { + goto out2; + } + + arg = 0; + if (ioctlsocket(socket2, FIONBIO, &arg) == SOCKET_ERROR) { + goto out2; + } + + fds[0] = socket1; + fds[1] = socket2; + + closesocket (temp); + + return 0; + +out2: + closesocket (socket2); +out1: + closesocket (socket1); +out0: + closesocket (temp); + errno = EIO; /* XXX */ + + return -1; +} +#endif + + + +#ifdef _WIN32 +struct gg_resolve_win32thread_data { + char *hostname; + int fd; +}; + +static DWORD WINAPI gg_resolve_win32thread_thread(LPVOID arg) +{ + struct gg_resolve_win32thread_data *d = arg; + struct in_addr a; + + gg_debug(GG_DEBUG_MISC, "// gg_resolve_win32thread_thread() host: %s, fd: %i called\n", d->hostname, d->fd); + + if ((a.s_addr = inet_addr(d->hostname)) == INADDR_NONE) { + /* W przypadku błędu gg_gethostbyname_real() zwróci -1 + * i nie zmieni &addr. Tam jest już INADDR_NONE, + * więc nie musimy robić nic więcej. */ + gg_gethostbyname_real(d->hostname, &a, 0); + } + + // if ((a.s_addr = inet_addr(d->hostname)) == INADDR_NONE) { + // struct in_addr *hn; + + // if (!(hn = gg_gethostbyname(d->hostname))) + // a.s_addr = INADDR_NONE; + // else { + // a.s_addr = hn->s_addr; + // free(hn); + // } + // } + + write(d->fd, &a, sizeof(a)); + close(d->fd); + + free(d->hostname); + d->hostname = NULL; + + free(d); + + gg_debug(GG_DEBUG_MISC, "// gg_resolve_win32thread_thread() done\n"); + + return 0; +} + + +static int gg_resolve_win32thread(int *fd, void **resolver, const char *hostname) +{ + struct gg_resolve_win32thread_data *d = NULL; + HANDLE h; + DWORD dwTId; + int pipes[2], new_errno; + + gg_debug(GG_DEBUG_FUNCTION, "** gg_resolve_win32thread(%p, %p, \"%s\");\n", fd, resolver, hostname); + + if (!resolver || !fd || !hostname) { + gg_debug(GG_DEBUG_MISC, "// gg_resolve_win32thread() invalid arguments\n"); + errno = EFAULT; + return -1; + } + + if (socket_pipe(pipes) == -1) { + gg_debug(GG_DEBUG_MISC, "// gg_resolve_win32thread() unable to create pipes (errno=%d, %s)\n", errno, strerror(errno)); + return -1; + } + + if (!(d = malloc(sizeof(*d)))) { + gg_debug(GG_DEBUG_MISC, "// gg_resolve_win32thread() out of memory\n"); + new_errno = errno; + goto cleanup; + } + + d->hostname = NULL; + + if (!(d->hostname = strdup(hostname))) { + gg_debug(GG_DEBUG_MISC, "// gg_resolve_win32thread() out of memory\n"); + new_errno = errno; + goto cleanup; + } + + d->fd = pipes[1]; + + h = CreateThread(NULL, 0, gg_resolve_win32thread_thread, + d, 0, &dwTId); + + if (h == NULL) { + gg_debug(GG_DEBUG_MISC, "// gg_resolve_win32thread() unable to create thread\n"); + new_errno = errno; + goto cleanup; + } + + *resolver = h; + *fd = pipes[0]; + + gg_debug(GG_DEBUG_MISC, "// gg_resolve_win32thread() done\n"); + + return 0; + +cleanup: + if (d) { + free(d->hostname); + free(d); + } + + close(pipes[0]); + close(pipes[1]); + + errno = new_errno; + + return -1; + +} + +static void gg_resolve_win32thread_cleanup(void **priv_data, int force) +{ + struct gg_resolve_win32thread_data *data; + + gg_debug(GG_DEBUG_MISC, "// gg_resolve_win32thread_cleanup() force: %i called\n", force); + + if (priv_data == NULL || *priv_data == NULL) + gg_debug(GG_DEBUG_MISC, "// gg_resolve_win32thread_cleanup() priv_data: NULL\n"); + return; + + data = (struct gg_resolve_win32thread_data*) *priv_data; + gg_debug(GG_DEBUG_MISC, "// gg_resolve_win32thread_cleanup() data: %s called\n", data->hostname); + *priv_data = NULL; + + if (force) { + gg_debug(GG_DEBUG_MISC, "// gg_resolve_win32thread_cleanup() force called\n", force); + //pthread_cancel(data->thread); + //pthread_join(data->thread, NULL); + } + + free(data->hostname); + data->hostname = NULL; + + if (data->fd != -1) { + close(data->fd); + data->fd = -1; + } + gg_debug(GG_DEBUG_MISC, "// gg_resolve_win32thread_cleanup() done\n"); + free(data); +} +#endif + +#ifndef _WIN32 /** * \internal Rozwiązuje nazwę serwera w osobnym procesie. * @@ -328,6 +602,7 @@ void gg_resolver_fork_cleanup(void **priv_data, int force) free(data); } +#endif #ifdef GG_CONFIG_HAVE_PTHREAD @@ -508,19 +783,31 @@ int gg_session_set_resolver(struct gg_session *gs, gg_resolver_t type) return 0; } -#if !defined(GG_CONFIG_HAVE_PTHREAD) || !defined(GG_CONFIG_PTHREAD_DEFAULT) - type = GG_RESOLVER_FORK; +#ifdef _WIN32 + type = GG_RESOLVER_WIN32; #else + type = GG_RESOLVER_FORK; +#endif + +#if defined(GG_CONFIG_HAVE_PTHREAD) || defined(GG_CONFIG_PTHREAD_DEFAULT) type = GG_RESOLVER_PTHREAD; #endif } switch (type) { - case GG_RESOLVER_FORK: +#ifdef _WIN32 + case GG_RESOLVER_WIN32: + gs->resolver_type = type; + gs->resolver_start = gg_resolve_win32thread; + gs->resolver_cleanup = gg_resolve_win32thread_cleanup; + return 0; +#else + case GG_RESOLVER_FORK: gs->resolver_type = type; gs->resolver_start = gg_resolver_fork_start; gs->resolver_cleanup = gg_resolver_fork_cleanup; return 0; +#endif #ifdef GG_CONFIG_HAVE_PTHREAD case GG_RESOLVER_PTHREAD: @@ -599,19 +886,31 @@ int gg_http_set_resolver(struct gg_http *gh, gg_resolver_t type) return 0; } -#if !defined(GG_CONFIG_HAVE_PTHREAD) || !defined(GG_CONFIG_PTHREAD_DEFAULT) - type = GG_RESOLVER_FORK; +#ifdef _WIN32 + type = GG_RESOLVER_WIN32; #else + type = GG_RESOLVER_FORK; +#endif + +#if defined(GG_CONFIG_HAVE_PTHREAD) || defined(GG_CONFIG_PTHREAD_DEFAULT) type = GG_RESOLVER_PTHREAD; #endif } switch (type) { - case GG_RESOLVER_FORK: +#ifdef _WIN32 + case GG_RESOLVER_WIN32: + gh->resolver_type = type; + gh->resolver_start = gg_resolve_win32thread; + gh->resolver_cleanup = gg_resolve_win32thread_cleanup; + return 0; +#else + case GG_RESOLVER_FORK: gh->resolver_type = type; gh->resolver_start = gg_resolver_fork_start; gh->resolver_cleanup = gg_resolver_fork_cleanup; return 0; +#endif #ifdef GG_CONFIG_HAVE_PTHREAD case GG_RESOLVER_PTHREAD: @@ -683,12 +982,22 @@ int gg_global_set_resolver(gg_resolver_t type) gg_global_resolver_cleanup = NULL; return 0; +#ifndef _WIN32 case GG_RESOLVER_FORK: gg_global_resolver_type = type; gg_global_resolver_start = gg_resolver_fork_start; gg_global_resolver_cleanup = gg_resolver_fork_cleanup; return 0; - +#endif + +#ifdef _WIN32 + case GG_RESOLVER_WIN32: + gg_global_resolver_type = type; + gg_global_resolver_start = gg_resolve_win32thread; + gg_global_resolver_cleanup = gg_resolve_win32thread_cleanup; + return 0; +#endif + #ifdef GG_CONFIG_HAVE_PTHREAD case GG_RESOLVER_PTHREAD: gg_global_resolver_type = type; |