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

 YAM - Yet Another Mailer
 Copyright (C) 1995-2000 by Marcel Beck <mbeck@yam.ch>
 Copyright (C) 2000-2001 by YAM Open Source Team

 This program is free software; you can redistribute it and/or modify
 it under the terms of the GNU General Public License as published by
 the Free Software Foundation; either version 2 of the License, or
 (at your option) any later version.

 This program is distributed in the hope that it will be useful,
 but WITHOUT ANY WARRANTY; without even the implied warranty of
 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 GNU General Public License for more details.

 You should have received a copy of the GNU General Public License
 along with this program; if not, write to the Free Software
 Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA

 YAM Official Support Site :  http://www.yam.ch
 YAM OpenSource project    :  http://sourceforge.net/projects/yamos/

 $Id: YAM_rexx_rxif.c,v 1.9 2001/05/08 22:27:37 damato Exp $

***************************************************************************/
/*
 * Source generated with ARexxBox 1.12 (May 18 1993)
 * And afterwards handmodified to fix bugs!
 * which is Copyright (c) 1992,1993 Michael Balzer
 */

#include <exec/types.h>
#include <exec/memory.h>
#include <dos/dos.h>
#include <rexx/storage.h>
#include <rexx/rxslib.h>

#ifdef __GNUC__
/* GCC needs all struct defs */
#include <dos/exall.h>
#include <graphics/graphint.h>
#include <intuition/classes.h>
#include <devices/keymap.h>
#include <exec/semaphores.h>
#endif

#include <clib/alib_protos.h>
#include <proto/exec.h>
#include <proto/dos.h>
#include <proto/rexxsyslib.h>

#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <ctype.h>

#include "YAM_rexx.h"
#include "YAM.h"


extern struct ExecBase *SysBase;
extern struct DosLibrary *DOSBase;
extern struct RxsLib *RexxSysBase;


/* $ARB: I 876664321 */

/* $ARB: B 1 SHOW */
/// OK
void rx_show( struct RexxHost *host, struct rxd_show **rxd, long action, struct RexxMsg *rexxmsg )
{
   struct rxd_show *rd = *rxd;
   switch( action )
   {
      case RXIF_INIT:
         *rxd = AllocVec( sizeof *rd, MEMF_CLEAR );
         break;
         
      case RXIF_ACTION:
         set(G->App, MUIA_Application_Iconified, FALSE);
         break;
      
      case RXIF_FREE:
         FreeVec( rd );
         break;
   }
   return;
}
///
/* $ARB: E 1 SHOW */

/* $ARB: B 2 HIDE */
/// OK
void rx_hide( struct RexxHost *host, struct rxd_hide **rxd, long action, struct RexxMsg *rexxmsg )
{
   struct rxd_hide *rd = *rxd;
   switch( action )
   {
      case RXIF_INIT:
         *rxd = AllocVec( sizeof *rd, MEMF_CLEAR );
         break;
         
      case RXIF_ACTION:
         set(G->App, MUIA_Application_Iconified, TRUE);
         break;
      
      case RXIF_FREE:
         FreeVec( rd );
         break;
   }
   return;
}
///
/* $ARB: E 2 HIDE */

/* $ARB: B 3 QUIT */
/// OK
void rx_quit( struct RexxHost *host, struct rxd_quit **rxd, long action, struct RexxMsg *rexxmsg )
{
   struct rxd_quit *rd = *rxd;
   switch( action )
   {
      case RXIF_INIT:
         *rxd = AllocVec( sizeof *rd, MEMF_CLEAR );
         break;
         
      case RXIF_ACTION:
         if (rd->arg.force) set(G->App, MUIA_Application_ForceQuit, TRUE);
         DoMethod(G->App, MUIM_Application_ReturnID, MUIV_Application_ReturnID_Quit);
         break;
      
      case RXIF_FREE:
         FreeVec( rd );
         break;
   }
   return;
}
///
/* $ARB: E 3 QUIT */

/* $ARB: B 4 HELP */
/// OK
void rx_help( struct RexxHost *host, struct rxd_help **rxd, long action, struct RexxMsg *rexxmsg )
{
   struct rxd_help *rd = *rxd;
   struct rxs_command *rxc;
   FILE *fp = NULL, *out = stdout;
   switch( action )
   {
      case RXIF_INIT:
         *rxd = AllocVec( sizeof *rd, MEMF_CLEAR );
         break;
         
      case RXIF_ACTION:
         if (rd->arg.file) if (fp = fopen(rd->arg.file, "w")) out = fp;
         fprintf(out, "Commands for application \"YAM\"\n\nCommand          Template\n-------          --------\n");
         for (rxc = rxs_commandlist; rxc->command; rxc++)
            fprintf(out, "%-16s%c%s%s%s%s%s\n", rxc->command,
               (rxc->results || rxc->args) ? ' ' : '\0', rxc->results ? "VAR/K,STEM/K" : "",
               (rxc->results && rxc->args) ? "," : "", rxc->args ? rxc->args : "",
               rxc->results ? " => " : "", rxc->results ? rxc->results : "");
         if (fp) fclose(fp);
         break;
      
      case RXIF_FREE:
         FreeVec( rd );
         break;
   }
   return;
}
///
/* $ARB: E 4 HELP */

/* $ARB: B 5 INFO */
/// OK
void rx_info( struct RexxHost *host, struct rxd_info **rxd, long action, struct RexxMsg *rexxmsg )
{
   struct rxd_info *rd = *rxd;
   char *key;
   switch( action )
   {
      case RXIF_INIT:
         *rxd = AllocVec( sizeof *rd, MEMF_CLEAR );
         break;
         
      case RXIF_ACTION:
         key = rd->arg.item;
         if (!key) break;

         if      (!stricmp(key, "title"))       get(G->App, MUIA_Application_Title, &rd->res.value);
         else if (!stricmp(key, "author"))      get(G->App, MUIA_Application_Author, &rd->res.value);
         else if (!stricmp(key, "copyright"))   get(G->App, MUIA_Application_Copyright, &rd->res.value);
         else if (!stricmp(key, "description")) get(G->App, MUIA_Application_Description, &rd->res.value);
         else if (!stricmp(key, "version"))     get(G->App, MUIA_Application_Version, &rd->res.value);
         else if (!stricmp(key, "base"))        get(G->App, MUIA_Application_Base, &rd->res.value);
         else if (!stricmp(key, "screen"))
         {
            struct Screen *screen;
            struct Node *pubs;
            struct List *pubscreens = LockPubScreenList();
            rd->res.value = "";
            get(G->MA->GUI.WI, MUIA_Window_Screen, &screen);
            for (pubs = pubscreens->lh_Head; pubs->ln_Succ; pubs = pubs->ln_Succ)
               if (((struct PubScreenNode *)pubs)->psn_Screen == screen) rd->res.value = pubs->ln_Name;
            UnlockPubScreenList();
         }
         else rd->rc = RETURN_ERROR;
         break;
      
      case RXIF_FREE:
         FreeVec( rd );
         break;
   }
   return;
}
///
/* $ARB: E 5 INFO */

/* $ARB: B 6 WRITETO */
/// OK
void rx_writeto( struct RexxHost *host, struct rxd_writeto **rxd, long action, struct RexxMsg *rexxmsg )
{
   struct rxd_writeto *rd = *rxd;
   switch( action )
   {
      case RXIF_INIT:
         *rxd = AllocVec( sizeof *rd, MEMF_CLEAR );
         break;
         
      case RXIF_ACTION:
         if (G->WR[G->ActiveWriteWin]) InsertAddresses(G->WR[G->ActiveWriteWin]->GUI.ST_TO, rd->arg.address, rd->arg.add);
         else rd->rc = RETURN_ERROR;
         break;
      
      case RXIF_FREE:
         FreeVec( rd );
         break;
   }
   return;
}
///
/* $ARB: E 6 WRITETO */

/* $ARB: B 7 WRITECC */
/// OK
void rx_writecc( struct RexxHost *host, struct rxd_writecc **rxd, long action, struct RexxMsg *rexxmsg )
{
   struct rxd_writecc *rd = *rxd;
   switch( action )
   {
      case RXIF_INIT:
         *rxd = AllocVec( sizeof *rd, MEMF_CLEAR );
         break;
         
      case RXIF_ACTION:
         if (G->WR[G->ActiveWriteWin]) InsertAddresses(G->WR[G->ActiveWriteWin]->GUI.ST_CC, rd->arg.address, rd->arg.add);
         else rd->rc = RETURN_ERROR;
         break;
      
      case RXIF_FREE:
         FreeVec( rd );
         break;
   }
   return;
}
///
/* $ARB: E 7 WRITECC */

/* $ARB: B 8 WRITEBCC */
/// OK
void rx_writebcc( struct RexxHost *host, struct rxd_writebcc **rxd, long action, struct RexxMsg *rexxmsg )
{
   struct rxd_writebcc *rd = *rxd;
   switch( action )
   {
      case RXIF_INIT:
         *rxd = AllocVec( sizeof *rd, MEMF_CLEAR );
         break;
         
      case RXIF_ACTION:
         if (G->WR[G->ActiveWriteWin]) InsertAddresses(G->WR[G->ActiveWriteWin]->GUI.ST_BCC, rd->arg.address, rd->arg.add);
         else rd->rc = RETURN_ERROR;
         break;
      
      case RXIF_FREE:
         FreeVec( rd );
         break;
   }
   return;
}
///
/* $ARB: E 8 WRITEBCC */

