
#include "mui_ascs.h"

int      CXBRK(void) { return(0); }
int     _CXBRK(void) { return(0); }
void    chkabort(void) {}
long    __OSlibversion = 37;

/* ------------------------------------------------------------------- */
/*      for cback.o startup */
/* ------------------------------------------------------------------- */

long                      __stack        = 4096;
char                      *__procname    = ASCSEND_VERSION;
long                      __priority      = 0L;
long                      __BackGroundIO = 0;
extern BPTR               _Backstdout;

/********************************************************************/
/*            Für den Filerequester                                 */
/********************************************************************/

struct TagItem	     FRTags[] =
		     {
		      ASL_Hail,(ULONG)"ASCII-SEND: Datei auswählen",
		      ASL_FuncFlags,0L,
		      ASL_Pattern,(ULONG)"~(#?.info)",
		      ASL_Dir,NULL,
		      ASL_File,NULL,
		      ASL_Window,NULL,
		      TAG_DONE,0L
		     };

/****************************************************************/
/*                    Var's                                     */
/****************************************************************/

struct Library *MUIMasterBase;
struct Library *LocalBase;

enum IDs
     {
      ID_DUMMY,
      ID_SAVE,
      ID_INFO,
      ID_LOAD,
      ID_OPENWD,
      ID_CLOSEWD,
      ID_QUIT,
      ID_INSERTFILE,
      ID_FILESELECT,
      ID_FILEREQ,
      ID_CHANGE_FILEREQ,
      ID_CHANGE_INFOREQ,
      ID_CHANGE_POPKEY,
      ID_CHANGE_STOPKEY,
      ID_CHANGE_DELAY,
      ID_CHANGE_DELAYCHAR,
      ID_STOPKEY,
      ID_QUIT_SILENT,
      ID_DOUBLESTART,
      ID_EDITFILE,
      ID_RECSTART,
      ID_RECSTOP,
      ID_RECFILE,
      ID_CHANGE_RECSTART,
      ID_CHANGE_RECSTOP,
      ID_CHANGE_HANDLER_PRI,
      ID_EDIT_RECFILE,
      ID_AUTORECSTART,
      ID_AUTORECSTOP,
      ID_AUTOHOTKEY,
      ID_AUTOFILEREQKEY,
      ID_AUTOPOPKEY,
      ID_AUTOSTOPKEY,
      ID_AUTOINFOKEY,
     };

struct NewMenu menu_list[] =
{
 { NM_TITLE,NULL,0,0,0,0},
 { NM_ITEM, NULL,"R",0,0,(APTR)ID_LOAD},
 { NM_ITEM, NULL,"I",0,0,(APTR) ID_SAVE},
 { NM_ITEM, NM_BARLABEL,0,0,0,0},
 { NM_ITEM, NULL,"?",0,0,(APTR) ID_INFO},
 { NM_ITEM, NM_BARLABEL,0,0,0,0},
 { NM_ITEM, NULL, "H",0,0,(APTR) ID_CLOSEWD},  
 { NM_ITEM, NULL, "Q",0,0,(APTR) ID_QUIT},
 NULL,
};


UBYTE  displayline[STRMAXLEN]; 
UBYTE  wtitle[STRMAXLEN];
UBYTE  requestpath[STRMAXLEN];
UBYTE  requestfile[STRMAXLEN];

struct hotkey   ins;
struct hotkey  *insert_key = &ins;
ULONG  from_inside;
ULONG  signals;
ULONG  NextID = CXID_BASE;
ULONG filesize;
ULONG filepos;
struct Catalog *ascs_catalog;
struct Locale  *ascs_locale;
ULONG recording;
ULONG from_main = FALSE;
APTR  from_main_object;

struct IOStdReq  *s_HandlerIO;
struct MsgPort   *s_InputPort;
BYTE              s_device;

UBYTE *locale_strings[] =
       {
        "Projekt",
        "Einstellungen zurücksetzen",
        "Icon erzeugen",
        "Info",
        "Fenster schliessen",
 /*5*/  "Beenden...",
        "Datei auswählen...",
        "Linke AMIGA-Taste",
        "Rechte AMIGA-Taste",
        "Keine ALT Taste",
 /*10*/ "Jede ALT-Taste ",
        "Linke ALT-Taste",
        "Rechte ALT-Taste",
        "Keine SHIFT Taste",
        "Jede SHIFT-Taste",
 /*15*/ "Linke SHIFT-Taste",
        "Rechte SHIFT-Taste",
        "Sendet Textfiles als InputEvents",
        "Tasten",
        "Übernehmen",
 /*20*/ "Abbruch",
        "Datei:",
        "Edieren",
        "Neu",
        "Entfernen",
 /*25*/ "Spezielle Tasten",
        "Verzögerungen",
        "Zeilen",
        "Einzelzeichen",
        "Ja|*Nein",
 /*30*/ "Wirklich beenden ?",
        "*Na gut",
        "Beenden|*Weiter",
        "Buchstaben",
        "Aufnahme",
 /*35*/ "Start",
        "Stop",
        "Datei",
        "Min. Delay",
        "Priorität",
 /*40*/ "Mit Mausbuttons",
        "Mit Pausen",
        "Zeichen",
        "Bitte eine Taste/Tastenkombination drücken",
       };
/*********************************************************************/
/*                   Hooks                                           */
/*********************************************************************/

struct Hook construct_keys = {
	{NULL, NULL},
	(void *)construct_key_func,
	NULL, NULL
};

struct Hook destruct_keys = {
	{NULL, NULL},
	(void *)destruct_key_func,
	NULL, NULL
};

struct Hook display_keys = {
	{NULL, NULL},
	(void *)display_key_func,
	NULL, NULL
};

struct Hook compare_keys = {
	{NULL, NULL},
	(void *)compare_func,
	NULL, NULL
};

struct Hook cxmsg = {
        {NULL,NULL},
        (void *)cxmsg_broker_func,
        NULL,NULL
};

struct Hook rx_send = {
	{NULL, NULL},
	(void *)rx_send_func,
	NULL, NULL
};

struct Hook rx_activate = {
	{NULL, NULL},
	(void *)rx_activate_func,
	NULL, NULL
};

struct Hook rx_activate_screen = {
	{NULL, NULL},
	(void *)rx_activate_screen_func,
	NULL, NULL
};

struct Hook rx_setkey = {
	{NULL, NULL},
	(void *)rx_setkey_func,
	NULL, NULL
};
struct Hook rx_remkey = {
	{NULL, NULL},
	(void *)rx_remkey_func,
	NULL, NULL
};

struct Hook rx_remall = {
	{NULL, NULL},
	(void *)rx_remall_func,
	NULL, NULL
};

struct Hook rx_set = {
	{NULL, NULL},
	(void *)rx_set_func,
	NULL, NULL
};
struct Hook rx_delay = {
	{NULL, NULL},
	(void *)rx_delay_func,
	NULL, NULL
};

struct Hook rx_delaychar = {
	{NULL, NULL},
	(void *)rx_delaychar_func,
	NULL, NULL
};

struct Hook rx_sendstring = {
	{NULL, NULL},
	(void *)rx_sendstring_func,
	NULL, NULL
};

struct Hook rx_recfile = {
	{NULL, NULL},
	(void *)rx_recfile_func,
	NULL, NULL
};

struct Hook rx_rec_opts = {
	{NULL, NULL},
	(void *)rx_rec_opts_func,
	NULL, NULL
};


/*********************************************************************/
/*                   Objekte                                         */
/*********************************************************************/

APTR app;
APTR window;
APTR key_lv;
APTR key_list; 
APTR special_list;
APTR newkey, newkeystring,delkey, filestring;
APTR filerequest_string, popup_string, stop_string,info_string,popfile;
APTR popfilebutton;
APTR delay_int,delaychar_int;
APTR pop_hotkey,popkey_button;
APTR edit_button,edit_popup,edit_string;
APTR rec_start,rec_stop,rec_file,pop_recfile;
APTR rec_min_delay,rec_handler_pri,rec_include_mb,rec_include_delay;
APTR edit_recfile,rec_max;
APTR auto_recstart,auto_recstop;
APTR press_a_key,t;
APTR autopopkey,autoinfokey,autofilereqkey,autostopkey;
APTR rec_max_on;
/****************************************************************/
/*              Arexx-Commands                                  */
/****************************************************************/

