| [453] | 1 | { **************************************************************
 | 
|---|
 | 2 |         Package: XWB - Kernel RPCBroker
 | 
|---|
 | 3 |         Date Created: Sept 18, 1997 (Version 1.1)
 | 
|---|
 | 4 |         Site Name: Oakland, OI Field Office, Dept of Veteran Affairs
 | 
|---|
 | 5 |         Developers: Danila Manapsal, Don Craven, Joel Ivey
 | 
|---|
 | 6 |         Description: Contains utilities used by the BDK.
 | 
|---|
 | 7 |         Current Release: Version 1.1 Patch 40 (January 7, 2005))
 | 
|---|
 | 8 | *************************************************************** }
 | 
|---|
 | 9 | 
 | 
|---|
 | 10 | unit Xwbut1;
 | 
|---|
 | 11 | 
 | 
|---|
 | 12 | interface
 | 
|---|
 | 13 | 
 | 
|---|
 | 14 | Uses
 | 
|---|
 | 15 | Sysutils, Classes, Messages, WinProcs, IniFiles,
 | 
|---|
 | 16 | Dialogs, Registry;
 | 
|---|
 | 17 | 
 | 
|---|
 | 18 | const
 | 
|---|
 | 19 |   xwb_ConnectAction = wm_User + 200;
 | 
|---|
 | 20 |   IniFile = 'VISTA.INI';
 | 
|---|
 | 21 |   BrokerSection = 'RPCBroker';
 | 
|---|
 | 22 |   BrokerServerSection = 'RPCBroker_Servers';
 | 
|---|
 | 23 |   TAB = #9;
 | 
|---|
 | 24 |   {For Registry interaction}
 | 
|---|
 | 25 |     {Roots}
 | 
|---|
 | 26 |     HKCR = HKEY_CLASSES_ROOT;
 | 
|---|
 | 27 |     HKCU = HKEY_CURRENT_USER;
 | 
|---|
 | 28 |     HKLM = HKEY_LOCAL_MACHINE;
 | 
|---|
 | 29 |     HKU  = HKEY_USERS;
 | 
|---|
 | 30 |     HKCC = HKEY_CURRENT_CONFIG;
 | 
|---|
 | 31 |     HKDD = HKEY_DYN_DATA;
 | 
|---|
 | 32 |     {Keys}
 | 
|---|
 | 33 |     REG_BROKER = 'Software\Vista\Broker';
 | 
|---|
 | 34 |     REG_VISTA  = 'Software\Vista';
 | 
|---|
 | 35 |     REG_SIGNON = 'Software\Vista\Signon';
 | 
|---|
 | 36 |     REG_SERVERS = 'Software\Vista\Broker\Servers';
 | 
|---|
 | 37 | 
 | 
|---|
 | 38 | var
 | 
|---|
 | 39 |   RetryLimit: integer;
 | 
|---|
 | 40 | 
 | 
|---|
 | 41 | 
 | 
|---|
 | 42 | function  BuildSect(s1: string; s2: string): string;
 | 
|---|
 | 43 | procedure GetHostList(HostList: TStrings);
 | 
|---|
 | 44 | function  GetHostsPath : String;
 | 
|---|
 | 45 | function  GetIniValue(Value, Default: string): string;
 | 
|---|
 | 46 | function  Iff(Condition: boolean; strTrue, strFalse: string): string;
 | 
|---|
 | 47 | function  Sizer (s1: string; s2: string): string;
 | 
|---|
 | 48 | function  ReadRegData(Root : HKEY; Key, Name : string) : string;
 | 
|---|
 | 49 | procedure WriteRegData(Root: HKEY; Key, Name, Value : string);
 | 
|---|
 | 50 | procedure DeleteRegData(Root: HKEY; Key, Name : string);
 | 
|---|
 | 51 | function  ReadRegDataDefault(Root: HKEY; Key, Name, Default : string) : string;
 | 
|---|
 | 52 | procedure ReadRegValues(Root: HKEY; Key : string; var RegValues : TStringList);
 | 
|---|
 | 53 | procedure ReadRegValueNames(Root:HKEY; Key : string; var RegNames : TStringlist);
 | 
|---|
 | 54 | 
 | 
|---|
 | 55 | implementation
 | 
|---|
 | 56 | 
 | 
|---|
 | 57 | 
 | 
|---|
 | 58 | 
 | 
