gweb: Make sure to destroy the lookup before calling any result function
[platform/upstream/connman.git] / gweb / gweb.c
index 3db5dc5..d35179a 100644 (file)
@@ -2,7 +2,7 @@
  *
  *  Web service library with GLib integration
  *
- *  Copyright (C) 2009-2010  Intel Corporation. All rights reserved.
+ *  Copyright (C) 2009-2012  Intel Corporation. All rights reserved.
  *
  *  This program is free software; you can redistribute it and/or modify
  *  it under the terms of the GNU General Public License version 2 as
@@ -98,6 +98,7 @@ struct web_session {
        GWebResult result;
 
        GWebResultFunc result_func;
+       GWebRouteFunc route_func;
        GWebInputFunc input_func;
        int fd;
        gsize length;
@@ -127,18 +128,26 @@ struct _GWeb {
        gpointer debug_data;
 };
 
-static inline void debug(GWeb *web, const char *format, ...)
+#define debug(web, format, arg...)                             \
+       _debug(web, __FILE__, __func__, format, ## arg)
+
+static void _debug(GWeb *web, const char *file, const char *caller,
+                                               const char *format, ...)
 {
        char str[256];
        va_list ap;
+       int len;
 
        if (web->debug_func == NULL)
                return;
 
        va_start(ap, format);
 
-       if (vsnprintf(str, sizeof(str), format, ap) > 0)
-               web->debug_func(str, web->debug_data);
+       if ((len = snprintf(str, sizeof(str), "%s:%s() web %p ",
+                                               file, caller, web)) > 0) {
+               if (vsnprintf(str + len, sizeof(str) - len, format, ap) > 0)
+                       web->debug_func(str, web->debug_data);
+       }
 
        va_end(ap);
 }
@@ -265,6 +274,11 @@ void g_web_unref(GWeb *web)
        g_free(web);
 }
 
+gboolean g_web_supports_tls(void)
+{
+       return g_io_channel_supports_tls();
+}
+
 void g_web_set_debug(GWeb *web, GWebDebugFunc func, gpointer user_data)
 {
        if (web == NULL)
@@ -428,7 +442,6 @@ gboolean g_web_get_close_connection(GWeb *web)
 
 static inline void call_result_func(struct web_session *session, guint16 status)
 {
-       gboolean result;
 
        if (session->result_func == NULL)
                return;
@@ -436,10 +449,15 @@ static inline void call_result_func(struct web_session *session, guint16 status)
        if (status != 0)
                session->result.status = status;
 
-       result = session->result_func(&session->result, session->user_data);
+       session->result_func(&session->result, session->user_data);
 
-       debug(session->web, "[result function] %s",
-                                       result == TRUE ? "continue" : "stop");
+}
+
+static inline void call_route_func(struct web_session *session)
+{
+       if (session->route_func != NULL)
+               session->route_func(session->address, session->addr->ai_family,
+                               session->web->index, session->user_data);
 }
 
 static gboolean process_send_buffer(struct web_session *session)
@@ -1212,6 +1230,7 @@ static void resolv_result(GResolvResultStatus status,
        }
 
        session->address = g_strdup(results[0]);
+       call_route_func(session);
 
        if (create_transport(session) < 0) {
                call_result_func(session, 409);
@@ -1222,7 +1241,7 @@ static void resolv_result(GResolvResultStatus status,
 static guint do_request(GWeb *web, const char *url,
                                const char *type, GWebInputFunc input,
                                int fd, gsize length, GWebResultFunc func,
-                               gpointer user_data)
+                               GWebRouteFunc route, gpointer user_data)
 {
        struct web_session *session;
 
@@ -1255,6 +1274,7 @@ static guint do_request(GWeb *web, const char *url,
        session->web = web;
 
        session->result_func = func;
+       session->route_func = route;
        session->input_func = input;
        session->fd = fd;
        session->length = length;
@@ -1324,17 +1344,17 @@ static guint do_request(GWeb *web, const char *url,
        return web->next_query_id++;
 }
 
-guint g_web_request_get(GWeb *web, const char *url,
-                               GWebResultFunc func, gpointer user_data)
+guint g_web_request_get(GWeb *web, const char *url, GWebResultFunc func,
+               GWebRouteFunc route, gpointer user_data)
 {
-       return do_request(web, url, NULL, NULL, -1, 0, func, user_data);
+       return do_request(web, url, NULL, NULL, -1, 0, func, route, user_data);
 }
 
 guint g_web_request_post(GWeb *web, const char *url,
                                const char *type, GWebInputFunc input,
                                GWebResultFunc func, gpointer user_data)
 {
-       return do_request(web, url, type, input, -1, 0, func, user_data);
+       return do_request(web, url, type, input, -1, 0, func, NULL, user_data);
 }
 
 guint g_web_request_post_file(GWeb *web, const char *url,
@@ -1352,7 +1372,8 @@ guint g_web_request_post_file(GWeb *web, const char *url,
        if (fd < 0)
                return 0;
 
-       ret = do_request(web, url, type, NULL, fd, st.st_size, func, user_data);
+       ret = do_request(web, url, type, NULL, fd, st.st_size, func, NULL,
+                       user_data);
        if (ret == 0)
                close(fd);