struct MUI_Command rx_cmd[] =
       {
        {"activate_window" ,"WINDOW/A",1,&rx_activate},
        {"activate_screen" ,"SCREEN/A",1,&rx_activate_screen},
        {"closewindow"     ,MC_TEMPLATE_ID,ID_CLOSEWD,NULL},
        {"delay"           ,"TICKS/N/A",1,&rx_delay},
        {"delaychar"       ,"TICKS/N/A",1,&rx_delaychar},
        {"infokey"         ,MC_TEMPLATE_ID,ID_INFO,NULL},
        {"openwindow"      ,MC_TEMPLATE_ID,ID_OPENWD,NULL},
        {"saveicon"        ,MC_TEMPLATE_ID,ID_SAVE,NULL},
        {"send"            ,"FILE/A",1,&rx_send},
        {"string"          ,"STRING/M/A",1,&rx_sendstring},
        {"set"             ,"POPKEY/S,REQUESTKEY/S,INFOKEY/S,STOPKEY/S,RECSTARTKEY/S,RECSTOPKEY/S,KEY/M/A",7,&rx_set},
        {"setkey"          ,"FILE/A,KEY/M/A",2,&rx_setkey},
        {"stopkey"         ,MC_TEMPLATE_ID,ID_STOPKEY,NULL},
        {"remove"          ,"KEY/M/A",1,&rx_remkey},
        {"remove_all"      ,"",0,&rx_remall},
        {"reset"           ,MC_TEMPLATE_ID,ID_LOAD,NULL},
        {"requestkey"      ,MC_TEMPLATE_ID,ID_FILEREQ,NULL},
        {"start_rec"       ,MC_TEMPLATE_ID,ID_RECSTART,NULL},
        {"stop_rec"        ,MC_TEMPLATE_ID,ID_RECSTOP,NULL},
        {"recfile"         ,"FILE/M/A",1,&rx_recfile},
        {"rec_options"     ,"MIN_DELAY/N,PRI/N,MOUSEBUTTONS/S,DELAYS/S,MAXCHAR/N,ON/S",4,&rx_rec_opts},
        {NULL,NULL,NULL,NULL}
       };

/*********************************************************************/
/*               Main                                                */
/*********************************************************************/

