]> code.citadel.org Git - citadel.git/blobdiff - citadel/msgbase.c
* added message subject to all those tiny messages
[citadel.git] / citadel / msgbase.c
index 3361b0c440c26faacf5aa9b155659fb42f38984d..36c5fbb2ded471f7da741d669f94e79e68dd5dd0 100644 (file)
@@ -969,6 +969,27 @@ void mime_download(char *name, char *filename, char *partnum, char *disp,
 
 
 
+/*
+ * Callback function for mime parser that outputs a section all at once
+ */
+void mime_spew_section(char *name, char *filename, char *partnum, char *disp,
+                  void *content, char *cbtype, char *cbcharset, size_t length,
+                  char *encoding, void *cbuserdata)
+{
+       int *found_it = (int *)cbuserdata;
+
+       /* ...or if this is not the desired section */
+       if (strcasecmp(CC->download_desired_section, partnum))
+               return;
+
+       *found_it = 1;
+
+       cprintf("%d %d\n", BINARY_FOLLOWS, length);
+       client_write(content, length);
+}
+
+
+
 /*
  * Load a message from disk into memory.
  * This is used by CtdlOutputMsg() and other fetch functions.
@@ -1492,6 +1513,32 @@ int CtdlOutputPreLoadedMsg(
                return((CC->download_fp != NULL) ? om_ok : om_mime_error);
        }
 
+       /* MT_SPEW_SECTION is like MT_DOWNLOAD except it outputs the whole MIME part
+        * in a single server operation instead of opening a download file.
+        */
+       if (mode == MT_SPEW_SECTION) {
+               if (TheMessage->cm_format_type != FMT_RFC822) {
+                       if (do_proto)
+                               cprintf("%d This is not a MIME message.\n",
+                               ERROR + ILLEGAL_VALUE);
+               } else {
+                       /* Parse the message text component */
+                       int found_it = 0;
+
+                       mptr = TheMessage->cm_fields['M'];
+                       mime_parser(mptr, NULL, *mime_spew_section, NULL, NULL, (void *)&found_it, 0);
+                       /* If section wasn't found, print an error
+                        */
+                       if (!found_it) {
+                               if (do_proto) cprintf(
+                                       "%d Section %s not found.\n",
+                                       ERROR + FILE_NOT_FOUND,
+                                       CC->download_desired_section);
+                       }
+               }
+               return((CC->download_fp != NULL) ? om_ok : om_mime_error);
+       }
+
        /* now for the user-mode message reading loops */
        if (do_proto) cprintf("%d msg:\n", LISTING_FOLLOWS);
 
@@ -1911,6 +1958,23 @@ void cmd_opna(char *cmdbuf)
        CtdlOutputMsg(msgid, MT_DOWNLOAD, 0, 1, 1, NULL);
 }                      
 
+
+/*
+ * Open a component of a MIME message and transmit it all at once
+ */
+void cmd_dlat(char *cmdbuf)
+{
+       long msgid;
+       char desired_section[128];
+
+       msgid = extract_long(cmdbuf, 0);
+       extract_token(desired_section, cmdbuf, 1, '|', sizeof desired_section);
+       safestrncpy(CC->download_desired_section, desired_section,
+               sizeof CC->download_desired_section);
+       CtdlOutputMsg(msgid, MT_SPEW_SECTION, 0, 1, 1, NULL);
+}                      
+
+
 /*
  * Save one or more message pointers into a specified room
  * (Returns 0 for success, nonzero for failure)
@@ -2647,7 +2711,7 @@ long CtdlSubmitMsg(struct CtdlMessage *msg,       /* message to save */
 /*
  * Convenience function for generating small administrative messages.
  */
-void quickie_message(char *from, char *to, char *room, char *text, 
+void quickie_message(char *from, char *fromaddr, char *to, char *room, char *text, 
                        int format_type, char *subject)
 {
        struct CtdlMessage *msg;
@@ -2658,7 +2722,21 @@ void quickie_message(char *from, char *to, char *room, char *text,
        msg->cm_magic = CTDLMESSAGE_MAGIC;
        msg->cm_anon_type = MES_NORMAL;
        msg->cm_format_type = format_type;
-       msg->cm_fields['A'] = strdup(from);
+
+       if (from != NULL) {
+               msg->cm_fields['A'] = strdup(from);
+       }
+       else if (fromaddr != NULL) {
+               msg->cm_fields['A'] = strdup(fromaddr);
+               if (strchr(msg->cm_fields['A'], '@')) {
+                       *strchr(msg->cm_fields['A'], '@') = 0;
+               }
+       }
+       else {
+               msg->cm_fields['A'] = strdup("Citadel");
+       }
+
+       if (fromaddr != NULL) msg->cm_fields['F'] = strdup(fromaddr);
        if (room != NULL) msg->cm_fields['O'] = strdup(room);
        msg->cm_fields['N'] = strdup(NODENAME);
        if (to != NULL) {
@@ -2931,8 +3009,9 @@ int CtdlCheckInternetMailPermission(struct ctdluser *who) {
 /*
  * Validate recipients, count delivery types and errors, and handle aliasing
  * FIXME check for dupes!!!!!
- * Returns 0 if all addresses are ok, -1 if no addresses were specified,
- * or the number of addresses found invalid.
+ * Returns 0 if all addresses are ok, ret->num_error = -1 if no addresses 
+ * were specified, or the number of addresses found invalid.
+ * caller needs to free the result.
  */
 struct recptypes *validate_recipients(char *supplied_recipients) {
        struct recptypes *ret;