1 /* macnapp.h -- general mac application library header
2  */
3 /* (C) Copyright 1995 by Carnegie Mellon University
4  * All Rights Reserved.
5  *
6  * Permission to use, copy, modify, distribute, and sell this software
7  * and its documentation for any purpose is hereby granted without
8  * fee, provided that the above copyright notice appear in all copies
9  * and that both that copyright notice and this permission notice
10  * appear in supporting documentation, and that the name of Carnegie
11  * Mellon University not be used in advertising or publicity
12  * pertaining to distribution of the software without specific,
13  * written prior permission.  Carnegie Mellon University makes no
14  * representations about the suitability of this software for any
15  * purpose.  It is provided "as is" without express or implied
16  * warranty.
17  *
18  * CARNEGIE MELLON UNIVERSITY DISCLAIMS ALL WARRANTIES WITH REGARD TO
19  * THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
20  * AND FITNESS, IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY BE LIABLE
21  * FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
22  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN
23  * AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING
24  * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
25  * SOFTWARE.
26  */
27 /* (C) Copyright 1990-1995 by Christopher J. Newman
28  * All Rights Reserved.
29  *
30  * Permission to use, copy, modify, and distribute this software and its
31  * documentation for any purpose is hereby granted without fee, provided that
32  * the above copyright notice appear in all copies and that both that
33  * copyright notice and this permission notice appear in supporting
34  * documentation, and that the name of Christopher J. Newman not be used in
35  * advertising or publicity pertaining to distribution of the software without
36  * specific, written prior permission.  Christopher J. Newman makes no
37  * representations about the suitability of this software for any purpose.  It
38  * is provided "as is" without express or implied warranty.
39  *
40  * CHRISTOPHER J. NEWMAN DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
41  * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT
42  * SHALL CHRISTOPHER J. NEWMAN BE LIABLE FOR ANY SPECIAL, INDIRECT OR
43  * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
44  * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
45  * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
46  * OF THIS SOFTWARE.
47  *
48  * Author:	Chris Newman
49  * Message:	This is a nifty program.
50  */
51 
52 #ifdef THINK_C
53 #define QD(x)	(x)
54 #ifndef NULL
55 #define NULL	0
56 #endif
57 #else
58 #define QD(x)	(qd.x)
59 #include <MacTypes.h>
60 #include <Quickdraw.h>
61 #include <Events.h>
62 #include <Controls.h>
63 #include <Windows.h>
64 #include <MemoryMgr.h>
65 #include <Menus.h>
66 #include <OSUtils.h>
67 #include <TextEdit.h>
68 #include <Dialogs.h>
69 #endif
70 
71 /* dual pascal/C strings
72  */
73 typedef unsigned char PCstr;
74 #define C(str)	((char*)(str) + 1)
75 #define P(str)	((unsigned char*)(str))
76 
77 /* various machine types.
78  */
79 typedef unsigned short WORD;
80 typedef unsigned char BYTE;
81 
82 /* useful macros:
83  */
84 #define HIWORD(x)	( (WORD) ( (x) >> 16) )
85 #define LOWORD(x)	( (WORD) (x) )
86 
87 /* most window/menu procedures return short integers (see defines below)
88  */
89 typedef short (*na_menup)(struct na_win *, WORD, WORD);
90 typedef short (*na_mousep)(struct na_win *, Point, short, short);
91 typedef short (*na_ctrlp)(struct na_win *, Point, short, short, ControlHandle);
92 typedef short (*na_activep)(struct na_win *, Boolean);
93 typedef short (*na_closep)(struct na_win *);
94 typedef void (*na_afterp)(struct na_win *);
95 typedef short (*na_updatep)(struct na_win *, Boolean);
96 typedef short (*na_keyp)(struct na_win *, long, short);
97 typedef short (*na_cursorp)(struct na_win *, Point);
98 typedef short (*na_miscp)(struct na_win *, EventRecord *);
99 typedef short (*na_idlep)(struct na_win *);
100 typedef short (*na_taskp)(struct na_win *);
101 typedef short (*na_resizep)(struct na_win *, Point, Rect *);
102 typedef short (*na_openp)(short, FSSpec *, FInfo *);
103 typedef short (*na_initp)(struct na_win *, long *);
104 typedef struct na_win {
105 	long			flags;		/* flags indicating various window settings (see below) */
106 	short			delay;		/* delay between main loop cycles (in ticks) */
107 	short			mousepix;	/* number of pixels mouse can move until drag starts */
108 	short			minw, minh;	/* minimum width and height for the window */
109 	short			maxw, maxh;	/* maximum width and height for the window */
110 	short			type;		/* current window type (negatives reserved) */
111 	BYTE			locks;		/* locks on this window structure */
112 	short			priority;	/* priority if there is a taskp (-1 = everytime) */
113 	RgnHandle		cursorRgn;	/* cursor region */
114 	RgnHandle		uncrsrRgn;	/* region cursor isn't in */
115 	WindowPtr		pwin;		/* window pointer */
116 	struct na_win	**next;		/* handle to next window in linked list */
117 	struct na_win	**task;		/* handle to next task in a linked list of active tasks */
118 	struct na_win	**child;	/* handle to child window list (NULL = no child) */
119 	struct na_win	**parent;	/* handle to parent window (NULL = toplevel) */
120 	na_menup		menup;		/* menu proc */
121 	na_mousep		mousep;		/* mouse proc */
122 	na_ctrlp		ctrlp;		/* dialog item/control proc */
123 	na_activep		activep;	/* activate proc */
124 	na_closep		closep;		/* close proc */
125 	na_afterp		afterp;		/* after proc */
126 	na_updatep		updatep;	/* update proc */
127 	na_keyp			keyp;		/* key proc */
128 	na_cursorp		cursorp;	/* cursor setting proc */
129 	na_miscp		miscp;		/* miscellaneous event proc (disk/net/app/driver) */
130 	na_idlep		idlep;		/* idle proc */
131 	na_taskp		taskp;		/* task proc */
132 	na_resizep		resizep;	/* resize proc */
133 	long			resid;		/* storage for window resource id or user data. */
134 	char			*data;		/* data pointer for user */
135 } na_win;
136 typedef struct nate_win {
137 	na_win			winp;
138 	TEHandle		hTE;		/* textedit handle for auto-textedit routines */
139 	ControlHandle	hctrl;		/* horizontal scroll bar for textedit */
140 	ControlHandle	vctrl;		/* vertical scroll bar for textedit */
141 	long			docwidth;	/* width of the document */
142 	short			lheight;	/* line height of text */
143 	short			topoff;		/* offset from top of window to textedit area */
144 } nate_win;
145 /* procedures types:
146  *
147  * // called for menu events when window is frontmost
148  * // supercedes global menu function unless NA_NOTPROCESSED is returned.
149  * // if menuid is 0, the procedure should enable/disable menus appropriately
150  * // if menuid is 1, the procedure should disable enabled menus appropriately
151  * short menu(winp, menuid, itemno)
152  *	WORD menuid;			// resource id of the menu
153  *	WORD itemno;			// item number of the menu item
154  *
155  * // called for mouse down/up/move events in the window
156  * short mouse(winp, p, type, mods)
157  *	Point p;				// location of mouse action
158  *	short type;				// type of mouse action (see below)
159  *	short mods;				// modifier keys
160  *
161  * // called for dialog events in dialog windows
162  * // control events in windows with controls
163  * // In a dialog window with no key procedure, ESC, command-., return, enter are
164  * // mapped to iCancel and iOk.
165  * short control(winp, p, itemHit, mods, ctrlh)
166  *	Point p;				// point in window local coords
167  *	short itemHit;			// the item/part code clicked
168  *	short mods;				// modifier keys
169  *	ControlHandle ctrlh;	// handle to the control
170  *
171  * // called when window is activated or deactivated
172  * // close return values may be ignored on a deactivate
173  * short activate(winp, on)
174  *	Boolean on;				// true = activate, false = deactivate
175  *
176  * // called when a window close request has been made (close box/close menu item)
177  * // called when any window function returns NA_REQCLOSE or NA_REQCLOSEALL
178  * // respond with either NA_CLOSED or NA_NOTPROCESSED
179  * short close(winp)
180  *
181  * // called after window closed & removed from lists, but before window object freed
182  * void afterp(winp)
183  *
184  * // called on update events
185  * short update(winp, newsize)
186  *	Boolean newsize;		// true if r is a new window size
187  *
188  * // called on key/autokey events (menu keys are parsed out first)
189  * short key(winp, c, mods)
190  *	long c;					// ASCII value of the key (unless NA_RAWKEY option set)
191  *	short mods;				// modifier keys
192  *
193  * // called when cursor moves into or out of a window
194  * // use winp->flags & NA_CURSORON
195  * // close request return values are ignored.
196  * // return NA_PROCESSED only when the cursorRgn is changed
197  * short cursor(winp, p)
198  *	Point p;				// point where the cursor is
199  *
200  * // This is called for miscellaneous events (disk/network/driver/app1-3)
201  * short miscp(winp, pevent)
202  *	EventRecord *pevent;	// the event
203  *
204  * // called every time through the event loop when window active
205  * short idle(winp)
206  *
207  * // called cyclicly with other tasks with each pass through event loop
208  * // only used when task is installed
209  * // the task procedure can only close it's own window.
210  * short task(winp)
211  *
212  * // function called to resize the window
213  * // (parameters similar to GrowWindow function)
214  * short resize(winp, where, rct)
215  *  Point where;
216  *  Rect *rct;
217  *
218  * // function passed to NAinit:
219  * // should return 0 if OK, and -1 to stop opening files
220  * short open(message, afile, fspec)
221  *	short message;			// either appOpen or appPrint (in SegLoad.h)
222  *  FSSpec *fspec;			// file to open/print
223  *  Finfo *finfo;			// finder info
224  *
225  * // function passed to NAwindow:
226  * // returns standard window status
227  * short init(winp, datap)
228  *	na_win	*winp;			// pointer to new window structure
229  *	long	*datap;			// pointer to data passed through NAwindow
230  */
231 
232 /* niftyapp globals */
233 extern na_win **NAhead;			/* handle to the head of the window tree */
234 extern na_win **NAtask;			/* handle to the head of the window task list */
235 extern na_win **NActask;		/* handle to the current task */
236 extern na_win *NAwin;			/* pointer to current window (NULL = no current window) */
237 extern na_menup NAmenup;		/* pointer to default menu procedure */
238 extern MenuHandle **NAmenus;	/* list of menu handles */
239 extern short NAnewitem;			/* item number of the new item on the file menu (0 = not avail) */
240 extern short NAcloseitem;		/* item number of the close item on the file menu (0 = not avail) */
241 extern short NAappleitems;		/* the number of (user) items at the top of the apple menu */
242 extern short NAhelpitems;		/* the number of (user) help items */
243 extern short NAhelpcount;   	/* the number of (system) items at the top of the help menu */
244 extern Boolean NAhasedit;		/* true if application has an edit menu */
245 extern long NAdelay;			/* the wait next event delay */
246 extern SysEnvRec NAsysenv;		/* mac system environment */
247 extern Boolean NAinBack;		/* true if application is backgrounded */
248 extern long NAmousetime;		/* time of last mouse up event */
249 extern short NAlastmouse;		/* kind of last mouse event */
250 extern Cursor NAibeam;			/* the ibeam cursor */
251 extern long NAgestaltBits;  	/* 0 = gestalt not on system */
252 
253 /* globals for your convenience */
254 extern RgnHandle NAfullRgn, NAnullRgn;
255 
256 /* niftyapp definitions */
257 
258 /* default resource id for niftyapp windows */
259 #define NA_CLIPWINDOW	1000
260 #define NA_ABOUTDLOG  	1000
261 #define NA_PREFSDLOG  	1001
262 #define NA_HELPSTR		1000
263 /* default item numbers for OK & cancel */
264 #define iOk				1
265 #define iCancel			2
266 /* default ids for APPLE, FILE, EDIT, and HELP menus */
267 #define mApple			128
268 #define mFile			129
269 #define mEdit			130
270 #define mHelp			((WORD)-16490)
271 /* default item numbers for about & edit menu */
272 #define iAbout			1
273 #define iUndo			1
274 #define iCut			3
275 #define iCopy			4
276 #define iPaste			5
277 #define iClear			6
278 #define iSelAll			7
279 #define iClipboard		9
280 /* new window positions */
281 #define NA_HFULLSCN		0x0000
282 #define NA_HQUARTERSCN	0x0001
283 #define NA_HHALFSCN		0x0002
284 #define NA_H3QUARTERSCN	0x0003
285 #define NA_VFULLSCN		0x0000
286 #define NA_VQUARTERSCN	0x0004
287 #define NA_VHALFSCN		0x0008
288 #define NA_V3QUARTERSCN	0x000C
289 #define NA_CENTERSCN	0x0000
290 #define NA_TOPSCN		0x0010
291 #define NA_BOTTOMSCN	0x0020
292 #define NA_LEFTSCN		0x0040
293 #define NA_RIGHTSCN		0x0080
294 #define NA_TITLEOFFSET	0x0100
295 /* new window flags */
296 #define NA_PLAINWIN		0x00000000L	/* plain window -- no title, simple border */
297 #define NA_COLORWINDOW	0x00000001L	/* allow color in the window */
298 #define NA_DIALOGWINDOW	0x00000002L	/* open as a dialog */
299 #define NA_TITLEBAR		0x00000004L	/* have title bar */
300 #define NA_GROWBOX		0x00000008L	/* have a grow box (enables automatic drawing) */
301 #define NA_ZOOMBOX		0x00000010L	/* have a zoom box */
302 #define NA_CLOSEBOX		0x00000020L	/* have a close box (enables close menu item) */
303 #define NA_SHADOWBORDER	0x00000040L	/* have a shadow border (for dialogs) */
304 #define NA_DOUBLEBORDER	0x00000080L	/* have a double (dialog) border */
305 #define NA_ROUNDBORDER	0x000000c0L	/* have rounded corners and black title bar */
306 #define NA_CHILDWINDOW	0x00000100L	/* open as a child window of current window */
307 #define NA_NOTVISIBLE	0x00000200L	/* do not make window visible on open */
308 #define NA_BEHIND		0x00000400L	/* open window behind current window */
309 #define NA_HASCONTROLS	0x00000800L	/* process/draw/kill controls automatically */
310 #define NA_HASTASK		0x00001000L	/* install window in background task list */
311 #define NA_USERESOURCE	0x00002000L	/* use res parameter as WIND/DLOG/wctb/dctb resource */
312 #define NA_CURSORON		0x00004000L	/* true if application has set the cursor */
313 #define NA_MODAL		0x00008000L	/* set if window/dialog will be modal */
314 #define NA_DEFBUTTON	0x00010000L	/* show default button after init proc */
315 #define NA_COPYDATA		0x00020000L	/* data will by copied by NAwindow */
316 #define NA_SMARTSIZE	0x00040000L	/* window resizes & placements are saved in WIND res */
317 #define NA_FORCESIZE	0x00080000L	/* when a resource is used, re-size the window anyway */
318 #define NA_RAWKEY		0x00100000L	/* if set, key event fields aren't stripped */
319 #define NA_HILITECTRLS	0x00200000L	/* if set, hilite controls on activate/deactive */
320 #define NATE_FLAGS		0x0f000000L	/* flags reserved for NATE */
321 #define NA_USER_FLAG1	0x10000000L	/* flags reserved for users */
322 #define NA_USER_FLAG2	0x20000000L
323 #define NA_USER_FLAG3	0x40000000L
324 #define NA_USER_FLAG4	0x80000000L
325 /* niftyapp window/task types */
326 #define NA_CLIPTYPE		-1
327 #define NA_DEBUGTYPE	-2
328 #define NA_TCPTYPE		-3
329 #define NA_SMTPTYPE		-4
330 /* mouse click types */
331 #define NA_DOWN1		0
332 #define NA_UP1			1
333 #define NA_DOWN2		2
334 #define NA_UP2			3
335 #define NA_DOWNN		4
336 #define NA_UPN			5
337 #define NA_DRAG			6
338 #define NA_RELEASE		7
339 /* return values for window/menu procedures */
340 #define NA_ALLCLOSED	-4		/* all windows are to be destroyed & exit app immediately */
341 #define NA_REQCLOSEALL	-3		/* request to close all windows & exit app */
342 #define NA_CLOSED		-2		/* current window is ready to close (used by closep/taskp) */
343 #define NA_REQCLOSE		-1		/* request to close current window */
344 #define NA_NOTPROCESSED	0		/* use any default handler available */
345 #define NA_PROCESSED	1		/* do nothing more */
346 #define NA_USERINTERACT 2		/* user interaction pending -- don't do tasks */
347 /* Gestalt bits */
348 #define NA_HASAEVENTS	0x00000001L	/* Apple events supported */
349 #define NA_HASFSSPEC    0x00000002L /* FSSpec calls supported */
350 #define NA_HASSTDFILE   0x00000004L /* New standard file available */
351 
352 /* niftyapp basic macros */
353 
354 #define NAunlockWindow(winp)		{if (!--(winp)->locks) HUnlock((Handle) GetWRefCon((winp)->pwin));}
355 #define NAunlockWindowh(winh, winp)	{if (!--(winp)->locks) HUnlock((Handle) winh);}
356 #define NAisDAWindow(pWnd)			(( (WindowPeek) pWnd)->windowKind < 0)
357 #define NAmenuh(menu)				((*NAmenus)[(menu) - mApple])
358 #define NAenableMItem(menu, item)	EnableItem(NAmenuh(menu), item)
359 #define NAdisableMItem(menu, item)	DisableItem(NAmenuh(menu), item)
360 #define NAcheckItem(menu, item, c)	CheckItem(NAmenuh(menu), item, c)
361 #define NAgetDHandle(dlg, it, hn)	{short ty; Rect r; GetDItem(dlg, it, &ty, (Handle *) (hn), &r);}
362 #define NAgetDRect(dlg, it, rct)	{short ty; Handle hn; GetDItem(dlg, it, &ty, &hn, (rct));}
363 #define NAsetIval(dlg, it, val)		{short ty; Rect r; Handle hn; GetDItem(dlg, it, &ty, &hn, &r); SetCtlValue((ControlHandle)hn, (val));}
364 #define NAsetInum(dlg, it, val)		NAsetIText(dlg, it, longtoPCstr(val))
365 #define NAalert(resid)				Alert(resid, NAfilterProc)
366 
367 /* niftyapp basic procedures */
368 
369 /* initialize the Macintosh managers and niftyapp internal variables.
370  * optionally set up a menu bar & menu procedure.
371  * Returns 0 if OK, negative if an error occured, 1 if print files requested & app should quit
372  * short minK;			// minimum K needed to execute
373  * short masters;		// number of times to call MoreMasters()
374  * na_proc *openp;		// open file procedure -- called for each application in the startup list
375  * na_proc *menup;		// pointer to a menu procedure (NULL = no menu handling)
376  * short nummenu;		// number of menus (starting at mApple == 128)
377  * short numapple;		// number of apple menu items
378  * short newitem;		// item number of new item (mFile)
379  * short closeitem;		// item number of close item (mFile)
380  */
381 short NAinit(short, short, na_openp, na_menup, short, short, short, short);
382 
383 /* call the main loop procedure
384  */
385 void NAmainloop(void);
386 
387 /* create a rectangle based on the screen size
388  *	short position;		// see above
389  */
390 Rect *NAscreenrect(short);
391 
392 /* create a new window structure
393  * returns window status result, up to the caller to pass on NA_ALLCLOSED
394  *	Rect *rpos;			// placement rectangle
395  *	long flags;			// flags determining type of window
396  *	char *title;		// window title (C string may not be NULL unless NA_USERESOURCE)
397  *	short res;			// resource number of WIND/DLOG/wctb/dctb/DITL
398  *	long *initdata;		// window data (may be NULL)
399  *	long datasize;		// bytes of window data
400  *	na_proc *initp;		// procedure to initialize the window functions, etc.
401  */
402 short NAwindow(Rect *, long, char *, short, long *, long, na_initp);
403 
404 /* create & add a new task to the task list, given pointer to task procedure,
405  * and data size
406  */
407 na_win **NAaddtask(na_taskp, long);
408 
409 /* standard init procedure for an about box -- stops all background tasks, however */
410 short NAabout(na_win*, long*);
411 
412 /* standard button flash procedure used by shell for keypresses */
413 void NAflashButton(DialogPtr, short);
414 
415 /* draw the default button */
416 void NAdefaultButton(DialogPtr);
417 
418 /* filter proc for modal dialogs which handles ESC and command-. */
419 pascal Boolean NAfilterProc(DialogPtr, EventRecord *, short *);
420 
421 /* re-calculate cursor region information (after changing winp->cursorRgn) */
422 void NAcalcCursor(na_win*);
423 
424 /* this saves a window's dimensions into a 'WIND' resource with appropriate resid */
425 void NAsaveWin(na_win*);
426 
427 /* This is available to access window structures other than the current window
428  * best for looking at parent window or child window(s).
429  */
430 na_win *NAlockWindow(na_win**);
431 
432 /* This is available, but the user should only call it is severe cases */
433 short NAcloseWindow(na_win*, short);
434 
435 /* this is for closing all windows, the user should only call it from main
436  * usually NAhead is the first parameter.
437  */
438 short NAcloseWindows(na_win**, short);
439 
440 /* this is for sending an event directly to the misc procedure of all windows.
441  * usually NAhead is the first parameter.
442  */
443 short NAallWindows(na_win**, EventRecord*);
444 
445 
446 /* niftyapp clipboard library:
447  * NAclipboard: true = window on, false = window off, 'TEXT' or 'PICT'
448  */
449 void NAclipboard(Boolean, ResType);
450 
451 
452 /* niftyapp debug library:
453  */
454 void NAdebug(char *, ...);
455 #ifdef DEBUG
456 #define NADEBUG(x) NAdebug x
457 #else
458 #define NADEBUG(x)
459 #endif
460 
461 
462 /* niftyapp dialog library:
463  */
464 /* select a radio button
465  * returns number from 0 to firstitem - lastitem: the button that's been pressed
466  *	DialogPtr dialog;	// the dialog window
467  *	short firstitem;	// the itemno of first radio button
468  *	short lastitem;		// the itemno of last radio button
469  *	short setting;		// the radio button to set (itemno to lastitem)
470  */
471 short NAradioSet(DialogPtr, short, short, short);
472 
473 /* get the itemno of the active radio button
474  *	DialogPtr dialog;	// the dialog window
475  *	short firstitem;	// the itemno of first radio button
476  *	short lastitem;		// the itemno of last radio button
477  */
478 short NAradioGet(DialogPtr, short, short);
479 
480 /* enable/disable,hilite,show/hide an item in a dialog window */
481 void NAenableDItem(DialogPtr, short, Boolean);
482 void NAhiliteDItem(DialogPtr, short, short);
483 void NAvisibleDItem(DialogPtr, short, Boolean);
484 
485 /* set/get the item text in a dialog item */
486 void NAsetIText(DialogPtr, short, PCstr*);
487 void NAgetIText(DialogPtr, short, PCstr*);
488 
489 /* enable/disable modal menus for a moveable modal dialog box (1 = go modal) */
490 void NAmodalMenus(int);
491 
492 /* handle edit menu for dialogs */
493 short NAdialogMenu(na_win *, WORD, WORD);
494 
495 
496 /* NATE (NiftyApp TextEdit) libraries
497  */
498 #define NATEflags (NA_TITLEBAR | NA_GROWBOX | NA_ZOOMBOX | NA_CLOSEBOX \
499 	| NA_HASCONTROLS | NA_HILITECTRLS)
500 #define NATE_DEFAULT	0x00000000L
501 #define NATE_READONLY	0x01000000L
502 #define NATE_NOMOUSE    0x02000000L
503 #define NATE_NOHSCROLL	0x04000000L
504 #define NATE_NOVSCROLL	0x08000000L
505 void NATEinit(na_win*, long, short, Ptr, long); /* winp, flags, horizwidth, data, len */
506 short NATEinitp(na_win*, long*);
507 short NATEmousep(na_win*, Point, short, short);
508 short NATEidlep(na_win*);
509 short NATEactivep(na_win*, Boolean);
510 short NATEkeyp(na_win*, long, short);
511 short NATEmenup(na_win*, WORD, WORD);
512 short NATEupdatep(na_win*, Boolean);
513 short NATEctrlp(na_win*, Point, short, short, ControlHandle);
514 short NATEclosep(na_win*);
515 
516 void NATEsetscroll(na_win*, Boolean, Rect*, Rect*);
517 void NATEappend(na_win*, char*, long);
518 
519 
520 /* Niftyapp file library
521  */
522 /* get a file to open -- similar to StandardGetFile, but works on older systems
523  * extra fields in "StandardFileReply" are only valid if NA_HASSTDFILE is set in
524  * NAgestaltBits
525  */
526 void NAgetFile(FileFilterProcPtr, short, SFTypeList, StandardFileReply *);
527 /* put a file to open -- similar to StandardPutFile, but works on older systems
528  * extra fields in "StandardFileReply" are only valid if NA_HASSTDFILE is set in
529  * NAgestaltBits
530  */
531 void NAputFile(Str255, Str255, StandardFileReply *);
532 
533 
534 /* Niftyapp TCP library
535  */
536 /* tcp stream descriptor */
537 typedef int na_tcp;
538 /* tcp init function
539  *  passed NATCP_connect for success, NATCP_nodriver/NATCP_nomem for failure
540  *  passed 1 to 100 for progress waiting for MacTCP to finish cleanly
541  */
542 typedef void na_tcpinitp(short);
543 /* TCP read/status callback for connection, or TCP window
544  * void *user;   Context generic pointer (passed to NATCPopen)
545  * na_tcp s;     TCP stream id
546  * short status; TCP status (see below)
547  * long size;    size of buffer (or Macintosh error)
548  * char *data;   data or NULL
549  */
550 typedef void na_tcpreadp(void *, na_tcp, short, long, char *);
551 typedef void na_readp(na_win *, short, long, char *);
552 /* TCP window */
553 typedef struct natcp_win {
554 	na_win		winp;
555 	na_tcp		s;
556 	na_readp    *readp;
557 } natcp_win;
558 /* status values/bits */
559 #define NATCP_closing  0x08		/* other end of connection closed */
560 #define NATCP_urgent   0x04		/* in urgent mode */
561 #define NATCP_more     0x02		/* more data will follow immediately */
562 #define NATCP_data     0x01		/* data to read */
563 #define NATCP_connect  0x00		/* connection ready */
564 #define NATCP_noread   -1		/* non-fatal */
565 #define NATCP_nowrite  -2		/* fatal... */
566 #define NATCP_nodriver -3
567 #define NATCP_notcpbuf -4
568 #define NATCP_nomem    -5
569 #define NATCP_nohost   -6
570 #define NATCP_nocon    -7
571 #define NATCP_closed   -8		/* connection fully closed */
572 /* open flags */
573 #define NATCP_server	0x01	/* be a server */
574 /* functions */
575 void NATCPinit(na_tcpinitp *);
576 /* NATCPsettings: TCP buffer size, type of service, precedence, write buffer size */
577 void NATCPsettings(long, short, short, unsigned short);
578 short NATCPtask(na_win *);
579 /* NATCPopen: callback, context, host, port, flags */
580 na_tcp NATCPopen(na_tcpreadp *, void *, char *, long, short);
581 na_tcp NATCPwinopen(natcp_win *, char *, long, short); /* tcp window, host, port, flags */
582 short NATCPwrite(na_tcp, Ptr, long, short); /* tcp, buffer, length, dispose */
583 short NATCPputchar(na_tcp, char);
584 void NATCPclose(na_tcp);
585 void NATCPdone(long); /* number of 1/60 sec intervals to wait for MacTCP to finish cleanly */
586 /* returns passes NATCP_connect to readp on success with hostname as argument */
587 void NATCPgethost(na_tcpreadp *, void *);
588 
589 
590 /* niftyapp SMTP library
591  */
592 /* status:
593  * void *context;	user context
594  * short code;		see below
595  * short err;		SMTP error code or NATCP error code (NASMTP_tcpfail) or 0
596  * long num;		macintosh TCP error code or address number or 0
597  * char *errstr;	SMTP error string or NULL
598  */
599 typedef void (*na_smtpstat)(void *, short, short, long, char *);
600 #define NASMTP_progress   2 /* progress: err = % done */
601 #define NASMTP_badaddr    1 /* address was not valid */
602 #define NASMTP_completed  0 /* success */
603 #define NASMTP_nomem     -1 /* not enough memory */
604 #define NASMTP_badargs   -2 /* input arguments invalid */
605 #define NASMTP_oserr     -3 /* OS failure (e.g. file error) */
606 #define NASMTP_tcpfail   -4 /* TCP connection to SMTP server failed */
607 #define NASMTP_conclosed -5 /* connection closed by other side before completion */
608 #define NASMTP_badprot   -6 /* other end sent unrecognizable protocol */
609 #define NASMTP_temperr   -7 /* SMTP persistant temporary failure */
610 #define NASMTP_permerr   -8 /* SMTP permanent failure */
611 /* Submit email: statf, server, fspec, headers, envelope, flags, context */
612 void NASMTPsubmit(na_smtpstat, char *, FSSpec *, Handle, Handle, short, void *);
613 #define NASMTP_crtrans	0x01 /* flag indicating translation of CR -> CRLF desired */
614 
615 /* PC, C string libraries:
616  */
617 #define SetClen(pcstr)	(*((pcstr) + *(pcstr) + 1) = '\0')
618 #define PCstrlen(pcstr)	(*(pcstr))
619 #define Pstrlen(pstr)	(* (unsigned char *) (pstr))
620 
621 void PtoPCstrcpy(PCstr*, char*);
622 void CtoPCstrcpy(PCstr*, char*);
623 void PCtoPCstrcpy(PCstr*, PCstr*);
624 void PtoPCstrncpy(PCstr*, char*, short);
625 void CtoPCstrncpy(PCstr*, char*, short);
626 void PtoPCstrcat(PCstr*, char*);
627 void CtoPCstrcat(PCstr*, char*);
628 PCstr *PtoPCstr(char*);
629 PCstr *CtoPCstr(char*);
630 void SetPlen(PCstr*);
631 PCstr *longtoPCstr(long);
632