void __stdargs main(int argc,char **argv)
{
 BOOL running = TRUE;
 init();
 
 /*******************************************************************/
 /*                  Objekte erstellen                              */
 /*******************************************************************/
 
 app = ApplicationObject,
		MUIA_Application_Title	    , "ASCII_SEND",
		MUIA_Application_Version    , ASCSEND_VERSION,
		MUIA_Application_Copyright  , "FREEWARE von Lunqal%%MAB@wsb.freinet.de",
		MUIA_Application_Author     , "Dr. Flame (VEG)Lunqual",
		MUIA_Application_Description, GETSTR(17),
		MUIA_Application_Base	    , "ASCSEND",
                MUIA_Application_Menu, menu_list,
                MUIA_Application_BrokerHook, &cxmsg,
                MUIA_Application_SingleTask, TRUE,
                MUIA_Application_Commands  , rx_cmd,
  Child,special_list = ListObject,
   MUIA_List_ConstructHook, &construct_keys,
   MUIA_List_DestructHook,  &destruct_keys,
  End,
  SubWindow, press_a_key = WindowObject,
   MUIA_Window_Title, "Taste ?",
   MUIA_Window_ID   , 'TAST',
   WindowContents, VGroup,GroupFrame,
    Child, t = TextObject,
     TextFrame,
     MUIA_Text_Contents,GETSTR(43),
    End,
   End,
  End,
  SubWindow, window= WindowObject,
   MUIA_Window_Title, ASCSEND_TEXT,
   MUIA_Window_ID   , 'ASCS',
   WindowContents, VGroup,
    Child,HGroup,
     MUIA_Group_SameSize,TRUE,
     Child, VGroup,GroupFrameT("Hotkeys & Files"),
      Child,VGroup,
       Child, key_lv = ListviewObject,
        ReadListFrame,
        MUIA_Listview_Input,TRUE,
        MUIA_Listview_List, key_list = ListObject,
         MUIA_List_ConstructHook, &construct_keys,
         MUIA_List_DestructHook,  &destruct_keys,
         MUIA_List_CompareHook,   &compare_keys,
         MUIA_List_DisplayHook,   &display_keys,
         End,
       End,
       Child, VGroup, GroupFrame,
        Child, ColGroup(3),
         Child, KeyLabel2("Hotkey:",'y'),
         Child, newkeystring = KeyString(0,STRMAXLEN,'y'),
         Child, popkey_button = PopButton(MUII_PopUp),
        End,
        Child,ColGroup(2),
         Child, KeyLabel2(GETSTR(21),'d'),
					    Child, popfile = PopaslObject,
						    MUIA_Popstring_String, filestring    = KeyString(0,STRMAXLEN,'d'),
						    MUIA_Popstring_Button, popfilebutton = PopButton(MUII_PopFile),
						    ASLFR_TitleText, GETSTR(6),
						   End,
        End,
        Child,VGroup,
         Child,HGroup,
          Child, edit_button =  KeyButton(GETSTR(22),'r'),
          Child, edit_popup = PopaslObject,
						     MUIA_Popstring_String, edit_string   = KeyString(0,STRMAXLEN,'i'),
						     MUIA_Popstring_Button, edit_popup = PopButton(MUII_PopFile),
						     ASLFR_TitleText, GETSTR(6),
						    End,
         End,
         Child,HGroup,
          Child, newkey = KeyButton(GETSTR(23),'n'),
          Child, delkey = KeyButton(GETSTR(24),'e'), 
         End,
        End,
       End,
      End,
     End,
     Child,VGroup,
      Child, VGroup, GroupFrameT(GETSTR(34)),
       Child,ColGroup(3),
        Child, Label2(GETSTR(35)),  
        Child, rec_start = String("",STRMAXLEN),
        Child, auto_recstart = PopButton(MUII_PopUp),
        Child, Label2(GETSTR(36)),  
        Child, rec_stop  = String("",STRMAXLEN),
        Child, auto_recstop = PopButton(MUII_PopUp),
       End,               
       Child,ColGroup(2),
        Child, Label2(GETSTR(37)),
        Child, pop_recfile = PopaslObject,
 					   MUIA_Popstring_String, rec_file      = KeyString(0,STRMAXLEN,'r'),
 					   MUIA_Popstring_Button, PopButton(MUII_PopFile),
 					   ASLFR_TitleText, GETSTR(6),
 					  End,
       End,
       Child, edit_recfile = ButtonObject(GETSTR(22)), 
       Child,ColGroup(2), 
        Child, Label2(GETSTR(38)),
        Child, rec_min_delay = IntegerObject("25",4),
        Child, Label2(GETSTR(39)),
        Child, rec_handler_pri = IntegerObject("60",3),
       End,
       Child, ColGroup(3),
        Child, Label2(GETSTR(42)),
        Child, rec_max         = IntegerObject("0",10),
        Child, rec_max_on      = CheckMark(FALSE),
       End,
       Child,ColGroup(4),
        Child, Label2(GETSTR(40)),
        Child, rec_include_mb = CheckMark(TRUE),
        Child, Label2(GETSTR(41)),
        Child, rec_include_delay = CheckMark(TRUE),
       End,
      End,
     End,
     Child,HGroup,GroupFrameT(GETSTR(25)),
      Child, VGroup,
       Child, ColGroup(3),
        Child,Label2("\33uF\33nilerequester"),
        Child,filerequest_string = KeyString("",KEYLEN,'f'),
        Child,autofilereqkey = PopButton(MUII_PopUp),
        Child,Label2("\33uS\33ntopkey"),
        Child,stop_string = KeyString("",KEYLEN,'s'),
        Child,autostopkey = PopButton(MUII_PopUp),
        Child,Label2("\33uI\33nnfo"),
        Child,info_string = KeyString("",KEYLEN,'i'),
        Child,autoinfokey = PopButton(MUII_PopUp),
        Child,Label2("\33uC\33nX_Popkey"),
        Child,popup_string = KeyString("",KEYLEN,'c'),
        Child,autopopkey = PopButton(MUII_PopUp),
       End,
       Child,VGroup,GroupFrameT(GETSTR(26)),
        Child,ColGroup(2),
         Child,Label2(GETSTR(27)),
         Child,delay_int = MyKeyInteger(KEYLEN,'z'),
         Child,Label2(GETSTR(28)),
         Child,delaychar_int = MyKeyInteger(KEYLEN,'h'),
        End,
       End,
      End,
     End,
    End,  
   End,
  End,
 End;
 /******************************************************************/
 /*           Objekte erstellt (oda eben nich)                     */
 /******************************************************************/
 
 if(!app)fail(NULL);
 Load_from_icon(argc,argv);
 if(!init_recorder())fail(app); 
 /******************************************************************/
 /*                Methoden                                        */
 /******************************************************************/
 /*          Fenster schliessen                                    */
 /******************************************************************/
 DoMethod(window,MUIM_Notify,MUIA_Window_CloseRequest,TRUE,app,2,MUIM_Application_ReturnID,ID_CLOSEWD);
 
 /*******************************************************************/
 /*        Die ganzen String & Integergadgets                       */
 /*******************************************************************/
 
 DoMethod(filerequest_string,MUIM_Notify,MUIA_String_Acknowledge,
          MUIV_EveryTime,app,2,MUIM_Application_ReturnID,ID_CHANGE_FILEREQ);
 DoMethod(stop_string,MUIM_Notify,MUIA_String_Acknowledge,
          MUIV_EveryTime,app,2,MUIM_Application_ReturnID,ID_CHANGE_STOPKEY);
 DoMethod(info_string,MUIM_Notify,MUIA_String_Acknowledge,
          MUIV_EveryTime,app,2,MUIM_Application_ReturnID,ID_CHANGE_INFOREQ);
 DoMethod(popup_string,MUIM_Notify,MUIA_String_Acknowledge,
          MUIV_EveryTime,app,2,MUIM_Application_ReturnID,ID_CHANGE_POPKEY);          
 DoMethod(rec_start,MUIM_Notify,MUIA_String_Acknowledge,
          MUIV_EveryTime,app,2,MUIM_Application_ReturnID,ID_CHANGE_RECSTART);  
 DoMethod(rec_stop,MUIM_Notify,MUIA_String_Acknowledge,
          MUIV_EveryTime,app,2,MUIM_Application_ReturnID,ID_CHANGE_RECSTOP);  
 DoMethod(rec_handler_pri,MUIM_Notify,MUIA_String_Acknowledge,
          MUIV_EveryTime,app,2,MUIM_Application_ReturnID,ID_CHANGE_HANDLER_PRI);  

 DoMethod(auto_recstart,MUIM_Notify,MUIA_Pressed,FALSE,
         app,2,MUIM_Application_ReturnID,ID_AUTORECSTART);

 DoMethod(auto_recstop,MUIM_Notify,MUIA_Pressed,FALSE,
         app,2,MUIM_Application_ReturnID,ID_AUTORECSTOP);

 DoMethod(popkey_button,MUIM_Notify,MUIA_Pressed,FALSE,
          app,2,MUIM_Application_ReturnID,ID_AUTOHOTKEY);
  
 DoMethod(autostopkey,MUIM_Notify,MUIA_Pressed,FALSE,
          app,2,MUIM_Application_ReturnID,ID_AUTOSTOPKEY);

 DoMethod(autofilereqkey,MUIM_Notify,MUIA_Pressed,FALSE,
          app,2,MUIM_Application_ReturnID,ID_AUTOFILEREQKEY);

 DoMethod(autoinfokey,MUIM_Notify,MUIA_Pressed,FALSE,
          app,2,MUIM_Application_ReturnID,ID_AUTOINFOKEY);

 DoMethod(autopopkey,MUIM_Notify,MUIA_Pressed,FALSE,
          app,2,MUIM_Application_ReturnID,ID_AUTOPOPKEY);

 /******************************************************************/
 /*             die Fileliste                                      */
 /******************************************************************/
 
 
 DoMethod(newkey,MUIM_Notify,MUIA_Pressed,FALSE,
         app,2,MUIM_Application_ReturnID,ID_INSERTFILE);

 
 DoMethod(key_list,MUIM_Notify,MUIA_List_Active,MUIV_EveryTime,
       	  app,2,MUIM_Application_ReturnID,ID_FILESELECT);

 
 DoMethod(delkey,MUIM_Notify,MUIA_Pressed,FALSE,
       	  key_list,2,MUIM_List_Remove,MUIV_List_Remove_Active);                
 
 /******************************************************************/
 /* popobject */
 /*************/    
  
 DoMethod(window,MUIM_Window_SetCycleChain,
          key_lv,newkeystring,popkey_button,filestring,popfilebutton,newkey,
          rec_start,rec_start,auto_recstart,rec_stop,auto_recstop,
          rec_file,pop_recfile,edit_recfile,rec_min_delay,rec_handler_pri,
          rec_max,rec_max_on,rec_include_mb,rec_include_delay,
          filerequest_string,autofilereqkey,stop_string,autostopkey,
          info_string,autoinfokey,popup_string,autopopkey,
          delay_int,delaychar_int,
          NULL);
               
 set(window,MUIA_Window_ActiveObject,key_lv);
 /******************************************************************/
 /*       Grummel.........vagesslich werd ich 8(((((               */
 /******************************************************************/
 
 DoMethod(app,MUIM_Notify,MUIA_Application_DoubleStart,MUIV_EveryTime,
	  app,2,MUIM_Application_ReturnID,ID_DOUBLESTART);

 DoMethod(edit_button, MUIM_Notify,MUIA_Pressed,FALSE,
          app,2,MUIM_Application_ReturnID,ID_EDITFILE);

 DoMethod(edit_recfile, MUIM_Notify,MUIA_Pressed,FALSE,
          app,2,MUIM_Application_ReturnID,ID_EDIT_RECFILE);


 /******************************************************************/
 /*              muss auch sein....;-)                             */
 /******************************************************************/

 ShowWDTitle();
 while (running)
 {
  switch (DoMethod(app,MUIM_Application_Input,&signals))
  {
   case ID_CLOSEWD                     : CLOSEWD_MACRO;
                                         break;
   case ID_QUIT_SILENT                 : running = FALSE;
                                         break;
   case ID_LOAD                        : Load_from_icon(argc,argv);
                                         break;
   case ID_SAVE                        : Save_to_icon();
                                         break;
   case MUIV_Application_ReturnID_Quit :
   case ID_QUIT                        : {
                                          ULONG o;
                                          get(window,MUIA_Window_Open,&o);
                                          if(o)
                                          {
                                           if(MUI_RequestA(app,NULL,0,NULL,GETSTR(29),
                                              GETSTR(30),NULL) != 0)running = FALSE;
                                          }
                                          else running = FALSE;
                                         }
                                         break;
   case ID_INFO                        : MUI_RequestA(app,NULL,0,NULL,GETSTR(31),"\33c" ASCSEND_VERSION "\n FREEWARE by Lunqual%%MAB@wsb.freinet.de\n",NULL);
                                         break;    
   case ID_CHANGE_POPKEY               : {
                                          UBYTE *str;
                                          get(popup_string,MUIA_String_Contents,&str);
                                          ChangeKey(special_list,str,NULL,CXID_POPUP,MODE_CHANGE);
                                          ShowWDTitle();
                                         }
                                         break;     
   case ID_CHANGE_STOPKEY              : {
                                          UBYTE *str;
                                          get(stop_string,MUIA_String_Contents,&str);
                                          ChangeKey(special_list,str,NULL,CXID_STOP,MODE_CHANGE);
                                         }
                                         break;     
   case ID_CHANGE_FILEREQ              : {
                                          UBYTE *str;
                                          get(filerequest_string,MUIA_String_Contents,&str);
                                          ChangeKey(special_list,str,NULL,CXID_FILEREQ,MODE_CHANGE);
                                         }
                                         break;     
   case ID_CHANGE_INFOREQ              : {
                                          UBYTE *str;
                                          get(info_string,MUIA_String_Contents,&str);
                                          ChangeKey(special_list,str,NULL,CXID_INFO,MODE_CHANGE);
                                         }
                                         break; 
   case ID_CHANGE_RECSTART             : {
                                          UBYTE *str;
                                          get(rec_start,MUIA_String_Contents,&str);
                                          ChangeKey(special_list,str,NULL,CXID_RECSTART,MODE_CHANGE);  
                                         }
                                         break;   
   case ID_CHANGE_RECSTOP              : {
                                          UBYTE *str;
                                          get(rec_stop,MUIA_String_Contents,&str);
                                          ChangeKey(special_list,str,NULL,CXID_RECSTOP,MODE_CHANGE);  
                                         }
                                         break;   
   case ID_INSERTFILE                  : {
                                          UBYTE *key,*file;
                                          get(newkeystring,MUIA_String_Contents,&key);
                                          get(filestring,MUIA_String_Contents,&file);
                                          if(*file && *key)
                                          {
                                           struct hotkey *k;
                                           if(k = FindEntryKey(key_list,key))
                                           {
                                            strcpy(k->h_filename,file);
                                           }
                                           else
                                             ChangeKey(key_list,key,file,NextID,MODE_CHANGE);
                                          }
                                         }
                                         break;
   case ID_FILESELECT                  : {
                                          struct hotkey *key;
                                          ULONG n;
                                          get(key_list,MUIA_List_Active,&n);
                                          if(key = FindEntryN(key_list,n))
                                          {
                                           set(newkeystring,MUIA_String_Contents,key->h_description);
                                           set(filestring,  MUIA_String_Contents,key->h_filename); 
                                          }
                                         }
                                         break;
   case ID_OPENWD                      : OPENWD_MACRO;
                                         break;
   case ID_FILEREQ                     : {
                                          ULONG o;
                                          get(window,MUIA_Window_Open,&o);
                                          if(!o)
                                          {
                                           UBYTE filename[STRMAXLEN];
                                           struct Window *active_wd;
                                           active_wd =  IntuitionBase->ActiveWindow;
                                           if(!from_inside)
                                           {
                                            if(showrequest())
                                            {
                                             strncpy(filename,requestpath,STRMAXLEN);
                                             AddPart(filename,requestfile,STRMAXLEN);
                                             ScreenToFront(active_wd->WScreen);
                                             ActivateWindow(active_wd);
                                             if(!Sendfile(filename,GET_A_FILE))DoMethod(app,MUIM_Application_ReturnID,ID_QUIT_SILENT);
                                            }
                                           }
                                          }
                                         }
                                         break;
   case ID_DOUBLESTART                 : OPENWD_MACRO;
                                         break;
   case ID_RECSTART                    : {
                                          ULONG o;
                                          LONG n;
                                          get(window,MUIA_Window_Open,&o);
                                          get(rec_max,MUIA_String_Integer,&n);
                                          if(!o)rec_start_f((n + 1));
                                         }
                                         break;
   case ID_RECSTOP                     : {
                                          rec_stop_f(NULL);
                                         }
                                         break;   
   case ID_EDITFILE                    : {
                                          UBYTE *o;
                                          get(filestring,MUIA_String_Contents,&o);
                                          editfile(o);
                                         }
                                         break; 
   case ID_EDIT_RECFILE                :{
                                         UBYTE *o;
                                         get(rec_file,MUIA_String_Contents,&o);
                                         editfile(o);
                                         }
                                         break; 
   case ID_CHANGE_HANDLER_PRI          : exit_recorder();
                                         init_recorder();
                                         break;
   case ID_AUTORECSTART                : set(press_a_key,MUIA_Window_Open,TRUE);
                                         from_main = TRUE;
                                         from_main_object = rec_start;
                                         rec_start_f(1);
                                         break;
   case ID_AUTORECSTOP                 : set(press_a_key,MUIA_Window_Open,TRUE);
                                         from_main = TRUE;
                                         from_main_object = rec_stop;
                                         rec_start_f(1);
                                         break;
   case ID_AUTOHOTKEY                  : set(press_a_key,MUIA_Window_Open,TRUE);
                                         from_main = TRUE;
                                         from_main_object = newkeystring;
                                         rec_start_f(1);
                                         break;
   case ID_AUTOFILEREQKEY              : set(press_a_key,MUIA_Window_Open,TRUE);
                                         from_main = TRUE;
                                         from_main_object = filerequest_string;
                                         rec_start_f(1);
                                         break;

   case ID_AUTOPOPKEY                  : set(press_a_key,MUIA_Window_Open,TRUE);
                                         from_main = TRUE;
                                         from_main_object = popup_string;
                                         rec_start_f(1);
                                         break;
   case ID_AUTOSTOPKEY                 : set(press_a_key,MUIA_Window_Open,TRUE);
                                         from_main = TRUE;
                                         from_main_object = stop_string;
                                         rec_start_f(1);
                                         break;

   case ID_AUTOINFOKEY                 : set(press_a_key,MUIA_Window_Open,TRUE);
                                         from_main = TRUE;
                                         from_main_object = info_string;
                                         rec_start_f(1);
                                         break;
   default                             : break;
  }
  if (running && signals) 
  {
   ULONG sgs;
   sgs = Wait(signals | (1L << SigBit));
   if(sgs & (1L << SigBit))
   {
    if(from_main)
    {
     FILE  *file;
     UBYTE buffer[STRMAXLEN];
     rec_stop_f("ram:ascs.key.tmp");
     from_main = FALSE;
     set(press_a_key,MUIA_Window_Open,FALSE);
     if(file = fopen("ram:ascs.key.tmp","r"))
     {
      fgets(buffer,STRMAXLEN,file);
      if(from_main_object)
      { 
       UBYTE *p = buffer;
       if(*buffer == '<')
       {
        p++;
        *(buffer + strlen(buffer) - 1 ) = 0;
       }
       set(from_main_object,MUIA_String_Contents,p);
       if(from_main_object == filerequest_string) ChangeKey(special_list,p,NULL,CXID_FILEREQ,MODE_CHANGE);
       if(from_main_object == popup_string)      {ChangeKey(special_list,p,NULL,CXID_POPUP,MODE_CHANGE);
                                                   ShowWDTitle();}
       if(from_main_object ==  stop_string)       ChangeKey(special_list,p,NULL,CXID_STOP,MODE_CHANGE);
       if(from_main_object ==  info_string)       ChangeKey(special_list,p,NULL,CXID_INFO,MODE_CHANGE);
       if(from_main_object ==  rec_start)         ChangeKey(special_list,p,NULL,CXID_RECSTART,MODE_CHANGE);
       if(from_main_object ==  rec_stop)          ChangeKey(special_list,p,NULL,CXID_RECSTOP,MODE_CHANGE);
       from_main_object = NULL;
      }
      fclose(file);
     }
    }
    else 
    {
     rec_stop_f(NULL);
     DisplayBeep(0);
    }
   }
  }
 }
 CLOSEWD_MACRO;
 fail(app);
}

