#include "mmmfuncsP.h"


/****************************************************************/

void MMMeditable_icon_button(widget, option)
     Widget widget;
     char *option;
 { char *str;

   /* make the widget invoke a WB option when moused */
   /* ---------------------------------------------- */
   str = (char *) XtCalloc((Cardinal) (strlen(option) + 28), (Cardinal) 1);
   sprintf(str,
	   "<Btn1Down>: EditWidget(\"%s\")", option);
   /* XtAugmentTranslations(widget, */
   XtOverrideTranslations(widget, 
			  XtParseTranslationTable(str));
 };        /* end of MMMeditable_icon_button()  */

/****************************************************************/

void MMMexit_button(widget, closure, call_data)
     Widget widget;
     caddr_t closure;
     caddr_t call_data;
 {
   exit(0);
 };         /* end of MMMexit_button()  */

/****************************************************************/

int MMM_sendmail(x_mmm_headers, headers, n_elements, body)
     MailBuffer *x_mmm_headers;
     char **headers;     /* ptr to an array of strings containing headers */ 
     char *body;
     int n_elements;
 {
   FILE *fp;
   int i;

   /* Check for errors in openning shell to sendmail. */
   /* ----------------------------------------------- */
   if ((fp = popen("/usr/lib/sendmail -t", "w+")) == NULL)
     { documentation_line(
	 "Couldn't open shell to send. You may have too many processes.");
       return(FALSE);
     };

   /* Write multi-media info (mail headers) to mail transport program. */
   /* ---------------------------------------------------------------- */
   AlMB_write_to_file(fp, x_mmm_headers);

   /* Write regular mail headers (To:, etc) to mail transport program. */
   /* ---------------------------------------------------------------- */
   for(i = 0; i < n_elements; i++)
     fprintf(fp, "%s\n", headers[i]);

   /* Write body of message (text) to mail transport program. */
   /* ------------------------------------------------------- */
   fprintf(fp, "%s", body);

   /* Terminate the message and send it on its way. */
   /* --------------------------------------------- */
   fprintf(fp, "\n.\n");
   fflush(fp);
   pclose(fp);

   return(TRUE);

 };     /* end of MMM_sendmail()  */
       
/* ---------------------------------------------------------------------- */
/* ------------------------------- ??? ---------------------------------- */


/*****************************************************************/
/*****************************************************************/
/****                                                         ****/
/****   Functions below here are only Rough Sketches.         ****/
/****   They are incomplete and contain faked code.           ****/
/****   RE-WRITE THE FOLLOWING FUNCTIONS AS SOON AS POSSIBLE. ****/
/****                                                         ****/
/*****************************************************************/
/*****************************************************************/

void MMM_sendmail_button(widget, closure, call_data)
     Widget widget;
     caddr_t closure;
     caddr_t call_data;
 {
   extern Widget msgtypePopUp;

   XtPopup(msgtypePopUp);

 };         /* end of MMM_sendmail_button()  */

/*****************************************************************/

/* This function is the callback for all buttons on msg type choice list */

void MMM_msgtypePopUp_button(widget, closure, call_data)
     Widget widget;
     caddr_t closure;    /* should be a ptr to a MsgHeaders struct */
     caddr_t call_data;
 {
   extern Widget headersPopUp,msgtypePopUp;
   extern Widget userArea;     /* main user area of application */
   Widget base_area;

   /* Create the headersPopUp widget here.                                 */
   /* with "MMM_headersPopUp_button" as the callback for the "Done" button */

   headersPopUp = XtCreatePopupShell("MMM_headersPopUp",
                        overrideShellWidgetClass,
                        userArea,
                        NULL, 0);
   base_area = 
         XtCreateManagedWidget("header_base_area",
                     boxWidgetClass,
                     headersPopUp,
                     NULL, 0);
   make_headersPopUp(base_area,                /* parent widget */
                     (MsgHeaders *) closure,   /* contains list of keys */
		     MMM_headersPopUp_button); /* callback function to use */

   XtPopup(headersPopUp);
   XtPopdown(msgtypePopUp);
   
 };         /* end of MMM_msgtypePopUp_button()  */


/*****************************************************************/

