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