/*******************************************************************/
/*                Icon-Tooltypes laden                             */
/*******************************************************************/

void __regargs Load_from_icon(int argc, char **argv)
{
 char **tooltypes = ArgArrayInit(argc,argv);
 struct MsgPort *port   = NULL;
 CxObj          *broker = NULL;
 ULONG           i      = 0;
 BOOL            end    = FALSE;
 get(app,MUIA_Application_BrokerPort,&port);
 get(app,MUIA_Application_Broker    ,&broker);
 if(port && broker)
 {
  DoMethod(special_list,MUIM_List_Clear);
  DoMethod(key_list,MUIM_List_Clear);
  tooltypes = ArgArrayInit(argc,argv);
  /*******************************/
  /*     popkey                  */
  /*******************************/
  ChangeKey(special_list,ArgString(tooltypes,"CX_POPKEY","control alt a"),NULL,CXID_POPUP,MODE_NEW);
  set(popup_string,MUIA_String_Contents,insert_key->h_description);
  /*******************************/
  /*     infokey                 */
  /*******************************/
  ChangeKey(special_list,ArgString(tooltypes,"INFOKEY","control alt i"),NULL,CXID_INFO,MODE_NEW);   
  set(info_string,MUIA_String_Contents,insert_key->h_description);
  /*******************************/
  /*     filerequester           */
  /*******************************/
  ChangeKey(special_list,ArgString(tooltypes,"REQUESTKEY","control alt r"),NULL,CXID_FILEREQ,MODE_NEW);
  set(filerequest_string,MUIA_String_Contents,insert_key->h_description);
  /*******************************/
  /*     stopkey                 */
  /*******************************/
  ChangeKey(special_list,ArgString(tooltypes,"STOPKEY","control alt q"),NULL,CXID_STOP,MODE_NEW);
  set(stop_string,MUIA_String_Contents,insert_key->h_description);
  /*******************************/
  /*          recstart           */
  /*******************************/
  ChangeKey(special_list,ArgString(tooltypes,"RECSTARTKEY","control alt 8"),NULL,CXID_RECSTART,MODE_NEW);
  set(rec_start,MUIA_String_Contents,insert_key->h_description);
  /*******************************/
  /*          recstop            */
  /*******************************/
  ChangeKey(special_list,ArgString(tooltypes,"RECSTOPKEY","control alt 9"),NULL,CXID_RECSTOP,MODE_NEW);
  set(rec_stop,MUIA_String_Contents,insert_key->h_description);
  /*******************************/
  /*        filerequester        */
  /*******************************/
  strcpy(requestpath,ArgString(tooltypes,"REQPATH",""));
  strcpy(requestfile,ArgString(tooltypes,"REQFILE",""));
  set(edit_string,MUIA_String_Contents,ArgString(tooltypes,"EDITOR","GoldEd"));
  set(rec_file,MUIA_String_Contents,ArgString(tooltypes,"RECFILE","ram:ascs_rec.0"));
  for(;!end;i++)
  {
   UBYTE desc[KEYLEN];
   UBYTE file[KEYLEN];
   sprintf(desc,"HOTKEY%ld",i);
   sprintf(file, "FILE%ld",  i);
   if(ArgString(tooltypes,desc,NULL))
   {
    if(ArgString(tooltypes,file,NULL))
    {
     ChangeKey(key_list,ArgString(tooltypes,desc,NULL),ArgString(tooltypes,file,NULL),NextID,MODE_NEW);
    }
   }
   else end = TRUE;
  }    
 }
 set(delay_int,MUIA_String_Integer, ArgInt(tooltypes,"DELAY",12));
 set(delaychar_int,MUIA_String_Integer, ArgInt(tooltypes,"DELAYCHAR",0));
 set(rec_max,MUIA_String_Integer, ArgInt(tooltypes,"REC_MAXCHAR",0));
 set(rec_min_delay,MUIA_String_Integer, ArgInt(tooltypes,"MIN_DELAY",25));
 set(rec_handler_pri,MUIA_String_Integer, ArgInt(tooltypes,"HANDLER_PRIORITY",60));
 if(!stricmp(ArgString(tooltypes,"INCLUDE_MB","NO"),"YES"))
   set(rec_include_mb,MUIA_Selected,TRUE);
 else
   set(rec_include_mb,MUIA_Selected,FALSE);
 if(!stricmp(ArgString(tooltypes,"INCLUDE_DELAY","NO"),"YES"))
   set(rec_include_delay,MUIA_Selected,TRUE);
 else
   set(rec_include_delay,MUIA_Selected,FALSE);
 if(!stricmp(ArgString(tooltypes,"REC_MAX_ON","NO"),"YES"))
   set(rec_max_on,MUIA_Selected,TRUE);
 else
   set(rec_max_on,MUIA_Selected,FALSE);
 
 if(!stricmp(ArgString(tooltypes,"CX_POPUP","no"),"yes"))OPENWD_MACRO;
 if(tooltypes)ArgArrayDone();
}

