/*
 * ========================================================================
 * Copyright 2006-2007 University of Washington
 * Copyright 2013-2015 Eduardo Chappa
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * ========================================================================
 */


#ifndef MSWIN_H
#define MSWIN_H


#define	__far
#define	_far
#define	__export

/*
 * Equivalent to a windows handle.
 */
typedef void	       *WINHAND;

/*
 * Mouse input events. 
 */
typedef struct {
	int		event;
	int		button;
	int		nRow;
	int		nColumn;
	int		keys;
	int		flags;
} MEvent;


/*
 * These define how mouse events get queued.
 */
#define MSWIN_MF_REPLACING	0x1000
#define MSWIN_MF_REPEATING	0x2000


typedef struct {
	int		ch;
	int		rval;
	LPTSTR		name;
	LPTSTR		label;
	int		id;
} MDlgButton;



/*
 * Struct to tell pico how to build and what to return when
 * it's asked to build a popup menu.
 */
typedef struct _popup {
	enum {tIndex, tQueue, tMessage, tSubMenu,
	      tSeparator, tTail} type;
	struct {			/* menu's label */
	    char	  *string;
	    enum	   {lNormal = 0, lChecked, lDisabled} style;
	} label;
	union {
	    UCS		   val;		/* Queue: inserted into input queue */
	    UCS 	   msg;		/* Message: gets posted to ghTTYWnd */
	    struct _popup *submenu;	/* Submenu: array of submenu entries */
	} data;
	struct {			/* Internal data */
	    int	       id;
	} internal;
} MPopup;



/*
 * Type of function expected by mswin_allowcopy and mswin_allowcopycut
 * and used in EditDoCopyData
 */
typedef	int (*getc_t)(int pos);

/*
 * Callback used to fetch text for display in alternate window.  Text
 * can be returned as either a pointer to a null terminated block of
 * text (a string), with CRLF deliminating lines.  OR as a pointer to
 * an array of pointers to lines, each line being a null terminated
 * string. 
 */
typedef int (*gettext_t)(char *title, void **text, long *len, int *format);

/*
 * Type used by line up/down event handlers to move the body of the
 * displayed text, by sort callback to get/set sort order, by
 * header mode to get/set header state...
 */
typedef int (*cbarg_t)(int action, long args);


/*
 * Callback used for periodic callback.
 */
typedef void  (*cbvoid_t)(void);
typedef char *(*cbstr_t)(char *);


#define GETTEXT_TITLELEN	128
#define GETTEXT_TEXT		1	/* 'text' is pointer to text. */
#define GETTEXT_LINES		2	/* 'text' is pointer to array of
					 *   pointers to lines. */


#ifndef PATH_MAX
#define PATH_MAX		128	/* Max size of a directory path. */
#endif

/*
 * Scroll callback values. Used to be mapped in the MSWIN_RANGE_START..END
 *  range, but now are mapped directly to keydefs.h values. Except two of
 *  them which don't have map values in keydefs.h so they're still in the
 *  MSWIN_RANGE_START..END 0x7000 range.
 */
#define MSWIN_KEY_SCROLLUPPAGE		0x7000
#define MSWIN_KEY_SCROLLDOWNPAGE	0x7001
#define MSWIN_KEY_SCROLLUPLINE		KEY_SCRLUPL
#define MSWIN_KEY_SCROLLDOWNLINE	KEY_SCRLDNL
#define MSWIN_KEY_SCROLLTO		    KEY_SCRLTO

#define	MSWIN_PASTE_DISABLE	0
#define	MSWIN_PASTE_FULL	1
#define	MSWIN_PASTE_LINE	2


#define MSWIN_CURSOR_ARROW	0
#define MSWIN_CURSOR_BUSY	1
#define MSWIN_CURSOR_IBEAM	2
#define MSWIN_CURSOR_HAND	3

/*
 * Flags for mswin_displaytext
 */
