Browse Source

Attachments are now starting to get real.

default 2 years ago
parent
commit
d9a15b8af7
6 changed files with 57 additions and 15 deletions
  1. 15 2
      data.c
  2. 26 1
      html.c
  3. 2 1
      snac.h
  4. 2 2
      xs.h
  5. 11 8
      xs_io.h
  6. 1 1
      xs_version.h

+ 15 - 2
data.c

@@ -805,14 +805,14 @@ int actor_get(snac *snac, char *actor, d_char **data)
 }
 
 
-d_char *_static_fn(snac *snac, char *id)
+d_char *_static_fn(snac *snac, const char *id)
 /* gets the filename for a static file */
 {
     return xs_fmt("%s/static/%s", snac->basedir, id);
 }
 
 
-int static_get(snac *snac, char *id, d_char **data, int *size)
+int static_get(snac *snac, const char *id, d_char **data, int *size)
 /* returns static content */
 {
     xs *fn = _static_fn(snac, id);
@@ -830,6 +830,19 @@ int static_get(snac *snac, char *id, d_char **data, int *size)
 }
 
 
+void static_put(snac *snac, const char *id, const char *data, int size)
+/* writes status content */
+{
+    xs *fn = _static_fn(snac, id);
+    FILE *f;
+
+    if ((f = fopen(fn, "wb")) != NULL) {
+        fwrite(data, size, 1, f);
+        fclose(f);
+    }
+}
+
+
 d_char *_history_fn(snac *snac, char *id)
 /* gets the filename for the history */
 {

+ 26 - 1
html.c

@@ -877,12 +877,37 @@ int html_post_handler(d_char *req, char *q_path, d_char *payload, int p_size,
         char *content     = xs_dict_get(p_vars, "content");
         char *in_reply_to = xs_dict_get(p_vars, "in_reply_to");
         char *attach_url  = xs_dict_get(p_vars, "attach_url");
+        char *attach_file = xs_dict_get(p_vars, "attach");
+        xs *attach_list   = xs_list_new();
+
+        /* is attach_url set? */
+        if (!xs_is_null(attach_url) && *attach_url != '\0')
+            attach_list = xs_list_append(attach_list, attach_url);
+
+        /* is attach_file set? */
+        if (!xs_is_null(attach_file) && xs_type(attach_file) == XSTYPE_LIST) {
+            char *fn = xs_list_get(attach_file, 0);
+
+            if (*fn != '\0') {
+                char *ext = strrchr(fn, '.');
+                xs *ntid  = tid(0);
+                xs *id    = xs_fmt("%s%s", ntid, ext);
+                xs *url   = xs_fmt("%s/s/%s", snac.actor, id);
+                int fo    = xs_number_get(xs_list_get(attach_file, 1));
+                int fs    = xs_number_get(xs_list_get(attach_file, 2));
+
+                /* store */
+                static_put(&snac, id, payload + fo, fs);
+
+                attach_list = xs_list_append(attach_list, url);
+            }
+        }
 
         if (content != NULL) {
             xs *msg   = NULL;
             xs *c_msg = NULL;
 
-            msg = msg_note(&snac, content, NULL, in_reply_to, attach_url);
+            msg = msg_note(&snac, content, NULL, in_reply_to, attach_list);
 
             c_msg = msg_create(&snac, msg);
 

+ 2 - 1
snac.h

@@ -80,7 +80,8 @@ int is_muted(snac *snac, char *actor);
 int actor_add(snac *snac, char *actor, char *msg);
 int actor_get(snac *snac, char *actor, d_char **data);
 
-int static_get(snac *snac, char *id, d_char **data, int *size);
+int static_get(snac *snac, const char *id, d_char **data, int *size);
+void static_put(snac *snac, const char *id, const char *data, int size);
 
 double history_mtime(snac *snac, char *id);
 void history_add(snac *snac, char *id, char *content, int size);

+ 2 - 2
xs.h

@@ -737,7 +737,7 @@ double xs_number_get(const char *v)
 {
     double f = 0.0;
 
-    if (v[0] == XSTYPE_NUMBER)
+    if (v != NULL && v[0] == XSTYPE_NUMBER)
         f = atof(&v[1]);
 
     return f;
@@ -749,7 +749,7 @@ const char *xs_number_str(const char *v)
 {
     const char *p = NULL;
 
-    if (v[0] == XSTYPE_NUMBER)
+    if (v != NULL && v[0] == XSTYPE_NUMBER)
         p = &v[1];
 
     return p;

+ 11 - 8
xs_io.h

@@ -59,26 +59,29 @@ d_char *xs_readline(FILE *f)
 d_char *xs_read(FILE *f, int *sz)
 /* reads up to size bytes from f */
 {
-    d_char *s;
-    int size = *sz;
-    int rdsz = 0;
+    d_char *s  = NULL;
+    int size   = *sz;
+    int rdsz   = 0;
 
     errno = 0;
 
-    s = xs_str_new(NULL);
-
     while (size > 0 && !feof(f)) {
-        char tmp[2048];
+        char tmp[4096];
         int n, r;
 
         if ((n = sizeof(tmp)) > size)
             n = size;
 
         r = fread(tmp, 1, n, f);
-        s = xs_append_m(s, tmp, r);
 
-        size -= r;
+        /* open room */
+        s = xs_realloc(s, rdsz + r);
+
+        /* copy read data */
+        memcpy(s + rdsz, tmp, r);
+
         rdsz += r;
+        size -= r;
     }
 
     *sz = rdsz;

+ 1 - 1
xs_version.h

@@ -1 +1 @@
-/* 639f769029cee785f4e854b66c695bbf84f016b9 */
+/* 65d893d17731d4cc1bfeeff6e5395e59fc4f7875 */