/*********************************************************************/
/*                Hook-Funktionen                                    */
/*********************************************************************/

LONG __asm __saveds construct_key_func( register __a0 struct Hook *hook,register __a2 APTR m_pool,register __a1 struct hotkey *key)
{
 struct hotkey  *insert;
 struct MsgPort *port   = NULL;
 CxObj          *broker;
 UBYTE          *p;
 get(app,MUIA_Application_BrokerPort,&port);
 get(app,MUIA_Application_Broker,&broker);
 p = key->h_description  + strlen(key->h_description) - 1;
 while(*p == ' '){*p = 0;--p;}
 if(insert = (struct hotkey *)AllocVec(sizeof(struct hotkey),MEMF_PUBLIC | MEMF_CLEAR))
 {
  strncpy(insert->h_description,key->h_description,KEYLEN);
  strncpy(insert->h_filename,key->h_filename,KEYLEN);
  insert->h_id = key->h_id;
  if(insert->h_key = HotKey(insert->h_description,port,insert->h_id))
  {
   AttachCxObj(broker,insert->h_key); 
   NextID++;
   return (LONG)insert;
  }
  else
   FreeVec(insert);
 }   
 return (NULL);
}

void __asm __saveds destruct_key_func( register __a0 struct Hook *hook,register __a2 APTR m_pool,register __a1 struct hotkey *key)
{
 if(key)
 {
  if(key->h_key)DeleteCxObjAll(key->h_key);
  FreeVec(key);
 }
}
 
LONG __asm __saveds display_key_func(register __a0 struct Hook *hook,register __a2 UBYTE **array,register __a1 struct hotkey  *key)
{
 strcpy(displayline,key->h_description);
 *array = displayline;
 return (0);
}

LONG __asm __saveds cxmsg_broker_func(register __a2 APTR app,register __a1 CxMsg *msg)
{
 LONG id,type;
 CxObj *broker;
 id    = CxMsgID(msg);
 type  = CxMsgType(msg);
 get(app,MUIA_Application_Broker,&broker);
 switch(type)
 {
  case CXM_IEVENT   : switch(id)
                      {
                       case CXID_STOP       : DoMethod(app,MUIM_Application_ReturnID,ID_STOPKEY);
                                              break;
                       case CXID_INFO       : if(MUI_RequestA(app,NULL,0,NULL,GETSTR(32),"\33c" ASCSEND_VERSION "\n FREEWARE by Lunqual%%MAB@wsb.freinet.de\n",NULL) != 0)
                                               DoMethod(app,MUIM_Application_ReturnID,ID_QUIT);
                                              break;
                       case CXID_POPUP      : OPENWD_MACRO;
                                              DoMethod(app,MUIM_Application_ReturnID,ID_STOPKEY);
                                              break;
                       case CXID_FILEREQ    : DoMethod(app,MUIM_Application_ReturnID,ID_FILEREQ);
                                              break;
                       case CXID_RECSTART   : 
                                              {
                                               LONG n;
                                               get(rec_max,MUIA_String_Integer,&n);
                                               rec_start_f((n + 1));
                                              }       
                                              break;
                       case CXID_RECSTOP    : {
                                               rec_stop_f(NULL);
                                              }
                                              break;
                       default              : {
                                               struct hotkey *key;
                                               if(key = FindEntry(key_list,id))
                                               {
                                                if(!from_inside)
                                                {
                                                 if(!Sendfile(key->h_filename,GET_A_FILE))
                                                  DoMethod(app,MUIM_Application_ReturnID,ID_QUIT_SILENT);
                                                }
                                               }
                                              }
                                              break;
                      }
                      break;
  case CXM_COMMAND  : switch(id)
                      {
                       case CXCMD_DISABLE   : ActivateCxObj(broker,0L);
                                              set(app,MUIA_Application_Iconified,TRUE);
                                              break;
                       case CXCMD_ENABLE    : ActivateCxObj(broker,1L);
                                              set(app,MUIA_Application_Iconified,FALSE);
                                              break;
                       case CXCMD_KILL      : DoMethod(app,MUIM_Application_ReturnID,ID_QUIT);
                                              break;
                       case CXCMD_UNIQUE    : 
                       case CXCMD_APPEAR    : OPENWD_MACRO;
                                              break;
                       case CXCMD_DISAPPEAR : CLOSEWD_MACRO;
                                              break;

                       default     : break;
                      }
                       break;     
  default           : break;
 }
 return 0;
}