#define MSWIN_DT_NODELETE	0x0001	/* Don't delete text when 
					 * window closes. */
#define MSWIN_DT_USEALTWINDOW   0x0002	/* Put text in alt window if already
					 * open. Open if not. */
#define MSWIN_DT_FILLFROMFILE   0x0004	/* pText_utf8 is a filename. */

/*
 * functions from mswin.c
 */


WINHAND		mswin_gethinstance();
WINHAND		mswin_gethwnd ();
void		mswin_killsplash();
void		mswin_settitle(char *);
int		mswin_getmouseevent (MEvent * pMouse);
void		mswin_mousetrackcallback (cbarg_t cbfunc);
int		mswin_popup(MPopup *members);
void		mswin_keymenu_popup ();
void		mswin_registericon(int row, int id, char *file);
void		mswin_destroyicons();
void		mswin_finishicons();
void		mswin_show_icon (int x, int y, char *file);
void		mswin_setdebug (int debug, FILE *debugfile);
void		mswin_setnewmailwidth (int width);
int		mswin_setdndcallback (int (*cb)());
int		mswin_cleardndcallback (void);
int		mswin_setresizecallback (int (*cb)());
int		mswin_clearresizecallback (int (*cb)());
void		mswin_setdebugoncallback (cbvoid_t cbfunc);
void		mswin_setdebugoffcallback (cbvoid_t cbfunc);
int		mswin_setconfigcallback (cbvoid_t cffunc);
int		mswin_sethelpcallback (cbstr_t cbfunc);
int		mswin_setgenhelpcallback (cbstr_t cbfunc);
void		mswin_setclosetext (char *pCloseText);
int		mswin_setwindow (char *fontName, char *fontSize, 
				 char *fontStyle, char *windowPosition,
				 char *cursorStyle, char *fontCharSet);
int             mswin_showwindow();
int		mswin_getwindow (char *fontName, size_t nfontName,
				 char *fontSize, size_t nfontSize,
				 char *fontStyle, size_t nfontStyle,
				 char *windowPosition, size_t nwindowPosition,
				 char *foreColor, size_t nforeColor,
				 char *backColor, size_t nbackColor,
				 char *cursorStyle, size_t ncursorStyle,
				 char *fontCharSet, size_t nfontCharSet);
void            mswin_noscrollupdate (int flag);
void		mswin_setscrollrange (long page, long max);
void		mswin_setscrollpos (long pos);
long		mswin_getscrollpos (void);
long		mswin_getscrollto (void);
void		mswin_setscrollcallback (cbarg_t cbfunc);
void		mswin_setsortcallback (cbarg_t cbfunc);
void		mswin_setflagcallback (cbarg_t cbfunc);
void		mswin_sethdrmodecallback (cbarg_t cbfunc);
void		mswin_setselectedcallback (cbarg_t cbfunc);
void		mswin_setzoomodecallback (cbarg_t cbfunc);
void		mswin_setfkeymodecallback (cbarg_t cbfunc);
void		mswin_setprintfont (char *fontName, char *fontSize, 
			char *fontStyle, char *fontCharSet);
void		mswin_getprintfont (char *, size_t, char *, size_t,
				    char *, size_t, char *, size_t);
