home *** CD-ROM | disk | FTP | other *** search
/ Celestin Apprentice 4 / Apprentice-Release4.iso / Source Code / Libraries / PNL Libraries / MyInternetConfig.p < prev    next >
Encoding:
Text File  |  1995-11-02  |  9.9 KB  |  367 lines  |  [TEXT/CWIE]

  1. unit MyInternetConfig;
  2.  
  3. interface
  4.  
  5.     uses
  6.         ICTypes, ICKeys;
  7.  
  8.     var
  9.         has_IC: boolean;
  10.         internet_config_instance: ICInstance;
  11.  
  12.     procedure StartupInternetConfig;
  13.     procedure ConfigureInternetConfig(creator: OSType; required: Boolean);
  14.     function GetFilenameInfo (name: Str255; var entry: ICMapEntry; istext: boolean): boolean;
  15. { NOTE: entry will always be valid as a "best guess"}
  16.     function GetCreatorTypeInfo (fcreator, ftype: OSType; name: Str255; var entry: ICMapEntry): boolean;
  17. { NOTE: entry will always be valid as a "best guess"}
  18.     function GetTextCreator: OSType; { DONT USE FOR EDITOR HELPER! }
  19.     procedure GetBinaryCreator;
  20.     function GetTextHelper: OSType;
  21.     function GetHelper (name: Str255; var app: ICAppSpec): OSErr;
  22.     function GetICString (key: Str255; var data: Str255): OSErr;
  23.     function GetICStr (key: Str255): Str255;
  24.     function SetICString (key: Str255; data: Str255): OSErr;
  25.     function MyICBegin (perm: ICPerm): OSErr;
  26.     function MyICEnd: OSErr;
  27.     function LaunchInternetConfig:OSErr;
  28.     function CheckICUsageVersion(component_version:longint): OSErr;
  29.     function MyLaunchURL(hint,url:Str255): OSErr;
  30.     function SafeICGetPrefHandle (inst: ICInstance; key: Str255; var attr: ICAttr; var prefh: Handle): ICError;
  31.  
  32. implementation
  33.  
  34.     uses
  35.         TextUtils, Errors, Components, 
  36.         MyMemory, MySystemGlobals, MyUtils, ICAPI, MyStrings, MyProcesses, MyStartup;
  37.  
  38.     const
  39.         IC_first_entry_pos = 0;
  40.         
  41.     var
  42.         map_handle: Handle;
  43.         ic_seed: longint;
  44.         text_creator: OSType;
  45.         binary_creator: OSType;
  46.         binary_type: OSType;
  47.         binary_creator_app_name:Str63;
  48.         last_checked:longint;
  49.         g_creator: OSType;
  50.         g_required: Boolean;
  51.         
  52.     function SafeICGetPrefHandle (inst: ICInstance; key: Str255; var attr: ICAttr; var prefh: Handle): ICError;
  53.         var
  54.             err, junk:ICError;
  55.             size: longint;
  56.     begin
  57.         prefh := nil;
  58.         err := ICBegin(inst, icReadOnlyPerm);
  59.         if err = noErr then begin
  60.             err := ICGetPref(inst, key, attr, nil, size);
  61.             if err = noErr then begin
  62.                 prefh := NewHandle(size);
  63.                 HLock(prefh);
  64.                 err := ICGetPref(inst, key, attr, prefh^, size);
  65.                 HUnlock(prefh);
  66.             end;
  67.             junk := ICEnd(inst);
  68.         end;
  69.         if err <> noErr then begin
  70.             DisposeHandle(prefh);
  71.             prefh := nil;
  72.         end;
  73.         SafeICGetPrefHandle := err;
  74.     end;
  75.     
  76.     function ICMapErr (icerr: ICError): OSErr;
  77.     begin
  78.         if (icerr < -32768) or (icerr > 32767) then begin
  79.             icerr := icInternalErr;
  80.         end; (* if *)
  81.         ICMapErr := icerr;
  82.     end; (* ICMapErr *)
  83.  
  84.     function MyLaunchURL(hint,url:Str255): OSErr;
  85.         var
  86.             start,fin:longint;
  87.     begin
  88.         MyLaunchURL := -1;
  89.         if has_IC then begin
  90.             start := 0;
  91.             fin := length(url);
  92.             MyLaunchURL := ICMapErr(ICLaunchURL (internet_config_instance,hint, @url[1],length(url), start,fin));
  93.         end;
  94.     end;
  95.     
  96.     function CheckICUsageVersion(component_version:longint): OSErr;
  97.         var
  98.             err: OSErr;
  99.             component_instance: ComponentInstance;
  100.     begin
  101.         err := ICMapErr(ICGetComponentInstance(internet_config_instance, component_instance));
  102.         if err = noErr then begin
  103.             if BAND(GetComponentVersion(component_instance), $FFFF0000) < BAND(component_version, $FFFF0000) then begin
  104.                 err := unimpErr;
  105.             end;
  106.         end
  107.         else begin
  108.             err := noErr; { we work fine without a component, we just can't deal with an old component }
  109.         end;
  110.         CheckICUsageVersion := err;
  111.     end;
  112.  
  113.     function LaunchInternetConfig:OSErr;
  114.     begin
  115.         LaunchInternetConfig:= ICMapErr(ICEditPreferences (internet_config_instance,''));
  116.     end;
  117.     
  118.     function MyGetMapHandle (var hhhh: Handle): boolean;
  119.         var
  120.             seed: longint;
  121.             junk: ICError;
  122.             junk_attr: longint;
  123.     begin
  124.         if (map_handle <> nil) then begin
  125.             if last_checked<TickCount-120 then begin
  126.                 if (ICGetSeed(internet_config_instance, seed) <> noErr) | (seed <> ic_seed) then begin
  127.                     MDisposeHandle(map_handle);
  128.                 end else begin
  129.                     last_checked:=TickCount;
  130.                 end;
  131.             end;
  132.         end;
  133.  
  134.         if (map_handle = nil) then begin
  135.             junk := SafeICGetPrefHandle(internet_config_instance, kICMapping, junk_attr, map_handle);
  136.             if (map_handle <> nil) & (ICGetSeed(internet_config_instance, seed) = noErr) then begin
  137.                 text_creator := OSType(0);
  138.                 binary_creator := OSType(0);
  139.                 ic_seed := seed;
  140.             end;
  141.         end;
  142.         hhhh := map_handle;
  143.         MyGetMapHandle := hhhh <> nil;
  144.     end;
  145.  
  146.     function GetHelper (name: Str255; var app: ICAppSpec): OSErr;
  147.         var
  148.             err: OSErr;
  149.             attr: ICAttr;
  150.             prefsize: longint;
  151.     begin
  152.         if has_IC then begin
  153.             prefsize := SizeOf(ICAppSpec);
  154.             err := ICMapErr(ICGetPref(internet_config_instance, concat(kICHelper, name), attr, @app, prefsize));
  155.             if (err = noErr) & ((prefsize < 5) | (prefsize < 5 + length(app.name))) then begin
  156.                 err := badExtResource;
  157.             end;
  158.         end
  159.         else begin
  160.             err := -1;
  161.         end;
  162.         GetHelper := err;
  163.     end;
  164.  
  165.     function GetTextHelper: OSType;
  166.         var
  167.             app:ICAppSpec;
  168.     begin
  169.         if GetHelper('editor',app)=noErr then begin
  170.             GetTextHelper:=app.fCreator;
  171.         end else begin
  172.             GetTextHelper:='ttxt';
  173.         end;
  174.     end;
  175.  
  176.     function GetTextCreator: OSType;
  177.         var
  178.             dummy: boolean;
  179.             entry: ICMapEntry;
  180.             map:Handle;
  181.     begin
  182.         dummy:= MyGetMapHandle (map); { reset text_creator if the handle has changed }
  183.         if text_creator = OSType(0) then begin
  184.             dummy := GetCreatorTypeInfo('ttxt', 'TEXT', 'file.txt', entry);
  185.             text_creator := entry.file_creator;
  186.         end;
  187.         GetTextCreator := text_creator;
  188.     end;
  189.  
  190.     procedure GetBinaryCreator; { WARNING: GetBinaryCreator calls GetFilenameInfo calls GetBinaryCreator }
  191.         var
  192.             dummy: boolean;
  193.             entry: ICMapEntry;
  194.             map:Handle;
  195.     begin
  196.         dummy:= MyGetMapHandle (map); { reset binary_creator if the handle has changed }
  197.         if binary_creator = OSType(0) then begin
  198.             binary_creator := 'hDmp'; { WARNING: we must set binary_creator to avoid unending recursion! }
  199.             binary_type := 'BINA';
  200.             binary_creator_app_name := 'HexEdit';
  201.             if GetFilenameInfo('file.binary', entry, false) then begin
  202.                 binary_creator := entry.file_creator;
  203.                 binary_type := entry.file_type;
  204.                 binary_creator_app_name := entry.creator_app_name;
  205.             end;
  206.         end;
  207.     end;
  208.  
  209.     function GetCreatorTypeInfo (fcreator, ftype: OSType; name: Str255; var entry: ICMapEntry): boolean;
  210.         var
  211.             found:boolean;
  212.             entries: Handle;
  213.     begin
  214.         found := false;
  215.         if has_IC & MyGetMapHandle(entries) then begin
  216.             found:=ICMapEntriesTypeCreator(internet_config_instance, entries, ftype, fcreator, name, entry)= noErr;
  217.         end;
  218.         if not found then begin
  219.             entry.file_type := ftype;
  220.             entry.file_creator := fcreator;
  221.             entry.creator_app_name := OSTypeToString(fcreator);
  222.             if ftype = 'TEXT' then begin
  223.                 entry.flags := ICmap_data_fork_bit;
  224.                 entry.MIME_type := 'text/plain';
  225.                 entry.entry_name := 'Text File';
  226.             end
  227.             else begin
  228.                 entry.flags := ICmap_binary_bit + ICmap_data_fork_bit;
  229.                 entry.MIME_type := 'application/octet-stream';
  230.                 entry.entry_name := 'Binary File';
  231.             end;
  232.             entry.post_creator := OSType(0);
  233.             entry.extension := '';
  234.             entry.post_app_name := '';
  235.         end;
  236.         GetCreatorTypeInfo := found;
  237.     end;
  238.  
  239.     function GetFilenameInfo (name: Str255; var entry: ICMapEntry; istext: boolean): boolean;
  240.         var
  241.             found: boolean;
  242.             entries: Handle;
  243.             temp_name:Str255;
  244.     begin
  245.         found := false;
  246.         if has_IC & MyGetMapHandle(entries) then begin
  247.             found:= ICMapEntriesFilename(internet_config_instance, entries, name, entry) = noErr;
  248.             if not found & (name <> '') & (name[length(name)]='~') then begin
  249.                 temp_name := TPCopy(name, 1, length(name)-1);
  250.                 found:= ICMapEntriesFilename(internet_config_instance, entries, temp_name, entry) = noErr;
  251.             end;
  252.         end;
  253.         if not found then begin
  254.             if IsExtension(name, '.txt') or istext then begin
  255.                 entry.file_type := 'TEXT';
  256.                 entry.file_creator := GetTextCreator;
  257.                 entry.flags := ICmap_data_fork_mask;
  258.                 entry.creator_app_name := 'SimpleText';
  259.                 entry.MIME_type := 'text/plain';
  260.                 entry.entry_name := 'Text File';
  261.             end
  262.             else begin
  263.                 GetBinaryCreator;
  264.                 entry.file_type := binary_type;
  265.                 entry.file_creator := binary_creator;
  266.                 entry.creator_app_name := binary_creator_app_name;
  267.                 entry.flags := ICmap_binary_mask + ICmap_data_fork_mask;
  268.                 entry.MIME_type := 'application/octet-stream';
  269.                 entry.entry_name := 'Binary File';
  270.             end;
  271.             entry.post_creator := OSType(0);
  272.             entry.extension := '';
  273.             entry.post_app_name := '';
  274.         end;
  275.         GetFilenameInfo := found;
  276.     end;
  277.  
  278.     function GetICString (key: Str255; var data: Str255): OSErr;
  279.         var
  280.             err:OSErr;
  281.             size: longint;
  282.             junk_attr: ICAttr;
  283.     begin
  284.         if has_IC then begin
  285.             size := 256;
  286.             err := ICMapErr(ICGetPref(internet_config_instance, key, junk_attr, @data, size));
  287.         end
  288.         else begin
  289.             err := -1;
  290.         end;
  291.         if err<>noErr then begin
  292.             data:='';
  293.         end;
  294.         GetICString:=err;
  295.     end;
  296.  
  297.     function GetICStr (key: Str255): Str255;
  298.         var
  299.             data: Str255;
  300.             junk: OSErr;
  301.     begin
  302.         junk := GetICString(key, data);
  303.         GetICStr := data;
  304.     end;
  305.  
  306.     function SetICString (key: Str255; data: Str255): OSErr;
  307.     begin
  308.         SetICString := ICMapErr(ICSetPref(internet_config_instance, key, ICattr_no_change, @data, length(data) + 1));
  309.     end;
  310.  
  311.     function MyICBegin (perm: ICPerm): OSErr;
  312.     begin
  313.         MyICBegin := ICMapErr(ICBegin(internet_config_instance, perm));
  314.     end;
  315.  
  316.     function MyICEnd: OSErr;
  317.     begin
  318.         MyICEnd := ICEnd(internet_config_instance);
  319.     end;
  320.  
  321.     function InitMyInternetConfig(var msg: integer): OSStatus;
  322.         var
  323.             junk, err: ICError;
  324.             folders: ICDirSpec;
  325.     begin
  326.         msg := msg; { Unused }
  327.         last_checked:=TickCount;
  328.         map_handle := nil;
  329.         ic_seed := 0;
  330.         text_creator := OSType(0);
  331.         binary_creator := OSType(0);
  332.         err := ICStart(internet_config_instance, g_creator);
  333.         has_IC := err = noErr;
  334.         if has_IC then begin
  335.             folders.vRefNum := app_fs.vRefNum;
  336.             folders.dirID := app_fs.parID;
  337.             junk := ICFindConfigFile(internet_config_instance, 1, @folders);
  338.         end;
  339.         if not g_required then begin
  340.             err := noErr;
  341.         end;
  342.         InitMyInternetConfig := err;
  343.     end;
  344.  
  345.     procedure FinishMyInternetConfig;
  346.         var
  347.             junk: ICError;
  348.     begin
  349.         MDisposeHandle(map_handle);
  350.         if has_IC then begin
  351.             junk := ICStop(internet_config_instance);
  352.         end;
  353.     end;
  354.  
  355.     procedure ConfigureInternetConfig(creator: OSType; required: Boolean);
  356.     begin
  357.         StartupInternetConfig;
  358.         g_creator := creator;
  359.         g_required := required;
  360.     end;
  361.     
  362.     procedure StartupInternetConfig;
  363.     begin
  364.         SetStartup(InitMyInternetConfig, nil, 0, FinishMyInternetConfig);
  365.     end;
  366.     
  367. end.