/* $ARB: B 9 WRITEATTACH */
/// OK
void rx_writeattach( struct RexxHost *host, struct rxd_writeattach **rxd, long action, struct RexxMsg *rexxmsg )
{
   struct rxd_writeattach *rd = *rxd;
   switch( action )
   {
      case RXIF_INIT:
         *rxd = AllocVec( sizeof *rd, MEMF_CLEAR );
         break;
         
      case RXIF_ACTION:
         if (access(rd->arg.file,F_OK) == 0 && G->WR[G->ActiveWriteWin])
         {
            WR_AddFileToList(G->ActiveWriteWin, rd->arg.file, NULL, FALSE);
            if (rd->arg.desc)    setstring(G->WR[G->ActiveWriteWin]->GUI.ST_DESC, rd->arg.desc);
            if (rd->arg.encmode) setmutex (G->WR[G->ActiveWriteWin]->GUI.RA_ENCODING, !strnicmp(rd->arg.encmode, "uu", 2) ? 1 : 0);
            if (rd->arg.ctype)   setstring(G->WR[G->ActiveWriteWin]->GUI.ST_CTYPE, rd->arg.ctype);
         }
         else rd->rc = RETURN_ERROR;
         break;
      
      case RXIF_FREE:
         FreeVec( rd );
         break;
   }
   return;
}
///
/* $ARB: E 9 WRITEATTACH */

/* $ARB: B 10 WRITELETTER */
/// OK
void rx_writeletter( struct RexxHost *host, struct rxd_writeletter **rxd, long action, struct RexxMsg *rexxmsg )
{
   struct rxd_writeletter *rd = *rxd;
   switch( action )
   {
      case RXIF_INIT:
         *rxd = AllocVec( sizeof *rd, MEMF_CLEAR );
         break;
         
      case RXIF_ACTION:
         if (G->WR[G->ActiveWriteWin]) if (CopyFile(G->WR_Filename[G->ActiveWriteWin], 0, rd->arg.file, 0))
         {
            if (C->UseSignature && !rd->arg.nosig) WR_AddSignature(G->WR_Filename[G->ActiveWriteWin], -1);
            FileToEditor(G->WR_Filename[G->ActiveWriteWin], G->WR[G->ActiveWriteWin]->GUI.TE_EDIT);
         }
         else rd->rc = RETURN_ERROR;  else rd->rc = RETURN_ERROR;
         break;

      case RXIF_FREE:
         FreeVec( rd );
         break;
   }
   return;
}
///
/* $ARB: E 10 WRITELETTER */

/* $ARB: B 11 WRITEOPTIONS */
/// OK
void rx_writeoptions( struct RexxHost *host, struct rxd_writeoptions **rxd, long action, struct RexxMsg *rexxmsg )
{
   struct rxd_writeoptions *rd = *rxd;
   switch( action )
   {
      case RXIF_INIT:
         *rxd = AllocVec( sizeof *rd, MEMF_CLEAR );
         break;

      case RXIF_ACTION:
         if (G->WR[G->ActiveWriteWin])
         {
            setcheckmark(G->WR[G->ActiveWriteWin]->GUI.CH_DELSEND, rd->arg.delete);
            setcheckmark(G->WR[G->ActiveWriteWin]->GUI.CH_RECEIPT, rd->arg.receipt);
            setcheckmark(G->WR[G->ActiveWriteWin]->GUI.CH_DISPNOTI, rd->arg.notif);
            setcheckmark(G->WR[G->ActiveWriteWin]->GUI.CH_ADDINFO, rd->arg.addinfo);
            if (rd->arg.importance) setcycle(G->WR[G->ActiveWriteWin]->GUI.CY_IMPORTANCE, *rd->arg.importance);
            if (rd->arg.sig)        setmutex(G->WR[G->ActiveWriteWin]->GUI.RA_SIGNATURE, *rd->arg.sig);
            if (rd->arg.security)   setmutex(G->WR[G->ActiveWriteWin]->GUI.RA_SECURITY, *rd->arg.security);
         }
         else rd->rc = RETURN_ERROR;
         break;

      case RXIF_FREE:
         FreeVec( rd );
         break;
   }
   return;
}
///
/* $ARB: E 11 WRITEOPTIONS */

/* $ARB: B 12 WRITEQUEUE */
/// OK
void rx_writequeue( struct RexxHost *host, struct rxd_writequeue **rxd, long action, struct RexxMsg *rexxmsg )
{
   struct rxd_writequeue *rd = *rxd;
   switch( action )
   {
      case RXIF_INIT:
         *rxd = AllocVec( sizeof *rd, MEMF_CLEAR );
         break;

      case RXIF_ACTION:
         WR_NewMail(rd->arg.hold ? WRITE_HOLD : WRITE_QUEUE, G->ActiveWriteWin);
         break;

      case RXIF_FREE:
         FreeVec( rd );
         break;
   }
   return;
}
///
/* $ARB: E 12 WRITEQUEUE */

/* $ARB: B 13 WRITESEND */
/// OK
void rx_writesend( struct RexxHost *host, struct rxd_writesend **rxd, long action, struct RexxMsg *rexxmsg )
{
   struct rxd_writesend *rd = *rxd;
   switch( action )
   {
      case RXIF_INIT:
         *rxd = AllocVec( sizeof *rd, MEMF_CLEAR );
         break;

      case RXIF_ACTION:
         WR_NewMail(WRITE_SEND, G->ActiveWriteWin);
         break;

      case RXIF_FREE:
         FreeVec( rd );
         break;
   }
   return;
}
///
/* $ARB: E 13 WRITESEND */

/* $ARB: B 14 MAILWRITE */
/// OK
void rx_mailwrite( struct RexxHost *host, struct rxd_mailwrite **rxd, long action, struct RexxMsg *rexxmsg )
{
   struct rxd_mailwrite *rd = *rxd;
   int winnr;
   switch( action )
   {
      case RXIF_INIT:
         *rxd = AllocVec( sizeof *rd, MEMF_CLEAR );
         break;

      case RXIF_ACTION:
         winnr = rd->arg.window ? *rd->arg.window : -1;
         rd->res.window = &G->ActiveWriteWin;
         if (winnr < 0)
         {
            if ((winnr = MA_NewMessage(NEW_NEW, rd->arg.quiet?NEWF_QUIET:0)) >= 0) G->ActiveWriteWin = winnr;
            else rd->rc = RETURN_ERROR;
         }
         else
         {
            if (winnr >= 0 && winnr <= 1) if (G->WR[winnr]) G->ActiveWriteWin = winnr;
            else rd->rc = RETURN_ERROR;
         }
         break;

      case RXIF_FREE:
         FreeVec( rd );
         break;
   }
   return;
}
///
/* $ARB: E 14 MAILWRITE */

/* $ARB: B 15 MAILREPLY */
/// OK
void rx_mailreply( struct RexxHost *host, struct rxd_mailreply **rxd, long action, struct RexxMsg *rexxmsg )
{
   struct rxd_mailreply *rd = *rxd;
   int winnr;
   switch( action )
   {
      case RXIF_INIT:
         *rxd = AllocVec( sizeof *rd, MEMF_CLEAR );
         break;
         
      case RXIF_ACTION:
         rd->res.window = &G->ActiveWriteWin;
         if ((winnr = MA_NewMessage(NEW_REPLY, rd->arg.quiet?NEWF_QUIET:0)) >= 0) G->ActiveWriteWin = winnr;
         else rd->rc = RETURN_ERROR;
         break;
      
      case RXIF_FREE:
         FreeVec( rd );
         break;
   }
   return;
}
///
/* $ARB: E 15 MAILREPLY */

/* $ARB: B 16 MAILFORWARD */
/// OK
void rx_mailforward( struct RexxHost *host, struct rxd_mailforward **rxd, long action, struct RexxMsg *rexxmsg )
{
   struct rxd_mailforward *rd = *rxd;
   int winnr;

   switch( action )
   {
      case RXIF_INIT:
         *rxd = AllocVec( sizeof *rd, MEMF_CLEAR );
         break;
         
      case RXIF_ACTION:
         rd->res.window = &G->ActiveWriteWin;
         if ((winnr = MA_NewMessage(NEW_FORWARD, rd->arg.quiet?NEWF_QUIET:0)) >= 0) G->ActiveWriteWin = winnr;
         else rd->rc = RETURN_ERROR;
         break;
      
      case RXIF_FREE:
         FreeVec( rd );
         break;
   }
   return;
}
///
/* $ARB: E 16 MAILFORWARD */

/* $ARB: B 17 MAILMOVE */
/// OK
void rx_mailmove( struct RexxHost *host, struct rxd_mailmove **rxd, long action, struct RexxMsg *rexxmsg )
{
   struct rxd_mailmove *rd = *rxd;
   struct Folder *folder;
   switch( action )
   {
      case RXIF_INIT:
         *rxd = AllocVec( sizeof *rd, MEMF_CLEAR );
         break;
         
      case RXIF_ACTION:
         if (folder = FO_GetFolderRexx(rd->arg.folder, NULL))
            MA_MoveCopy(NULL, FO_GetCurrentFolder(), folder, FALSE);
         else rd->rc = RETURN_ERROR;
         break;
      
      case RXIF_FREE:
         FreeVec( rd );
         break;
   }
   return;
}
///
/* $ARB: E 17 MAILMOVE */

/* $ARB: B 18 MAILREAD */
/// OK
void rx_mailread( struct RexxHost *host, struct rxd_mailread **rxd, long action, struct RexxMsg *rexxmsg )
{
   struct rxd_mailread *rd = *rxd;
   struct Mail *mail;
   int winnr;

   switch( action )
   {
      case RXIF_INIT:
         *rxd = AllocVec( sizeof *rd, MEMF_CLEAR );
         break;
         
      case RXIF_ACTION:
         winnr = rd->arg.window ? *rd->arg.window : -1;
         rd->res.window = &G->ActiveReadWin;
         if (winnr < 0)
         {
            if (mail = MA_GetActiveMail(ANYBOX, NULL, NULL))
               if ((winnr = RE_Open(-1, TRUE)) >= 0)
               {
                  G->ActiveReadWin = winnr;
                  if (!rd->arg.quiet) set(G->RE[winnr]->GUI.WI, MUIA_Window_Open, TRUE);
                  RE_ReadMessage(winnr, mail);
               }
               else rd->rc = RETURN_ERROR;
            else rd->rc = RETURN_WARN;
         }
         else
         {
            if (winnr >= 0 && winnr <= 3) if (G->RE[winnr]) G->ActiveReadWin = winnr;
            else rd->rc = RETURN_ERROR;
         }
         break;
      
      case RXIF_FREE:
         FreeVec( rd );
         break;
   }
   return;
}
///
/* $ARB: E 18 MAILREAD */

/* $ARB: B 19 MAILSEND */
/// OK
void rx_mailsend( struct RexxHost *host, struct rxd_mailsend **rxd, long action, struct RexxMsg *rexxmsg )
{
   struct rxd_mailsend *rd = *rxd;
   switch( action )
   {
      case RXIF_INIT:
         *rxd = AllocVec( sizeof *rd, MEMF_CLEAR );
         break;
         
      case RXIF_ACTION:
         if (!MA_Send(rd->arg.all ? SEND_ALL : SEND_ACTIVE)) rd->rc = RETURN_WARN;
         break;
      
      case RXIF_FREE:
         FreeVec( rd );
         break;
   }
   return;
}
///
/* $ARB: E 19 MAILSEND */

/* $ARB: B 20 MAILDELETE */
/// OK
void rx_maildelete( struct RexxHost *host, struct rxd_maildelete **rxd, long action, struct RexxMsg *rexxmsg )
{
   struct rxd_maildelete *rd = *rxd;
   switch( action )
   {
      case RXIF_INIT:
         *rxd = AllocVec( sizeof *rd, MEMF_CLEAR );
         break;
         
      case RXIF_ACTION:
         MA_DeleteMessage(rd->arg.atonce, rd->arg.force);
         break;
      
      case RXIF_FREE:
         FreeVec( rd );
         break;
   }
   return;
}
///
/* $ARB: E 20 MAILDELETE */

/* $ARB: B 21 MAILCHECK */
/// OK
void rx_mailcheck( struct RexxHost *host, struct rxd_mailcheck **rxd, long action, struct RexxMsg *rexxmsg )
{
   struct rxd_mailcheck *rd = *rxd;
   int pop, popnr = -2;
   switch( action )
   {
      case RXIF_INIT:
         *rxd = AllocVec( sizeof *rd, MEMF_CLEAR );
         break;
         
      case RXIF_ACTION:
         if (rd->arg.pop) { if ((pop = *rd->arg.pop) >= 0 && pop < MAXP3) if (C->P3[pop]) popnr = pop; }
         else popnr = -1;
         if (popnr > -2)
         {
            if (rd->arg.manual) MA_PopNow(POP_USER, popnr);
            else
            {
               MA_PopNow(POP_REXX, popnr);
               rd->res.downloaded = &G->LastDL.Downloaded;
               rd->res.onserver = &G->LastDL.OnServer;
               rd->res.dupskipped = &G->LastDL.DupSkipped;
               rd->res.deleted = &G->LastDL.Deleted;
               if (G->LastDL.Error) rd->rc = RETURN_WARN;
            }
         }
         else rd->rc = RETURN_ERROR;
         break;
      
      case RXIF_FREE:
         FreeVec( rd );
         break;
   }
   return;
}
///
/* $ARB: E 21 MAILCHECK */

/* $ARB: B 22 MAILIMPORT */
/// OK
void rx_mailimport( struct RexxHost *host, struct rxd_mailimport **rxd, long action, struct RexxMsg *rexxmsg )
{
   struct rxd_mailimport *rd = *rxd;
   switch( action )
   {
      case RXIF_INIT:
         *rxd = AllocVec( sizeof *rd, MEMF_CLEAR );
         break;
         
      case RXIF_ACTION:
         if (!MA_ImportMessages(rd->arg.filename)) rd->rc = RETURN_ERROR;
         else if (!rd->arg.wait) TR_ProcessIMPORTFunc();
         break;
      
      case RXIF_FREE:
         FreeVec( rd );
         break;
   }
   return;
}
///
/* $ARB: E 22 MAILIMPORT */

/* $ARB: B 23 MAILEXPORT */
/// OK
void rx_mailexport( struct RexxHost *host, struct rxd_mailexport **rxd, long action, struct RexxMsg *rexxmsg )
{
   struct rxd_mailexport *rd = *rxd;
   switch( action )
   {
      case RXIF_INIT:
         *rxd = AllocVec( sizeof *rd, MEMF_CLEAR );
         break;
         
      case RXIF_ACTION:
         if (!MA_ExportMessages(rd->arg.all, rd->arg.filename, rd->arg.append)) rd->rc = RETURN_ERROR;
         break;
      
      case RXIF_FREE:
         FreeVec( rd );
         break;
   }
   return;
}
///
/* $ARB: E 23 MAILEXPORT */

/* $ARB: B 24 MAILUPDATE */
/// OK
void rx_mailupdate( struct RexxHost *host, struct rxd_mailupdate **rxd, long action, struct RexxMsg *rexxmsg )
{
   struct rxd_mailupdate *rd = *rxd;
   switch( action )
   {
      case RXIF_INIT:
         *rxd = AllocVec( sizeof *rd, MEMF_CLEAR );
         break;
         
      case RXIF_ACTION:
         DoMethod(G->App, MUIM_CallHook, &MA_RescanIndexHook);
         break;
      
      case RXIF_FREE:
         FreeVec( rd );
         break;
   }
   return;
}
///
/* $ARB: E 24 MAILUPDATE */

/* $ARB: B 25 MAILFILTER */
/// OK
void rx_mailfilter( struct RexxHost *host, struct rxd_mailfilter **rxd, long action, struct RexxMsg *rexxmsg )
{
   struct rxd_mailfilter *rd = *rxd;
   struct RuleResult *rr = &G->RRs;
   switch( action )
   {
      case RXIF_INIT:
         *rxd = AllocVec( sizeof *rd, MEMF_CLEAR );
         break;
         
      case RXIF_ACTION:
         DoMethod(G->App, MUIM_CallHook, &MA_ApplyRulesHook, rd->arg.all ? APPLY_RX_ALL : APPLY_RX, 0, FALSE);
         rd->res.checked = &rr->Checked;
         rd->res.bounced = &rr->Bounced;
         rd->res.forwarded = &rr->Forwarded;
         rd->res.replied = &rr->Replied;
         rd->res.executed = &rr->Executed;
         rd->res.moved = &rr->Moved;
         rd->res.deleted = &rr->Deleted;
         break;
      
      case RXIF_FREE:
         FreeVec( rd );
         break;
   }
   return;
}
///
/* $ARB: E 25 MAILFILTER */

/* $ARB: B 27 MAILINFO */
/// OK
void rx_mailinfo( struct RexxHost *host, struct rxd_mailinfo **rxd, long action, struct RexxMsg *rexxmsg )
{
   struct {
      struct rxd_mailinfo rd;
      long active;
      char from[SIZE_ADDRESS], to[SIZE_ADDRESS], replyto[SIZE_ADDRESS], flags[SIZE_SMALL];
      char filename[SIZE_PATHFILE], date[32];
   } *rd = (void *)*rxd;
   struct Mail *mail;
   struct Folder *folder;
   int pf, vf;

   switch( action )
   {
      case RXIF_INIT:
         *rxd = AllocVec( sizeof *rd, MEMF_CLEAR );
         break;
         
      case RXIF_ACTION:
         if (rd->rd.arg.index)
         {
            rd->active = *rd->rd.arg.index;
            DoMethod(G->MA->GUI.NL_MAILS, MUIM_NList_GetEntry, rd->active, &mail);
         }
         else mail = MA_GetActiveMail(ANYBOX, &folder, (int *)&rd->active);
         if (mail)
         {
            pf = (mail->Flags & 0x0700) >> 8;
            vf = (mail->Flags & 0x3800) >> 11;
            GetMailFile(rd->rd.res.filename = rd->filename, folder, mail);
            rd->rd.res.index = &rd->active;
            rd->rd.res.status = Status[mail->Status];
            stccpy(rd->rd.res.from    = rd->from   , BuildAddrName2(&mail->From), SIZE_ADDRESS);
            stccpy(rd->rd.res.to      = rd->to     , BuildAddrName2(&mail->To), SIZE_ADDRESS);
            stccpy(rd->rd.res.replyto = rd->replyto, BuildAddrName2(GetReturnAddress(mail)), SIZE_ADDRESS);
            strcpy(rd->rd.res.date    = rd->date   , DateStamp2String(&mail->Date, DSS_USDATETIME));
            rd->rd.res.subject = mail->Subject;
            rd->rd.res.size = &mail->Size;
            rd->rd.res.msgid = &mail->cMsgID;
            sprintf(rd->rd.res.flags = rd->flags, "%c%c%c%c%c-%c%c",
               (mail->Flags&MFLAG_MULTIRCPT)?'M':'-', (mail->Flags&MFLAG_MULTIPART)?'A':'-', (mail->Flags&MFLAG_REPORT)?'R':'-',
               (mail->Flags&MFLAG_CRYPT)?'C':'-', (mail->Flags&MFLAG_SIGNED)?'S':'-', pf?pf+'0':'-', vf?vf+'0':'-');
         }
         else rd->rd.rc = RETURN_ERROR;
         break;
      
      case RXIF_FREE:
         FreeVec( rd );
         break;
   }
   return;
}
///
/* $ARB: E 27 MAILINFO */

/* $ARB: B 28 SETFOLDER */
/// OK
void rx_setfolder( struct RexxHost *host, struct rxd_setfolder **rxd, long action, struct RexxMsg *rexxmsg )
{
   struct rxd_setfolder *rd = *rxd;
   struct Folder *folder;
   switch( action )
   {
      case RXIF_INIT:
         *rxd = AllocVec( sizeof *rd, MEMF_CLEAR );
         break;
         
      case RXIF_ACTION:
         if (folder = FO_GetFolderRexx(rd->arg.folder, NULL)) MA_ChangeFolder(folder);
         else rd->rc = RETURN_ERROR;
         break;
      
      case RXIF_FREE:
         FreeVec( rd );
         break;
   }
   return;
}
///
/* $ARB: E 28 SETFOLDER */

/* $ARB: B 29 SETMAIL */
/// OK
void rx_setmail( struct RexxHost *host, struct rxd_setmail **rxd, long action, struct RexxMsg *rexxmsg )
{
   struct rxd_setmail *rd = *rxd;
   int mail, max;
   switch( action )
   {
      case RXIF_INIT:
         *rxd = AllocVec( sizeof *rd, MEMF_CLEAR );
         break;
         
      case RXIF_ACTION:
         mail = *rd->arg.num;
         get(G->MA->GUI.NL_MAILS, MUIA_NList_Entries, &max);
         if (mail < 0 || mail >= max) rd->rc = RETURN_ERROR;
         else set(G->MA->GUI.NL_MAILS, MUIA_NList_Active, mail);
         break;
      
      case RXIF_FREE:
         FreeVec( rd );
         break;
   }
   return;
}
///
/* $ARB: E 29 SETMAIL */

/* $ARB: B 30 WRITEEDITOR */
/// OK
void rx_writeeditor( struct RexxHost *host, struct rxd_writeeditor **rxd, long action, struct RexxMsg *rexxmsg )
{
   struct rxd_writeeditor *rd = *rxd;
   switch( action )
   {
      case RXIF_INIT:
         *rxd = AllocVec( sizeof *rd, MEMF_CLEAR );
         break;
         
      case RXIF_ACTION:
         if (G->WR[G->ActiveWriteWin])
         {
            ULONG p = DoMethod(G->WR[G->ActiveWriteWin]->GUI.TE_EDIT, MUIM_TextEditor_ARexxCmd, rd->arg.command);
            switch (p)
            {
               case FALSE: rd->rc = RETURN_WARN; break;
               case TRUE:  break;
               default:    rd->res.result = (char *)p; break;
            }
         }
         else rd->rc = RETURN_ERROR;
         break;
      
      case RXIF_FREE:
         if (rd->res.result) FreeVec(rd->res.result);
         FreeVec( rd );
         break;
   }
   return;
}
///
/* $ARB: E 30 WRITEEDITOR */

/* $ARB: B 31 REQUEST */
/// OK
void rx_request( struct RexxHost *host, struct rxd_request **rxd, long action, struct RexxMsg *rexxmsg )
{
   struct {
      struct rxd_request rd;
      long result;
   } *rd = (void *)*rxd;
   char *reqtext;

   switch( action )
   {
      case RXIF_INIT:
         *rxd = AllocVec( sizeof *rd, MEMF_CLEAR );
         break;
         
      case RXIF_ACTION:
         reqtext = AllocReqText(rd->rd.arg.body);
         rd->result = MUI_Request(G->App, NULL, 0, NULL, rd->rd.arg.gadgets, reqtext);
         rd->rd.res.result = &rd->result;
         free(reqtext);
         break;
      
      case RXIF_FREE:
         FreeVec( rd );
         break;
   }
   return;
}
///
/* $ARB: E 31 REQUEST */

/* $ARB: B 32 MAILARCHIVE */
/// OK OBSOLETE
void rx_mailarchive( struct RexxHost *host, struct rxd_mailarchive **rxd, long action, struct RexxMsg *rexxmsg )
{
   rx_mailmove(host, (struct rxd_mailmove **)rxd, action, rexxmsg);
}
///
/* $ARB: E 32 MAILARCHIVE */

/* $ARB: B 33 MAILSENDALL */
/// OK OBSOLETE
void rx_mailsendall( struct RexxHost *host, struct rxd_mailsendall **rxd, long action, struct RexxMsg *rexxmsg )
{
   struct rxd_mailsendall *rd = *rxd;
   switch( action )
   {
      case RXIF_INIT:
         *rxd = AllocVec( sizeof *rd, MEMF_CLEAR );
         break;
         
      case RXIF_ACTION:
         if (!MA_Send(SEND_ALL)) rd->rc = RETURN_WARN;
         break;
      
      case RXIF_FREE:
         FreeVec( rd );
         break;
   }
   return;
}
///
/* $ARB: E 33 MAILSENDALL */

/* $ARB: B 35 GETFOLDERINFO */
/// OK
void rx_getfolderinfo( struct RexxHost *host, struct rxd_getfolderinfo **rxd, long action, struct RexxMsg *rexxmsg )
{
   struct {
      struct rxd_getfolderinfo rd;
      char result[SIZE_SMALL];
   } *rd = (void *)*rxd;
   struct Folder *fo;
   int num;
   char *key;

   switch( action )
   {
      case RXIF_INIT:
         *rxd = AllocVec( sizeof *rd, MEMF_CLEAR );
         break;
         
      case RXIF_ACTION:
         key = rd->rd.arg.item;
         fo = FO_GetCurrentFolder();
         get(G->MA->GUI.NL_FOLDERS, MUIA_NList_Active, &num);
         if (!strnicmp(key, "NUM", 3)) sprintf(rd->rd.res.value = rd->result, "%ld", num);
         else if (!strnicmp(key, "NAM", 3)) rd->rd.res.value = fo->Name;
         else if (!strnicmp(key, "PAT", 3)) rd->rd.res.value = fo->Path;
         else if (!strnicmp(key, "MAX", 3)) sprintf(rd->rd.res.value = rd->result, "%ld", fo->Total);
         else rd->rd.rc = RETURN_ERROR;
         break;
      
      case RXIF_FREE:
         FreeVec( rd );
         break;
   }
   return;
}
///
/* $ARB: E 35 GETFOLDERINFO */

/* $ARB: B 36 GETMAILINFO */
/// OK OBSOLETE
void rx_getmailinfo( struct RexxHost *host, struct rxd_getmailinfo **rxd, long action, struct RexxMsg *rexxmsg )
{
   struct {
      struct rxd_getmailinfo rd;
      char result[SIZE_LARGE];
   } *rd = (void *)*rxd;
   struct Mail *mail;
   int active;
   char *key;

   switch( action )
   {
      case RXIF_INIT:
         *rxd = AllocVec( sizeof *rd, MEMF_CLEAR );
         break;
         
      case RXIF_ACTION:
         if (mail = MA_GetActiveMail(ANYBOX, NULL, &active))
         {
            rd->rd.res.value = rd->result;
            key = rd->rd.arg.item;
            if (!strnicmp(key, "ACT", 3)) sprintf(rd->result, "%d", active);
            else if (!strnicmp(key, "STA", 3)) rd->rd.res.value = Status[mail->Status];
            else if (!strnicmp(key, "FRO", 3)) strcpy(rd->result, BuildAddrName2(&mail->From));
            else if (!strnicmp(key, "TO" , 2)) strcpy(rd->result, BuildAddrName2(&mail->To));
            else if (!strnicmp(key, "REP", 3)) strcpy(rd->result, BuildAddrName2(GetReturnAddress(mail)));
            else if (!strnicmp(key, "SUB", 3)) rd->rd.res.value = mail->Subject;
            else if (!strnicmp(key, "FIL", 3)) GetMailFile(rd->rd.res.value = rd->result, mail->Folder, mail);
            else rd->rd.rc = RETURN_ERROR;
         }
         else rd->rd.rc = RETURN_ERROR;
         break;
      
      case RXIF_FREE:
         FreeVec( rd );
         break;
   }
   return;
}
///
/* $ARB: E 36 GETMAILINFO */

/* $ARB: B 37 GETCONFIGINFO */
/// OK OBSOLETE
void rx_getconfiginfo( struct RexxHost *host, struct rxd_getconfiginfo **rxd, long action, struct RexxMsg *rexxmsg )
{
   struct rxd_getconfiginfo *rd = *rxd;
   char *key;
   switch( action )
   {
      case RXIF_INIT:
         *rxd = AllocVec( sizeof *rd, MEMF_CLEAR );
         break;
         
      case RXIF_ACTION:
         key = rd->arg.item;
         if (!strnicmp(key, "NAM", 3)) rd->res.value = C->RealName;
         else if (!strnicmp(key, "EMA", 3)) rd->res.value = C->EmailAddress;
         else rd->rc = RETURN_ERROR;
         break;
      
      case RXIF_FREE:
         FreeVec( rd );
         break;
   }
   return;
}
///
/* $ARB: E 37 GETCONFIGINFO */

/* $ARB: B 38 FOLDERINFO */
/// OK
void rx_folderinfo( struct RexxHost *host, struct rxd_folderinfo **rxd, long action, struct RexxMsg *rexxmsg )
{
   struct rxd_folderinfo *rd = *rxd;
   struct Folder *fo;
   static long num;
   switch( action )
   {
      case RXIF_INIT:
         *rxd = AllocVec( sizeof *rd, MEMF_CLEAR );
         break;
         
      case RXIF_ACTION:
         fo = rd->arg.folder ? FO_GetFolderRexx(rd->arg.folder, NULL) : FO_GetCurrentFolder();
         if (fo)
         {
            num = FO_GetFolderPosition(fo);
            rd->res.number = &num;
            rd->res.name = fo->Name;
            rd->res.path = fo->Path;
            rd->res.total = (long *)&fo->Total;
            rd->res.new = (long *)&fo->New;
            rd->res.unread = (long *)&fo->Unread;
            rd->res.size = (long *)&fo->Size;
            rd->res.type = (long *)&fo->Type;
         }
         else rd->rc = RETURN_ERROR;
         break;
      
      case RXIF_FREE:
         FreeVec( rd );
         break;
   }
   return;
}
///
/* $ARB: E 38 FOLDERINFO */

/* $ARB: B 40 WRITESUBJECT */
/// OK
void rx_writesubject( struct RexxHost *host, struct rxd_writesubject **rxd, long action, struct RexxMsg *rexxmsg )
{
   struct rxd_writesubject *rd = *rxd;
   switch( action )
   {
      case RXIF_INIT:
         *rxd = AllocVec( sizeof *rd, MEMF_CLEAR );
         break;
         
      case RXIF_ACTION:
         if (G->WR[G->ActiveWriteWin]) setstring(G->WR[G->ActiveWriteWin]->GUI.ST_SUBJECT, rd->arg.subject);
         break;
      
      case RXIF_FREE:
         FreeVec( rd );
         break;
   }
   return;
}
///
/* $ARB: E 40 WRITESUBJECT */

/* $ARB: B 41 SCREENTOBACK */
/// OK
void rx_screentoback( struct RexxHost *host, struct rxd_screentoback **rxd, long action, struct RexxMsg *rexxmsg )
{
   struct rxd_screentoback *rd = *rxd;
   switch( action )
   {
      case RXIF_INIT:
         *rxd = AllocVec( sizeof *rd, MEMF_CLEAR );
         break;
         
      case RXIF_ACTION:
         rd->rc = 0;
         if (G->MA) DoMethod(G->MA->GUI.WI, MUIM_Window_ScreenToBack);
         else rd->rc = RETURN_WARN;
         break;
      
      case RXIF_FREE:
         FreeVec( rd );
         break;
   }
   return;
}
///
/* $ARB: E 41 SCREENTOBACK */

/* $ARB: B 42 SCREENTOFRONT */
/// OK
void rx_screentofront( struct RexxHost *host, struct rxd_screentofront **rxd, long action, struct RexxMsg *rexxmsg )
{
   struct rxd_screentofront *rd = *rxd;
   switch( action )
   {
      case RXIF_INIT:
         *rxd = AllocVec( sizeof *rd, MEMF_CLEAR );
         break;
         
      case RXIF_ACTION:
         rd->rc = 0;
         if (G->MA) DoMethod(G->MA->GUI.WI, MUIM_Window_ScreenToFront);
         else rd->rc = RETURN_WARN;
         break;
      
      case RXIF_FREE:
         FreeVec( rd );
         break;
   }
   return;
}
///
/* $ARB: E 42 SCREENTOFRONT */

/* $ARB: B 46 SETFLAG */
/// OK
void rx_setflag( struct RexxHost *host, struct rxd_setflag **rxd, long action, struct RexxMsg *rexxmsg )
{
   struct rxd_setflag *rd = *rxd;
   int flag;
   struct Mail *mail;
   switch( action )
   {
      case RXIF_INIT:
         *rxd = AllocVec( sizeof *rd, MEMF_CLEAR );
         break;
         
      case RXIF_ACTION:
         if (mail = MA_GetActiveMail(ANYBOX, NULL, NULL))
         {
            if (rd->arg.vol) { if ((flag = *rd->arg.vol) >= 0 && flag < 8)
               mail->Flags = (mail->Flags&0xC7FF) | (flag<<11);
               
            else rd->rc = RETURN_ERROR;
            }
            if (rd->arg.per) if ((flag = *rd->arg.per) >= 0 && flag < 8)
            {
               if (flag != ((mail->Flags&0x0700)>>8))
               {
                  mail->Flags = (mail->Flags&0xF8FF) | (flag<<8);
                  MA_SetMailStatus(mail, mail->Status|0x100);
               }
            }
            else rd->rc = RETURN_ERROR;
         }
         else rd->rc = RETURN_WARN;
         break;
      
      case RXIF_FREE:
         FreeVec( rd );
         break;
   }
   return;
}
///
/* $ARB: E 46 SETFLAG */

/* $ARB: B 47 MAILEDIT */
/// OK
void rx_mailedit( struct RexxHost *host, struct rxd_mailedit **rxd, long action, struct RexxMsg *rexxmsg )
{
   struct rxd_mailedit *rd = *rxd;
   int winnr;
   switch( action )
   {
      case RXIF_INIT:
         *rxd = AllocVec( sizeof *rd, MEMF_CLEAR );
         break;
         
      case RXIF_ACTION:
         rd->res.window = &G->ActiveWriteWin;
         if ((winnr = MA_NewMessage(NEW_EDIT, rd->arg.quiet?NEWF_QUIET:0)) >= 0) G->ActiveWriteWin = winnr;
         else rd->rc = RETURN_ERROR;
         break;
      
      case RXIF_FREE:
         FreeVec( rd );
         break;
   }
   return;
}
///
/* $ARB: E 47 MAILEDIT */

/* $ARB: B 48 READINFO */
/// OK
void rx_readinfo( struct RexxHost *host, struct rxd_readinfo **rxd, long action, struct RexxMsg *rexxmsg )
{
   struct rxd_readinfo *rd = *rxd;
   struct Part *part;
   int i, parts;
   switch( action )
   {
      case RXIF_INIT:
         *rxd = AllocVec( sizeof *rd, MEMF_CLEAR );
         break;
         
      case RXIF_ACTION:
         if (G->RE[G->ActiveReadWin])
         {
            for (parts = 0, part = G->RE[G->ActiveReadWin]->FirstPart->Next; part; parts++, part = part->Next);
            rd->res.filename = calloc(parts+1, sizeof(char *));
            rd->res.filetype = calloc(parts+1, sizeof(char *));
            rd->res.filesize = calloc(parts+1, sizeof(long));
            rd->res.tempfile = calloc(parts+1, sizeof(char *));
            for (i = 0, part = G->RE[G->ActiveReadWin]->FirstPart->Next; part; i++, part = part->Next)
            {
               rd->res.filename[i] = part->Name;
               rd->res.filetype[i] = part->ContentType;
               rd->res.filesize[i] = (long *)&part->Size;
               rd->res.tempfile[i] = part->Filename;
            }
         }
         else rd->rc = RETURN_ERROR;
         break;
      
      case RXIF_FREE:
         if (rd->res.filename) free(rd->res.filename);
         if (rd->res.filetype) free(rd->res.filetype);
         if (rd->res.filesize) free(rd->res.filesize);
         if (rd->res.tempfile) free(rd->res.tempfile);
         FreeVec( rd );
         break;
   }
   return;
}
///
/* $ARB: E 48 READINFO */

/* $ARB: B 49 READSAVE */
/// OK
void rx_readsave( struct RexxHost *host, struct rxd_readsave **rxd, long action, struct RexxMsg *rexxmsg )
{
   struct rxd_readsave *rd = *rxd;
   struct Part *part;
   struct TempFile *tf;
   BOOL success = FALSE;
   char file[SIZE_PATHFILE];
   switch( action )
   {
      case RXIF_INIT:
         *rxd = AllocVec( sizeof *rd, MEMF_CLEAR );
         break;
         
      case RXIF_ACTION:
         if (G->RE[G->ActiveReadWin])
            if (rd->arg.part)
            {
               for (part = G->RE[G->ActiveReadWin]->FirstPart->Next; part; part = part->Next)
                  if (part->Nr == *(rd->arg.part))
                     if (RE_DecodePart(part))
                     {
                        strmfp(file, C->DetachDir, part->Name);
                        success = RE_Export(G->ActiveReadWin, part->Filename, rd->arg.filename ? rd->arg.filename : "", part->Name, part->Nr, TRUE, rd->arg.overwrite, part->ContentType);
                     }
            }
            else if (tf = OpenTempFile("w"))
            {
               RE_SaveDisplay(G->ActiveReadWin, tf->FP);
               fclose(tf->FP); tf->FP = NULL;
               success = RE_Export(G->ActiveReadWin, tf->Filename, rd->arg.filename ? rd->arg.filename : "", "", 0, TRUE, rd->arg.overwrite, ContType[CT_TX_PLAIN]);
               CloseTempFile(tf);
            }
         if (!success) rd->rc = RETURN_ERROR;
         break;
      
      case RXIF_FREE:
         FreeVec( rd );
         break;
   }
   return;
}
///
/* $ARB: E 49 READSAVE */

/* $ARB: B 50 READPRINT */
/// OK
void rx_readprint( struct RexxHost *host, struct rxd_readprint **rxd, long action, struct RexxMsg *rexxmsg )
{
   struct rxd_readprint *rd = *rxd;
   struct Part *part;
   FILE *prt;
   BOOL success = FALSE;
   switch( action )
   {
      case RXIF_INIT:
         *rxd = AllocVec( sizeof *rd, MEMF_CLEAR );
         break;
         
      case RXIF_ACTION:
         if (C->PrinterCheck) if (!CheckPrinter()) { rd->rc = RETURN_ERROR; break; }
         if (G->RE[G->ActiveReadWin])
            if (rd->arg.part)
            {
               for (part = G->RE[G->ActiveReadWin]->FirstPart->Next; part; part = part->Next)
                  if (part->Nr == *(rd->arg.part))
                     if (RE_DecodePart(part)) success = CopyFile("PRT:", 0, part->Filename, 0);
            }
            else if (prt = fopen("PRT:","w"))
            {
               RE_SaveDisplay(G->ActiveReadWin, prt);
               fclose(prt);
               success = TRUE;
            }
         if (!success) rd->rc = RETURN_ERROR;
         break;
      
      case RXIF_FREE:
         FreeVec( rd );
         break;
   }
   return;
}
///
/* $ARB: E 50 READPRINT */

/* $ARB: B 51 MAILBOUNCE */
/// OK
void rx_mailbounce( struct RexxHost *host, struct rxd_mailbounce **rxd, long action, struct RexxMsg *rexxmsg )
{
   struct rxd_mailbounce *rd = *rxd;
   int winnr;
   switch( action )
   {
      case RXIF_INIT:
         *rxd = AllocVec( sizeof *rd, MEMF_CLEAR );
         break;
         
      case RXIF_ACTION:
         rd->res.window = &G->ActiveWriteWin;
         if ((winnr = MA_NewMessage(NEW_BOUNCE, rd->arg.quiet?NEWF_QUIET:0)) >= 0) G->ActiveWriteWin = winnr;
         else rd->rc = RETURN_ERROR;
         break;
      
      case RXIF_FREE:
         FreeVec( rd );
         break;
   }
   return;
}
///
/* $ARB: E 51 MAILBOUNCE */

/* $ARB: B 52 ADDRFIND */
/// OK
void rx_addrfind( struct RexxHost *host, struct rxd_addrfind **rxd, long action, struct RexxMsg *rexxmsg )
{
   struct rxd_addrfind *rd = *rxd;
   int mode;
   switch( action )
   {
      case RXIF_INIT:
         *rxd = AllocVec( sizeof *rd, MEMF_CLEAR );
         break;
         
      case RXIF_ACTION:
         G->AB->Hits = 0;
         if (rd->arg.nameonly) mode = rd->arg.emailonly ? ABF_RX_NAMEEMAIL : ABF_RX_NAME;
                          else mode = rd->arg.emailonly ? ABF_RX_EMAIL     : ABF_RX;
         AB_FindEntry(MUIV_NListtree_GetEntry_ListNode_Root, rd->arg.pattern, mode, NULL);
         if (G->AB->Hits)
         {
            rd->res.alias = calloc(G->AB->Hits+1, sizeof(char *));
            AB_FindEntry(MUIV_NListtree_GetEntry_ListNode_Root, rd->arg.pattern, mode, rd->res.alias);
         }
         else rd->rc = RETURN_WARN;
         break;
      
      case RXIF_FREE:
         if (rd->res.alias) free(rd->res.alias);
         FreeVec( rd );
         break;
   }
   return;
}
///
/* $ARB: E 52 ADDRFIND */

/* $ARB: B 53 ADDRINFO */
/// OK
void rx_addrinfo( struct RexxHost *host, struct rxd_addrinfo **rxd, long action, struct RexxMsg *rexxmsg )
{
   struct {
      struct rxd_addrinfo rd;
      char *members, **memberptr;
   } *rd = (void *)*rxd;
   static char *types[3] = { "P","L","G"};
   char *ptr;
   struct MUI_NListtree_TreeNode *tn;
   int i, hits;
   switch( action )
   {
      case RXIF_INIT:
         *rxd = AllocVec( sizeof *rd, MEMF_CLEAR );
         break;
         
      case RXIF_ACTION:
         hits = 0;
         if (AB_SearchEntry(MUIV_NListtree_GetEntry_ListNode_Root, rd->rd.arg.alias, ASM_ALIAS|ASM_USER|ASM_LIST|ASM_GROUP, &hits, &tn))
         {
            struct ABEntry *ab = (struct ABEntry *)tn->tn_User;
            rd->rd.res.type = types[ab->Type];
            rd->rd.res.name = ab->RealName;
            rd->rd.res.email = ab->Address;
            rd->rd.res.pgp = ab->PGPId;
            rd->rd.res.homepage = ab->Homepage;
            rd->rd.res.street = ab->Street;
            rd->rd.res.city = ab->City;
            rd->rd.res.country = ab->Country;
            rd->rd.res.phone = ab->Phone;
            rd->rd.res.comment = ab->Comment;
            rd->rd.res.birthdate = &ab->BirthDay;
            rd->rd.res.image = ab->Photo;
            if (ab->Members)
            {
               rd->members = calloc(strlen(ab->Members)+1,1);
               strcpy(rd->members, ab->Members);
               for (hits = 0, ptr = rd->members; *ptr; hits++, ptr++)
               {
                  if (ptr = strchr(ptr, '\n')) *ptr = 0; else break;
               }
               rd->rd.res.members = rd->memberptr = calloc(hits+1, sizeof(char *));
               for (i = 0, ptr = rd->members; i < hits; ptr += strlen(ptr)+1) rd->memberptr[i++] = ptr;
            }
         }
         else rd->rd.rc = RETURN_ERROR;
         break;
      
      case RXIF_FREE:
         if (rd->members) free(rd->members);
         if (rd->memberptr) free(rd->memberptr);
         FreeVec( rd );
         break;
   }
   return;
}
///
/* $ARB: E 53 ADDRINFO */

/* $ARB: B 54 ADDRRESOLVE */
/// OK
void rx_addrresolve( struct RexxHost *host, struct rxd_addrresolve **rxd, long action, struct RexxMsg *rexxmsg )
{
   struct {
      struct rxd_addrresolve rd;
      char *string;
   } *rd = (void *)*rxd;

   switch( action )
   {
      case RXIF_INIT:
         *rxd = AllocVec( sizeof *rd, MEMF_CLEAR );
         break;
         
      case RXIF_ACTION:
         rd->rd.res.recpt = rd->string = AllocStrBuf(80);
         if (WR_ResolveName(-1, rd->rd.arg.alias, &(rd->string), FALSE)) rd->rd.rc = RETURN_WARN;
         break;
      
      case RXIF_FREE:
         FreeStrBuf(rd->string);
         FreeVec( rd );
         break;
   }
   return;
}
///
/* $ARB: E 54 ADDRRESOLVE */

/* $ARB: B 56 NEWMAILFILE */
/// OK
void rx_newmailfile( struct RexxHost *host, struct rxd_newmailfile **rxd, long action, struct RexxMsg *rexxmsg )
{
   struct {
      struct rxd_newmailfile rd;
      char result[SIZE_PATHFILE];
   } *rd = (void *)*rxd;
   struct Folder *folder;
   switch( action )
   {
      case RXIF_INIT:
         *rxd = AllocVec( sizeof *rd, MEMF_CLEAR );
         break;
         
      case RXIF_ACTION:
         if (rd->rd.arg.folder) folder = FO_GetFolderRexx(rd->rd.arg.folder, NULL);
         else folder = FO_GetCurrentFolder();
         if (folder) strcpy(rd->rd.res.filename = rd->result, MA_NewMailFile(folder, NULL, 0));
         else rd->rd.rc = RETURN_ERROR;
         break;
      
      case RXIF_FREE:
         FreeVec( rd );
         break;
   }
   return;
}
///
/* $ARB: E 56 NEWMAILFILE */

/* $ARB: B 57 WRITEFROM */
/// OK
void rx_writefrom( struct RexxHost *host, struct rxd_writefrom **rxd, long action, struct RexxMsg *rexxmsg )
{
   struct rxd_writefrom *rd = *rxd;
   switch( action )
   {
      case RXIF_INIT:
         *rxd = AllocVec( sizeof *rd, MEMF_CLEAR );
         break;
         
      case RXIF_ACTION:
         if (G->WR[G->ActiveWriteWin]) setstring(G->WR[G->ActiveWriteWin]->GUI.ST_FROM, rd->arg.address);
         else rd->rc = RETURN_ERROR;
         break;
      
      case RXIF_FREE:
         FreeVec( rd );
         break;
   }
   return;
}
///
/* $ARB: E 57 WRITEFROM */

/* $ARB: B 58 WRITEREPLYTO */
/// OK
void rx_writereplyto( struct RexxHost *host, struct rxd_writereplyto **rxd, long action, struct RexxMsg *rexxmsg )
{
   struct rxd_writereplyto *rd = *rxd;
   switch( action )
   {
      case RXIF_INIT:
         *rxd = AllocVec( sizeof *rd, MEMF_CLEAR );
         break;
         
      case RXIF_ACTION:
         if (G->WR[G->ActiveWriteWin]) setstring(G->WR[G->ActiveWriteWin]->GUI.ST_REPLYTO, rd->arg.address);
         else rd->rc = RETURN_ERROR;
         break;
      
      case RXIF_FREE:
         FreeVec( rd );
         break;
   }
   return;
}
///
/* $ARB: E 58 WRITEREPLYTO */

/* $ARB: B 59 LISTSELECT */
/// OK
void rx_listselect( struct RexxHost *host, struct rxd_listselect **rxd, long action, struct RexxMsg *rexxmsg )
{
   struct rxd_listselect *rd = *rxd;
   APTR nl;
   switch( action )
   {
      case RXIF_INIT:
         *rxd = AllocVec( sizeof *rd, MEMF_CLEAR );
         break;
         
      case RXIF_ACTION:
         nl = G->MA->GUI.NL_MAILS;
         switch (rd->arg.mode[0])
         {
            case 'a': case 'A': DoMethod(nl, MUIM_NList_Select, MUIV_NList_Select_All, MUIV_NList_Select_On, NULL); break;
            case 'n': case 'N': DoMethod(nl, MUIM_NList_Select, MUIV_NList_Select_All, MUIV_NList_Select_Off, NULL); break;
            case 't': case 'T': DoMethod(nl, MUIM_NList_Select, MUIV_NList_Select_All, MUIV_NList_Select_Toggle, NULL); break;
            case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7':
            case '8': case '9': DoMethod(nl, MUIM_NList_Select, atol(rd->arg.mode), MUIV_NList_Select_On, NULL); break;
         }
         break;
      
      case RXIF_FREE:
         FreeVec( rd );
         break;
   }
   return;
}
///
/* $ARB: E 59 LISTSELECT */

/* $ARB: B 60 READCLOSE */
/// OK
void rx_readclose( struct RexxHost *host, struct rxd_readclose **rxd, long action, struct RexxMsg *rexxmsg )
{
   struct rxd_readclose *rd = *rxd;
   switch( action )
   {
      case RXIF_INIT:
         *rxd = AllocVec( sizeof *rd, MEMF_CLEAR );
         break;
         
      case RXIF_ACTION:
         if (G->RE[G->ActiveReadWin]) DoMethod(G->App, MUIM_CallHook, &RE_CloseHook, G->ActiveReadWin);
         break;
      
      case RXIF_FREE:
         FreeVec( rd );
         break;
   }
   return;
}
///
/* $ARB: E 60 READCLOSE */

/* $ARB: B 61 SETMAILFILE */
/// OK
void rx_setmailfile( struct RexxHost *host, struct rxd_setmailfile **rxd, long action, struct RexxMsg *rexxmsg )
{
   struct rxd_setmailfile *rd = *rxd;
   struct Mail *mail = NULL;
   int i;
   char *mfile;

   switch( action )
   {
      case RXIF_INIT:
         *rxd = AllocVec( sizeof *rd, MEMF_CLEAR );
         break;
         
      case RXIF_ACTION:
         mfile = FilePart(rd->arg.mailfile);
         for (i = 0;; i++)
         {
            DoMethod(G->MA->GUI.NL_MAILS, MUIM_NList_GetEntry, i, &mail);
            if (!mail) break;
            if (!stricmp(mail->MailFile, mfile)) { set(G->MA->GUI.NL_MAILS, MUIA_NList_Active, i); break; }
         }
         if (!mail) rd->rc = RETURN_WARN;
         break;
      
      case RXIF_FREE:
         FreeVec( rd );
         break;
   }
   return;
}
///
/* $ARB: E 61 SETMAILFILE */

/* $ARB: B 62 MAILCOPY */
/// OK
void rx_mailcopy( struct RexxHost *host, struct rxd_mailcopy **rxd, long action, struct RexxMsg *rexxmsg )
{
   struct rxd_mailcopy *rd = *rxd;
   struct Folder *folder;
   switch( action )
   {
      case RXIF_INIT:
         *rxd = AllocVec( sizeof *rd, MEMF_CLEAR );
         break;
         
      case RXIF_ACTION:
         if (folder = FO_GetFolderRexx(rd->arg.folder, NULL))
            MA_MoveCopy(NULL, FO_GetCurrentFolder(), folder, TRUE);
         else rd->rc = RETURN_ERROR;
         break;
      
      case RXIF_FREE:
         FreeVec( rd );
         break;
   }
   return;
}
///
/* $ARB: E 62 MAILCOPY */

/* $ARB: B 63 APPBUSY */
/// OK
void rx_appbusy( struct RexxHost *host, struct rxd_appbusy **rxd, long action, struct RexxMsg *rexxmsg )
{
   struct rxd_appbusy *rd = *rxd;
   char *s;
   switch( action )
   {
      case RXIF_INIT:
         *rxd = AllocVec( sizeof *rd, MEMF_CLEAR );
         break;
         
      case RXIF_ACTION:
         s = rd->arg.text;
         if (s) Busy(s, "", 0, 0);
         rd->rc = BusyLevel ? 1 : 0;
         break;
      
      case RXIF_FREE:
         FreeVec( rd );
         break;
   }
   return;
}
///
/* $ARB: E 63 APPBUSY */

/* $ARB: B 64 APPNOBUSY */
/// OK
void rx_appnobusy( struct RexxHost *host, struct rxd_appnobusy **rxd, long action, struct RexxMsg *rexxmsg )
{
   struct rxd_appnobusy *rd = *rxd;
   switch( action )
   {
      case RXIF_INIT:
         *rxd = AllocVec( sizeof *rd, MEMF_CLEAR );
         break;
         
      case RXIF_ACTION:
         BusyEnd;
         rd->rc = BusyLevel ? 1 : 0;
         break;
      
      case RXIF_FREE:
         FreeVec( rd );
         break;
   }
   return;
}
///
/* $ARB: E 64 APPNOBUSY */

/* $ARB: B 65 WRITEMAILTO */
/// OK OBSOLETE
void rx_writemailto( struct RexxHost *host, struct rxd_writemailto **rxd, long action, struct RexxMsg *rexxmsg )
{
   struct rxd_writemailto *rd = *rxd;
   switch( action )
   {
      case RXIF_INIT:
         *rxd = AllocVec( sizeof *rd, MEMF_CLEAR );
         break;
         
      case RXIF_ACTION:
         if (G->WR[G->ActiveWriteWin]) InsertAddresses(G->WR[G->ActiveWriteWin]->GUI.ST_TO, rd->arg.address, FALSE);
         else rd->rc = RETURN_ERROR;
         break;
      
      case RXIF_FREE:
         FreeVec( rd );
         break;
   }
   return;
}
///
/* $ARB: E 65 WRITEMAILTO */

/* $ARB: B 66 USERINFO */
/// OK
void rx_userinfo( struct RexxHost *host, struct rxd_userinfo **rxd, long action, struct RexxMsg *rexxmsg )
{
   struct {
      struct rxd_userinfo rd;
      int folders;
   } *rd = (void *)*rxd;
   struct User *u = NULL;
   switch( action )
   {
      case RXIF_INIT:
         *rxd = AllocVec( sizeof *rd, MEMF_CLEAR );
         break;
         
      case RXIF_ACTION:
         u = US_GetCurrentUser();
         rd->rd.res.username = u->Name;
         rd->rd.res.email = C->EmailAddress;
         rd->rd.res.realname = C->RealName;
         rd->rd.res.config = G->CO_PrefsFile;
         rd->rd.res.maildir = G->MA_MailDir;
         get(G->MA->GUI.NL_FOLDERS, MUIA_NList_Entries, &rd->folders);
         rd->rd.res.folders = (long *)&rd->folders;
         break;
      
      case RXIF_FREE:
         FreeVec( rd );
         break;
   }
   return;
}
///
/* $ARB: E 66 USERINFO */

/* $ARB: B 67 MAILSTATUS */
/// OK
void rx_mailstatus( struct RexxHost *host, struct rxd_mailstatus **rxd, long action, struct RexxMsg *rexxmsg )
{
   struct rxd_mailstatus *rd = *rxd;
   switch( action )
   {
      case RXIF_INIT:
         *rxd = AllocVec( sizeof *rd, MEMF_CLEAR );
         break;
         
      case RXIF_ACTION:
         switch (tolower(rd->arg.status[0]))
         {
            case 'o': MA_SetStatusTo(STATUS_OLD); break;
            case 'u': MA_SetStatusTo(STATUS_UNR); break;
            case 'h': MA_SetStatusTo(STATUS_HLD); break;
            case 'w': MA_SetStatusTo(STATUS_WFS); break;
            default: rd->rc = RETURN_WARN;
         }
         break;
      
      case RXIF_FREE:
         FreeVec( rd );
         break;
   }
   return;
}
///
/* $ARB: E 67 MAILSTATUS */

/* $ARB: B 68 ISONLINE */
/// OK
void rx_isonline( struct RexxHost *host, struct rxd_isonline **rxd, long action, struct RexxMsg *rexxmsg )
{
   struct rxd_isonline *rd = *rxd;
   switch( action )
   {
      case RXIF_INIT:
         *rxd = AllocVec( sizeof *rd, MEMF_CLEAR );
         break;
         
      case RXIF_ACTION:
         rd->rc = SocketBase ? 1 : 0;
         break;
      
      case RXIF_FREE:
         FreeVec( rd );
         break;
   }
   return;
}
///
/* $ARB: E 68 ISONLINE */

/* $ARB: B 70 REQUESTSTRING */
/// OK
void rx_requeststring( struct RexxHost *host, struct rxd_requeststring **rxd, long action, struct RexxMsg *rexxmsg )
{
   struct {
      struct rxd_requeststring rd;
      char string[SIZE_DEFAULT];
   } *rd = (void *)*rxd;
   char *reqtext;

   switch( action )
   {
      case RXIF_INIT:
         *rxd = AllocVec( sizeof *rd, MEMF_CLEAR );
         break;
         
      case RXIF_ACTION:
         reqtext = AllocReqText(rd->rd.arg.body);
         if (rd->rd.arg.string) stccpy(rd->string, rd->rd.arg.string, SIZE_DEFAULT);
         rd->rd.rc = !StringRequest(rd->string, SIZE_DEFAULT, NULL, reqtext, GetStr(MSG_Okay), NULL, GetStr(MSG_Cancel), rd->rd.arg.secret, G->MA->GUI.WI);
         rd->rd.res.string = rd->string;
         free(reqtext);
         break;
      
      case RXIF_FREE:
         FreeVec( rd );
         break;
   }
   return;
}
///
/* $ARB: E 70 REQUESTSTRING */

/* $ARB: B 71 REQUESTFOLDER */
/// OK
void rx_requestfolder( struct RexxHost *host, struct rxd_requestfolder **rxd, long action, struct RexxMsg *rexxmsg )
{
   struct rxd_requestfolder *rd = *rxd;
   char *reqtext;
   struct Folder *exfolder, *folder;

   switch( action )
   {
      case RXIF_INIT:
         *rxd = AllocVec( sizeof *rd, MEMF_CLEAR );
         break;
         
      case RXIF_ACTION:
         reqtext = AllocReqText(rd->arg.body);
         exfolder = rd->arg.excludeactive ? FO_GetCurrentFolder() : NULL;
         if (folder = FolderRequest(NULL, reqtext, GetStr(MSG_Okay), GetStr(MSG_Cancel), exfolder, G->MA->GUI.WI)) rd->res.folder = folder->Name;
         else rd->rc = 1;
         free(reqtext);
         break;
      
      case RXIF_FREE:
         FreeVec( rd );
         break;
   }
   return;
}
///
/* $ARB: E 71 REQUESTFOLDER */

/* $ARB: B 72 GETSELECTED */
/// OK
void rx_getselected( struct RexxHost *host, struct rxd_getselected **rxd, long action, struct RexxMsg *rexxmsg )
{
   struct rxd_getselected *rd = *rxd;
   struct Mail **mlist;

   switch( action )
   {
      case RXIF_INIT:
         *rxd = AllocVec( sizeof *rd, MEMF_CLEAR );
         break;
         
      case RXIF_ACTION:
         if (mlist = MA_CreateMarkedList(G->MA->GUI.NL_MAILS))
         {
            int i;
            rd->res.num = calloc(1+(int)mlist[0], sizeof(long));
            for (i = 0; i < (int)mlist[0]; i++) rd->res.num[i] = (long *)&(mlist[i+2]->Position);
            free(mlist);
         }
         break;
      
      case RXIF_FREE:
         if (rd->res.num) free(rd->res.num);
         FreeVec( rd );
         break;
   }
   return;
}
///
/* $ARB: E 72 GETSELECTED */

