2011-10-16 [mones] 3.7.10cvs30
authorRicardo Mones <mones@claws-mail.org>
Sun, 16 Oct 2011 00:48:32 +0000 (00:48 +0000)
committerRicardo Mones <mones@claws-mail.org>
Sun, 16 Oct 2011 00:48:32 +0000 (00:48 +0000)
* src/main.c
Add --compose-from-file option to open composition
window with the headers and body from a file; based
on Debian patch to fix http://bugs.debian.org/544868

ChangeLog
PATCHSETS
configure.ac
src/main.c

index af87fb4..fc20db2 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,10 @@
+2011-10-16 [mones]     3.7.10cvs30
+
+       * src/main.c
+               Add --compose-from-file option to open composition
+               window with the headers and body from a file; based
+               on Debian patch to fix http://bugs.debian.org/544868
+
 2011-10-15 [mones]     3.7.10cvs29
 
        * manual/advanced.xml
index 00fcec8..d5414b7 100644 (file)
--- a/PATCHSETS
+++ b/PATCHSETS
 ( cvs diff -u -r 1.27.2.56 -r 1.27.2.57 src/addr_compl.c;  ) > 3.7.10cvs27.patchset
 ( cvs diff -u -r 1.382.2.584 -r 1.382.2.585 src/compose.c;  ) > 3.7.10cvs28.patchset
 ( cvs diff -u -r 1.1.2.57 -r 1.1.2.58 manual/advanced.xml;  ) > 3.7.10cvs29.patchset
+( cvs diff -u -r 1.115.2.239 -r 1.115.2.240 src/main.c;  ) > 3.7.10cvs30.patchset
index 407dce6..7aa81cd 100644 (file)
@@ -12,7 +12,7 @@ MINOR_VERSION=7
 MICRO_VERSION=10
 INTERFACE_AGE=0
 BINARY_AGE=0
-EXTRA_VERSION=29
+EXTRA_VERSION=30
 EXTRA_RELEASE=
 EXTRA_GTK2_VERSION=
 
index 13d40a4..3c12d92 100644 (file)
@@ -1813,6 +1813,94 @@ static void exit_claws(MainWindow *mainwin)
        claws_done();
 }
 
+#define G_STRING_APPEND_ENCODED_URI(gstring,source)    \
+       {                                               \
+               gchar tmpbuf[BUFFSIZE];                 \
+               encode_uri(tmpbuf, BUFFSIZE, (source)); \
+               g_string_append((gstring), tmpbuf);     \
+       }
+
+#define G_PRINT_EXIT(msg)      \
+       {                       \
+               g_print(msg);   \
+               exit(1);        \
+       }
+
+static GString * parse_cmd_compose_from_file(const gchar *fn)
+{
+       GString *headers = g_string_new(NULL);
+       GString *body = g_string_new(NULL);
+       gchar *to = NULL;
+       gchar *h;
+       gchar *v;
+       gchar fb[BUFFSIZE];
+       FILE *fp;
+       gboolean isstdin;
+
+       if (fn == NULL || *fn == '\0')
+               G_PRINT_EXIT(_("Missing filename\n"));
+       isstdin = (*fn == '-' && *(fn + 1) == '\0');
+       if (isstdin)
+               fp = stdin;
+       else {
+               fp = g_fopen(fn, "r");
+               if (!fp)
+                       G_PRINT_EXIT(_("Cannot open filename for reading\n"));
+       }
+
+       while (fgets(fb, sizeof(fb), fp)) {
+               gchar *tmp;     
+               strretchomp(fb);
+               if (*fb == '\0')
+                       break;
+               h = fb;
+               while (*h && *h != ':') { ++h; } /* search colon */
+               if (*h == '\0')
+                       G_PRINT_EXIT(_("Malformed header\n"));
+               v = h + 1;
+               while (*v && *v == ' ') { ++v; } /* trim value start */
+               *h = '\0';
+               tmp = g_ascii_strdown(fb, -1); /* get header name */
+               if (!strcmp(tmp, "to")) {
+                       if (to != NULL)
+                               G_PRINT_EXIT(_("Duplicated 'To:' header\n"));
+                       to = g_strdup(v);
+               } else {
+                       g_string_append_c(headers, '&');
+                       g_string_append(headers, tmp);
+                       g_string_append_c(headers, '=');
+#if GLIB_CHECK_VERSION(2,16,0)
+                       g_string_append_uri_escaped(headers, v, NULL, TRUE);
+#else
+                       G_STRING_APPEND_ENCODED_URI(headers, v);
+#endif 
+               }
+               g_free(tmp);
+       }
+       if (to == NULL)
+               G_PRINT_EXIT(_("Missing required 'To:' header\n"));
+       g_string_append(body, to);
+       g_free(to);
+       g_string_append(body, "?body=");
+       while (fgets(fb, sizeof(fb), fp)) {
+#if GLIB_CHECK_VERSION(2,16,0)
+               g_string_append_uri_escaped(body, fb, NULL, TRUE);
+#else
+               G_STRING_APPEND_ENCODED_URI(body, fb);
+#endif
+       }
+       if (!isstdin)
+               fclose(fp);
+       /* append the remaining headers */
+       g_string_append(body, headers->str);
+       g_string_free(headers, TRUE);
+
+       return body;
+}
+
+#undef G_STRING_APPEND_ENCODED_URI
+#undef G_PRINT_EXIT
+
 static void parse_cmd_opt(int argc, char *argv[])
 {
        gint i;
@@ -1822,6 +1910,13 @@ static void parse_cmd_opt(int argc, char *argv[])
                        cmd.receive_all = TRUE;
                } else if (!strncmp(argv[i], "--receive", 9)) {
                        cmd.receive = TRUE;
+               } else if (!strncmp(argv[i], "--compose-from-file", 19)) {
+                       const gchar *p = (i+1 < argc)?argv[i+1]:NULL;
+
+                       GString *mailto = parse_cmd_compose_from_file(p);
+                       cmd.compose = TRUE;
+                       cmd.compose_mailto = mailto->str;
+                       i++;
                } else if (!strncmp(argv[i], "--compose", 9)) {
                        const gchar *p = (i+1 < argc)?argv[i+1]:NULL;
 
@@ -1923,6 +2018,11 @@ static void parse_cmd_opt(int argc, char *argv[])
                        g_print(_("Usage: %s [OPTION]...\n"), base);
 
                        g_print("%s\n", _("  --compose [address]    open composition window"));
+                       g_print("%s\n", _("  --compose-from-file file\n"
+                                         "                         open composition window with data from given file;\n"
+                                         "                         use - as file name for reading from standard input;\n"
+                                         "                         content format: headers first (To: required) until an\n"
+                                         "                         empty line, then mail body until end of file."));
                        g_print("%s\n", _("  --subscribe [uri]      subscribe to the given URI if possible"));
                        g_print("%s\n", _("  --attach file1 [file2]...\n"
                                  "                         open composition window with specified files\n"