@@ -71,12 +71,29 @@ Name: "erlpath"; Description: "Append Erlang directory to Path environment varia
7171
7272[Code]
7373type
74- TStringTable = array of TStringList;
74+ TElixirReleaseType = (rtRelease, rtPrerelease, rtLatestRelease, rtLatestPrerelease, rtIncompatible);
75+ TElixirRelease = record
76+ Version: String;
77+ URL: String;
78+ ReleaseType: TElixirReleaseType;
79+ Ref: TObject;
80+ end ;
81+ TErlangRelease = record
82+ OTPVersion: String;
83+ ERTSVersion: String;
84+ URL32: String;
85+ URL64: String;
86+ EXE32: String;
87+ EXE64: String;
88+ end ;
7589
7690var
7791 PSelRelease: TInputOptionWizardPage;
7892 PSelInstallType: TInputOptionWizardPage;
79- ErlangCSVInfo: TStrings;
93+
94+ ElixirReleases: array of TElixirRelease;
95+ ErlangInfo: TErlangRelease;
96+
8097 _int: Integer;
8198
8299function SplitStringRec (Str: String; Delim: String; StrList: TStringList): TStringList;
@@ -135,132 +152,78 @@ begin
135152 Result := ExpandConstant(' {tmp}\' + GetURLFilePart(' {#ERLANG_CSV_URL}' ));
136153end ;
137154
138- function GetVersion (Release: TStrings): String;
139- begin
140- Result := Release[0 ];
141- end ;
142-
143- function GetURL (Release: TStrings): String;
144- begin
145- Result := Release[1 ];
146- end ;
147-
148- function IsPrerelease (Release: TStrings): Boolean;
149- begin
150- Result := (Release[2 ] = ' prerelease' );
151- end ;
152-
153- function IsCompatibleForInstall (Release: TStrings): Boolean;
154- begin
155- Result := (StrToInt(Release[3 ]) = { #COMPAT_MASK} );
156- end ;
157-
158- function GetOTP32Name : String;
159- begin
160- Result := ' OTP ' + ErlangCSVInfo[0 ] + ' (32-bit)'
161- end ;
162-
163- function GetOTP64Name : String;
164- begin
165- Result := ' OTP ' + ErlangCSVInfo[0 ] + ' (64-bit)'
166- end ;
167-
168- function GetERTSVersion : String;
169- begin
170- Result := ErlangCSVInfo[1 ];
171- end ;
172-
173- function GetOTP32URL : String;
174- begin
175- Result := ErlangCSVInfo[2 ];
176- end ;
177-
178- function GetOTP64URL : String;
179- begin
180- Result := ErlangCSVInfo[3 ];
181- end ;
182-
183- function GetOTP32Exe : String;
184- begin
185- Result := ExpandConstant(' {tmp}\' + GetURLFilePart(GetOTP32URL));
186- end ;
187-
188- function GetOTP64Exe : String;
155+ function ReleaseTypeToString (ReleaseType: TElixirReleaseType): String;
189156begin
190- Result := ExpandConstant(' {tmp}\' + GetURLFilePart(GetOTP64URL));
157+ Result := ' Undefined' ;
158+ if ReleaseType = rtRelease then
159+ Result := ' Release' ;
160+ if ReleaseType = rtPrerelease then
161+ Result := ' Prerelease' ;
162+ if ReleaseType = rtLatestRelease then
163+ Result := ' Latest Release' ;
164+ if ReleaseType = rtLatestPrerelease then
165+ Result := ' Latest Prerelease' ;
166+ if ReleaseType = rtIncompatible then
167+ Result := ' Incompatible' ;
191168end ;
192169
193- function CSVToStringTable (Filename: String): TStringTable ;
170+ procedure CSVToElixirReleases (Filename: String; Releases: array of TElixirRelease) ;
194171var
195172 Rows: TArrayOfString;
196- i: Integer;
197- begin
198- LoadStringsFromFile(Filename, Rows);
199- SetArrayLength(Result, GetArrayLength(Rows));
200-
201- for i := 0 to GetArrayLength(Result) - 1 do begin
202- Result[i] := SplitString(Rows[i], ' ,' );
203- end ;
204- end ;
205-
206- procedure PopulatePSelReleaseListBox (StringTable: TStringTable);
207- var
208- SelectFirst: Boolean;
209- ReleaseDesc: String;
173+ RowValues: TStrings;
210174 i: Integer;
175+ LatestPrerelease: Boolean;
176+ LatestRelease: Boolean;
211177begin
212- PSelRelease.CheckListBox.Items.Clear;
213- SelectFirst := True;
214- for i := 0 to GetArrayLength(StringTable) - 1 do begin
215- if IsCompatibleForInstall(StringTable[i]) then begin
216- if IsPrerelease(StringTable[i]) then begin
217- ReleaseDesc := ' Prerelease' ;
178+ LatestPrerelease := True;
179+ LatestRelease := True;
180+
181+ LoadStringsFromFile(Filename, Rows);
182+ SetArrayLength(Releases, GetArrayLength(Rows));
183+
184+ for i := 0 to GetArrayLength(Releases) - 1 do begin
185+ RowValues := SplitString(Rows[i], ' ,' );
186+
187+ with Releases[i] do begin
188+ Version := RowValues[0 ];
189+ URL := RowValues[1 ];
190+
191+ if StrToInt(RowValues[3 ]) = { #COMPAT_MASK} then begin
192+ if RowValues[2 ] = ' prerelease' then begin
193+ if LatestPrerelease then begin
194+ ReleaseType := rtLatestPrerelease;
195+ LatestPrerelease := False;
196+ end else begin
197+ ReleaseType := rtPrerelease;
198+ end ;
199+ end else begin
200+ if LatestRelease then begin
201+ ReleaseType := rtLatestRelease;
202+ LatestRelease := False;
203+ end else begin
204+ ReleaseType := rtRelease;
205+ end ;
206+ end ;
218207 end else begin
219- ReleaseDesc := ' Release ' ;
208+ ReleaseType := rtIncompatible ;
220209 end ;
221- PSelRelease.CheckListBox.AddRadioButton(' Elixir version ' + GetVersion(StringTable[i]), ReleaseDesc, 0 , SelectFirst, True, StringTable[i]);
222- SelectFirst := False;
223- end ;
224- end ;
225- end ;
226210
227- function GetListBoxSelectedRelease (): TStrings;
228- var
229- i: Integer;
230- begin
231- for i := 0 to PSelRelease.CheckListBox.Items.Count - 1 do begin
232- if PSelRelease.CheckListBox.Checked[i] then begin
233- Result := TStrings(PSelRelease.CheckListBox.ItemObject[i]);
234- break;
211+ Ref := TObject.Create();
235212 end ;
236213 end ;
237214end ;
238215
239- function GetListBoxLatestRelease (Prerelease: Boolean): TStrings;
240- var
241- i: Integer;
242- begin
243- for i := 0 to PSelRelease.CheckListBox.Items.Count - 1 do begin
244- if Prerelease = IsPrerelease(TStrings(PSelRelease.CheckListBox.ItemObject[i])) then begin
245- Result := TStrings(PSelRelease.CheckListBox.ItemObject[i]);
246- break;
247- end ;
248- end ;
249- end ;
250-
251- function GetSelectedRelease (): TStrings;
216+ procedure ElixirReleasesToListBox (ListBox: TNewCheckListBox; Releases: array of TElixirRelease);
252217var
253218 i: Integer;
254219begin
255- for i := 0 to PSelInstallType.CheckListBox.Items.Count - 1 do begin
256- if PSelInstallType.CheckListBox.Checked[i] then begin
257- if not (PSelInstallType.CheckListBox.ItemObject[i] = nil ) then begin
258- Result := TStrings(PSelInstallType.CheckListBox.ItemObject[i]);
259- end else begin
260- Result := GetListBoxSelectedRelease();
220+ PSelRelease.CheckListBox.Items.Clear;
221+ for i := 0 to GetArrayLength(Releases) - 1 do begin
222+ with Releases[i] do begin
223+ if ReleaseType <> rtIncompatible then begin
224+ PSelRelease.CheckListBox.AddRadioButton(' Elixir version ' + Version, ReleaseTypeToString(ReleaseType), 0 , (ReleaseType = rtLatestRelease), True, Ref);
261225 end ;
262- break;
263- end ;
226+ end
264227 end ;
265228end ;
266229
@@ -279,7 +242,7 @@ begin
279242 end ;
280243
281244 if RegGetSubkeyNames(HKEY_LOCAL_MACHINE, KeyPath, Versions) then begin
282- if RegQueryStringValue(HKEY_LOCAL_MACHINE, KeyPath + ' \' + GetERTSVersion , ' ' , Path) then begin
245+ if RegQueryStringValue(HKEY_LOCAL_MACHINE, KeyPath + ' \' + ErlangInfo.ERTSVersion , ' ' , Path) then begin
283246 Result := Path;
284247 end else if RegQueryStringValue(HKEY_LOCAL_MACHINE, KeyPath + ' \' + Versions[GetArrayLength(Versions) - 1 ], ' ' , Path) then begin
285248 Result := Path;
@@ -312,10 +275,10 @@ procedure CurPageChanged(CurPageID: Integer);
312275begin
313276 if CurPageID = wpPreparing then begin
314277 if IsTaskSelected(' erlang\32' ) then begin
315- idpAddFile(GetOTP32URL , GetOTP32Exe);
278+ idpAddFile(ErlangInfo.URL32 , GetOTP32Exe);
316279 end ;
317280 if IsTaskSelected(' erlang\64' ) then begin
318- idpAddFile(GetOTP64URL , GetOTP64Exe);
281+ idpAddFile(ErlangInfo.URL64 , GetOTP64Exe);
319282 end ;
320283 idpAddFile(GetURL(GetSelectedRelease()), ExpandConstant(' {tmp}\Precompiled.zip' ));
321284 idpDownloadAfter(wpPreparing);
0 commit comments