/* $ARB: B 73 ADDREDIT */
/// OK
void rx_addredit( struct RexxHost *host, struct rxd_addredit **rxd, long action, struct RexxMsg *rexxmsg )
{
   struct MUI_NListtree_TreeNode *tn = NULL;
   struct rxd_addredit *rd = *rxd;

   switch( action )
   {
      case RXIF_INIT:
         *rxd = AllocVec( sizeof *rd, MEMF_CLEAR );
         break;
         
      case RXIF_ACTION:
         if (tn = (struct MUI_NListtree_TreeNode *)DoMethod(G->AB->GUI.LV_ADRESSES, MUIM_NListtree_GetEntry, MUIV_NListtree_GetEntry_ListNode_Active, MUIV_NListtree_GetEntry_Position_Active, 0))
         {
            struct ABEntry *ab = (struct ABEntry *)(tn->tn_User);
            if (rd->arg.alias)    stccpy(ab->Alias, rd->arg.alias, SIZE_NAME);
            if (rd->arg.name)     stccpy(ab->RealName, rd->arg.name, SIZE_REALNAME);
            if (rd->arg.email)    stccpy(ab->Address, rd->arg.email, SIZE_ADDRESS);
            if (rd->arg.pgp)      stccpy(ab->PGPId, rd->arg.pgp, SIZE_ADDRESS);
            if (rd->arg.homepage) stccpy(ab->Homepage, rd->arg.homepage, SIZE_URL);
            if (rd->arg.street)   stccpy(ab->Street, rd->arg.street, SIZE_DEFAULT);
            if (rd->arg.city)     stccpy(ab->City, rd->arg.city, SIZE_DEFAULT);
            if (rd->arg.country)  stccpy(ab->Country, rd->arg.country, SIZE_DEFAULT);
            if (rd->arg.phone)    stccpy(ab->Phone, rd->arg.phone, SIZE_DEFAULT);
            if (rd->arg.comment)  stccpy(ab->Comment, rd->arg.comment, SIZE_DEFAULT);
            if (rd->arg.birthdate) ab->BirthDay = *rd->arg.birthdate;
            if (rd->arg.image)    stccpy(ab->Photo, rd->arg.image, SIZE_PATHFILE);
            if (rd->arg.member && ab->Type == AET_LIST)
            {
               char **p, *memb = AllocStrBuf(SIZE_DEFAULT);
               if (rd->arg.add && ab->Members) memb = StrBufCpy(memb, ab->Members);
               for (p = rd->arg.member; *p; p++) { memb = StrBufCat(memb, *p); memb = StrBufCat(memb, "\n"); }
               if (ab->Members) free(ab->Members);
               ab->Members = malloc(strlen(memb)+1);
               strcpy(ab->Members, memb);
               FreeStrBuf(memb);
            }
            DoMethod(G->AB->GUI.LV_ADRESSES, MUIM_List_Redraw, MUIV_List_Redraw_All);
            G->AB->Modified = TRUE;
         }
         else rd->rc = RETURN_ERROR;
         break;
      
      case RXIF_FREE:
         FreeVec( rd );
         break;
   }
   return;
}
///
/* $ARB: E 73 ADDREDIT */

/* $ARB: B 74 ADDRDELETE */
/// OK
void rx_addrdelete( struct RexxHost *host, struct rxd_addrdelete **rxd, long action, struct RexxMsg *rexxmsg )
{
   struct rxd_addrdelete *rd = *rxd;

   switch( action )
   {
      case RXIF_INIT:
         *rxd = AllocVec( sizeof *rd, MEMF_CLEAR );
         break;
         
      case RXIF_ACTION:
         if (!AB_GotoEntry(rd->arg.alias)) rd->rc = RETURN_WARN;
         if (!rd->rc) AB_DeleteFunc();
         break;
      
      case RXIF_FREE:
         FreeVec( rd );
         break;
   }
   return;
}
///
/* $ARB: E 74 ADDRDELETE */

/* $ARB: B 76 ADDRSAVE */
/// OK
void rx_addrsave( struct RexxHost *host, struct rxd_addrsave **rxd, long action, struct RexxMsg *rexxmsg )
{
   struct rxd_addrsave *rd = *rxd;

   switch( action )
   {
      case RXIF_INIT:
         *rxd = AllocVec( sizeof *rd, MEMF_CLEAR );
         break;
         
      case RXIF_ACTION:
         if (rd->arg.filename)
         {
            if (!AB_SaveTree(rd->arg.filename)) rd->rc = RETURN_ERROR;
         }
         else
         {
            if (AB_SaveTree(G->AB_Filename)) G->AB->Modified = FALSE; else rd->rc = RETURN_ERROR;
         }
         break;
      
      case RXIF_FREE:
         FreeVec( rd );
         break;
   }
   return;
}
///
/* $ARB: E 76 ADDRSAVE */

/* $ARB: B 77 ADDRLOAD */
/// OK
void rx_addrload( struct RexxHost *host, struct rxd_addrload **rxd, long action, struct RexxMsg *rexxmsg )
{
   struct rxd_addrload *rd = *rxd;

   switch( action )
   {
      case RXIF_INIT:
         *rxd = AllocVec( sizeof *rd, MEMF_CLEAR );
         break;
         
      case RXIF_ACTION:
         if (!AB_LoadTree(rd->arg.filename, FALSE, FALSE)) rd->rc = RETURN_ERROR;
         break;
      
      case RXIF_FREE:
         FreeVec( rd );
         break;
   }
   return;
}
///
/* $ARB: E 77 ADDRLOAD */

/* $ARB: B 79 ADDRGOTO */
/// OK
void rx_addrgoto( struct RexxHost *host, struct rxd_addrgoto **rxd, long action, struct RexxMsg *rexxmsg )
{
   struct rxd_addrgoto *rd = *rxd;

   switch( action )
   {
      case RXIF_INIT:
         *rxd = AllocVec( sizeof *rd, MEMF_CLEAR );
         break;
         
      case RXIF_ACTION:
         if (!AB_GotoEntry(rd->arg.alias)) rd->rc = RETURN_WARN;
         break;
      
      case RXIF_FREE:
         FreeVec( rd );
         break;
   }
   return;
}
///
/* $ARB: E 79 ADDRGOTO */

/* $ARB: B 80 ADDRNEW */
/// OK
void rx_addrnew( struct RexxHost *host, struct rxd_addrnew **rxd, long action, struct RexxMsg *rexxmsg )
{
   static struct ABEntry addr;
   struct rxd_addrnew *rd = *rxd;

   switch( action )
   {
      case RXIF_INIT:
         *rxd = AllocVec( sizeof *rd, MEMF_CLEAR );
         break;
         
      case RXIF_ACTION:
         clear(&addr, sizeof(struct ABEntry));
         addr.Type = AET_USER;
         if (rd->arg.type) if (tolower(*rd->arg.type) == 'g') addr.Type = AET_GROUP;
                      else if (tolower(*rd->arg.type) == 'l') addr.Type = AET_LIST;
         if (rd->arg.alias)    stccpy(addr.Alias, rd->arg.alias, SIZE_NAME);
         if (rd->arg.name)     stccpy(addr.RealName, rd->arg.name, SIZE_REALNAME);
         if (rd->arg.email)    stccpy(addr.Address, rd->arg.email, SIZE_ADDRESS);
         if (!*addr.Alias) if (addr.Type == AET_USER) EA_SetDefaultAlias(&addr); else rd->rc = RETURN_ERROR;
         if (!rd->rc)
         {
            EA_FixAlias(&addr, FALSE);
            rd->res.alias = addr.Alias;
            EA_InsertBelowActive(&addr, addr.Type == AET_GROUP ? TNF_LIST : 0);
            G->AB->Modified = TRUE;
            AppendLogVerbose(71, GetStr(MSG_LOG_NewAddress), addr.Alias, "", "", "");
         }
         break;
      
      case RXIF_FREE:
         FreeVec( rd );
         break;
   }
   return;
}
///
/* $ARB: E 80 ADDRNEW */

/* $ARB: B 81 MAILCHANGESUBJECT */
/// OK
void rx_mailchangesubject( struct RexxHost *host, struct rxd_mailchangesubject **rxd, long action, struct RexxMsg *rexxmsg )
{
   struct rxd_mailchangesubject *rd = *rxd;
   struct Mail **mlist;
   switch( action )
   {
      case RXIF_INIT:
         *rxd = AllocVec( sizeof *rd, MEMF_CLEAR );
         break;
         
      case RXIF_ACTION:
         if (mlist = MA_CreateMarkedList(G->MA->GUI.NL_MAILS))
         {
            int i, selected = (int)*mlist;
            for (i = 0; i < selected; i++) MA_ChangeSubject(mlist[i+2], rd->arg.subject);
            free(mlist);
            DoMethod(G->MA->GUI.NL_MAILS, MUIM_NList_Redraw, MUIV_NList_Redraw_All);
         }
         else rd->rc = RETURN_ERROR;
         break;
      
      case RXIF_FREE:
         FreeVec( rd );
         break;
   }
   return;
}
///
/* $ARB: E 81 MAILCHANGESUBJECT */

/* $ARB: B 83 GETURL */
/// OK
void rx_geturl( struct RexxHost *host, struct rxd_geturl **rxd, long action, struct RexxMsg *rexxmsg )
{
   struct rxd_geturl *rd = *rxd;
   switch( action )
   {
      case RXIF_INIT:
         *rxd = AllocVec( sizeof *rd, MEMF_CLEAR );
         break;
         
      case RXIF_ACTION:
         if (TR_OpenTCPIP())
         {
            Busy(GetStr(MSG_TR_Downloading), "", 0, 0);
            if (!TR_DownloadURL(rd->arg.url, NULL, NULL, rd->arg.filename)) rd->rc = RETURN_ERROR;
            TR_CloseTCPIP();
            BusyEnd;
         }
         else rd->rc = RETURN_WARN;
         break;
      
      case RXIF_FREE:
         FreeVec( rd );
         break;
   }
   return;
}
///
/* $ARB: E 83 GETURL */


#ifndef RX_ALIAS_C
char *ExpandRXCommand( struct RexxHost *host, char *command )
{
   /* Insert your ALIAS-HANDLER here */
   return( NULL );
}
#endif