LONG __asm __saveds compare_func(register __a0 struct Hook *hook,register __a1 struct hotkey *h1,register __a2 struct hotkey *h2)
{
 return (h1->h_id == h2->h_id) ? 0 : (h1->h_id < h2->h_id) ? 1 : -1;
}

/*****************************************************************/
/*                Arexx-Hook-Funktionen                          */
/*****************************************************************/

LONG __asm __saveds rx_send_func(register __a1 UBYTE **parms)
{
 ULONG o;
 get(window,MUIA_Window_Open,&o);
 if((!o) && (!from_inside))
 {
  if(!Sendfile(*parms,GET_A_FILE)) DoMethod(app,MUIM_Application_ReturnID,ID_QUIT_SILENT);
 }
 return 0;
}

LONG __asm __saveds rx_activate_func(register __a1 UBYTE **parms)
{
 LONG rc = RC_ERROR;
 ULONG i_lock;
 struct Window *wd;
 struct Screen *sc;
 int end = FALSE;
 i_lock = LockIBase(0);
 sc = IntuitionBase->FirstScreen;
 while(sc && !end)
 {
  wd = sc->FirstWindow;
  while(wd && !end)
  {
   if(!strnicmp(*parms,wd->Title,strlen(*parms)))
   {
    end = TRUE;
    rc = RC_OK;
    UnlockIBase(i_lock);i_lock = 0;
    ScreenToFront(sc);
    ActivateWindow(wd);
   }
   wd = wd->NextWindow;
  }
  sc = sc->NextScreen;
 }
 if(i_lock)UnlockIBase(i_lock);
 return rc; 
}

LONG __asm __saveds rx_activate_screen_func(register __a1 UBYTE **parms)
{
 LONG rc = RC_ERROR;
 ULONG i_lock;
 struct Window *wd;
 struct Screen *sc;
 int end = FALSE;
 i_lock = LockIBase(0);
 sc = IntuitionBase->FirstScreen;
 while(sc && !end)
 {
  if(!strnicmp(*parms,sc->Title,strlen(*parms)))
  {
   end = TRUE;
   ScreenToFront(sc);
   if(wd = sc->FirstWindow)
   {
    rc = RC_OK;
   }
  }
  sc = sc->NextScreen;
 }
 UnlockIBase(i_lock);
 if(rc == RC_OK) ActivateWindow(wd);
 return rc;     
}

LONG __asm __saveds rx_setkey_func(register __a1 UBYTE **parms)
{
 UBYTE **p;
 struct hotkey *k;
 UBYTE key[STRMAXLEN];
 *key = 0;
 p = (UBYTE **)parms[1];
 while(*p)
 {
  strcat(key,*p);strcat(key," ");
  p++;
 }
 *(key + (KEYLEN-1)) = 0; 
 set(newkeystring,MUIA_String_Contents,key);
 set(filestring  ,MUIA_String_Contents,parms[0]);
 if(k = FindEntryKey(key_list,key))
 {
  strcpy(k->h_filename,parms[0]);
 }
 else
  ChangeKey(key_list,key,parms[0],NextID,MODE_CHANGE);
 return 0;   
}

LONG __asm __saveds rx_remkey_func(register __a1 UBYTE **parms)
{
 UBYTE **p;
 struct hotkey *k;
 UBYTE key[STRMAXLEN];
 *key = 0;
 p = (UBYTE **)parms[0];
 while(*p)
 {
  strcat(key,*p);strcat(key," ");
  p++;
 }
 *(key + (KEYLEN-1)) = 0; 
 if(k = FindEntryKey(key_list,key))
 {
  ChangeKey(key_list,NULL,NULL,k->h_id,MODE_CHANGE);
 }
 return (0);
}

LONG __asm __saveds rx_remall_func(register __a1 UBYTE **parms)
{
 DoMethod(key_list,MUIM_List_Clear);
 return (0);   
}

LONG __asm __saveds rx_set_func(register __a1 UBYTE **parms)
{
 UBYTE **p;
 UBYTE key[STRMAXLEN];
 LONG  id = -1;
 APTR  obj;
 *key = 0;
 p = (UBYTE **)parms[6];
 while(*p)
 {
  strcat(key,*p);strcat(key," ");
  p++;
 }
 *(key + (KEYLEN-1)) = 0; 
 if(parms[0]){id = CXID_POPUP   ;obj = popup_string;}
 if(parms[1]){id = CXID_FILEREQ ;obj = filerequest_string;}
 if(parms[2]){id = CXID_INFO    ;obj = info_string;}
 if(parms[3]){id = CXID_STOP    ;obj = stop_string;}
 if(parms[4]){id = CXID_RECSTART;obj = rec_start;}
 if(parms[5]){id = CXID_RECSTOP ;obj = rec_stop;}
 if(id != -1)
 {
  ChangeKey(special_list,key,NULL,id,MODE_CHANGE);
  set(obj,MUIA_String_Contents,key);
 }
 return (0);
}

LONG __asm __saveds rx_delay_func(register __a1 LONG **parms)
{
 set(delay_int,MUIA_String_Integer,*parms[0]);
 return (0);
}

LONG __asm __saveds rx_delaychar_func(register __a1 LONG **parms)
{
 set(delaychar_int,MUIA_String_Integer,*parms[0]);
 return (0);
}

LONG __asm __saveds rx_sendstring_func(register __a1 LONG **parms)
{
 UBYTE **p;
 UBYTE string[512];
 p = (UBYTE **)parms[0];
 *string = 0;
 while(*p)
 {
  strcat(string,*p);strcat(string," ");
  p++;
 }
 string[strlen(string)] = 0;
 Sendfile(string,GET_A_STRING);
 return (0);
}

LONG __asm __saveds rx_recfile_func(register __a1 LONG **parms)
{
 set(rec_file,MUIA_String_Contents,*parms[0]);
 return(0);
}

LONG __asm __saveds rx_rec_opts_func(register __a1 LONG **parms)
{
 if(parms[0])set(rec_min_delay,MUIA_String_Integer,*parms[0]);
 if(parms[1])
 {
  set(rec_handler_pri,MUIA_String_Integer,*parms[1]);
  exit_recorder();
  init_recorder();
 }
 if(parms[2])set(rec_include_mb,MUIA_Selected,TRUE);
   else      set(rec_include_mb,MUIA_Selected,FALSE);
 if(parms[3])set(rec_include_delay,MUIA_Selected,TRUE);
   else      set(rec_include_delay,MUIA_Selected,FALSE);
 if(parms[4])set(rec_max,MUIA_String_Integer,*parms[4]);
 if(parms[5])set(rec_max_on,MUIA_Selected,TRUE);
    else     set(rec_max_on,MUIA_Selected,FALSE);
 return(0);
}

/*********************************************************************/
/*                 sonstiger Krempel                                 */
/*********************************************************************/

struct hotkey __regargs *FindEntry(APTR list,ULONG id)
{
 struct hotkey *rc = NULL;
 ULONG          i;
 for(i=0;;i++)
 {
  DoMethod(list,MUIM_List_GetEntry,i,&rc);
  if(!rc)return NULL;
  if(rc->h_id == id)return rc;
 }
}

LONG __regargs FindEntryNumber(APTR list,ULONG id)
{
 struct hotkey *rc = NULL;
 LONG          i;
 for(i=0;;i++)
 {
  DoMethod(list,MUIM_List_GetEntry,i,&rc);
  if(!rc)return -1;
  if(rc->h_id == id)return i;
 }
} 

struct hotkey __regargs *FindEntryN(APTR list,ULONG num)
{
 struct hotkey *rc = NULL;
 LONG          i;
 for(i=0;i <= num;i++)
 {
  DoMethod(list,MUIM_List_GetEntry,i,&rc);
  if(!rc)return (NULL);
 }
 return (rc);
} 


