/* Mui-Ascsend.h */


#include <stdio.h>
#include <stdarg.h>
#include <stddef.h>
#include <math.h>
#include <dos.h>
#include <dos/dostags.h>
#include <time.h>
#include <ctype.h>
#include <stdlib.h>
#include <string.h>

#include <libraries/dos.h>
#include <libraries/asl.h>
#include <libraries/mui.h>
#include <libraries/locale.h>
#include <devices/input.h>
#include <devices/inputevent.h>

#include <intuition/intuition.h>
#include <intuition/intuitionbase.h>
#include <exec/exec.h>
#include <dos/dos.h>
#include <graphics/gfx.h>
#include <utility/tagitem.h>

#include <workbench/icon.h>
#include <workbench/startup.h>
#include <workbench/workbench.h>

#include <proto/all.h>
#include <clib/muimaster_protos.h>

#include <rexx/errors.h>


#include <pragmas/asl_pragmas.h>
#include <pragmas/wb_pragmas.h>
#include <pragmas/icon_pragmas.h>
#include <pragmas/muimaster_pragmas.h>
#include <pragmas/commodities_pragmas.h>
#include <pragmas/gadtools_pragmas.h>
#include <pragmas/utility_pragmas.h>
#include <pragmas/exec_pragmas.h>
#include <pragmas/graphics_pragmas.h>
#include <pragmas/dos_pragmas.h>
#include <pragmas/intuition_pragmas.h>
#include <pragmas/gadtools_pragmas.h>
#include <pragmas/locale_pragmas.h>

extern struct Library *AslBase;
extern struct Library *CxBase;
extern struct Library *UtilityBase;
extern struct Library *GadToolsBase;
extern struct GfxBase *GfxBase;
extern struct Library *LocaleBase;
extern struct IntuitionBase *IntuitionBase;
extern struct Library *MUIMasterBase;
extern struct Library *KeymapBase;

#define ASCSEND_TEXT     "MUI-ASCII-SEND"
#define ASCSEND_VER      "1"
#define ASCSEND_REVISION "19"
#define ASCSEND_VERSION  "$VER: " ASCSEND_TEXT " " ASCSEND_VER "." ASCSEND_REVISION  " "__DATE__ " " __TIME__
#define STRMAXLEN       256
#define KEYLEN           40

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

#define CXID_STOP        1
#define CXID_QUIT        2
#define CXID_FILEREQ     3     
#define CXID_INFO        4
#define CXID_POPUP       5
#define CXID_RECSTART    6
#define CXID_RECSTOP     7
#define CXID_BASE       10

#define DEFAULT_REQUESTFILE_KEY "control alt r"
#define DEFAULT_POPUP_KEY       "control alt a"
#define DEFAULT_INFO_KEY        "control alt i"
#define DEFAULT_STOP_KEY        "control alt q"

#define  OPENWD_MACRO  {CxObj *broker; get(app,MUIA_Application_Broker,&broker);set(window,MUIA_Window_Open,TRUE); ActivateCxObj(broker,0L);rec_stop_f(NULL);}
#define  CLOSEWD_MACRO {CxObj *broker; get(app,MUIA_Application_Broker,&broker);set(window,MUIA_Window_Open,FALSE); ActivateCxObj(broker,1L);}
#define  GetStrArg(n,m)  (*parms[n] + m++)
#define  my_AddIEvents(ie) {s_HandlerIO->io_Data    = (APTR)ie;  DoIO((struct IORequest *)s_HandlerIO);}

#define  MODE_CHANGE   0
#define  MODE_NEW      1
#define  GET_A_FILE    0
#define  GET_A_STRING  1

#define IE_COUNT       40

/**************************************************************/
/*                 locale-support                             */
/**************************************************************/

#define GETSTR(strnum) ((LocaleBase) ? GetCatalogStr(ascs_catalog,strnum,locale_strings[strnum]) : locale_strings[strnum])

/**************************************************************/
/*            ein paar abgewandelte Mui-Macros                */
/**************************************************************/

#define MyKeyString(contents,maxlen,controlchar,disable)\
	StringObject,\
		StringFrame,\
		MUIA_ControlChar    , controlchar,\
		MUIA_String_MaxLen  , maxlen,\
		MUIA_String_Contents, contents,\
                MUIA_Disabled       , disable,\
 		End

#define MyKeyInteger(maxlen,controlchar)\
	StringObject,\
		StringFrame,\
		MUIA_ControlChar    , controlchar,\
		MUIA_String_MaxLen  , maxlen,\
                MUIA_String_Accept  , "0123456789",\
 		End


#define IntegerObject(contents,maxlen)\
	StringObject,\
		StringFrame,\
		MUIA_String_MaxLen  , maxlen,\
  MUIA_String_Accept  , "0123456789",\
  MUIA_String_Integer , contents, \
 		End

#define ButtonObject(name)\
	TextObject,\
		ButtonFrame,\
		MUIA_Text_Contents, name,\
		MUIA_Text_PreParse, "\33c",\
		MUIA_InputMode    , MUIV_InputMode_RelVerify,\
		MUIA_Background   , MUII_ButtonBack,\
		End



