This is more along the lines of what I meant:
program SRLUpdater;
type
TInclude = Record
name : String;
varName : String;
reposURL : String;
localV : integer;
onlineV : integer;
outdated : boolean;
end;
var
MainMenuItem, MenuCheck, MenuUpdate,AutoUpdate : TMenuItem;
started: Boolean;
Timer : TTimer;
Updating : boolean;
LocalP,LocalS,LocalR,OnlineP,OnlineS,OnlineR: Integer;
F: TForm;
Memo: TMemo;
but: TButton;
Includes: array of TInclude;
const
I_SRL = 0;
I_Pluggins = 1;
I_Ref = 2;
Procedure LoadIncludes;
var
i: integer;
begin
SetLength(Includes, 3);
with Includes[I_SRL] do
begin
name := 'SRL';
varName := 'SRLVersion';
reposURL := 'http://wizzup.org/static/srl/srl.tar.bz2';
onlineV := strtointdef(GetNumbers(getpage('http://wizzup.org/static/srl/srl_version')),-1);
end;
with Includes[I_Pluggins] do
begin
name := 'Pluggins';
varName := 'PlugginsVersion';
reposURL := 'http://wizzup.org/static/srl/simba_plugins.tar.bz2';
onlineV := strtointdef(GetNumbers(getpage('http://wizzup.org/static/srl/plugins_version')),-1);
end;
with Includes[I_Ref] do
begin
name := 'Reflection';
varName := 'RefVersion';
reposURL := 'http://wizzup.org/static/srl/srlref.tar.bz2';
onlineV := strtointdef(GetNumbers(getpage('http://wizzup.org/static/srl/srl_refl_version')),-1);
end;
for i := High(Includes) DownTo 0 do
begin
localV := StrToIntDef(Settings.GetKeyValueDef(Includes[i].varName, '-1'), -1);
if Includes[i].onlineV > Includes[i].localV then
Includes[i].outdated := true;
end;
end;
function GetNumbers(const str : string) : string;
var
i : integer;
begin;
for i := 1 to length(str) do
case str[i] of
'0'..'9': result := result + str[i];
end;
end;
function UpdatePlugins: Boolean;
var
I : integer;
Contents : String;
DeContents : string;
Files : TStringArray;
Failed,OverWrite : boolean;
begin
Memo.Lines.Add('Downloading the plugins...');
Contents := GetPage('http://wizzup.org/static/srl/simba_plugins.tar.bz2');
Memo.Lines.Add('Uncompressing the plugins...');
Failed := True;
if DecompressBZip2(Contents,DeContents,4096) then
if ForceDirectories(IncludePath + 'SRL/SimbaPlugins/') then
if UnTarEx(DeContents,IncludePath + 'SRL/SimbaPlugins/',true) then
begin;
Files := GetFiles(IncludePath + 'SRL/SimbaPlugins/','dll');
for i := 0 to high(Files) do
if FileExists(PluginPath + Files[i]) then
OverWrite := True;
if OverWrite then
begin;
case MessageDlg('SRL Updater', 'Do you want to overwrite the plugins?' ,mtConfirmation, [mbNo,mbYes],0) of
mrYes : Failed := not UnTarEx(DeContents,PluginPath,True)
else
Failed := not UnTarEx(DeContents,PluginPath,false);
end;
Writeln('A restart is necessary to activate the new plugins.');
end else
Failed := not UnTarEx(DeContents,PluginPath,false);
end;
if Failed then
begin
Writeln('Failed to update the plugins');
Memo.Lines.Add('Failed to update the plugins');
end
else
begin
Writeln('Succesfully updated your plugins.');
Memo.Lines.Add('Succesfully updated your plugins.');
end;
DeContents := '';
Contents := '';
Result := Failed;
if not Failed then
Settings.SetKeyValue('PluginsVersion',inttostr(OnlineP));
end;
function UpdateSRL: boolean;
var
Contents : String;
DeContents : string;
Failed : boolean;
begin
Memo.Lines.Add('Downloading SRL...');
Contents := GetPage('http://wizzup.org/static/srl/srl.tar.bz2');
Failed := True;
Memo.Lines.Add('Uncompressing SRL...');
if DecompressBZip2(Contents,DeContents,4096) then
if UnTarEx(DeContents,IncludePath,true) then
Failed := False;
if not Failed then
Settings.SetKeyValue('SRLVersion',inttostr(OnlineS));
if Result then
Result := Failed;
if not Failed then
begin
Memo.Lines.Add('Succesfully updated your SRL!');
Writeln('Succesfully updated your SRL!');
end;
end;
function UpdateRef: boolean;
var
Contents : String;
DeContents : string;
Failed : boolean;
begin
Memo.Lines.Add('Downloading Reflection...');
Contents := GetPage('http://wizzup.org/static/srl/srlref.tar.bz2');
Failed := True;
Memo.Lines.Add('Uncompressing Reflection...');
if DecompressBZip2(Contents,DeContents,4096) then
if UnTarEx(DeContents,IncludePath,true) then
Failed := False;
if not Failed then
Settings.SetKeyValue('RefVersion',inttostr(OnlineR));
if Result then
Result := Failed;
if not Failed then
begin
Memo.Lines.Add('Succesfully updated your Reflection!');
Writeln('Succesfully updated your Reflection!');
end;
end;
procedure DoUpdate(Sender: TObject);
begin
if LocalP < OnlineP then
begin
Memo.Lines.Add('Plugins update. Old version: ' + IntToStr(LocalP) +
' New version: ' + IntToStr(OnlineP));
UpdatePlugins;
end;
if LocalS < OnlineS then
begin
Memo.Lines.Add('SRL update. Old version: ' + IntToStr(LocalS) +
' New version: ' + IntToStr(OnlineS));
UpdateSRL;
end;
if LocalR < OnlineR then
begin
Memo.Lines.Add('Reflection update. Old version: ' + IntToStr(LocalR) +
' New version: ' + IntToStr(OnlineR));
UpdateRef;
end;
F.ModalResult := mrOk;
end;
function Update : boolean;
var
OpenForm: Boolean;
begin
Result := false;
if Updating then
Exit;
Updating := True;
if (LocalP < OnlineP) or (LocalS < OnlineS) then
begin
case MessageDlg('SRL Updater', 'Updates are available. '+
'Do you want to open the Updater now?',
mtConfirmation, [mbNo,mbYes],0) of
mrYes : OpenForm := True;
else
OpenForm := False;
end;
if not OpenForm then
begin
Updating := False;
Exit;
end;
Result := True;
f.ShowModal;
end else
begin
writeln('No SRL update / Plugins update available!');
end;
Updating := False;
end;
procedure OnSRLCheckClick(Sender: TObject);
var
LocalP,LocalS,OnlineP,OnlineS : integer;
begin
GetLocalVersion(LocalP,LocalS,LocalR);
GetOnlineVersion(OnlineP,OnlineS,OnlineR);
if (OnlineP > LocalP) or (OnlineS > LocalS) or (OnlineR > LocalR) then
begin;
Writeln('A new SRL version is available');
Update;
end;
end;
procedure SetAutoUpdate(Sender: TObject);
begin
AutoUpdate.Checked := not AutoUpdate.Checked;
Timer.Enabled := AutoUpdate.Checked;
if LowerCase(Settings.GetKeyValueDef('AutoUpdate','True')) = 'true' then
Settings.SetKeyValue('AutoUpdate', 'False')
else
Settings.SetKeyValue('AutoUpdate', 'True');
end;
procedure OnSRLUpdateClick(Sender: TObject);
begin
GetLocalVersion(LocalP,LocalS,LocalR);
GetOnlineVersion(OnlineP,OnlineS,OnlineR);
if (OnlineP =< LocalP) or (OnlineS =< LocalS) or (OnlineR =< LocalR) then
MessageDlg('SRL Updater', 'No SRL update / Plugins update available!', mtConfirmation, [mbYes], 0)
else
Update;
end;
procedure OnSRLSettingsClick(Sender: TObject);
begin
end;
procedure OnUpdateTimer(Sender: TObject);
begin;
Timer.Interval := 30 * 60 * 1000; //Every half hour
GetLocalVersion(LocalP,LocalS,LocalR);
GetOnlineVersion(OnlineP,OnlineS,OnlineR);
Update;
end;
procedure Init;
begin;
MainMenuItem := TMenuItem.Create(Simba_MainMenu);
MainMenuItem.Caption := 'SRL';
Simba_MainMenu.Items.Add(MainMenuItem);
MenuCheck := TMenuItem.Create(MainMenuItem);
MenuCheck.Caption := 'Check for new SRL';
MenuCheck.OnClick := @OnSRLCheckClick;
MainMenuItem.Add(MenuCheck);
MenuUpdate := TMenuItem.Create(MainMenuItem);
MenuUpdate.Caption := 'Update SRL';
MenuUpdate.OnClick := @OnSRLUpdateClick;
MainMenuItem.Add(MenuUpdate);
AutoUpdate := TMenuItem.Create(MainMenuItem);
AutoUpdate.Caption := 'Automatically update';
AutoUpdate.OnClick := @SetAutoUpdate;
AutoUpdate.Checked := LowerCase(Settings.GetKeyValueDef('AutoUpdate','True')) = 'true';
MainMenuItem.Add(AutoUpdate);
MenuSettings := TMenuItem.Create(MainMenuItem);
MenuSettings.Caption := 'Settings';
MenuSettings.OnClick := @OnSRLSettingsClick;
MenuSettings.Add(MenuUpdate);
Timer := TTimer.Create(Simba);
Timer.Interval := 5000;
Timer.OnTimer := @OnUpdateTimer;
Timer.Enabled :=AutoUpdate.Checked;
F := TForm.Create(nil);
With F Do
begin
Visible := False;
Width := 300;
Height := 300;
BorderStyle := bsSingle;
Caption := 'SRL Updater - Updates Available';
end;
but := TButton.Create(F);
with but do
begin
Parent := F;
Left := 10;
Top := 10;
Caption := 'Update';
Width := 280;
OnClick := @DoUpdate;
end;
Memo := TMemo.Create(F);
with Memo do
begin
Parent := F;
Left := 10;
Top := 40;
Width := 280;
Height := 250;
end;
started := True;
end;
procedure Free;
begin
if (started) then
Timer.Enabled := False;//Freeing the components is not needed, as they will be freed upon the freeing of Simba.
if F <> nil then
F.Free;
end;
procedure Attach;
begin;
Writeln('From now on, you shall be alerted as to when your SRL is out of date!');
MainMenuItem.Visible := True;
Timer.Enabled := AutoUpdate.Checked;
end;
Procedure Detach;
begin
Timer.Enabled := False;
MainMenuItem.Visible := False;
end;
function GetName : string;
begin;
result := 'SRL Updater';
end;
function GetVersion : string;
begin;
result := '1.0';
end;
begin
end.
Do notice that it's not finished, as I was on my way to something else :p
(I only did the records part, as it was the main idea behind my thought. With those, there's no need for code repetition.)
~RM