struct hotkey __regargs *FindEntryKey(APTR list,UBYTE *key)
{
 struct hotkey *rc = NULL;
 LONG          i;
 for(i=0;;i++)
 {
  DoMethod(list,MUIM_List_GetEntry,i,&rc);
  if(!rc)return NULL;
  if(!strnicmp(key,rc->h_description,strlen(rc->h_description)))return rc;
 }
}

void ShowWDTitle()
{
 struct hotkey *key;
 if(key = FindEntry(special_list,CXID_POPUP))
 {
  strcpy(wtitle,"ASCII-SEND: Hotkey=");
  strcat(wtitle,key->h_description);
 } 
 set(window,MUIA_Window_Title,&wtitle);   
}

void __regargs ChangeKey(APTR list,UBYTE *key,UBYTE *file,ULONG id,ULONG mode)
{
 LONG rkey;
 if(mode == MODE_CHANGE)
 {
  if((rkey = FindEntryNumber(list,id)) != -1) DoMethod(list,MUIM_List_Remove,rkey);
 }
 if((key == NULL) &&(file == NULL))return;
 memset(insert_key,0,sizeof(struct hotkey));
 strcpy(insert_key->h_description,key);
 if(file) strcpy(insert_key->h_filename,file);
 insert_key->h_id = id;
 DoMethod(list,MUIM_List_Insert,&insert_key,1,MUIV_List_Insert_Bottom); 
}

UBYTE __regargs *makemem(ULONG size)
{
 return((UBYTE *)AllocVec(size,MEMF_PUBLIC | MEMF_CLEAR));   
}

void releasemem(void *mem)
{
 FreeVec(mem);   
}

UBYTE __regargs *getfilebuffer(UBYTE *filename,ULONG mode)
{
 struct FileInfoBlock *fib;
 BPTR lock,fh;
 UBYTE *buffer;
 switch( mode )
 {
  case GET_A_FILE: 
  if(lock = Lock(filename,ACCESS_READ))
  {
   if(fib = AllocDosObject(DOS_FIB,TAG_DONE))
   {
    Examine(lock,fib);
    filesize = fib->fib_Size;
    FreeDosObject(DOS_FIB,fib);
    if(buffer = (UBYTE *)makemem(filesize))
    {
     if(fh = OpenFromLock(lock))
     {
      FRead(fh,buffer,filesize,1);
      Close(fh);
      return buffer;
     }
     else UnLock(lock);
    }
   }
  }
  return NULL;
  break;
  case GET_A_STRING :
  filesize = strlen(filename + 1);
  if(buffer = (UBYTE *)makemem(filesize))
  {
   strcpy(buffer,filename);
   return buffer;
  }
  else return NULL;
  break;
 }    
 return NULL;
}

void __regargs freefilebuffer(UBYTE *buffer,ULONG size)
{
 releasemem(buffer);   
}

BOOL __regargs getnextchar(UBYTE *buffer,UBYTE *where)
{
 if(filepos >= filesize)return FALSE;
 *where = *(buffer + filepos);
 filepos++;   
 return TRUE;
}

void editfile(UBYTE *name)
{
 UBYTE line[STRMAXLEN];
 UBYTE *c;
 BPTR  in;
 if(in = Open("NIL:",ACCESS_READ))
 {
  get(edit_string,MUIA_String_Contents,&c);
  strcpy(line,c);strcat(line," ");
  strcat(line,name);
  SystemTags(line,SYS_Input,in,SYS_Asynch,TRUE,TAG_DONE);
 }
}

/*********************************************************************/
/*              Filerequester                                        */
/*********************************************************************/

int showrequest()
{
 int ret = FALSE;
 struct  FileRequester *FileReq;
 struct Screen         *rscreen;
 if(rscreen = LockPubScreen(NULL))ScreenToFront(rscreen);
 FRTags[3].ti_Data = (ULONG)requestpath;
 FRTags[4].ti_Data = (ULONG)requestfile;
 if(FileReq = (struct FileRequester *)MUI_AllocAslRequest(ASL_FileRequest,FRTags))
 {
  if(MUI_AslRequest(FileReq,TAG_DONE))
  {
   ret = TRUE;
   strcpy(requestfile,FileReq->rf_File);
   strcpy(requestpath,FileReq->rf_Dir);
  }
  MUI_FreeAslRequest((APTR)FileReq);
 }
 return ret;
}


/*********************************************************************/
/*             Datei senden                                          */
/*********************************************************************/