int		mswin_yield (void);
int		mswin_charavail (void);
UCS		mswin_getc_fast (void);
void		mswin_flush_input (void);
int		mswin_showcursor (int show);
int		mswin_showcaret (int show);
void		mswin_trayicon (int show);
int		mswin_move (int row, int column);
int		mswin_getpos (int *row, int *column);
int		mswin_getscreensize (int *row, int *column);
void		mswin_minimize (void);
int		mswin_putblock (char *utf8_str, int strLen);
int		mswin_puts (char *utf8_str);
int		mswin_puts_n (char *utf8_str, int n);
int		mswin_putc (UCS c);
int		mswin_outc (char c);
int		mswin_rev (int state);
int		mswin_getrevstate (void);
int		mswin_bold (int state);
int		mswin_uline (int state);
int		mswin_eeol (void);
int		mswin_eeop (void);
int		mswin_beep (void);
void		mswin_pause (int);
int		mswin_flush (void);
void		mswin_setcursor (int);
void		mswin_messagebox (char *msg, int);
void		mswin_allowpaste (int);
void		mswin_allowcopycut (getc_t);
void		mswin_allowcopy (getc_t);
void		mswin_addclipboard (char *s);
void		mswin_allowmousetrack (int);
int		mswin_newmailicon (void);
void		mswin_newmailtext (char *t);
void		mswin_newmaildone (void);
void		mswin_mclosedtext (char *t);
void		mswin_menuitemclear (void);
void		mswin_menuitemadd (UCS key, char *label, int menuitem, 
			int flags);
int		mswin_setwindowmenu (int menu);
int		mswin_print_ready (WINHAND hWnd, LPTSTR docDesc);
int		mswin_print_done (void);
char *		mswin_print_error (int errorcode);
int		mswin_print_char (TCHAR c);
int		mswin_print_char_utf8 (int c);
int		mswin_print_text (LPTSTR text);
int		mswin_print_text_utf8 (char *text);
int		mswin_savefile (char *dir, int dirlen, char *fName, int nMaxFName);
int		mswin_openfile (char *dir, int nMaxDName, char *fName, int nMaxFName, char *extlist);
int		mswin_multopenfile (char *dir, int nMaxDName, char *fName, int nMaxFName, char *extlist);
char	       *mswin_rgbchoice(char *pOldRGB);
void		mswin_killbuftoclip (getc_t copyfunc);
void		pico_popup();
void		mswin_paste_popup();
int		mswin_fflush (FILE *f);
void		mswin_setperiodiccallback (cbvoid_t periodiccb, long period);
WINHAND		mswin_inst2task (WINHAND hInst);
int		mswin_ontask_del (WINHAND hTask, char *path);
int		mswin_exec_and_wait (char *whatsit, char *command,
				     char *infile, char *outfile,
				     int *exit_val,
				     unsigned mseaw_flags);
int		mswin_shell_exec (char *command, WINHAND *childproc);
void		mswin_exec_err_msg (char *what, int status, char *buf, 
			size_t buflen);
int		mswin_onexit_del (char *path);
int		mswin_set_quit_confirm (int);
void		mswin_showhelpmsg (WINHAND hWnd, char **helplines);

typedef struct MSWIN_TEXTWINDOW MSWIN_TEXTWINDOW;
MSWIN_TEXTWINDOW *mswin_displaytext (char *title, char *pText, size_t textLen,
			             char **pLines, MSWIN_TEXTWINDOW *mswin_tw,
			             int flags);
int		mswin_imaptelemetry(char *msg);
void		mswin_enableimaptelemetry(int state);
int             mswin_newmailwin(int is_us, char *from,
				 char *subject, char *folder);
int             mswin_newmailwinon(void);

char	       *mswin_reg_default_browser(char *url);
int		mswin_reg(int op, int tree, char *data, size_t size);
int             mswin_is_def_client(int type);
int             mswin_set_def_client(int type);
char	      **mswin_reg_dump(void);
int		mswin_majorver();
int		mswin_minorver();
char	       *mswin_compilation_date();
char	       *mswin_compilation_remarks();
char	       *mswin_specific_winver();


int		mswin_usedialog (void);
int		mswin_dialog(UCS *prompt, UCS *string, int field_len, 
			int append_current, int passwd, 
			MDlgButton *button_list, char **help, unsigned flags);
int		mswin_select(char *utf8prompt, MDlgButton *button_list, 
			int dflt, int on_ctrl_C, char **help, unsigned flags);
int		mswin_yesno(UCS *);
int		mswin_yesno_utf8(char *);

