home *** CD-ROM | disk | FTP | other *** search
/ MacFormat 1995 June / MacFormat 25.iso / Shareware City / Developers / ICAppSourceKit1.0 / ICInstall.p < prev    next >
Encoding:
Text File  |  1994-11-27  |  7.4 KB  |  299 lines  |  [TEXT/PJMM]

  1. unit ICInstall;
  2.  
  3. interface
  4.  
  5.     procedure AdjustInstalMenu (menu: integer);
  6.     procedure DoInstallMenu (menu, item: integer);
  7.     procedure InitializeComponentInstalation;
  8.  
  9. implementation
  10.  
  11.     uses
  12.         Folders, Components, 
  13.  
  14.         ICTypes, ICCAPI, 
  15.  
  16.         ICMiscSubs, ICGlobals, ICStandardFile, ICDialogs;
  17.  
  18.     const            (* why aren't these in Components.p??? *)
  19.         registerCmpGlobal = 1;
  20.         registerCmpNoDuplicates = 2;
  21.         registerCompAfter = 4;
  22.  
  23.     var
  24.         application_version: longInt;
  25.         installed_version: longInt;
  26.  
  27.     function GetVersionFromResFile: longInt;
  28.         var
  29.             versh: VersRecHndl;
  30.     begin
  31.         GetVersionFromResFile := 0;
  32.         versh := VersRecHndl(Get1Resource('vers', 1));
  33.         if versh <> nil then begin
  34.             GetVersionFromResFile := versh^^.numericVersion.version;
  35.         end; (* if *)
  36.     end;
  37.  
  38.     function GetRegisteredVersion: longInt;
  39.         var
  40.             inst: ComponentInstance;
  41.             junk: OSErr;
  42.             refnum: integer;
  43.     begin
  44.         GetRegisteredVersion := 0;
  45.         if has_components then begin
  46.             inst := OpenDefaultComponent(internetConfigurationComponentType, internetConfigurationComponentSubType);
  47.             if inst <> nil then begin
  48.                 refnum := OpenComponentResFile(Component(inst));
  49.                 if refnum <> -1 then begin
  50.                     GetRegisteredVersion := GetVersionFromResFile;
  51.                     CloseResFile(refnum);
  52.                 end;
  53.                 junk := CloseComponent(inst);
  54.             end; (* if *)
  55.         end; (* if *)
  56.     end;
  57.  
  58.     function IsInstalled (var where: FSSpec): boolean;
  59.         var
  60.             err: OSErr;
  61.             ndx: integer;
  62.             found: boolean;
  63.             cpb: CInfoPBRec;
  64.             info: FInfo;
  65.     begin
  66.         err := FindFolder(kOnSystemDisk, kExtensionFolderType, true, where.vRefNum, where.parID);
  67.         where.name := GetAString(128, 12);
  68.         if err = noErr then begin
  69.             err := HGetFInfo(where.vRefNum, where.parID, where.name, info);
  70.             if err <> noErr then begin
  71.                 found := false;
  72.                 ndx := 1;
  73.                 repeat
  74.                     with cpb do begin
  75.                         ioNamePtr := @where.name;
  76.                         ioVRefNum := where.vRefNum;
  77.                         ioDirID := where.parID;
  78.                         ioFDirIndex := ndx;
  79.                     end; (* with *)
  80.                     err := PBGetCatInfoSync(@cpb);
  81.                     if err = noErr then begin
  82.                         found := (cpb.ioFlFndrInfo.fdType = 'thng') and (cpb.ioFlFndrInfo.fdCreator = ICcreator);
  83.                     end; (* if *)
  84.                     ndx := ndx + 1;
  85.                 until found or (err <> noErr);
  86.                 if not found then begin
  87.                     where.name := GetAString(128, 12);
  88.                     err := fnfErr;
  89.                 end; (* if *)
  90.             end; (* if *)
  91.         end; (* if *)
  92.         IsInstalled := (err = noErr);
  93.     end; (* IsInstalled *)
  94.  
  95.     procedure UpdateInstalledVersion (var fss: FSSpec);
  96.         var
  97.             ref: integer;
  98.             err: OSErr;
  99.     begin
  100.         installed_version := 0;
  101.         if IsInstalled(fss) then begin
  102.             ref := HOpenResFile(fss.vRefNum, fss.parID, fss.name, fsRdPerm);
  103.             err := ResError;
  104.             if err = noErr then begin
  105.                 installed_version := GetVersionFromResFile;
  106.                 CloseResFile(ref);
  107.             end; (* if *)
  108.         end;
  109.     end;
  110.  
  111.     function SaveComponentToFile (fss: FSSpec): OSErr;
  112.         var
  113.             err: OSErr;
  114.             thng: Handle;
  115.             rref: integer;
  116.             junk: OSErr;
  117.     begin
  118.         err := noErr;
  119.         thng := GetResource('ThNg', 128);
  120.         if thng = nil then begin
  121.             err := resNotFound;
  122.         end; (* if *)
  123.         if err = noErr then begin
  124.             HNoPurge(thng);
  125.             junk := HCreate(fss.vRefNum, fss.parID, fss.name, ICcreator, 'thng');
  126.             err := HOpenRF(fss.vRefNum, fss.parID, fss.name, fsRdWrPerm, rref);
  127.             if err = noErr then begin
  128.                 err := SetEOF(rref, GetHandleSize(thng));
  129.                 if err = noErr then begin
  130.                     err := FSWriteQ(rref, GetHandleSize(thng), thng^);
  131.                 end; (* if *)
  132.                 junk := FSClose(rref);
  133.             end; (* if *)
  134.             HPurge(thng);
  135.         end; (* if *)
  136.         UpdateInstalledVersion(fss); { in case we are installing or saving to the init }
  137.         SaveComponentToFile := err;
  138.     end; (* SaveComponentToFile *)
  139.  
  140.     function RegisterFile (fss: FSSpec): OSErr;
  141.         var
  142.             ref: integer;
  143.             err: OSErr;
  144.             result: longint;
  145.             err2: OSErr;
  146.     begin
  147.         ref := HOpenResFile(fss.vRefNum, fss.parID, fss.name, fsRdPerm);
  148.         err := ResError;
  149.         if err = noErr then begin
  150.             result := RegisterComponentResourceFile(ref, registerCmpGlobal);
  151.             if result > 0 then begin
  152.                 err := noErr;
  153.             end
  154.             else begin
  155.                 err := result;
  156.             end; (* if *)
  157.             CloseResFile(ref);
  158.             err2 := ResError;
  159.             if err = noErr then begin
  160.                 err := err2;
  161.             end; (* if *)
  162.         end; (* if *)
  163.         RegisterFile := err;
  164.     end; (* RegisterFile *)
  165.  
  166.     function SaveICComponent: OSErr;
  167.         var
  168.             junklong: longint;
  169.             err: OSErr;
  170.             fss: FSSpec;
  171.     begin
  172.         err := ICStandardPutFile(GetAString(128, 13), GetAString(128, 12), fss);
  173.         if err = noErr then begin
  174.             err := SaveComponentToFile(fss);
  175.         end;
  176.         SaveICComponent := err;
  177.     end; (* SaveICComponent *)
  178.  
  179.     function InstallICComponent (quiet: boolean): OSErr;
  180.         var
  181.             err: OSErr;
  182.             where: FSSpec;
  183.             prompt: Str255;
  184.             desc: Str255;
  185.             ndx: integer;
  186.             junk: integer;
  187.             registered_version: longInt;
  188.     begin
  189.         err := noErr;
  190.         registered_version := 0;
  191.         UpdateInstalledVersion(where);
  192.         if not quiet & (installed_version > 0) then begin
  193.             if installed_version < application_version then begin
  194.                 prompt := GetAString(128, 17);
  195.             end
  196.             else if installed_version < application_version then begin
  197.                 prompt := GetAString(128, 18);
  198.             end
  199.             else if installed_version = application_version then begin
  200.                 prompt := GetAString(128, 19);
  201.             end; (* if *)
  202.             ParamText(prompt, '', '', '');
  203.             InitCursor;
  204.             if CautionAlert(145, @CancelModalFilter) <> ok then begin
  205.                 err := userCanceledErr;
  206.             end; (* if *)
  207.         end; (* if *)
  208.         if err = noErr then begin
  209.             err := SaveComponentToFile(where);
  210.         end; (* if *)
  211.         if err = noErr then begin
  212.             if has_components then begin
  213.                 registered_version := GetRegisteredVersion;
  214.                 if (registered_version = 0) then begin
  215.                     err := RegisterFile(where);
  216.                 end; (* if *)
  217.             end;
  218.         end; (* if *)
  219.         if err = noErr then begin
  220.             InitCursor;
  221.             ParamText(GetAString(128, 20), '', '', '');
  222.             junk := NoteAlert(142, nil);
  223.         end; (* if *)
  224.         InstallICComponent := err;
  225.     end; (* InstallICComponent *)
  226.  
  227.     function RemoveICComponent: OSErr;
  228.         var
  229.             err: OSErr;
  230.             fss: FSSpec;
  231.             junk: integer;
  232.     begin
  233.         err := noErr;
  234.         UpdateInstalledVersion(fss);
  235.         if installed_version > 0 then begin
  236.             err := HDelete(fss.vRefNum, fss.parID, fss.name);
  237.         end;
  238.         if err = noErr then begin
  239.             if GetRegisteredVersion > 0 then begin
  240.                 junk := NoteAlert(144, nil);
  241.             end;
  242.         end;
  243.         UpdateInstalledVersion(fss);
  244.         RemoveICComponent := err;
  245.     end;
  246.  
  247.     procedure AdjustInstalMenu (menu: integer);
  248.         var
  249.             fss: FSSpec;
  250.     begin
  251.         if has_components then begin
  252.             SetItemEnable(GetMHandle(menu), IM_Install, installed_version <> application_version);
  253.         end
  254.         else begin
  255.             SetItemEnable(GetMHandle(menu), IM_Install, false);
  256.         end;
  257.         SetItemEnable(GetMHandle(menu), IM_Remove, installed_version > 0);
  258.     end;
  259.  
  260.     procedure DoInstallMenu (menu, item: integer);
  261.     begin
  262.         case item of
  263.             IM_Install: 
  264.                 DisplayError(acInstallComponent, InstallICComponent(false));
  265.             IM_Save: 
  266.                 DisplayError(acInstallComponent, SaveICComponent);
  267.             IM_Remove: 
  268.                 DisplayError(acRemoveComponent, RemoveICComponent);
  269.             otherwise
  270.                 ;
  271.         end; (* case *)
  272.     end;
  273.  
  274.     procedure InitializeComponentInstalation;
  275.         var
  276.             fss: FSSpec;
  277.             a: integer;
  278.     begin
  279.         application_version := app_version.numericVersion.version;
  280.         UpdateInstalledVersion(fss);
  281.         if has_components then begin
  282.             if installed_version < application_version then begin
  283.                 InitCursor;
  284.                 if installed_version > 0 then begin
  285.                     ParamText(GetAString(128, 22), '', '', '');
  286.                     a := NoteAlert(146, @CancelModalFilter);
  287.                 end
  288.                 else begin
  289.                     ParamText(GetAString(128, 8), '', '', '');
  290.                     a := NoteAlert(141, @CancelModalFilter);
  291.                 end;
  292.                 if a = ok then begin
  293.                     DisplayError(acInstallComponent, InstallICComponent(true));
  294.                 end; (* if *)
  295.             end;
  296.         end;
  297.     end;
  298.  
  299. end. (* ICInstall *)