#define MyKeyButton(name,key,disable)\
	TextObject,\
		ButtonFrame,\
		MUIA_Text_Contents, name,\
		MUIA_Text_PreParse, "\33c",\
		MUIA_Text_HiChar  , key,\
		MUIA_ControlChar  , key,\
		MUIA_InputMode    , MUIV_InputMode_RelVerify,\
		MUIA_Background   , MUII_ButtonBack,\
                MUIA_Disabled     , disable,\
		End


struct hotkey
       {
        CxObj         *h_key;
        UBYTE          h_description[KEYLEN];
        UBYTE          h_filename[KEYLEN];
        ULONG          h_id;
       };

extern struct hotkey   requestfile_hotkey,popup_hotkey,info_hotkey,stop_hotkey;
extern struct hotkey   insert_this_key;
extern enum IDs;
extern struct MUI_Command rx_cmd[];
extern UBYTE *locale_strings[];
extern APTR app;
extern APTR window;
extern APTR key_lv;
extern APTR key_list; 
extern APTR special_list;
extern APTR newkey, newkeystring,delkey, filestring;
extern APTR filerequest_string, popup_string, stop_string,info_string;
extern APTR delay_int,delaychar_int;
extern APTR edit_string;
extern APTR rec_start,rec_stop,rec_file;
extern APTR rec_min_delay,rec_handler_pri,rec_include_mb,rec_include_delay;
extern APTR rec_max;
extern APTR auto_recstart,auto_recstop;
extern APTR rec_max_on;

extern UBYTE displayline[STRMAXLEN];
extern UBYTE requestpath[STRMAXLEN];
extern UBYTE requestfile[STRMAXLEN];
extern ULONG recording;
extern ULONG min_delay;
extern BYTE  h_priority;
extern ULONG from_main;

extern struct Hook construct_keys;
extern struct Hook destruct_keys;
extern struct Hook display_keys;
extern struct Hook compare_keys;
extern struct Hook cxmsg;
extern struct Hook rx_send;
extern struct Hook rx_sendkey;
extern struct Hook rx_set_rec_opts;

extern LONG        SigBit;
       
extern void __stdargs main(int argc, char **argv);
extern void init(void);
extern void __regargs fail(APTR app);
extern void __regargs Load_from_icon(int argc, char **argv);
extern struct hotkey __regargs *FindEntry(APTR list,ULONG id);
extern LONG          __regargs  FindEntryNumber(APTR list,ULONG id);
extern struct hotkey __regargs *FindEntryKey(APTR list,UBYTE *key);
extern struct hotkey __regargs *FindEntryN(APTR list,ULONG num);
extern void          __regargs  ChangeKey(APTR list,UBYTE *key,UBYTE *file,ULONG id,ULONG mode);
extern void           ShowWDTitle(void);
extern long          __regargs  Sendfile(UBYTE *filename,ULONG mode);
extern void          Save_to_icon(void);
extern int           showrequest(void);
extern void          editfile(UBYTE *name);
extern LONG __asm __saveds construct_key_func( register __a0 struct Hook *hook,register __a2 APTR mem_pool,register __a1 struct hotkey *key);
extern void __asm __saveds destruct_key_func( register __a0 struct Hook *hook,register __a2 APTR mem_pool,register __a1 struct hotkey *key);
extern LONG __asm __saveds display_key_func(register __a0 struct Hook *hook,register __a2 UBYTE **array,register __a1 struct hotkey  *key);
extern LONG __asm __saveds cxmsg_broker_func(register __a2 APTR app,register __a1 CxMsg *key);
extern LONG __asm __saveds compare_func(register __a0 struct Hook *hook,register __a1 struct hotkey *h1,register __a2 struct hotkey *h2);
extern LONG __asm __saveds rx_send_func(register __a1 UBYTE **parms);
extern LONG __asm __saveds rx_activate_func(register __a1 UBYTE **parms);
extern LONG __asm __saveds rx_activate_screen_func(register __a1 UBYTE **parms);
extern LONG __asm __saveds rx_setkey_func(register __a1 UBYTE **parms);
extern LONG __asm __saveds rx_remkey_func(register __a1 UBYTE **parms);
extern LONG __asm __saveds rx_remall_func(register __a1 UBYTE **parms);
extern LONG __asm __saveds rx_set_func(register __a1 UBYTE **parms);
extern LONG __asm __saveds rx_delay_func(register __a1 LONG **parms);
extern LONG __asm __saveds rx_delaychar_func(register __a1 LONG **parms);
extern LONG __asm __saveds rx_sendstring_func(register __a1 LONG **parms);
extern LONG __asm __saveds rx_rec_opts_func(register __a1 LONG **parms);
extern LONG __asm __saveds rx_recfile_func(register __a1 LONG **parms);
extern UBYTE      __regargs *makemem(ULONG size);
extern void                  releasemem(void *mem);
extern UBYTE __regargs *getfilebuffer(UBYTE *filename,ULONG mode);
extern void  __regargs freefilebuffer(UBYTE *buffer,ULONG size);
extern BOOL  __regargs getnextchar(UBYTE *buffer,UBYTE *where);
extern LONG            makeIHandler(void);
extern void            remIHandler(void);

extern void * __asm __saveds input_handler(register __a0 struct InputEvent *ev,register __a1 APTR mem_pool);

extern void rec_start_f(ULONG n);
extern void rec_stop_f(UBYTE *name);
extern LONG init_recorder(void);
extern void exit_recorder(void);
extern void write_file(UBYTE *name);
