This is macstuff.c in view mode; [Download] [Up]
/*** analog 1.93beta ***/ /* Please read Readme.html, or http://www.statslab.cam.ac.uk/~sret1/analog/ */ /*** macstuff.c; stuff only required for the Mac port ***/ /* The functions in this file inside #ifdef MAC_EVENTS are due to, and copyright, Jason Linhart (jason@summary.net), 1996. */ /* The functions in this file inside #ifndef NODNS are due to, and copyright, Jason Linhart and Stephan Somogyi, 1996. Version history: 950531 SCS First release 960716 JTL Switched to async OT calls and improved failure cases to not recheck 960927 JTL Added MacTCP support and combined check and open into OpenNetwork */ #include "analhea2.h" #ifdef MAC_EVENTS void MacInit(void) { SIOUXSettings.asktosaveonclose=false; printf("Processing...\n"); } void MacFini(void) { extern char *commandname; extern long Mac_good_lines, Mac_bad_lines, Mac_tab_lines; /* in sscanf.c */ extern int total_succ_reqs; extern flag warnq, anywarns; if (!Mac_good_lines && Mac_tab_lines > 4 && total_succ_reqs < 5 && warnq) { fprintf(stderr,"%s: Warning: No valid log entries found!\n", commandname); fprintf(stderr,"WebStar logs must start with a LOG_FORMAT line something like:\n"); fprintf(stderr,"!!LOG_FORMAT DATE TIME RESULT URL TRANSFER_TIME BYTES_SENT HOSTNAME REFERER\n"); fprintf(stderr,"except with the fields listed in the order they actually occur.\n"); fprintf(stderr,"WebSTAR 1.2.1 or higher should create this line automatically.\n\n"); anywarns = ON; } if (!anywarns) SIOUXSettings.autocloseonquit=true; printf("Complete!\n"); #ifndef NODNS ResolverCleanup(); #endif } void MacIdle(void) { static long time = 0; EventRecord myEvent; WindowPtr whichWindow; char theChar; if (TickCount()<time) return; time=TickCount()+6; SystemTask(); if (WaitNextEvent(everyEvent, &myEvent, 1, nil)) { if (!SIOUXHandleOneEvent(&myEvent)) switch (myEvent.what) { case mouseDown: switch (FindWindow(myEvent.where,&whichWindow)) { case inMenuBar: MenuSelect(myEvent.where); break; case inSysWindow: SystemClick(&myEvent,whichWindow); break; case inContent: SelectWindow(whichWindow); break; case inDrag: DragWindow(whichWindow,myEvent.where,&qd.screenBits.bounds); break; } break; case keyDown: theChar = myEvent.message & charCodeMask; break; case updateEvt: BeginUpdate((WindowPtr) myEvent.message); EndUpdate((WindowPtr) myEvent.message); break; } } } #endif /* (ifdef MAC_EVENTS) */ #ifdef MAC #ifndef NODNS static long OpenNetwork(void); /* Takes a string of an IP address in *hostname, resolves it to a domain name, and returns the name in *hostname. Returns nil if unresolvable (or something else went wrong), otherwise returns 1. */ /* URL processing and host lookup */ static long slNetChecked = 0, slNetPresent = 0, slNetSvcOpen = 0; static ResultUPP gMacTCPDNRResultProcUPP = nil; typedef struct { /* Open Transport Internet services provider info */ InetSvcRef ref; /* provider reference */ Boolean done; /* true when asynch operation has completed */ OTResult result; /* result code */ void *cookie; /* cookie */ } SvcInfo; static SvcInfo sSvcRef; int IpAddr2Name(char *hostname) { struct hostInfo hInfoMacTCP; OSStatus lStatus; OSErr err; InetHost lHostAddr; int cnt, tmp; char *cptr; Boolean done; if (!slNetChecked) { slNetPresent = OpenNetwork(); slNetChecked = 1; } if (slNetPresent == 1) { /* turn ascii with periods into a long */ lStatus = OTInetStringToHost(hostname, &lHostAddr); if (lStatus != noErr) return 0; /* turn the long into a reverse-resolved name */ sSvcRef.done=false; lStatus=OTInetAddressToName(sSvcRef.ref,lHostAddr,hostname); if (!lStatus) { do { MacIdle(); } while (!sSvcRef.done); lStatus=sSvcRef.result; } if (!lStatus) { if (hostname[strlen(hostname)-1]=='.') hostname[strlen(hostname)-1]=0; return(1); } } else if (slNetPresent==2) { lHostAddr=0; cptr=hostname; for (cnt=0; cnt<4; ++cnt) { if (!isdigit(*cptr)) return(0); tmp=atoi(cptr); if (tmp<0 || tmp>255) return(0); lHostAddr=(lHostAddr<<8)|tmp; while (isdigit(*cptr)) ++cptr; if (cnt!=3 && *cptr!='.') return(0); ++cptr; } memset(&hInfoMacTCP, 0, sizeof(hInfoMacTCP)); done=false; err = AddrToName(lHostAddr, &hInfoMacTCP, gMacTCPDNRResultProcUPP, (char*)&done); if (err == cacheFault) { while (!done) MacIdle(); err = hInfoMacTCP.rtnCode; } if (err == noErr) { hInfoMacTCP.cname[254] = 0; strcpy(hostname, hInfoMacTCP.cname); if (hostname[strlen(hostname)-1]=='.') hostname[strlen(hostname)-1]=0; return(1); } } return 0; } /* end IpAddr2Name() */ /* Must call this before quitting app */ void ResolverCleanup(void) { if (slNetChecked && slNetSvcOpen) { if (slNetPresent==1) OTCloseProvider(sSvcRef.ref); else if (slNetPresent==2) CloseResolver(); } } /* end ResolverCleanup() */ /* #pragma mark - */ /* Check for availbility of OT/TCP 1.1 or later, or MacTCP and open the service. Return nil if it isn't. */ static pascal void SvcNotifyProc(SvcInfo *svcInfo,OTEventCode code,OTResult result,void *cookie) { svcInfo->done=true; svcInfo->result=result; svcInfo->cookie=cookie; } static Boolean OpenInetServices(SvcInfo *svcInfo) { OSStatus result; svcInfo->done=false; result=OTAsyncOpenInternetServices(kDefaultInternetServicesPath, 0, SvcNotifyProc, svcInfo); if (!result) { do { MacIdle(); } while (!svcInfo->done); result=svcInfo->result; } if (result) return(false); svcInfo->ref=(InetSvcRef)svcInfo->cookie; return(true); } static pascal void MacTCPDNRResultProc (struct hostInfo *hInfoPtr, char *userDataPtr) { *(Boolean*)userDataPtr = true; } static long OpenNetwork(void) { OSStatus lStatus; OSErr err; long lResponse, lCriteria; err = Gestalt(gestaltOpenTpt, &lResponse); if (err == noErr) { lCriteria = gestaltOpenTptPresentMask + gestaltOpenTptTCPPresentMask; lResponse = lCriteria & lResponse; if (lResponse == lCriteria) { err = Gestalt(gestaltOpenTptVersions, &lResponse); if (err==noErr && lResponse >= 0x01108000) { /* 1.1gm */ lStatus = InitOpenTransport(); if (lStatus == noErr) { if (OpenInetServices(&sSvcRef)) { slNetSvcOpen=1; return(1); } } return(0); /* OT present, but won't open */ } } } else { gMacTCPDNRResultProcUPP = NewResultProc(MacTCPDNRResultProc); err = OpenResolver(nil); if (err == noErr) { slNetSvcOpen=1; return(2); } } return(0); } /* end OpenNetwork() */ #endif #endif
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.