From: <ou...@us...> - 2007-09-26 18:28:47
|
Revision: 2189 http://jcl.svn.sourceforge.net/jcl/?rev=2189&view=rev Author: outchy Date: 2007-09-26 11:28:42 -0700 (Wed, 26 Sep 2007) Log Message: ----------- several fixes for multiple profiles support: - support for Delphi 5 and C++Builder 5 - fixed exception if product is not supported - fixed ghost process after elevation request - fixed subversion properties - check path environment variables for all users - profile page is created only in multiple profile mode Modified Paths: -------------- trunk/jcl/install/JclInstall.pas trunk/jcl/install/JediProfiles.pas trunk/jcl/install/VclGui/JediGUIProfiles.dfm trunk/jcl/install/VclGui/JediGUIProfiles.pas trunk/jcl/source/common/JclBorlandTools.pas Property Changed: ---------------- trunk/jcl/install/JediProfiles.pas trunk/jcl/install/VclGui/JediGUIProfiles.dfm trunk/jcl/install/VclGui/JediGUIProfiles.pas Modified: trunk/jcl/install/JclInstall.pas =================================================================== --- trunk/jcl/install/JclInstall.pas 2007-09-26 11:32:58 UTC (rev 2188) +++ trunk/jcl/install/JclInstall.pas 2007-09-26 18:28:42 UTC (rev 2189) @@ -1369,10 +1369,6 @@ end; function CheckDirectories: Boolean; - {$IFDEF MSWINDOWS} - var - PathEnvVar: string; - {$ENDIF MSWINDOWS} begin Result := True; @@ -1409,21 +1405,6 @@ GUI.Dialog(Format(RsErrorCantCreatePath, [GetDcpPath]), dtError, [drCancel]); end; end; - {$IFDEF MSWINDOWS} - if CLRVersion = '' then - begin - PathEnvVar := RegReadStringDef(HKCU, RegHKCUEnvironmentVar, PathEnvironmentVar, ''); - PathListIncludeItems(PathEnvVar, RegReadStringDef(HKLM, RegHKLMEnvironmentVar, PathEnvironmentVar, '')); - ExpandEnvironmentVar(PathEnvVar); - if (PathListItemIndex(PathEnvVar, GetBplPath) = -1) and (PathListItemIndex(PathEnvVar, PathAddSeparator(GetBplPath)) = -1) - and Assigned(GUI) and (GUI.Dialog(RsWarningAddPathToEnvironment, dtWarning, [drYes, drNo]) = drYes) then - begin - PathEnvVar := RegReadStringDef(HKCU, RegHKCUEnvironmentVar, PathEnvironmentVar, ''); - PathListIncludeItems(PathEnvVar, GetBplPath); - RegWriteString(HKCU, RegHKCUEnvironmentVar, PathEnvironmentVar, PathEnvVar); - end; - end; - {$ENDIF MSWINDOWS} end; end; @@ -1790,11 +1771,29 @@ end; function RegisterPackages(ATarget: TJclBorRADToolInstallation): Boolean; + {$IFDEF MSWINDOWS} + var + PathEnvVar: string; + {$ENDIF MSWINDOWS} begin {$IFDEF MSWINDOWS} - InstallJediRegInformation(Target.ConfigDataLocation, 'JCL', - Format('%d.%d.%d.%d', [JclVersionMajor, JclVersionMinor, JclVersionRelease, JclVersionBuild]), - GetDcpPath, GetBplPath, Distribution.FJclPath, ATarget.RootKey); + if CLRVersion = '' then + begin + InstallJediRegInformation(ATarget.ConfigDataLocation, 'JCL', + Format('%d.%d.%d.%d', [JclVersionMajor, JclVersionMinor, JclVersionRelease, JclVersionBuild]), + GetDcpPath, GetBplPath, Distribution.FJclPath, ATarget.RootKey); + + PathEnvVar := RegReadStringDef(ATarget.RootKey, RegHKCUEnvironmentVar, PathEnvironmentVar, ''); + PathListIncludeItems(PathEnvVar, RegReadStringDef(HKLM, RegHKLMEnvironmentVar, PathEnvironmentVar, '')); + ExpandEnvironmentVar(PathEnvVar); + if (PathListItemIndex(PathEnvVar, GetBplPath) = -1) and (PathListItemIndex(PathEnvVar, PathAddSeparator(GetBplPath)) = -1) + and Assigned(GUI) and (GUI.Dialog(RsWarningAddPathToEnvironment, dtWarning, [drYes, drNo]) = drYes) then + begin + PathEnvVar := RegReadStringDef(ATarget.RootKey, RegHKCUEnvironmentVar, PathEnvironmentVar, ''); + PathListIncludeItems(PathEnvVar, GetBplPath); + RegWriteString(ATarget.RootKey, RegHKCUEnvironmentVar, PathEnvironmentVar, PathEnvVar); + end; + end; {$ENDIF MSWINDOWS} Result := True; end; @@ -3236,10 +3235,12 @@ brCppBuilder : Result := Target.VersionNumber in [5, 6]; brBorlandDevStudio : - Result := Target.VersionNumber in [1, 2, 3, 4, 5]; + Result := ((Target.VersionNumber in [1, 2]) and (bpDelphi32 in Target.Personalities)) + or (Target.VersionNumber in [3, 4, 5]); else Result := False; end; + Result := Result and (Target.Personalities * [bpDelphi32, bpBCBuilder32, bpDelphiNet32, bpDelphiNet64] <> []); {$ENDIF ~KYLIX} end; var @@ -3433,16 +3434,20 @@ ReadMePage := GUI.CreateReadmePage; ReadMePage.Caption := Version; ReadMePage.ReadmeFileName := FJclReadmeFileName; - FProfilesPage := GUI.CreateProfilesPage; - FProfilesPage.Caption := 'Profiles'; - Settings := InstallCore.Configuration; - if Settings <> nil then - for Index := 0 to InstallCore.ProfilesManager.ProfileCount - 1 do + if InstallCore.ProfilesManager.MultipleProfileMode then begin - ProfileName := InstallCore.ProfilesManager.ProfileNames[Index]; - if Settings.ValueExists(ProfilesSectionName, ProfileName) then - FProfilesPage.IsProfileEnabled[Index] := Settings.OptionAsBoolByName[ProfilesSectionName, ProfileName]; + FProfilesPage := GUI.CreateProfilesPage; + FProfilesPage.Caption := 'Profiles'; + + Settings := InstallCore.Configuration; + if Settings <> nil then + for Index := 0 to InstallCore.ProfilesManager.ProfileCount - 1 do + begin + ProfileName := InstallCore.ProfilesManager.ProfileNames[Index]; + if Settings.ValueExists(ProfilesSectionName, ProfileName) then + FProfilesPage.IsProfileEnabled[Index] := Settings.OptionAsBoolByName[ProfilesSectionName, ProfileName]; + end; end; end; Modified: trunk/jcl/install/JediProfiles.pas =================================================================== --- trunk/jcl/install/JediProfiles.pas 2007-09-26 11:32:58 UTC (rev 2188) +++ trunk/jcl/install/JediProfiles.pas 2007-09-26 18:28:42 UTC (rev 2189) @@ -1,291 +1,295 @@ -{**************************************************************************************************} -{ } -{ Project JEDI Code Library (JCL) extension } -{ } -{ The contents of this file are subject to the Mozilla Public License Version 1.1 (the "License"); } -{ you may not use this file except in compliance with the License. You may obtain a copy of the } -{ License at http://www.mozilla.org/MPL/ } -{ } -{ Software distributed under the License is distributed on an "AS IS" basis, WITHOUT WARRANTY OF } -{ ANY KIND, either express or implied. See the License for the specific language governing rights } -{ and limitations under the License. } -{ } -{ The Original Code is JediProfiles.pas. } -{ } -{ The Initial Developer of the Original Code is Florent Ouchet. Portions created by Florent Ouchet } -{ are Copyright (C) of Florent Ouchet. All Rights Reserved. } -{ } -{ Contributors: } -{ } -{**************************************************************************************************} -{ } -{ Core unit to manipulate multiple users' profiles at install time } -{ } -{**************************************************************************************************} -{ } -{ Last modified: $Date:: 2007-09-17 23:41:02 +0200 (lun., 17 sept. 2007) $ } -{ Revision: $Rev:: 2175 $ } -{ Author: $Author:: outchy $ } -{ } -{**************************************************************************************************} - -unit JediProfiles; - -{$I jcl.inc} - -interface - -uses - {$IFDEF MSWINDOWS} - Windows, - {$ENDIF MSWINDOWS} - SysUtils, - Classes, - JediInstall; - -type - {$IFDEF MSWINDOWS} - TJediProfile = record - UserName: string; - SID: string; - LocalProfile: string; - UserKey: HKEY; - CloseKey: Boolean; - UnloadKey: Boolean; - end; - {$ENDIF MSWINDOWS} - - TJediProfilesManager = class(TInterfacedObject, IJediProfilesManager) - private - FMultipleProfileMode: Boolean; - {$IFDEF MSWINDOWS} - FProfiles: array of TJediProfile; - procedure LoadProfiles; - {$ENDIF MSWINDOWS} - public - destructor Destroy; override; - { IJediProfileManager } - function CheckPrerequisites: Boolean; - function GetMultipleProfileMode: Boolean; - function GetProfileKey(Index: Integer): LongWord; // HKEY is Windows specific - function GetProfileCount: Integer; - function GetProfileName(Index: Integer): string; - procedure SetMultipleProfileMode(Value: Boolean); - property MultipleProfileMode: Boolean read GetMultipleProfileMode write SetMultipleProfileMode; - end; - -implementation - -{$IFDEF MSWINDOWS} -uses - JclAnsiStrings, - JclFileUtils, - JclRegistry, - JclSecurity, - JclShell, - JclSysInfo, - JclWin32; - -const - RegProfileListKey = 'SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList'; -{$ENDIF MSWINDOWS} - -//=== { TJediProfileManager } ================================================ - -destructor TJediProfilesManager.Destroy; -{$IFDEF MSWINDOWS} -var - Index: Integer; -{$ENDIF MSWINDOWS} -begin - {$IFDEF MSWINDOWS} - for Index := Low(FProfiles) to High(FProfiles) do - begin - if FProfiles[Index].CloseKey then - begin - Windows.RegFlushKey(FProfiles[Index].UserKey); - Windows.RegCloseKey(FProfiles[Index].UserKey); - end; - - if FProfiles[Index].UnloadKey then - Windows.RegUnLoadKey(HKUS, PAnsiChar(FProfiles[Index].SID)); - end; - SetLength(FProfiles, 0); - {$ENDIF MSWINDOWS} - inherited Destroy; -end; - -function TJediProfilesManager.CheckPrerequisites: Boolean; -{$IFDEF MSWINDOWS} -var - InstallGUI: IJediInstallGUI; - Fork: Boolean; - Parameters: string; - Index: Integer; -{$ENDIF MSWINDOWS} -begin - {$IFDEF MSWINDOWS} - FMultipleProfileMode := FMultipleProfileMode and IsWinNT; - Result := not FMultipleProfileMode; - if not Result then - begin - Result := IsElevated; - if not Result then - begin - // attempt to fork as an administrator - InstallGUI := InstallCore.InstallGUI; - if Assigned(InstallGUI) then - Fork := InstallGUI.Dialog('Installation requires administrator privilege, do you want to run installer with' + - ' administrator rights', dtConfirmation, [drYes, drNo]) = drYes - else - Fork := True; - if Fork then - begin - Parameters := ''; - for Index := 1 to ParamCount do - Parameters := Parameters + AnsiQuotedStr(ParamStr(Index), AnsiDoubleQuote); - ShellExecAndWait(ParamStr(0), Parameters, 'runas'); - Result := False; - end - else - begin - // single profile installation for current user - FMultipleProfileMode := False; - Result := True; - end; - end; - end; - if FMultipleProfileMode and Result then - LoadProfiles; - {$ENDIF MSWINDOWS} - {$IFDEF UNIX} - // don't know how to enumerate profiles on Linux - Result := not FMultipleProfileMode; - FMultipleProfileMode := False; - {$ENDIF UNIX} -end; - -function TJediProfilesManager.GetMultipleProfileMode: Boolean; -begin - Result := FMultipleProfileMode; -end; - -function TJediProfilesManager.GetProfileCount: Integer; -begin - {$IFDEF MSWINDOWS} - if FMultipleProfileMode then - Result := Length(FProfiles) - else - {$ENDIF MSWINDOWS} - Result := 0; -end; - -function TJediProfilesManager.GetProfileKey(Index: Integer): LongWord; -{$IFDEF MSWINDOWS} -var - NtUserFileName: string; - Key: HKEY; -{$ENDIF MSWINDOWS} -begin - {$IFDEF MSWINDOWS} - if FMultipleProfileMode then - begin - if FProfiles[Index].UserKey = 0 then - begin - if AnsiSameText(FProfiles[Index].UserName, GetLocalUserName) then - FProfiles[Index].UserKey := HKCU - else - begin - NtUserFileName := PathAddSeparator(FProfiles[Index].LocalProfile) + 'NTUSER.DAT'; - if not RegKeyExists(HKUS, '\' + FProfiles[Index].SID) then - begin - EnableProcessPrivilege(True, SE_RESTORE_NAME); - EnableProcessPrivilege(True, SE_BACKUP_NAME); - if RegLoadKey(HKUS, PAnsiChar(FProfiles[Index].SID), PAnsiChar(NtUserFileName)) = ERROR_SUCCESS then - FProfiles[Index].UnloadKey := True - else - RaiseLastOSError; - end; - if RegOpenKey(HKUS, PAnsiChar(FProfiles[Index].SID), Key) = ERROR_SUCCESS then - FProfiles[Index].CloseKey := True - else - raise EJclSecurityError.CreateFmt('Unable to load profile for user "%s"', [FProfiles[Index].UserName]); - FProfiles[Index].UserKey := Key; - end; - end; - Result := FProfiles[Index].UserKey; - end - else - Result := HKCU; - {$ENDIF MSWINDOWS} - {$IFDEF LINUX} - Result := 0; - {$ENDIF LINUX} -end; - -function TJediProfilesManager.GetProfileName(Index: Integer): string; -begin - {$IFDEF MSWINDOWS} - if FMultipleProfileMode then - Result := FProfiles[Index].UserName - else - {$ENDIF MSWINDOWS} - Result := ''; -end; - -{$IFDEF MSWINDOWS} -procedure TJediProfilesManager.LoadProfiles; -var - Index: Integer; - SID: PSID; - DataSize: Cardinal; - Name, Domain, KeyName, SIDStr, ProfileDir: string; - RegProfiles: TStrings; -begin - if FMultipleProfileMode then - begin - RegProfiles := TStringList.Create; - try - GetMem(SID, SECURITY_MAX_SID_SIZE); - try - if RegGetKeyNames(HKLM, RegProfileListKey, RegProfiles) then - for Index := 0 to RegProfiles.Count - 1 do - begin - KeyName := RegProfileListKey + '\' + RegProfiles.Strings[Index]; - if RegReadBinaryEx(HKLM, KeyName, 'Sid', SID^, SECURITY_MAX_SID_SIZE, DataSize, False) - and RegReadAnsiStringEx(HKLM, KeyName, 'ProfileImagePath', ProfileDir, False) then - begin - try - SIDStr := SIDToString(SID); - LookupAccountBySid(SID, Name, Domain); - if SameText(Domain, GetLocalComputerName) then - begin - SetLength(FProfiles, Length(FProfiles) + 1); - FProfiles[High(FProfiles)].UserName := Name; - FProfiles[High(FProfiles)].SID := SIDStr; - FProfiles[High(FProfiles)].LocalProfile := ProfileDir; - FProfiles[High(FProfiles)].UserKey := 0; - FProfiles[High(FProfiles)].CloseKey := False; - FProfiles[High(FProfiles)].UnloadKey := False; - end; - except - // trap deleted accounts - end; - end; - end; - finally - FreeMem(SID); - end; - finally - RegProfiles.Free; - end; - end; -end; -{$ENDIF MSWINDOWS} - -procedure TJediProfilesManager.SetMultipleProfileMode(Value: Boolean); -begin - FMultipleProfileMode := Value; -end; - -end. +{**************************************************************************************************} +{ } +{ Project JEDI Code Library (JCL) extension } +{ } +{ The contents of this file are subject to the Mozilla Public License Version 1.1 (the "License"); } +{ you may not use this file except in compliance with the License. You may obtain a copy of the } +{ License at http://www.mozilla.org/MPL/ } +{ } +{ Software distributed under the License is distributed on an "AS IS" basis, WITHOUT WARRANTY OF } +{ ANY KIND, either express or implied. See the License for the specific language governing rights } +{ and limitations under the License. } +{ } +{ The Original Code is JediProfiles.pas. } +{ } +{ The Initial Developer of the Original Code is Florent Ouchet. Portions created by Florent Ouchet } +{ are Copyright (C) of Florent Ouchet. All Rights Reserved. } +{ } +{ Contributors: } +{ } +{**************************************************************************************************} +{ } +{ Core unit to manipulate multiple users' profiles at install time } +{ } +{**************************************************************************************************} +{ } +{ Last modified: $Date:: $ } +{ Revision: $Rev:: $ } +{ Author: $Author:: $ } +{ } +{**************************************************************************************************} + +unit JediProfiles; + +{$I jcl.inc} + +interface + +uses + {$IFDEF MSWINDOWS} + Windows, + {$ENDIF MSWINDOWS} + SysUtils, + Classes, + JediInstall; + +type + {$IFDEF MSWINDOWS} + TJediProfile = record + UserName: string; + SID: string; + LocalProfile: string; + UserKey: HKEY; + CloseKey: Boolean; + UnloadKey: Boolean; + end; + {$ENDIF MSWINDOWS} + + TJediProfilesManager = class(TInterfacedObject, IJediProfilesManager) + private + FMultipleProfileMode: Boolean; + {$IFDEF MSWINDOWS} + FProfiles: array of TJediProfile; + procedure LoadProfiles; + {$ENDIF MSWINDOWS} + public + destructor Destroy; override; + { IJediProfileManager } + function CheckPrerequisites: Boolean; + function GetMultipleProfileMode: Boolean; + function GetProfileKey(Index: Integer): LongWord; // HKEY is Windows specific + function GetProfileCount: Integer; + function GetProfileName(Index: Integer): string; + procedure SetMultipleProfileMode(Value: Boolean); + property MultipleProfileMode: Boolean read GetMultipleProfileMode write SetMultipleProfileMode; + end; + +implementation + +{$IFDEF MSWINDOWS} +uses + JclAnsiStrings, + JclFileUtils, + JclRegistry, + JclSecurity, + JclShell, + JclSysInfo, + JclWin32; + +const + RegProfileListKey = 'SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList'; +{$ENDIF MSWINDOWS} + +//=== { TJediProfileManager } ================================================ + +destructor TJediProfilesManager.Destroy; +{$IFDEF MSWINDOWS} +var + Index: Integer; +{$ENDIF MSWINDOWS} +begin + {$IFDEF MSWINDOWS} + for Index := Low(FProfiles) to High(FProfiles) do + begin + if FProfiles[Index].CloseKey then + begin + Windows.RegFlushKey(FProfiles[Index].UserKey); + Windows.RegCloseKey(FProfiles[Index].UserKey); + end; + + if FProfiles[Index].UnloadKey then + Windows.RegUnLoadKey(HKUS, PAnsiChar(FProfiles[Index].SID)); + end; + SetLength(FProfiles, 0); + {$ENDIF MSWINDOWS} + inherited Destroy; +end; + +function TJediProfilesManager.CheckPrerequisites: Boolean; +{$IFDEF MSWINDOWS} +var + InstallGUI: IJediInstallGUI; + Fork: Boolean; + Parameters: string; + Index: Integer; +{$ENDIF MSWINDOWS} +begin + {$IFDEF MSWINDOWS} + FMultipleProfileMode := FMultipleProfileMode and IsWinNT; + Result := not FMultipleProfileMode; + if not Result then + begin + Result := IsElevated; + if not Result then + begin + // attempt to fork as an administrator + InstallGUI := InstallCore.InstallGUI; + if Assigned(InstallGUI) then + Fork := InstallGUI.Dialog('Installation requires administrator privilege, do you want to run installer with' + + ' administrator rights?', dtConfirmation, [drYes, drNo]) = drYes + else + Fork := True; + if Fork then + begin + Parameters := ''; + for Index := 1 to ParamCount do + Parameters := Parameters + AnsiQuotedStr(ParamStr(Index), AnsiDoubleQuote); + ShellExecEx(ParamStr(0), Parameters, 'runas'); + Result := False; + end + else + begin + // single profile installation for current user + FMultipleProfileMode := False; + Result := True; + end; + end; + end; + if FMultipleProfileMode and Result then + LoadProfiles; + {$ENDIF MSWINDOWS} + {$IFDEF UNIX} + // don't know how to enumerate profiles on Linux + Result := not FMultipleProfileMode; + FMultipleProfileMode := False; + {$ENDIF UNIX} +end; + +function TJediProfilesManager.GetMultipleProfileMode: Boolean; +begin + Result := FMultipleProfileMode; +end; + +function TJediProfilesManager.GetProfileCount: Integer; +begin + {$IFDEF MSWINDOWS} + if FMultipleProfileMode then + Result := Length(FProfiles) + else + {$ENDIF MSWINDOWS} + Result := 0; +end; + +function TJediProfilesManager.GetProfileKey(Index: Integer): LongWord; +{$IFDEF MSWINDOWS} +var + NtUserFileName: string; + Key: HKEY; +{$ENDIF MSWINDOWS} +begin + {$IFDEF MSWINDOWS} + if FMultipleProfileMode then + begin + if FProfiles[Index].UserKey = 0 then + begin + if AnsiSameText(FProfiles[Index].UserName, GetLocalUserName) then + FProfiles[Index].UserKey := HKCU + else + begin + NtUserFileName := PathAddSeparator(FProfiles[Index].LocalProfile) + 'NTUSER.DAT'; + if not RegKeyExists(HKUS, '\' + FProfiles[Index].SID) then + begin + EnableProcessPrivilege(True, SE_RESTORE_NAME); + EnableProcessPrivilege(True, SE_BACKUP_NAME); + if RegLoadKey(HKUS, PAnsiChar(FProfiles[Index].SID), PAnsiChar(NtUserFileName)) = ERROR_SUCCESS then + FProfiles[Index].UnloadKey := True + else + {$IFDEF COMPILER5} + RaiseLastWin32Error; + {$ELSE ~COMPILER5} + RaiseLastOSError; + {$ENDIF ~COMPILER5} + end; + if RegOpenKey(HKUS, PAnsiChar(FProfiles[Index].SID), Key) = ERROR_SUCCESS then + FProfiles[Index].CloseKey := True + else + raise EJclSecurityError.CreateFmt('Unable to load profile for user "%s"', [FProfiles[Index].UserName]); + FProfiles[Index].UserKey := Key; + end; + end; + Result := FProfiles[Index].UserKey; + end + else + Result := HKCU; + {$ENDIF MSWINDOWS} + {$IFDEF LINUX} + Result := 0; + {$ENDIF LINUX} +end; + +function TJediProfilesManager.GetProfileName(Index: Integer): string; +begin + {$IFDEF MSWINDOWS} + if FMultipleProfileMode then + Result := FProfiles[Index].UserName + else + {$ENDIF MSWINDOWS} + Result := ''; +end; + +{$IFDEF MSWINDOWS} +procedure TJediProfilesManager.LoadProfiles; +var + Index: Integer; + SID: PSID; + DataSize: Cardinal; + Name, Domain, KeyName, SIDStr, ProfileDir: string; + RegProfiles: TStrings; +begin + if FMultipleProfileMode then + begin + RegProfiles := TStringList.Create; + try + GetMem(SID, SECURITY_MAX_SID_SIZE); + try + if RegGetKeyNames(HKLM, RegProfileListKey, RegProfiles) then + for Index := 0 to RegProfiles.Count - 1 do + begin + KeyName := RegProfileListKey + '\' + RegProfiles.Strings[Index]; + if RegReadBinaryEx(HKLM, KeyName, 'Sid', SID^, SECURITY_MAX_SID_SIZE, DataSize, False) + and RegReadAnsiStringEx(HKLM, KeyName, 'ProfileImagePath', ProfileDir, False) then + begin + try + SIDStr := SIDToString(SID); + LookupAccountBySid(SID, Name, Domain); + if SameText(Domain, GetLocalComputerName) then + begin + SetLength(FProfiles, Length(FProfiles) + 1); + FProfiles[High(FProfiles)].UserName := Name; + FProfiles[High(FProfiles)].SID := SIDStr; + FProfiles[High(FProfiles)].LocalProfile := ProfileDir; + FProfiles[High(FProfiles)].UserKey := 0; + FProfiles[High(FProfiles)].CloseKey := False; + FProfiles[High(FProfiles)].UnloadKey := False; + end; + except + // trap deleted accounts + end; + end; + end; + finally + FreeMem(SID); + end; + finally + RegProfiles.Free; + end; + end; +end; +{$ENDIF MSWINDOWS} + +procedure TJediProfilesManager.SetMultipleProfileMode(Value: Boolean); +begin + FMultipleProfileMode := Value; +end; + +end. Property changes on: trunk/jcl/install/JediProfiles.pas ___________________________________________________________________ Name: svn:keywords + URL HeadURL Author LastChangedBy Date LastChangedDate Rev Revision LastChangedRevision Id Name: svn:eol-style + native Modified: trunk/jcl/install/VclGui/JediGUIProfiles.dfm =================================================================== --- trunk/jcl/install/VclGui/JediGUIProfiles.dfm 2007-09-26 11:32:58 UTC (rev 2188) +++ trunk/jcl/install/VclGui/JediGUIProfiles.dfm 2007-09-26 18:28:42 UTC (rev 2189) @@ -1,27 +1,27 @@ -object ProfilesFrame: TProfilesFrame - Left = 0 - Top = 0 - Width = 320 - Height = 240 - AutoScroll = True - TabOrder = 0 - object MemoComment: TMemo - Left = 16 - Top = 16 - Width = 281 - Height = 73 - Anchors = [akLeft, akTop, akRight] - BorderStyle = bsNone - Lines.Strings = ( - - 'Select profile in the list below. Note that only remote profiles' + - ' logged on local computer and local profiles are available.' - - 'If a profile has not IDE settings, the JCL won'#39't be installed on' + - ' it.') - ParentColor = True - ReadOnly = True - TabOrder = 0 - WordWrap = False - end -end +object ProfilesFrame: TProfilesFrame + Left = 0 + Top = 0 + Width = 320 + Height = 240 + AutoScroll = True + TabOrder = 0 + object MemoComment: TMemo + Left = 16 + Top = 16 + Width = 281 + Height = 73 + Anchors = [akLeft, akTop, akRight] + BorderStyle = bsNone + Lines.Strings = ( + + 'Select profile in the list below. Note that only remote profiles' + + ' logged on local computer and local profiles are available.' + + 'If a profile has not IDE settings, the JCL won'#39't be installed on' + + ' it.') + ParentColor = True + ReadOnly = True + TabOrder = 0 + WordWrap = False + end +end Property changes on: trunk/jcl/install/VclGui/JediGUIProfiles.dfm ___________________________________________________________________ Name: svn:eol-style + native Modified: trunk/jcl/install/VclGui/JediGUIProfiles.pas =================================================================== --- trunk/jcl/install/VclGui/JediGUIProfiles.pas 2007-09-26 11:32:58 UTC (rev 2188) +++ trunk/jcl/install/VclGui/JediGUIProfiles.pas 2007-09-26 18:28:42 UTC (rev 2189) @@ -1,103 +1,103 @@ -{**************************************************************************************************} -{ } -{ Project JEDI Code Library (JCL) extension } -{ } -{ The contents of this file are subject to the Mozilla Public License Version 1.1 (the "License"); } -{ you may not use this file except in compliance with the License. You may obtain a copy of the } -{ License at http://www.mozilla.org/MPL/ } -{ } -{ Software distributed under the License is distributed on an "AS IS" basis, WITHOUT WARRANTY OF } -{ ANY KIND, either express or implied. See the License for the specific language governing rights } -{ and limitations under the License. } -{ } -{ The Original Code is JediGUIProfiles.pas. } -{ } -{ The Initial Developer of the Original Code is Florent Ouchet. Portions created by Florent Ouchet } -{ are Copyright (C) of Florent Ouchet. All Rights Reserved. } -{ } -{ Contributors: } -{ } -{**************************************************************************************************} -{ } -{ Last modified: $Date:: 2007-09-17 23:41:02 +0200 (lun., 17 sept. 2007) $ } -{ Revision: $Rev:: 2175 $ } -{ Author: $Author:: outchy $ } -{ } -{**************************************************************************************************} - -unit JediGUIProfiles; - -{$I jcl.inc} - -interface - -uses - Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, - Dialogs, JediInstall, StdCtrls, ComCtrls; - -type - TProfilesFrame = class(TFrame, IJediProfilesPage, IJediPage) - MemoComment: TMemo; - public - constructor Create(AOwner: TComponent); override; - // IJediPage - function GetCaption: string; - procedure SetCaption(const Value: string); - function GetHintAtPos(ScreenX, ScreenY: Integer): string; - // IJediProfilesPage - function GetProfileEnabled(Index: Integer): Boolean; - procedure SetProfileEnabled(Index: Integer; Value: Boolean); - end; - -implementation - -{$R *.dfm} - -//=== { TProfilesFrame } ===================================================== - -constructor TProfilesFrame.Create(AOwner: TComponent); -var - Index: Integer; - ACheckBox: TCheckBox; - AProfilesManager: IJediProfilesManager; -begin - inherited Create(AOwner); - MemoComment.WordWrap := True; - AProfilesManager := InstallCore.ProfilesManager; - for Index := 0 to AProfilesManager.ProfileCount - 1 do - begin - ACheckBox := TCheckBox.Create(Self); - ACheckBox.SetBounds(48, Index * 32 + 100, Width - 96, ACheckBox.Height); - ACheckBox.Anchors := [akLeft, akTop, akRight]; - ACheckBox.Parent := Self; - ACheckBox.Checked := True; - ACheckBox.Caption := AProfilesManager.ProfileNames[Index]; - end; -end; - -function TProfilesFrame.GetCaption: string; -begin - Result := (Parent as TTabSheet).Caption; -end; - -function TProfilesFrame.GetHintAtPos(ScreenX, ScreenY: Integer): string; -begin - Result := ''; -end; - -function TProfilesFrame.GetProfileEnabled(Index: Integer): Boolean; -begin - Result := (Controls[Index + 1] as TCheckBox).Checked; -end; - -procedure TProfilesFrame.SetCaption(const Value: string); -begin - (Parent as TTabSheet).Caption := Value; -end; - -procedure TProfilesFrame.SetProfileEnabled(Index: Integer; Value: Boolean); -begin - (Controls[Index + 1] as TCheckBox).Checked := Value; -end; - -end. +{**************************************************************************************************} +{ } +{ Project JEDI Code Library (JCL) extension } +{ } +{ The contents of this file are subject to the Mozilla Public License Version 1.1 (the "License"); } +{ you may not use this file except in compliance with the License. You may obtain a copy of the } +{ License at http://www.mozilla.org/MPL/ } +{ } +{ Software distributed under the License is distributed on an "AS IS" basis, WITHOUT WARRANTY OF } +{ ANY KIND, either express or implied. See the License for the specific language governing rights } +{ and limitations under the License. } +{ } +{ The Original Code is JediGUIProfiles.pas. } +{ } +{ The Initial Developer of the Original Code is Florent Ouchet. Portions created by Florent Ouchet } +{ are Copyright (C) of Florent Ouchet. All Rights Reserved. } +{ } +{ Contributors: } +{ } +{**************************************************************************************************} +{ } +{ Last modified: $Date:: $ } +{ Revision: $Rev:: $ } +{ Author: $Author:: $ } +{ } +{**************************************************************************************************} + +unit JediGUIProfiles; + +{$I jcl.inc} + +interface + +uses + Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, + Dialogs, JediInstall, StdCtrls, ComCtrls; + +type + TProfilesFrame = class(TFrame, IJediProfilesPage, IJediPage) + MemoComment: TMemo; + public + constructor Create(AOwner: TComponent); override; + // IJediPage + function GetCaption: string; + procedure SetCaption(const Value: string); + function GetHintAtPos(ScreenX, ScreenY: Integer): string; + // IJediProfilesPage + function GetProfileEnabled(Index: Integer): Boolean; + procedure SetProfileEnabled(Index: Integer; Value: Boolean); + end; + +implementation + +{$R *.dfm} + +//=== { TProfilesFrame } ===================================================== + +constructor TProfilesFrame.Create(AOwner: TComponent); +var + Index: Integer; + ACheckBox: TCheckBox; + AProfilesManager: IJediProfilesManager; +begin + inherited Create(AOwner); + MemoComment.WordWrap := True; + AProfilesManager := InstallCore.ProfilesManager; + for Index := 0 to AProfilesManager.ProfileCount - 1 do + begin + ACheckBox := TCheckBox.Create(Self); + ACheckBox.SetBounds(48, Index * 32 + 100, Width - 96, ACheckBox.Height); + ACheckBox.Anchors := [akLeft, akTop, akRight]; + ACheckBox.Parent := Self; + ACheckBox.Checked := True; + ACheckBox.Caption := AProfilesManager.ProfileNames[Index]; + end; +end; + +function TProfilesFrame.GetCaption: string; +begin + Result := (Parent as TTabSheet).Caption; +end; + +function TProfilesFrame.GetHintAtPos(ScreenX, ScreenY: Integer): string; +begin + Result := ''; +end; + +function TProfilesFrame.GetProfileEnabled(Index: Integer): Boolean; +begin + Result := (Controls[Index + 1] as TCheckBox).Checked; +end; + +procedure TProfilesFrame.SetCaption(const Value: string); +begin + (Parent as TTabSheet).Caption := Value; +end; + +procedure TProfilesFrame.SetProfileEnabled(Index: Integer; Value: Boolean); +begin + (Controls[Index + 1] as TCheckBox).Checked := Value; +end; + +end. Property changes on: trunk/jcl/install/VclGui/JediGUIProfiles.pas ___________________________________________________________________ Name: svn:keywords + URL HeadURL Author LastChangedBy Date LastChangedDate Rev Revision LastChangedRevision Id Name: svn:eol-style + native Modified: trunk/jcl/source/common/JclBorlandTools.pas =================================================================== --- trunk/jcl/source/common/JclBorlandTools.pas 2007-09-26 11:32:58 UTC (rev 2188) +++ trunk/jcl/source/common/JclBorlandTools.pas 2007-09-26 18:28:42 UTC (rev 2189) @@ -791,6 +791,7 @@ procedure SetCppSearchPath(const Value: TJclBorRADToolPath); procedure SetCppLibraryPath(const Value: TJclBorRADToolPath); function GetMaxDelphiCLRVersion: string; + function GetDCCIL: TJclDCCIL; function GetMsBuildEnvOptionsFileName: string; function GetMsBuildEnvOption(const OptionName: string): string; @@ -849,7 +850,7 @@ property DualPackageInstallation: Boolean read FDualPackageInstallation write SetDualPackageInstallation; property Help2Manager: TJclHelp2Manager read FHelp2Manager; - property DCCIL: TJclDCCIL read FDCCIL; + property DCCIL: TJclDCCIL read GetDCCIL; property MaxDelphiCLRVersion: string read GetMaxDelphiCLRVersion; property PdbCreate: Boolean read FPdbCreate write FPdbCreate; end; @@ -4714,7 +4715,6 @@ inherited Create(AConfigDataLocation, ARootKey); FHelp2Manager := TJclHelp2Manager.Create(Self); - { TODO : .net 64 bit } if ConfigData.ReadString(PersonalitiesSection, 'C#Builder', '') <> '' then Include(FPersonalities, bpCSBuilder32); if ConfigData.ReadString(PersonalitiesSection, 'BCB', '') <> '' then @@ -4723,21 +4723,20 @@ Include(FPersonalities, bpDelphi32); if (ConfigData.ReadString(PersonalitiesSection, 'Delphi.NET', '') <> '') or (ConfigData.ReadString(PersonalitiesSection, 'Delphi8', '') <> '') then + begin Include(FPersonalities, bpDelphiNet32); + if VersionNumber >= 5 then + Include(FPersonalities, bpDelphiNet64); + end; if clDcc32 in CommandLineTools then Include(FPersonalities, bpDelphi32); - - if FPersonalities = [] then - raise EJclBorRadException.CreateRes(@RsENoSupportedPersonality); - - FDCCIL := TJclDCCIL.Create(Self); end; destructor TJclBDSInstallation.Destroy; begin - FDCCIL.Free; - FHelp2Manager.Free; + FreeAndNil(FDCCIL); + FreeAndNil(FHelp2Manager); inherited Destroy; end; @@ -4986,6 +4985,17 @@ Result := ConfigData.ReadString(GetCppPathsKeyName, CppLibraryPathValueName, ''); end; +function TJclBDSInstallation.GetDCCIL: TJclDCCIL; +begin + if not Assigned(FDCCIL) then + begin + if not (clDccIL in CommandLineTools) then + raise EJclBorRadException.CreateResFmt(@RsENotFound, [DccILExeName]); + FDCCIL := TJclDCCIL.Create(Self); + end; + Result := FDCCIL; +end; + function TJclBDSInstallation.GetDCPOutputPath: string; begin case IDEVersionNumber of This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |