refactoring context handling
[src/app-framework-binder.git] / src / afb-hreq.c
index 9984cbc..72b9050 100644 (file)
@@ -15,7 +15,6 @@
  * limitations under the License.
  */
 
-#define USE_MAGIC_MIME_TYPE
 #define _GNU_SOURCE
 
 #include <stdlib.h>
@@ -53,6 +52,7 @@ static const char token_cookie[] = "token";
 
 static char *cookie_name = NULL;
 static char *cookie_setter = NULL;
+static char *tmp_pattern = NULL;
 
 struct hreq_data {
        struct hreq_data *next;
@@ -81,7 +81,9 @@ static const struct afb_req_itf afb_hreq_itf = {
        .send = (void*)req_send,
        .session_create = (void*)req_session_create,
        .session_check = (void*)req_session_check,
-       .session_close = (void*)req_session_close
+       .session_close = (void*)req_session_close,
+       .context_get = (void*)afb_context_get,
+       .context_set = (void*)afb_context_set
 };
 
 static struct hreq_data *get_data(struct afb_hreq *hreq, const char *key, int create)
@@ -145,12 +147,6 @@ static int validsubpath(const char *subpath)
        return 1;
 }
 
-#if defined(USE_MAGIC_MIME_TYPE)
-
-#if !defined(MAGIC_DB)
-#define MAGIC_DB "/usr/share/misc/magic.mgc"
-#endif
-
 static void afb_hreq_reply_v(struct afb_hreq *hreq, unsigned status, struct MHD_Response *response, va_list args)
 {
        char *cookie;
@@ -209,6 +205,12 @@ void afb_hreq_reply_free(struct afb_hreq *hreq, unsigned status, size_t size, ch
        va_end(args);
 }
 
+#if defined(USE_MAGIC_MIME_TYPE)
+
+#if !defined(MAGIC_DB)
+#define MAGIC_DB "/usr/share/misc/magic.mgc"
+#endif
+
 static magic_t lazy_libmagic()
 {
        static int done = 0;
@@ -219,7 +221,7 @@ static magic_t lazy_libmagic()
                /* MAGIC_MIME tells magic to return a mime of the file,
                         but you can specify different things */
                if (verbosity)
-                       printf("Loading mimetype default magic database\n");
+                       fprintf(stderr, "Loading mimetype default magic database\n");
 
                result = magic_open(MAGIC_MIME_TYPE);
                if (result == NULL) {
@@ -254,8 +256,9 @@ static const char *mimetype_fd_name(int fd, const char *filename)
        const char *extension = strrchr(filename, '.');
        if (extension) {
                static const char *const known[][2] = {
-                       { ".js", "text/javascript" },
+                       { ".js",   "text/javascript" },
                        { ".html", "text/html" },
+                       { ".css",  "text/css" },
                        { NULL, NULL }
                };
                int i = 0;
@@ -492,12 +495,53 @@ int afb_hreq_post_add(struct afb_hreq *hreq, const char *key, const char *data,
        return 1;
 }
 
+int afb_hreq_init_download_path(const char *directory)
+{
+       struct stat st;
+       size_t n;
+       char *p;
+
+       if (access(directory, R_OK|W_OK)) {
+               /* no read/write access */
+               return -1;
+       }
+       if (stat(directory, &st)) {
+               /* can't get info */
+               return -1;
+       }
+       if (!S_ISDIR(st.st_mode)) {
+               /* not a directory */
+               errno = ENOTDIR;
+               return -1;
+       }
+       n = strlen(directory);
+       while(n > 1 && directory[n-1] == '/') n--;
+       p = malloc(n + 8);
+       if (p == NULL) {
+               /* can't allocate memory */
+               errno = ENOMEM;
+               return -1;
+       }
+       memcpy(p, directory, n);
+       p[n++] = '/';
+       p[n++] = 'X';
+       p[n++] = 'X';
+       p[n++] = 'X';
+       p[n++] = 'X';
+       p[n++] = 'X';
+       p[n++] = 'X';
+       p[n] = 0;
+       free(tmp_pattern);
+       tmp_pattern = p;
+       return 0;
+}
+
 static int opentempfile(char **path)
 {
        int fd;
        char *fname;
 
-       fname = strdup("XXXXXX"); /* TODO improve the path */
+       fname = strdup(tmp_pattern ? : "XXXXXX"); /* TODO improve the path */
        if (fname == NULL)
                return -1;
 
@@ -542,7 +586,7 @@ int afb_hreq_post_add_file(struct afb_hreq *hreq, const char *key, const char *f
 
 struct afb_req afb_hreq_to_req(struct afb_hreq *hreq)
 {
-       return (struct afb_req){ .itf = &afb_hreq_itf, .data = hreq };
+       return (struct afb_req){ .itf = &afb_hreq_itf, .req_closure = hreq };
 }
 
 static struct afb_arg req_get(struct afb_hreq *hreq, const char *name)