refactoring context handling
[src/app-framework-binder.git] / src / afb-hreq.c
index 8a0b280..72b9050 100644 (file)
@@ -52,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;
@@ -80,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)
@@ -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)