home *** CD-ROM | disk | FTP | other *** search
/ Celestin Apprentice 2 / Apprentice-Release2.iso / Source Code / Peter Lewis / PNL Libraries / DNR.p next >
Encoding:
Text File  |  1994-08-27  |  6.6 KB  |  275 lines  |  [TEXT/PJMM]

  1. unit DNR;
  2.  
  3. interface
  4.  
  5.     uses
  6.         TCPTypes;
  7.  
  8.     type
  9.         ResultProcPtr = ProcPtr;
  10. { procedure ResultProc(hip:hostInfoPtr; userdata:ptr); }
  11.         ResultProc2Ptr = ProcPtr;
  12. { procedure ResultProc2(hmxip:HMXInfoPtr; userdata:ptr); }
  13.         EnumResultProcPtr = ProcPtr;
  14. { procedure EnumResultProc(cerp:cacheEntryRecordPtr; userdata:ptr); }
  15.  
  16.     function OpenResolver: OSErr;
  17.     procedure CloseResolver;
  18.     function StrToAddr (host: Str255; var rtnStruct: hostInfo; completion: ResultProcPtr; userdata: Ptr): OSErr;
  19.     procedure AddrToStr (addr: longInt; var s: str255);
  20.     function EnumCache (completion: EnumResultProcPtr; userdata: ptr): OSErr;
  21.     function AddrToName (addr: longInt; var hi: hostInfo; completion: ResultProcPtr; userdata: ptr): OSErr;
  22.     function HInfo (host: Str255; var hi: hmxInfoRec; completion: ResultProc2Ptr; userdata: ptr): OSErr;
  23.     function MXInfo (host: Str255; var mxi: hmxInfoRec; completion: ResultProc2Ptr; userdata: ptr): OSErr;
  24.  
  25. implementation
  26.  
  27.     uses
  28. {$IFC undefined THINK_Pascal}
  29.         Resources, Errors, Memory, 
  30. {$ENDC}
  31.         Folders;
  32.  
  33.     var
  34.         code: Handle;
  35.  
  36.     procedure GetSystemFolder (var vrn: integer; var dirID: longInt);
  37.     begin
  38.         if FindFolder(kOnSystemDisk, kSystemFolderType, false, vrn, dirID) <> noErr then begin
  39.             vrn := 0;
  40.             dirID := 0;
  41.         end;
  42.     end;
  43.  
  44.     procedure GetCPanelFolder (var vrn: integer; var dirID: longInt);
  45.     begin
  46.         if FindFolder(kOnSystemDisk, kControlPanelFolderType, false, vrn, dirID) <> noErr then begin
  47.             vrn := 0;
  48.             dirID := 0;
  49.         end;
  50.     end;
  51.  
  52. { SearchFolderForDNRP is called to search a folder for files that might }
  53. { contain the 'dnrp' resource }
  54.     function SearchFolderForDNRP (ftype, fcreator: OSType; vrn: integer; dirID: longInt): Handle;
  55.         var
  56.             pb: HParamBlockRec;
  57.             filename: Str63;
  58.             refnum: integer;
  59.             i: integer;
  60.             h: Handle;
  61.             err: OSErr;
  62.     begin
  63.         h := nil;
  64.         i := 1;
  65.         repeat
  66.             pb.ioNamePtr := @filename;
  67.             pb.ioVRefNum := vrn;
  68.             pb.ioDirID := dirID;
  69.             pb.ioFDirIndex := i;
  70.             i := i + 1;
  71.             err := PBHGetFInfoSync(@pb);
  72.             if err = noErr then begin
  73.                 if (pb.ioFlFndrInfo.fdType = ftype) & (pb.ioFlFndrInfo.fdCreator = fcreator) then begin
  74.                     SetResLoad(false);
  75.                     refnum := HOpenResFile(vrn, dirID, filename, fsRdPerm);
  76.                     SetResLoad(true);
  77.                     if refnum <> -1 then begin
  78.                         h := Get1IndResource('dnrp', 1);
  79.                         if h <> nil then begin
  80.                             DetachResource(h);
  81.                         end;
  82.                         CloseResFile(refnum);
  83.                     end;
  84.                 end;
  85.             end;
  86.         until (err <> noErr) or (h <> nil);
  87.         SearchFolderForDNRP := h;
  88.     end;
  89.  
  90.     function SearchForDNRP: Handle;
  91.         var
  92.             h: Handle;
  93.             vrn: integer;
  94.             dirID: longInt;
  95.     begin
  96. { first search Control Panels for MacTCP 1.1 }
  97.         GetCPanelFolder(vrn, dirID);
  98.         h := SearchFolderForDNRP('cdev', 'ztcp', vrn, dirID);
  99.  
  100.         if h = nil then begin
  101. { next search System Folder for MacTCP 1.0.x }
  102.             GetSystemFolder(vrn, dirID);
  103.             h := SearchFolderForDNRP('cdev', 'mtcp', vrn, dirID);
  104.         end;
  105.  
  106.         if h = nil then begin
  107. { then search Control Panels for MacTCP 1.0.x }
  108.             GetCPanelFolder(vrn, dirID);
  109.             h := SearchFolderForDNRP('cdev', 'mtcp', vrn, dirID);
  110.         end;
  111.  
  112.         if h = nil then begin
  113. { finally, look in any open resource file }
  114.             h := Get1IndResource('dnrp', 1);
  115.             if h <> nil then begin
  116.                 DetachResource(h);
  117.             end;
  118.         end;
  119.  
  120.         SearchForDNRP := h;
  121.     end;
  122.  
  123.     function CallOpenResolver (code: ptr): OSErr;
  124.     inline
  125.         $205F, $42A7, $4878, $0001, $4E90, $504F, $3E80;
  126.  
  127.     function OpenResolver: OSErr;
  128.         var
  129.             err: OSErr;
  130.     begin
  131.         code := SearchForDNRP;
  132.         if code = nil then begin
  133.             err := resNotFound;
  134.         end
  135.         else begin
  136.             HLock(code);
  137.             err := CallOpenResolver(code^);
  138.             if err <> noErr then begin
  139.                 DisposeHandle(code);
  140.                 code := nil;
  141.             end;
  142.         end;
  143.         OpenResolver := err;
  144.     end;
  145.  
  146.     procedure CallCloseResolver (code: ptr);
  147.     inline
  148.         $205F, $4878, $0002, $4E90, $584F;
  149.  
  150.     procedure CloseResolver;
  151.     begin
  152.         if code <> nil then begin
  153.             CallCloseResolver(code^);
  154.             DisposeHandle(code);
  155.         end;
  156.     end;
  157.  
  158.     procedure P2C (var name: string);
  159.         var
  160.             len: integer;
  161.     begin
  162.         len := length(name);
  163.         BlockMove(@name[1], @name, len);
  164.         name[len] := chr(0);
  165.     end;
  166.  
  167.     function CallStrToAddr (userdata: ptr; completion: ProcPtr; var rtnStruct: hostInfo; cname: ptr; code: ptr): OSErr;
  168.     inline
  169.         $205F, $4878, $0003, $4E90, $4FEF, $0014, $3E80;
  170.  
  171.     function StrToAddr (host: Str255; var rtnStruct: hostInfo; completion: ResultProcPtr; userdata: Ptr): OSErr;
  172.         var
  173.             err: OSErr;
  174.             len: integer;
  175.     begin
  176.         if code = nil then begin
  177.             err := notOpenErr;
  178.         end
  179.         else begin
  180.             P2C(host);
  181.             err := CallStrToAddr(userdata, completion, rtnStruct, @host, code^);
  182.         end;
  183.         StrToAddr := err;
  184.     end;
  185.  
  186.     procedure CallAddrToStr (cstr: ptr; addr: longInt; code: ptr);
  187.     inline
  188.         $205F, $4878, $0004, $4E90, $4FEF, $000C;
  189.  
  190.     procedure AddrToStr (addr: longInt; var s: str255);
  191.         var
  192.             len: integer;
  193.     begin
  194.         if code <> nil then begin
  195.             CallAddrToStr(@s, addr, code^);
  196.             len := 0;
  197.             while (s[len] <> chr(0)) & (len < 255) do begin
  198.                 len := len + 1;
  199.             end;
  200.             BlockMove(@s, @s[1], len);
  201.             s[0] := chr(len);
  202.         end;
  203.     end;
  204.  
  205.     function CallEnumCache (userdata: ptr; completion: ProcPtr; code: ptr): OSErr;
  206.     inline
  207.         $205F, $4878, $0005, $4E90, $4FEF, $000C, $3E80;
  208.  
  209.     function EnumCache (completion: EnumResultProcPtr; userdata: ptr): OSErr;
  210.         var
  211.             err: OSErr;
  212.     begin
  213.         if code = nil then begin
  214.             err := notOpenErr;
  215.         end
  216.         else begin
  217.             err := CallEnumCache(userdata, completion, code^);
  218.         end;
  219.         EnumCache := err;
  220.     end;
  221.  
  222.     function CallAddrToName (userdata: ptr; completion: ProcPtr; var hi: hostInfo; addr: longInt; code: ptr): OSErr;
  223.     inline
  224.         $205F, $4878, $0006, $4E90, $4FEF, $0014, $3E80;
  225.  
  226.     function AddrToName (addr: longInt; var hi: hostInfo; completion: ResultProcPtr; userdata: ptr): OSErr;
  227.         var
  228.             err: OSErr;
  229.     begin
  230.         if code = nil then begin
  231.             err := notOpenErr;
  232.         end
  233.         else begin
  234.             err := CallAddrToName(userdata, completion, hi, addr, code^);
  235.         end;
  236.         AddrToName := err;
  237.     end;
  238.  
  239.     function CallHInfo (userdata: ptr; completion: ProcPtr; var hi: hmxInfoRec; name: ptr; code: ptr): OSErr;
  240.     inline
  241.         $205F, $4878, $0007, $4E90, $4FEF, $0014, $3E80;
  242.  
  243.     function HInfo (host: Str255; var hi: hmxInfoRec; completion: ResultProc2Ptr; userdata: ptr): OSErr;
  244.         var
  245.             err: OSErr;
  246.     begin
  247.         if code = nil then begin
  248.             err := notOpenErr;
  249.         end
  250.         else begin
  251.             P2C(host);
  252.             err := CallHInfo(userdata, completion, hi, @host, code^);
  253.         end;
  254.         HInfo := err;
  255.     end;
  256.  
  257.     function CallMXInfo (userdata: ptr; completion: ProcPtr; var hi: hmxInfoRec; name: ptr; code: ptr): OSErr;
  258.     inline
  259.         $205F, $4878, $0008, $4E90, $4FEF, $0014, $3E80;
  260.  
  261.     function MXInfo (host: Str255; var mxi: hmxInfoRec; completion: ResultProc2Ptr; userdata: ptr): OSErr;
  262.         var
  263.             err: OSErr;
  264.     begin
  265.         if code = nil then begin
  266.             err := notOpenErr;
  267.         end
  268.         else begin
  269.             P2C(host);
  270.             err := CallMXInfo(userdata, completion, mxi, @host, code^);
  271.         end;
  272.         MXInfo := err;
  273.     end;
  274.  
  275. end.