BOOL		MSWRShellCanOpen(LPTSTR key, char *cmdbuf, int clen, int allow_noreg);
BOOL		MSWRPeek(HKEY hRootKey, LPTSTR subkey, LPTSTR valstr,
			 LPTSTR data, DWORD *dlen);
int             mswin_store_pass_prompt(void);
void            mswin_set_erasecreds_callback(cbvoid_t);
void		mswin_setviewinwindcallback (cbvoid_t);
int             mswin_setgenhelptextcallback(cbstr_t);
int             mswin_caninput(void);
void            mswin_beginupdate(void);
void            mswin_endupdate(void);
int             mswin_sethelptextcallback(cbstr_t);
int             strucmp(char *, char *);
int             struncmp(char *, char *, int);

#ifdef	MSC_MALLOC
/*
 * These definitions will disable the SEGHEAP allocation routines, in
 * favor of the compliler libraries usual allocators.  This is useful
 * when external debugging tools and the SEGHEAP debugging routines step
 * on each other...
 */
#define MemAlloc(X) malloc(X)
#define MemFree(X) free(X)
#define MemRealloc(X,Y) realloc(X,Y)
#define MemFreeAll()
#define	MemDebug(X,Y)
#else
/*
 * Memory management stuff, from msmem.c
 */
typedef unsigned long		MemSize;
typedef void __far	      *	MemPtr;

#define MemAlloc(s)		_MemAlloc (s, __FILE__, __LINE__)
#define malloc(s)		_MemAlloc (s, __FILE__, __LINE__)
#define MemFree(b)		_MemFree (b, __FILE__, __LINE__)
#define free(b)			_MemFree (b, __FILE__, __LINE__)
#define MemRealloc(b,s)		_MemRealloc (b, s, __FILE__, __LINE__)
#define realloc(b,s)		_MemRealloc (b, s, __FILE__, __LINE__)
#define MEM_BLOCK_SIZE_MAX	0xff00

void		MemDebug (int debug, FILE *debugFile);
void __far *	_MemAlloc (MemSize size, char __far * file, int line);
int		_MemFree (void __far *block, char __far *file, int line);
void __far *	_MemRealloc (void __far *block, MemSize size, 
					char __far * file, int line);
MemSize		MemBlkSize (MemPtr block);
void		MemFreeAll (void);
void            MemFailSoon (MemSize);
#endif

/* functions from win moved to mswin.c */
int	pico_scroll_callback (int, long);
#undef sleep
int     sleep (int);

/*
 * Signals that are not defined by MS C
 */
#define SIGHUP	    1	/* Terminal hangup. */
#define SIGINT      2   /* Ctrl-C sequence */
#define SIGILL      4   /* illegal instruction - invalid function image */
#define SIGSEGV     11  /* segment violation */
#define SIGALRM     14  /* alarm clock */
#define SIGTERM     15  /* Software termination signal from kill */
#define SIGABRT     22  /* abnormal termination triggered by abort call */
#define SIGWINCH    28	/* Change in window size. */


#define fflush	mswin_fflush

#define	alarm	mswin_alarm

/*
 * Registry setting constants
 */
#define	MSWR_PINE_RC	       1
#define	MSWR_PINE_DIR	       2
#define	MSWR_PINE_EXE	       3
#define MSWR_PINE_AUX          4
#define MSWR_PINE_POS          5
#define MSWR_PINE_CONF         6

#define MSWR_SDC_MAIL 1
#define MSWR_SDC_NEWS 2
#define MSWR_SDC_NNTP 3
#define MSWR_SDC_IMAP 4

#define	MSWR_NULL	0x00
#define	MSWR_OP_SET	0x01
#define	MSWR_OP_FORCE	0x02
#define	MSWR_OP_GET	0x04
#define	MSWR_OP_BLAST	0x08

#endif /* MSWIN_H */