long __regargs Sendfile(UBYTE *filename,ULONG mode)
{
 int rc = TRUE;
 struct InputEvent *ie;
 UBYTE buffer[STRMAXLEN];
 UBYTE *filebuffer;
 int Ldelay     = FALSE;
 ULONG           stop = FALSE;
 ULONG           v_line;
 ULONG           v_z;
 ULONG           fpm;  
 ULONG           brk = IE_COUNT;  
 if(!makeIHandler())return rc;
 get(delay_int,MUIA_String_Integer,&v_line);
 get(delaychar_int,MUIA_String_Integer,&v_z);
 from_inside = TRUE;
 filepos = 0;
 if(filebuffer = getfilebuffer(filename,mode))
 {
  while((getnextchar(filebuffer,buffer)) && (!stop))
  {
   *(buffer + 1) = 0;
   switch(*buffer)
   {
    case '\n' : Ldelay = TRUE;
                strcpy(buffer,"\\n");
                break;
    case '\r' : Ldelay = TRUE;
                strcpy(buffer,"\\r");
                break;
    case '\t' : strcpy(buffer,"\\t");
                break;
    case '\\' : fpm = filepos;
                getnextchar(filebuffer,buffer + 1);
                *(buffer + 2) = 0;
                {
                 int end = FALSE;
                 int p = 2;
                 ULONG v;
                 if((*(buffer + 1)=='d')||(*(buffer + 1)=='l')||(*(buffer + 1)=='c')||
                    (*(buffer + 1)=='n')||(*(buffer + 1)=='r')||(*(buffer + 1)=='t'))
                 {
                  do
                  {
                   if( (*(buffer + 1)=='n')||(*(buffer + 1)=='r')||(*(buffer + 1)=='t'))
                   {
                    end = TRUE;
                   }
                   else
                   {
                    getnextchar(filebuffer,buffer + p);
                    if(!(isdigit(*(buffer + p))) || (p >= 6))
                    {
                     end = TRUE;
                     *(buffer + p + 1) = 0;
                     v = atol(buffer + 2);
                     switch(*(buffer + 1))
                     {
                      case 'd' : Delay(v);
                                 break;
                      case 'l' : v_line = v;
                                 break;
                      case 'c' : v_z = v;
                                 break;
                      default  : break;
                     }
                     *buffer = 0;
                     filepos -= 1;
                    }
                    p++;
                    if(p >= (STRMAXLEN - 2))end = TRUE;
                   }
                  }
                  while(!end); 
                 }
                 else
                 {
                  UBYTE t[2] = {0,0}; 
                  struct InputEvent ev;
                  if(*(buffer + 1) == '(')
                  {
                   getnextchar(filebuffer,buffer + 2);
                   getnextchar(filebuffer,buffer + 3);
                   getnextchar(filebuffer,buffer + 4);
                   getnextchar(filebuffer,buffer + 5);
                   if((*(buffer + 3) == 'm')&&(*(buffer + 5)==':'))
                   {
                    int p = 6;
                    int py;
                    int end = FALSE;
                    while(!end)
                    {
                     getnextchar(filebuffer,buffer + p);
                     if(!(isdigit(*(buffer + p))))
                     {
                      end = TRUE;
                     }
                     p++;
                    }
                    --p;
                    if(*(buffer + p) == ',')
                    {
                     p++;
                     py = p;
                     end = FALSE;
                     while(!end)
                     {
                      getnextchar(filebuffer,buffer + p);
                      if(!(isdigit(*(buffer + p))))
                      {
                       end = TRUE;
                      }
                      p++;
                     }
                     --p;
                     if(*(buffer + p) == ')')
                     {
                      ev.ie_Class = IECLASS_POINTERPOS;
                      ev.ie_NextEvent = NULL;
                      ev.ie_Qualifier = 0;
                      ev.ie_SubClass  = 0;
                      ev.ie_TimeStamp.tv_secs = 0;
                      ev.ie_TimeStamp.tv_micro = 0;
                      ev.ie_Y = (WORD)atol(buffer + py);
                      ev.ie_X = (WORD)atol(buffer + 6);
                      switch(*(buffer + 2))
                      {
                       case 'l' : if(*(buffer + 4) == 'd')
                                   ev.ie_Code      = IECODE_LBUTTON ;
                                  else
                                    ev.ie_Code      = IECODE_LBUTTON | IECODE_UP_PREFIX;
                                  my_AddIEvents(&ev);
                                  break;
                       case 'r' : if(*(buffer + 4) == 'd')
                                   ev.ie_Code      = IECODE_RBUTTON ;
                                  else
                                    ev.ie_Code      = IECODE_RBUTTON | IECODE_UP_PREFIX;
                                  my_AddIEvents(&ev);
                                  break;
                        case 'm' : if(*(buffer + 4) == 'd')
                                   ev.ie_Code      = IECODE_MBUTTON ;
                                  else
                                    ev.ie_Code      = IECODE_MBUTTON | IECODE_UP_PREFIX;
                                  my_AddIEvents(&ev);
                                  break;
                      }
                      *buffer = 0;
                     }
                     else
                     {
                      filepos =fpm;
                      strcpy(buffer,"\\\\");
                      if(ie = InvertString(buffer,NULL))
                      {
                       my_AddIEvents(ie);
                       FreeIEvents(ie);
                       *buffer = 0;
                      }
                     }
                    }
                    else
                    {
                     filepos = fpm;
                     strcpy(buffer,"\\\\");
                     if(ie = InvertString(buffer,NULL))
                     {
                      my_AddIEvents(ie);
                      FreeIEvents(ie);
                      *buffer = 0;
                     }
                    }
                   }
                   else
                   {
                    filepos = fpm;
                    strcpy(buffer,"\\\\");
                    if(ie = InvertString(buffer,NULL))
                    {
                     my_AddIEvents(ie);
                     FreeIEvents(ie);
                     *buffer = 0;
                    }
                   }
                  }
                  else
                  {
                   t[0] = *(buffer + 1);
                   strcpy(buffer,"\\\\");
                   if(ie = InvertString(buffer,NULL))
                   {
                    my_AddIEvents(ie);
                    FreeIEvents(ie);
                   }
                  }
                  strcpy(buffer,t);
                  switch(*buffer)
                  {
                   case '\n' : strcpy(buffer,"\\n");
                               break;
                   case '\r' : strcpy(buffer,"\\r");
                               break;
                   case '<'  : *buffer = 0;filepos -= 1;
                               break;
                  }
                 }
                }
                break;
   case '<'  : {
                 int end;
                 int p;
                 end = FALSE;
                 p = 1;
                 fpm = filepos;
                 do
                 {
                  getnextchar(filebuffer,buffer + p);
                  switch(*(buffer + p))
                  {
                   case '\r': 
                   case '\n': if(ie = InvertString("\\<",NULL))
                              {
                               my_AddIEvents(ie); 
                               FreeIEvents(ie);
                              }
                              filepos = fpm;
                              *buffer = 0;
                              end = TRUE;
                              break;
                   case '>' : *(buffer + p + 1) = 0;
                              if(ie = InvertString(buffer,NULL))
                              {
                               my_AddIEvents(ie); 
                               FreeIEvents(ie);
                              }
                              else
                              {
                               if(ie = InvertString("\\<",NULL))
                               {
                                my_AddIEvents(ie); 
                                FreeIEvents(ie);
                               }
                               filepos = fpm;
                              }
                              *buffer = 0;
                              end = TRUE;
                              break;
                   default  : break;
                  }
                  p++;
                  if(p >= (STRMAXLEN - 2))end = TRUE;
                 }
                 while(!end);
                 break;
                }
    case '>'  : if(ie = InvertString(buffer,NULL))
                {
                 my_AddIEvents(ie); 
                 FreeIEvents(ie);
                }
                strcpy(buffer,"\\>");
                break;
    default   : *(buffer + 1) = 0;
                break;
   }
   
   if(ie = InvertString(buffer,NULL))
   {
    --brk;
    if(v_z)Delay(v_z);
    my_AddIEvents(ie);
    FreeIEvents(ie);
    if(Ldelay)
    {
     Delay(v_line);
     Ldelay = FALSE;
     brk = 0;
    }
    if(!brk)
    {
     brk = IE_COUNT;
     switch(DoMethod(app,MUIM_Application_Input,&signals))
     {
      case MUIV_Application_ReturnID_Quit :
      case ID_QUIT                        : if(MUI_RequestA(app,NULL,0,NULL,"Ja|*Nein","\33cWollen Sie dieses\ngigantische Programm\nwirklich beenden ???",NULL) != 0)
                                            {
                                             stop = TRUE;
                                             rc = FALSE;
                                            }
                                            break;
      case ID_INFO                        : MUI_RequestA(app,NULL,0,NULL,"*Na gut","\33c" ASCSEND_VERSION "\n FREEWARE von Lunqual%%MAB@wsb.freinet.de\n",NULL);
                                            break;
      case ID_OPENWD                      : OPENWD_MACRO;
      case ID_STOPKEY                     : stop  = TRUE;
                                            break; 
      default                             : break;
     }
    }
   }
  }
  freefilebuffer(filebuffer,filesize);
 }
 from_inside=FALSE; 
 remIHandler();
 return rc;
}

/*********************************************************************/
/*                  InputHandler Glump                               */
/*********************************************************************/

LONG makeIHandler()
{
 if(s_InputPort = CreateMsgPort())
 {
  if(s_HandlerIO = (struct IOStdReq *)CreateExtIO(s_InputPort,sizeof(struct IOStdReq)))
  {
   if(!(s_device = OpenDevice("input.device",NULL,(struct IORequest *)s_HandlerIO,0L)))
   {
    s_HandlerIO->io_Length  = sizeof(struct InputEvent);
    s_HandlerIO->io_Command = IND_WRITEEVENT;
    return(TRUE);
   }
  }  
 }
 return (FALSE);
}

void remIHandler()
{
 if(s_HandlerIO)
 {
  if(!s_device)CloseDevice((struct IORequest *)s_HandlerIO);
  DeleteExtIO((struct IORequest *)s_HandlerIO);
  s_HandlerIO = NULL;
 }
 if(s_InputPort)
 {
  DeletePort(s_InputPort);
  s_InputPort = NULL;
 }
}
       
/*********************************************************************/
/*                  MUI init & Fail                                  */
/*********************************************************************/

void init()
{
 if (!(MUIMasterBase = OpenLibrary(MUIMASTER_NAME,7L)))fail(NULL);
 LocaleBase = OpenLibrary("locale.library",38);
 ascs_locale = OpenLocale(NULL);
 ascs_catalog = OpenCatalog(ascs_locale,"ascsend.catalog", 
                            OC_BuiltInLanguage,"deutsch",
                            OC_Version,1,TAG_DONE);
 menu_list[0].nm_Label = GETSTR(0);
 menu_list[1].nm_Label = GETSTR(1);
 menu_list[2].nm_Label = GETSTR(2);
 menu_list[4].nm_Label = GETSTR(3);
 menu_list[6].nm_Label = GETSTR(4);
 menu_list[7].nm_Label = GETSTR(5);
 FRTags[0].ti_Data     = (ULONG)GETSTR(6);
}

void __regargs fail(APTR app)
{
 if (app)
 {
  MUI_DisposeObject(app);
 }
 exit_recorder();
 if(LocaleBase)CloseLibrary(LocaleBase);
 CloseCatalog(ascs_catalog);
 CloseLocale(ascs_locale);
 if (MUIMasterBase)CloseLibrary(MUIMasterBase);
 exit(0);
}

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