void MMM_headersPopUp_button(widget, closure, call_data)
     Widget widget;
     caddr_t closure;    /* should be a ptr to a MsgHeaders struct */
     caddr_t call_data;
 {
   MsgHeaders *msgheaders;
   int i;
   char **headers;
   MailBuffer *buffer;
   extern Widget headersPopUp;

   msgheaders = (MsgHeaders *) closure;

   headers = (char **) XtCalloc((Cardinal) (msgheaders->n_headers + 1),
				(Cardinal) sizeof(char *));

   /* Create all of the header fields from the user info */
   for (i = 0; i < (msgheaders->n_headers); i ++)
     { headers[i] = (char *) XtCalloc((Cardinal) (4 + 
                        strlen(msgheaders->keys[i]) +
                        strlen(msgheaders->headers[i])),
				      (Cardinal) sizeof(char));
       sprintf(headers[i], "%s%s%s%c", msgheaders->keys[i],
                head_separator(msgheaders->keys[i]),
                msgheaders->headers[i], '\0');
     };

   /* Send a header field with the msg type, too */
   headers[msgheaders->n_headers] = (char *) XtCalloc((Cardinal) (3 + 
                        strlen(msgheaders->typename) +
                        strlen("Msg-Type: ")),
		     (Cardinal) sizeof(char));
   sprintf(headers[i], "Msg-Type: %s%c", 
                msgheaders->typename, '\0');

   /* create headers for multi-media info */
   buffer = AlMB_create();

   prstr_all_widgets(HeadWidgetList, buffer, 0);

   MMM_sendmail(buffer, headers, msgheaders->n_headers, WB_get_body());

   AlMB_destroy(buffer);

   /* Free all header strings created by this function */
   for (i = 0; i < (msgheaders->n_headers); i ++)
      XtFree((char *) headers[i]);
   XtFree((char *) headers);

   documentation_line("Message sent.");

   XtPopdown(headersPopUp);
   XtDestroyWidget(headersPopUp);
   destroy_headersPopUp(msgheaders);
   
 };         /* end of MMM_headersPopUp_button()  */

/*****************************************************************/

void MMM_next_msg(widget, closure, call_data)
     Widget widget;
     caddr_t closure;
     caddr_t call_data;
 {
   char *folder_name, *command;
   int flag;
   FILE *fp;

   WNdestroy_all(TRUE);                 /* Destroy nodes & widgets, too */

   folder_name = MMM_get_cur_folder_name();

   /* Open up a shell to grab the next message from MH.                  */
   /* (Note: This is slightly slower, but insures upward compatibility.) */
   /* ------------------------------------------------------------------ */
   command = (char *) XtCalloc((Cardinal) (23 + strlen(folder_name)),
			       (Cardinal) sizeof(char));
   sprintf(command, "next +%s -showproc cat", folder_name);

   if ((fp = popen(command, "w+")) == NULL)
     { documentation_line("No more Messages. (No next message available.)");
     }
   else
     { XtUnmanageChild(userArea);
       flag = MMMread_msg_from_file(fp);
       XtManageChild(userArea);
       if (flag == FALSE)
	 { documentation_line(
	     "Unable to read next message. (Or no next message available.)");
	 }
       else
	 { documentation_line("Successfully read next message.");
	 };
     };
   XtFree((char *) command);
 };       /* end of MMM_next_msg()  */

/****************************************************************/

void MMM_create_msg_button(widget, closure, call_data)
     Widget widget;
     caddr_t closure;
     caddr_t call_data;
 {
   char *folder_name, *command;
   int flag;
   FILE *fp;

   WNdestroy_all(TRUE);                 /* Destroy nodes & widgets, too */

 };       /* end of MMM_create_msg_button()  */

/****************************************************************/

void MMM_delete_msg_button(widget, closure, call_data)
     Widget widget;
     caddr_t closure;
     caddr_t call_data;
 {
   char *folder_name, *command;
   int flag;
   FILE *fp;

   WNdestroy_all(TRUE);                 /* Destroy nodes & widgets, too */

 };       /* end of MMM_delete_msg_button()  */

/****************************************************************/

void MMM_readprev_button(widget, closure, call_data)
     Widget widget;
     caddr_t closure;
     caddr_t call_data;
 {
   char *folder_name, *command;
   int flag;
   FILE *fp;

   WNdestroy_all(TRUE);                 /* Destroy nodes & widgets, too */

 };       /* end of MMM_readprev_msg()  */

/****************************************************************/