|---|
 | 59 | {---------------------------- BuildSect ---------------------------
 | 
|---|
 | 60 | ------------------------------------------------------------------}
 | 
|---|
 | 61 | Function BuildSect(s1: string; s2: string): string;
 | 
|---|
 | 62 | var
 | 
|---|
 | 63 |    s, x: string[100];
 | 
|---|
 | 64 | begin
 | 
|---|
 | 65 |      if s2 <> '' then
 | 
|---|
 | 66 |           s := s1 + s2
 | 
|---|
 | 67 |      else
 | 
|---|
 | 68 |          s := s1;
 | 
|---|
 | 69 | 
 | 
|---|
 | 70 |      x := IntToStr(length(s));
 | 
|---|
 | 71 |      if length(x) = 1 then x := '00' + x;
 | 
|---|
 | 72 |      if length(x) = 2 then x := '0' + x;
 | 
|---|
 | 73 |      Result := x + s;
 | 
|---|
 | 74 | end;
 | 
|---|
 | 75 | 
 | 
|---|
 | 76 | 
 | 
|---|
 | 77 | 
 | 
|---|
 | 78 | {--------------------------- GetHostList --------------------------
 | 
|---|
 | 79 | Reads HOSTS file and fills the passed HostList with all
 | 
|---|
 | 80 | entries from that file.
 | 
|---|
 | 81 | ------------------------------------------------------------------}
 | 
|---|
 | 82 | procedure GetHostList(HostList: TStrings);
 | 
|---|
 | 83 | var
 | 
|---|
 | 84 |   I, SpacePos: integer;
 | 
|---|
 | 85 |   IP, HostName: string;
 | 
|---|
 | 86 |   S : string;                             //Individual line from Hosts file.
 | 
|---|
 | 87 |   WholeList: TStringList;
 | 
|---|
 | 88 | begin
 | 
|---|
 | 89 | 
 | 
|---|
 | 90 |   HostList.Clear;
 | 
|---|
 | 91 |   WholeList := nil;
 | 
|---|
 | 92 |   try
 | 
|---|
 | 93 |     WholeList := TStringList.Create;             {create temp buffer}
 | 
|---|
 | 94 |     WholeList.LoadFromFile(GetHostsPath + '\HOSTS');  {read in the file}
 | 
|---|
 | 95 |     for I := 0 to WholeList.Count - 1 do
 | 
|---|
 | 96 |     begin
 | 
|---|
 | 97 |         S := WholeList[I];
 | 
|---|
 | 98 |         {ignore lines that start with '#' and empty lines}
 | 
|---|
 | 99 |         if (Copy(S,1,1) <> '#') and (Length(S) > 0) then
 | 
|---|
 | 100 |         begin
 | 
|---|
 | 101 |            while Pos(TAB, S) > 0 do              //Convert tabs to spaces
 | 
|---|
 | 102 |               S[Pos(TAB, S)] := ' ';
 | 
|---|
 | 103 |            IP := Copy(S,1,pos(' ', S)-1);  {get IP addr}
 | 
|---|
 | 104 |            {parse out Host name}
 | 
|---|
 | 105 |            SpacePos := Length(IP) + 1;
 | 
|---|
 | 106 |            while Copy(S,SpacePos,1) = ' ' do inc(SpacePos);
 | 
|---|
 | 107 |            HostName := Copy(S,SpacePos,255);
 | 
|---|
 | 108 |            if pos(' ',HostName) > 0 then
 | 
|---|
 | 109 |               HostName := Copy(HostName,1,pos(' ',HostName)-1);
 | 
|---|
 | 110 |            if pos('#',HostName) > 0 then
 | 
|---|
 | 111 |               HostName := Copy(HostName,1,pos('#',HostName)-1);
 | 
|---|
 | 112 |            HostList.Add(HostName+'   [' + IP + ']');
 | 
|---|
 | 113 |         end{if};
 | 
|---|
 | 114 |     end{for};
 | 
|---|
 | 115 |   finally
 | 
|---|
 | 116 |     WholeList.Free;
 | 
|---|
 | 117 |   end{try};
 | 
|---|
 | 118 | end;
 | 
|---|
 | 119 | 
 | 
|---|
 | 120 | {GetHostsPath returns path to host file without terminating '\'.
 | 
|---|
 | 121 | If path in VISTA.INI that is used.  Otherwise, path is determined based
 | 
|---|
 | 122 | on default windows directory and Windows OS.}
 | 
|---|
 | 123 | function  GetHostsPath : String;
 | 
|---|
 | 124 | var
 | 
|---|
 | 125 |   OsInfo : TOSVersionInfo;                    //Type for OS info
 | 
|---|
 | 126 |   HostsPath : String;
 | 
|---|
 | 127 |   WinDir   : PChar;
 | 
|---|
 | 128 | begin
 | 
|---|
 | 129 |   Result := '';
 | 
|---|
 | 130 |   OSInfo.dwOSVersionInfoSize := SizeOf(OsInfo);
 | 
|---|
 | 131 |   GetVersionEx(OSInfo);                           // Retrieve OS info
 | 
|---|
 | 132 |   WinDir := StrAlloc(MAX_PATH + 1);
 | 
|---|
 | 133 |   GetWindowsDirectory(WinDir, MAX_PATH);          //Retieve windows directory
 | 
|---|
 | 134 |   HostsPath := StrPas(WinDir);
 | 
|---|
 | 135 |   StrDispose(WinDir);
 | 
|---|
 | 136 |   {Now check OS.  VER_PLATFORM_WIN32_WINDOWS indicates Windows 95.
 | 
|---|
 | 137 |    If Windows 95, hosts default directory is windows directory.
 | 
|---|
 | 138 |    Else assume NT and append NT's directory for hosts to windows directory.}
 | 
|---|
 | 139 |   if OSInfo.dwPlatformID <> VER_PLATFORM_WIN32_WINDOWS then
 | 
|---|
 | 140 |     HostsPath := HostsPath + '\system32\drivers\etc';
 | 
|---|
 | 141 |   HostsPath := GetIniValue('HostsPath',HostsPath);
 | 
|---|
 | 142 |   if Copy(HostsPath, Length(HostsPath), 1) = '\' then  //Strip terminating '\'
 | 
|---|
 | 143 |     HostsPath := Copy(HostsPath, 1, Length(HostsPath)-1);
 | 
|---|
 | 144 |   Result := HostsPath;
 | 
|---|
 | 145 | end;
 | 
|---|
 | 146 | 
 | 
|---|
 | 147 | 
 | 
|---|
 | 148 | {-------------------------- GetIniValue --------------------------
 | 
|---|
 | 149 | ------------------------------------------------------------------}
 | 
|---|
 | 150 | function GetIniValue(Value, Default: string): string;
 | 
|---|
 | 151 | var
 | 
|---|
 | 152 |   DhcpIni: TIniFile;
 | 
|---|
 | 153 |   pchWinDir: array[0..100] of char;
 | 
|---|
 | 154 | begin
 | 
|---|
 | 155 |   GetWindowsDirectory(pchWinDir, SizeOf(pchWinDir));
 | 
|---|
 | 156 |   DhcpIni := TIniFile.Create(IniFile);
 | 
|---|
 | 157 |   Result := DhcpIni.ReadString(BrokerSection, Value, 'Could not find!');
 | 
|---|
 | 158 |   if Result = 'Could not find!' then begin
 | 
|---|
 | 159 |      if ((Value <> 'Installing') and (GetIniValue('Installing','0') <> '1')) then
 | 
|---|
 | 160 |         {during Broker install Installing=1 so warnings should not display}
 | 
|---|
 | 161 |      begin
 | 
|---|
 | 162 |         DhcpIni.WriteString(BrokerSection, Value, Default);   {Creates vista.ini
 | 
|---|
 | 163 |                                                                if necessary}
 | 
|---|
 | 164 |      end;
 | 
|---|
 | 165 |      Result := Default;
 | 
|---|
 | 166 |   end;
 | 
|---|
 | 167 |   DhcpIni.Free;
 | 
|---|
 | 168 | end;
 | 
|---|
 | 169 | 
 | 
|---|
 | 170 | 
 | 
|---|
 | 171 | 
 | 
|---|
 | 172 | {------------------------------ Iff ------------------------------
 | 
|---|
 | 173 | ------------------------------------------------------------------}
 | 
|---|
 | 174 | function Iff(Condition: boolean; strTrue, strFalse: string): string;
 | 
|---|
 | 175 | begin
 | 
|---|
 | 176 |   if Condition then Result := strTrue else Result := strFalse;
 | 
|---|
 | 177 | end;
 | 
|---|
 | 178 | 
 | 
|---|
 | 179 | 
 | 
|---|
 | 180 | {------------------------------ Sizer -----------------------------
 | 
|---|
 | 181 | This function is used in conjunction with the ListSetUp function.  It returns
 | 
|---|
 | 182 | the number of characters found in the string passed in.  The string is
 | 
|---|
 | 183 | returned with a leading 0 for the 3 character number format required by the
 | 
|---|
 | 184 | broker call.
 | 
|---|
 | 185 | ------------------------------------------------------------------}
 | 
|---|
 | 186 | function Sizer (s1: string; s2: string): string;
 | 
|---|
 | 187 | var
 | 
|---|
 | 188 |    x: integer;
 | 
|---|
 | 189 |    st: string;
 | 
|---|
 | 190 | begin
 | 
|---|
 | 191 |   st := s1 + s2;
 | 
|---|
 | 192 |   x := Length(st);
 | 
|---|
 | 193 |   st := IntToStr(x);
 | 
|---|
 | 194 |   if length(st) < 3 then
 | 
|---|
 | 195 |      Result := '0' + st
 | 
|---|
 | 196 |   else
 | 
|---|
 | 197 |       Result := st;
 | 
|---|
 | 198 | end;
 | 
|---|
 | 199 | 
 | 
|---|
 | 200 | {Function to retrieve a data value from the Windows Registry.
 | 
|---|
 | 201 | If Key or Name does not exist, null returned.}
 | 
|---|
 | 202 | function  ReadRegData(Root: HKEY; Key, Name : string) : string;
 | 
|---|
 | 203 | var
 | 
|---|
 | 204 |   Registry: TRegistry;
 | 
|---|
 | 205 | begin
 | 
|---|
 | 206 |   Result := '';
 | 
|---|
 | 207 |   Registry := TRegistry.Create;
 | 
|---|
 | 208 |   try
 | 
|---|
 | 209 |     Registry.RootKey := Root;
 | 
|---|
 | 210 |     if Registry.OpenKeyReadOnly(Key) then
 | 
|---|
 | 211 |     begin
 | 
|---|
 | 212 |       Result := Registry.ReadString(Name);
 | 
|---|
 | 213 |       Registry.CloseKey;
 | 
|---|
 | 214 |     end;
 | 
|---|
 | 215 |   finally
 | 
|---|
 | 216 |     Registry.Free;
 | 
|---|
 | 217 |   end;
 | 
|---|
 | 218 | end;
 | 
|---|
 | 219 | 
 | 
|---|
 | 220 | {Function to set a data value into the Windows Registry.
 | 
|---|
 | 221 | If Key or Name does not exist, it is created.}
 | 
|---|
 | 222 | procedure  WriteRegData(Root: HKEY; Key, Name, Value : string);
 | 
|---|
 | 223 | var
 | 
|---|
 | 224 |   Registry: TRegistry;
 | 
|---|
 | 225 | begin
 | 
|---|
 | 226 |   Registry := TRegistry.Create;
 | 
|---|
 | 227 |   try
 | 
|---|
 | 228 |     Registry.RootKey := Root;
 | 
|---|
 | 229 |     if Registry.OpenKey(Key, True) then
 | 
|---|
 | 230 |     begin
 | 
|---|
 | 231 |       Registry.WriteString(Name, Value);
 | 
|---|
 | 232 |       Registry.CloseKey;
 | 
|---|
 | 233 |     end;
 | 
|---|
 | 234 |   finally
 | 
|---|
 | 235 |     Registry.Free;
 | 
|---|
 | 236 |   end;
 | 
|---|
 | 237 | end;
 | 
|---|
 | 238 | 
 | 
|---|
 | 239 | {Procedure to delete a data value into the Windows Registry.}
 | 
|---|
 | 240 | procedure  DeleteRegData(Root: HKEY; Key, Name : string);
 | 
|---|
 | 241 | var
 | 
|---|
 | 242 |   Registry: TRegistry;
 | 
|---|
 | 243 | begin
 | 
|---|
 | 244 |   Registry := TRegistry.Create;
 | 
|---|
 | 245 |   try
 | 
|---|
 | 246 |     Registry.RootKey := Root;
 | 
|---|
 | 247 |     if Registry.OpenKey(Key, True) then
 | 
|---|
 | 248 |     begin
 | 
|---|
 | 249 |       Registry.DeleteValue(Name);
 | 
|---|
 | 250 |       Registry.CloseKey;
 | 
|---|
 | 251 |     end;
 | 
|---|
 | 252 |   finally
 | 
|---|
 | 253 |     Registry.Free;
 | 
|---|
 | 254 |   end;
 | 
|---|
 | 255 | end;
 | 
|---|
 | 256 | 
 | 
|---|
 | 257 | 
 | 
|---|
 | 258 | {Returns string value from registry.  If value is '', then Default
 | 
|---|
 | 259 | value is filed in Registry and Default is returned.}
 | 
|---|
 | 260 | function  ReadRegDataDefault(Root: HKEY; Key, Name, Default : string) : string;
 | 
|---|
 | 261 | begin
 | 
|---|
 | 262 |   Result := ReadRegData(Root, Key, Name);
 | 
|---|
 | 263 |   if Result = '' then
 | 
|---|
 | 264 |   begin
 | 
|---|
 | 265 |     WriteRegData(Root, Key, Name, Default);
 | 
|---|
 | 266 |     Result := Default;
 | 
|---|
 | 267 |   end;
 | 
|---|
 | 268 | end;
 | 
|---|
 | 269 | 
 | 
|---|
 | 270 | {Returns name=value pairs for a key.  Format returned same as found in .ini
 | 
|---|
 | 271 | files.  Useful with the Values method of TStringList.}
 | 
|---|
 | 272 | procedure  ReadRegValues(Root: HKEY; Key : string; var RegValues : TStringList);
 | 
|---|
 | 273 | var
 | 
|---|
 | 274 |   RegNames : TStringList;
 | 
|---|
 | 275 |   Registry  : TRegistry;
 | 
|---|
 | 276 |   i         : integer;
 | 
|---|
 | 277 | begin
 | 
|---|
 | 278 |   RegNames := TStringlist.Create;
 | 
|---|
 | 279 |   Registry  := TRegistry.Create;
 | 
|---|
 | 280 |   try
 | 
|---|
 | 281 |     Registry.RootKey := Root;
 | 
|---|
 | 282 |     if Registry.OpenKeyReadOnly(Key) then
 | 
|---|
 | 283 |     begin
 | 
|---|
 | 284 |       Registry.GetValueNames(RegNames);
 | 
|---|
 | 285 |       for i := 0 to (RegNames.Count - 1) do
 | 
|---|
 | 286 |         RegValues.Add(RegNames.Strings[i] + '='
 | 
|---|
 | 287 |                    + Registry.ReadString(RegNames.Strings[i]));
 | 
|---|
 | 288 |     end
 | 
|---|
 | 289 |     else
 | 
|---|
 | 290 |       RegValues.Add('');
 | 
|---|
 | 291 |   finally
 | 
|---|
 | 292 |     Registry.Free;
 | 
|---|
 | 293 |     RegNames.Free;
 | 
|---|
 | 294 |   end;
 | 
|---|
 | 295 | end;
 | 
|---|
 | 296 | 
 | 
|---|
 | 297 | procedure ReadRegValueNames(Root:HKEY; Key : string; var RegNames : TStringlist);
 | 
|---|
 | 298 | var
 | 
|---|
 | 299 |   Registry  : TRegistry;
 | 
|---|
 | 300 |   ReturnedNames : TStringList;
 | 
|---|
 | 301 | begin
 | 
|---|
 | 302 |   RegNames.Clear;
 | 
|---|
 | 303 |   Registry  := TRegistry.Create;
 | 
|---|
 | 304 |   ReturnedNames := TStringList.Create;
 | 
|---|
 | 305 |   try
 | 
|---|
 | 306 |     Registry.RootKey := Root;
 | 
|---|
 | 307 |     if Registry.OpenKeyReadOnly(Key) then
 | 
|---|
 | 308 |     begin
 | 
|---|
 | 309 |       Registry.GetValueNames(ReturnedNames);
 | 
|---|
 | 310 |       RegNames.Assign(ReturnedNames);
 | 
|---|
 | 311 |     end;
 | 
|---|
 | 312 |   finally
 | 
|---|
 | 313 |     Registry.Free;
 | 
|---|
 | 314 |     ReturnedNames.Free;
 | 
|---|
 | 315 |   end;
 | 
|---|
 | 316 | end;
 | 
|---|
 | 317 | 
 | 
|---|
 | 318 | end.
 | 
|---|
 | 319 | 
 | 
|---|