To V0.3.4.0 Work-in-progress

git-svn-id: https://svn.code.sf.net/p/lazarus-ccr/svn@5712 8e941d3f-bd1b-0410-a28a-d453659cc2b4
This commit is contained in:
gbamber
2017-01-27 10:38:53 +00:00
parent d76fc59786
commit 7046b88864
8 changed files with 484 additions and 91 deletions

View File

@ -66,8 +66,8 @@ More information in the Wiki Home Page http://wiki.freepascal.org/LazAutoUpdater
along with this library; if not, write to the Free Software Foundation,
Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
"/>
<Version Minor="3" Release="3"/>
<Files Count="6">
<Version Minor="3" Release="4"/>
<Files Count="7">
<Item1>
<Filename Value="ulazautoupdate.pas"/>
<HasRegisterProc Value="True"/>
@ -94,6 +94,10 @@ More information in the Wiki Home Page http://wiki.freepascal.org/LazAutoUpdater
<Filename Value="open_ssl.pas"/>
<UnitName Value="open_ssl"/>
</Item6>
<Item7>
<Filename Value="ushortcut.pas"/>
<UnitName Value="ushortcut"/>
</Item7>
</Files>
<i18n>
<EnableI18N Value="True"/>

View File

@ -9,7 +9,7 @@ interface
uses
ulazautoupdate, aboutlazautoupdateunit, VersionSupport, uappisrunning,
lazautoupdate_httpclient, open_ssl, LazarusPackageIntf;
lazautoupdate_httpclient, open_ssl, ushortcut, LazarusPackageIntf;
implementation

View File

@ -66,6 +66,7 @@
</Target>
<SearchPaths>
<IncludeFiles Value="$(ProjOutDir)"/>
<OtherUnitFiles Value=".."/>
<UnitOutputDirectory Value="lib\$(TargetCPU)-$(TargetOS)"/>
</SearchPaths>
<CodeGeneration>

View File

@ -35,8 +35,7 @@ uses
cthreads,
{$ENDIF}{$ENDIF}
Interfaces, // this includes the LCL widgetset
Forms, umainform, open_ssl
{ you can add units after this };
Forms, umainform, open_ssl;
{$R *.res}

View File

@ -4,13 +4,13 @@
<PathDelim Value="\"/>
<Version Value="10"/>
<BuildModes Active="Win64"/>
<Units Count="22">
<Units Count="28">
<Unit0>
<Filename Value="testapp.lpr"/>
<IsPartOfProject Value="True"/>
<EditorIndex Value="2"/>
<EditorIndex Value="6"/>
<CursorPos X="25" Y="28"/>
<UsageCount Value="59"/>
<UsageCount Value="63"/>
<Loaded Value="True"/>
</Unit0>
<Unit1>
@ -20,8 +20,8 @@
<HasResources Value="True"/>
<ResourceBaseClass Value="Form"/>
<TopLine Value="8"/>
<CursorPos X="55" Y="40"/>
<UsageCount Value="59"/>
<CursorPos X="16" Y="15"/>
<UsageCount Value="63"/>
<Loaded Value="True"/>
<LoadedDesigner Value="True"/>
</Unit1>
@ -32,7 +32,7 @@
<WindowIndex Value="1"/>
<TopLine Value="31"/>
<CursorPos X="48" Y="14"/>
<UsageCount Value="42"/>
<UsageCount Value="46"/>
</Unit2>
<Unit3>
<Filename Value="..\lazautoupdate_httpclient.pas"/>
@ -43,15 +43,15 @@
<Unit4>
<Filename Value="..\ulazautoupdate.pas"/>
<IsVisibleTab Value="True"/>
<EditorIndex Value="1"/>
<TopLine Value="117"/>
<CursorPos X="10" Y="118"/>
<WindowIndex Value="1"/>
<TopLine Value="450"/>
<CursorPos X="60" Y="471"/>
<ExtraEditorCount Value="2"/>
<ExtraEditor1>
<IsVisibleTab Value="True"/>
<WindowIndex Value="1"/>
<TopLine Value="106"/>
<CursorPos X="38" Y="109"/>
<EditorIndex Value="1"/>
<TopLine Value="559"/>
<CursorPos Y="583"/>
</ExtraEditor1>
<ExtraEditor2>
<EditorIndex Value="-1"/>
@ -59,7 +59,7 @@
<TopLine Value="-1"/>
<CursorPos X="-1" Y="-1"/>
</ExtraEditor2>
<UsageCount Value="29"/>
<UsageCount Value="31"/>
<Loaded Value="True"/>
</Unit4>
<Unit5>
@ -146,7 +146,7 @@
<WindowIndex Value="1"/>
<TopLine Value="132"/>
<CursorPos X="6" Y="338"/>
<UsageCount Value="19"/>
<UsageCount Value="21"/>
<Loaded Value="True"/>
</Unit16>
<Unit17>
@ -184,130 +184,179 @@
<TopLine Value="290"/>
<UsageCount Value="10"/>
</Unit21>
<Unit22>
<Filename Value="..\ushortcut.pas"/>
<EditorIndex Value="4"/>
<TopLine Value="29"/>
<CursorPos X="8" Y="45"/>
<UsageCount Value="22"/>
<Loaded Value="True"/>
</Unit22>
<Unit23>
<Filename Value="C:\laztrunk\fpc\packages\fcl-process\src\process.pp"/>
<EditorIndex Value="-1"/>
<TopLine Value="116"/>
<CursorPos X="24" Y="125"/>
<UsageCount Value="11"/>
</Unit23>
<Unit24>
<Filename Value="C:\laztrunk\fpc\packages\winunits-base\src\shlobj.pp"/>
<EditorIndex Value="5"/>
<TopLine Value="2203"/>
<CursorPos X="56" Y="2335"/>
<UsageCount Value="11"/>
<Loaded Value="True"/>
</Unit24>
<Unit25>
<Filename Value="C:\laztrunk\fpc\rtl\objpas\classes\classesh.inc"/>
<EditorIndex Value="3"/>
<TopLine Value="399"/>
<CursorPos X="30" Y="426"/>
<UsageCount Value="10"/>
<Loaded Value="True"/>
</Unit25>
<Unit26>
<Filename Value="C:\laztrunk\fpc\rtl\win32\windows.pp"/>
<EditorIndex Value="-1"/>
<TopLine Value="12"/>
<CursorPos X="5" Y="39"/>
<UsageCount Value="10"/>
</Unit26>
<Unit27>
<Filename Value="..\aboutlazautoupdateunit.pas"/>
<EditorIndex Value="2"/>
<TopLine Value="65"/>
<CursorPos X="41" Y="86"/>
<UsageCount Value="10"/>
<Loaded Value="True"/>
</Unit27>
</Units>
<OtherDefines Count="1">
<Define0 Value="DEBUGMODE"/>
</OtherDefines>
<General>
<ActiveWindowIndexAtStart Value="1"/>
</General>
<JumpHistory Count="30" HistoryIndex="29">
<Position1>
<Filename Value="umainform.pas"/>
<Caret Line="99" Column="38" TopLine="64"/>
<Filename Value="..\ulazautoupdate.pas"/>
<Caret Line="1804" Column="20" TopLine="1777"/>
</Position1>
<Position2>
<Filename Value="umainform.pas"/>
<Caret Line="127" Column="28" TopLine="123"/>
<Filename Value="..\ushortcut.pas"/>
<Caret Line="83" Column="34" TopLine="60"/>
</Position2>
<Position3>
<Filename Value="..\ulazautoupdate.pas"/>
<Caret Line="472" Column="22" TopLine="446"/>
<Filename Value="..\ushortcut.pas"/>
<Caret Line="52" Column="94" TopLine="30"/>
</Position3>
<Position4>
<Filename Value="..\ulazautoupdate.pas"/>
<Caret Line="1094" Column="27" TopLine="1082"/>
<Filename Value="..\ushortcut.pas"/>
<Caret Line="51" TopLine="10"/>
</Position4>
<Position5>
<Filename Value="..\ulazautoupdate.pas"/>
<Caret Line="1117" Column="23" TopLine="1082"/>
<Filename Value="..\ushortcut.pas"/>
<Caret Line="91" Column="6" TopLine="64"/>
</Position5>
<Position6>
<Filename Value="..\ulazautoupdate.pas"/>
<Caret Line="1120" Column="35" TopLine="1082"/>
<Filename Value="..\ushortcut.pas"/>
<Caret Line="149" Column="31"/>
</Position6>
<Position7>
<Filename Value="..\ulazautoupdate.pas"/>
<Caret Line="1123" Column="35" TopLine="1082"/>
<Caret Line="242" Column="24" TopLine="214"/>
</Position7>
<Position8>
<Filename Value="..\ulazautoupdate.pas"/>
<Caret Line="1316" Column="25" TopLine="1298"/>
<Caret Line="241" Column="34" TopLine="215"/>
</Position8>
<Position9>
<Filename Value="..\ulazautoupdate.pas"/>
<Caret Line="1324" Column="23" TopLine="1298"/>
<Caret Line="232" Column="37" TopLine="214"/>
</Position9>
<Position10>
<Filename Value="..\ulazautoupdate.pas"/>
<Caret Line="1358" Column="73" TopLine="1264"/>
<Filename Value="C:\laztrunk\fpc\rtl\objpas\classes\classesh.inc"/>
<Caret Line="426" Column="30" TopLine="399"/>
</Position10>
<Position11>
<Filename Value="..\ulazautoupdate.pas"/>
<Caret Line="2187" Column="58" TopLine="2140"/>
<Caret Line="232" Column="36" TopLine="214"/>
</Position11>
<Position12>
<Filename Value="..\ulazautoupdate.pas"/>
<Caret Line="2216" Column="15" TopLine="2169"/>
<Caret Line="281" Column="45" TopLine="259"/>
</Position12>
<Position13>
<Filename Value="..\ulazautoupdate.pas"/>
<Caret Line="2231" Column="46" TopLine="2205"/>
<Caret Line="243" TopLine="223"/>
</Position13>
<Position14>
<Filename Value="umainform.pas"/>
<Caret Line="133" TopLine="113"/>
<Filename Value="..\ulazautoupdate.pas"/>
<Caret Line="241" Column="43" TopLine="214"/>
</Position14>
<Position15>
<Filename Value="umainform.pas"/>
<Caret Line="19" Column="43" TopLine="7"/>
<Filename Value="..\ulazautoupdate.pas"/>
<Caret Line="251" Column="21" TopLine="223"/>
</Position15>
<Position16>
<Filename Value="umainform.pas"/>
<Caret Line="153" TopLine="123"/>
<Filename Value="..\ulazautoupdate.pas"/>
<Caret Line="679" Column="49" TopLine="658"/>
</Position16>
<Position17>
<Filename Value="umainform.pas"/>
<Caret Line="165" TopLine="124"/>
<Filename Value="..\ulazautoupdate.pas"/>
<Caret Line="701" Column="38" TopLine="687"/>
</Position17>
<Position18>
<Filename Value="..\ulazautoupdate.pas"/>
<Caret Line="209" Column="24" TopLine="184"/>
<Caret Line="457" Column="37" TopLine="444"/>
</Position18>
<Position19>
<Filename Value="..\ulazautoupdate.pas"/>
<Caret Line="193" Column="17" TopLine="184"/>
<Caret Line="466" Column="23" TopLine="452"/>
</Position19>
<Position20>
<Filename Value="..\ulazautoupdate.pas"/>
<Caret Line="1929" Column="33" TopLine="1904"/>
<Caret Line="470" Column="40" TopLine="460"/>
</Position20>
<Position21>
<Filename Value="..\ulazautoupdate.pas"/>
<Caret Line="2016" Column="108" TopLine="1984"/>
<Caret Line="583" Column="36" TopLine="552"/>
</Position21>
<Position22>
<Filename Value="..\ulazautoupdate.pas"/>
<Caret Line="63" Column="65" TopLine="48"/>
<Caret Line="553" TopLine="529"/>
</Position22>
<Position23>
<Filename Value="..\ulazautoupdate.pas"/>
<Caret Line="2019" Column="6" TopLine="1987"/>
<Caret Line="545" Column="6" TopLine="523"/>
</Position23>
<Position24>
<Filename Value="..\ulazautoupdate.pas"/>
<Caret Line="1998" Column="5" TopLine="1987"/>
<Caret Line="61" Column="74" TopLine="50"/>
</Position24>
<Position25>
<Filename Value="..\ulazautoupdate.pas"/>
<Caret Line="6" Column="10"/>
<Caret Line="570" Column="28" TopLine="542"/>
</Position25>
<Position26>
<Filename Value="..\ulazautoupdate.pas"/>
<Caret Line="117" Column="48" TopLine="79"/>
<Caret Line="621" Column="46" TopLine="582"/>
</Position26>
<Position27>
<Filename Value="..\ulazautoupdate.pas"/>
<Caret Line="118" Column="24" TopLine="80"/>
<Caret Line="629" Column="65" TopLine="593"/>
</Position27>
<Position28>
<Filename Value="..\ulazautoupdate.pas"/>
<Caret Line="318" Column="28" TopLine="282"/>
<Caret Line="637" Column="51" TopLine="615"/>
</Position28>
<Position29>
<Filename Value="..\ulazautoupdate.pas"/>
<Caret Line="922" Column="58" TopLine="884"/>
<Caret Line="639" Column="8" TopLine="615"/>
</Position29>
<Position30>
<Filename Value="..\ulazautoupdate.pas"/>
<Caret Line="934" Column="58" TopLine="896"/>
<Caret Line="637" Column="50" TopLine="616"/>
</Position30>
</JumpHistory>
</ProjectSession>

View File

@ -125,6 +125,8 @@ object mainform: Tmainform
GitHubProjectname = 'lazarusccr'
GitHubRepositoryName = 'TestApp'
GitHubBranchOrTag = 'updates'
ShortCut.ShortcutName = 'AnotherName'
ShortCut.Category = scUtility
Left = 200
Top = 24
end

View File

@ -58,11 +58,11 @@ interface
uses
Forms, Classes, SysUtils, lazautoupdate_httpclient, strutils,
Forms, Classes, SysUtils, lazautoupdate_httpclient, strutils,PropEdits,
LazUTF8, FileUtil, LazFileUtils, Dialogs, StdCtrls,
Buttons, DateUtils,{$IFDEF LINUX}process, asyncprocess,{$ENDIF}zipper, LResources,
VersionSupport, inifiles, aboutlazautoupdateunit, uappisrunning, LCLProc,
fileinfo, open_ssl, winpeimagereader {need this for reading exe info}
fileinfo, open_ssl, ushortcut,winpeimagereader {need this for reading exe info}
, elfreader {needed for reading ELF executables}
, machoreader {needed for reading MACH-O executables}
{$IFDEF WINDOWS}, Windows, ShellAPI{$ENDIF}; // Thanks to Windows 10 and 704 error
@ -139,10 +139,10 @@ const
V0.3.1: Added SetExecutePermission (LINUX only)
V0.3.2: Bugfix for DoSilentUpdate
V0.3.3: Added event OnUpdate
V0.3.4: ??
V0.3.4: Added unit ushortcut (CreateDesktopShortCut) for installers
}
C_TLazAutoUpdateComponentVersion = '0.3.3';
C_TThreadedDownloadComponentVersion = '0.0.3';
C_TLazAutoUpdateComponentVersion = '0.3.4.0';
C_TThreadedDownloadComponentVersion = '0.0.3.0';
{
V0.0.1: Initial alpha
V0.0.2: Added fDebugmode to all classes and functions
@ -228,6 +228,7 @@ resourcestring
'sClick OK to continue';
rsApplicationU = 'Application update';
type
// Dummy thread to initialise the threading system
tc = class(tthread)
@ -247,7 +248,7 @@ type
end;
TThreadedDownload = class; // Forward declaration
TShortCutClass = class; // Forward declaration
{TLAZAUTOUPDATE}
// Event declarations
TOnNewVersionAvailable = procedure(Sender: TObject; Newer: boolean;
@ -256,7 +257,7 @@ type
object;
TOnDebugEvent = procedure(Sender: TObject; lauMethodName, lauMessage: string) of
object;
TOnUpdated = Procedure(Sender:TObject;NewVersion,LauMessage:String) of Object;
TOnUpdated = procedure(Sender: TObject; NewVersion, LauMessage: string) of object;
TLazAutoUpdate = class(TAboutLazAutoUpdate)
private
@ -283,6 +284,7 @@ type
fShowDialogs: boolean;
fDownloadInprogress: boolean;
fWindowsAdminCheck: boolean;
fShortCutClass:TShortCutClass;
{$IFDEF UNIX}
FUpdateHMProcess: TAsyncProcess;
{$ENDIF}
@ -294,7 +296,7 @@ type
FOnNewVersionAvailable: TOnNewVersionAvailable;
FOnDownloaded: TOnDownloaded;
fOnDebugEvent: TOnDebugEvent;
fOnUpdated:TOnUpdated;
fOnUpdated: TOnUpdated;
fLastError: string;
fVersionCountLimit, fDownloadCountLimit: cardinal;
fZipfileName: string;
@ -319,8 +321,8 @@ type
function GetThreadDownloadReturnCode: integer;
function IsOnlineVersionNewer(const sznewINIPath: string): boolean;
function DoSilentUpdate: boolean;
function GetUpdateSilentExe:String;
function GetUpdateExe:String;
function GetUpdateSilentExe: string;
function GetUpdateExe: string;
protected
public
@ -398,7 +400,7 @@ type
read FOnNewVersionAvailable write FOnNewVersionAvailable;
property OnDownloaded: TOnDownloaded read fOnDownloaded write fOnDownloaded;
property OnDebugEvent: TOnDebugEvent read fOnDebugEvent write fOnDebugEvent;
property OnUpdated:TOnUpdated read fOnUpdated write fOnUpdated;
property OnUpdated: TOnUpdated read fOnUpdated write fOnUpdated;
// Embedded class
property ThreadDownload: TThreadedDownload
@ -447,6 +449,37 @@ type
write fGitHubRepositoryName;
// Default=master but any branchname or tagname is OK
property GitHubBranchOrTag: string read fGitHubBranchOrTag write fGitHubBranchOrTag;
property ShortCut:TShortCutClass read fShortCutClass write fShortCutClass;
end;
Type
TShortCutCategory = (scAudioVideo,scAudio,scDevelopment,
scEducation,scGame,scGraphics,scNetwork,scOffice,scScience,scSettings,
scSystem,scUtility);
// TShortCutCategoryFlags = Set of TShortCutCategory;
Type
TShortCutClass = Class(TPersistent)
private
// ShortCut stuff for CreateDesktopShortCut in ushortcut.pas
fShortCutTarget:String;
fShortCutTargetArguments:String;
fShortCutShortcutName:String;
fShortCutIconFileName:String;
fShortCutCategoryString:String;
fShortCutCategory:TShortCutCategory; // For easier property access
procedure SetShortCutCategoryString(ACategory:TShortCutCategory);
Public
constructor Create; // Constructor must be public
destructor Destroy; override; // Destructor must be public
published
property Target:String read fShortCutTarget write fShortCutTarget;
property TargetArguments:String read fShortCutTargetArguments write fShortCutTargetArguments;
property ShortcutName:String read fShortCutShortcutName write fShortCutShortcutName;
property IconFileName:String read fShortCutIconFileName write fShortCutIconFileName;
property Category:TShortCutCategory read fShortCutCategory write SetShortCutCategoryString;
end;
{TThreadedDownload }
@ -512,10 +545,18 @@ type
procedure ShowProgress;
}
end;
Type
// For the TShortCutClass filename properties (needs propedits unit)
TMyFileNamePropertyEditor = class(TFileNamePropertyEditor)
public
// Override the Edit method for total control
function GetFilter: string; override;
function GetDialogOptions: TOpenOptions; override;
function GetDialogTitle: string; override;
end;
// Non-threaded version
// Non-threaded function
function DownloadHTTP(URL, TargetFile: string; var ReturnCode, DownloadSize: integer;
bIsSourceForge, fDebugMode: boolean): boolean;
@ -527,8 +568,39 @@ procedure Register;
begin
{$I lazautoupdate_icon.lrs}
RegisterComponents('System', [TLazAutoUpdate]);
// Register the custom property editors for the TShortCutClass filename properties
RegisterPropertyEditor(TypeInfo(String),
TShortCutClass, 'Target', TMyFileNamePropertyEditor);
RegisterPropertyEditor(TypeInfo(String),
TShortCutClass, 'IconFileName', TMyFileNamePropertyEditor);
end;
// Start Property editors for File type properties in TShortCutClass
function TMyFileNamePropertyEditor.GetFilter: string;
begin
{$IFDEF WINDOWS}
Result := 'Windows executable|*.exe|All Files|*.*';
{$ELSE}
{$IFDEF LINUX}
Result := 'Linux executable|*.|All Files|*.*';
{$ELSE}
Result := 'All Files|*.*';
{$ENDIF}
{$ENDIF}
end;
function TMyFileNamePropertyEditor.GetDialogOptions: TOpenOptions;
begin
// To see the full list, drop an OpenDialog onto a form and see the Options property
Result := [ofFileMustExist, ofPathMustExist];
end;
function TMyFileNamePropertyEditor.GetDialogTitle: string;
begin
Result := 'Choose Shortcut Target Filename';
end;
// End Property editors for File type properties in TShortCutClass
// Dummy thread to initialise the threading process
procedure tc.Execute;
begin
@ -544,6 +616,32 @@ begin
while MilliSecondOfTheDay(Now) < (ThisSecond + MillisecondDelay) do ;
end;
procedure TShortCutClass.SetShortCutCategoryString(ACategory:TShortCutCategory);
{
TShortCutCategory = (scAudioVideo,scAudio,scDevelopment,
scEducation,scGame,scGraphics,scNetwork,scOffice,scScience,scSettings,
scSystem,scUtility);
}
begin
If ACategory=fShortCutCategory then exit;
fShortCutCategoryString:='Unknown';
Case ACategory of
scAudioVideo:fShortCutCategoryString:='AudioVideo';
scAudio:fShortCutCategoryString:='Audio';
scDevelopment:fShortCutCategoryString:='Development';
scEducation:fShortCutCategoryString:='Education';
scGame:fShortCutCategoryString:='Game';
scGraphics:fShortCutCategoryString:='Graphics';
scNetwork:fShortCutCategoryString:='Network';
scOffice:fShortCutCategoryString:='Office';
scScience:fShortCutCategoryString:='Science';
scSettings:fShortCutCategoryString:='Settings';
scSystem:fShortCutCategoryString:='System';
scUtility:fShortCutCategoryString:='Utility';
end;
end;
procedure TLazAutoUpdate.DebugTest;
begin
ShowMessage(fApplicationVersionString);
@ -650,6 +748,15 @@ end;
{$ENDIF}
// === END WINDOWS PROCS =======================================================
constructor TShortCutClass.Create;
begin
inherited Create; // TComponent method;
end;
destructor TShortCutClass.Destroy;
begin
inherited Destroy;
end;
constructor TLazAutoUpdate.Create(AOwner: TComponent);
var
@ -667,6 +774,10 @@ begin
// Freed in Destroy
fThreadDownload := TThreadedDownload.Create();
fShortCutClass:=TShortCutClass.Create();
fShortCutClass.ShortcutName:='MyShortcutName';
fShortCutClass.TargetArguments:='';
fShortCutClass.Category:=scDevelopment;
// Leave URL and Filename to be set via properties
fComponentVersion := C_TLazAutoUpdateComponentVersion;
// Unused
@ -773,24 +884,26 @@ end;
destructor TLazAutoUpdate.Destroy;
begin
FreeAndNil(fThreadDownload);
FreeAndNil(fShortCutClass);
inherited Destroy;
end;
function TLazAutoUpdate.GetUpdateSilentExe:String;
function TLazAutoUpdate.GetUpdateSilentExe: string;
begin
fUpdateSilentExe := C_LAUUPDATENAME;
If csDesigning in ComponentState then
Result:='lauupdate'
if csDesigning in ComponentState then
Result := 'lauupdate'
else
Result:=fUpdateSilentExe;
Result := fUpdateSilentExe;
end;
function TLazAutoUpdate.GetUpdateExe:String;
function TLazAutoUpdate.GetUpdateExe: string;
begin
fUpdateExe := C_UPDATEHMNAME;
If csDesigning in ComponentState then
Result:='updatehm'
if csDesigning in ComponentState then
Result := 'updatehm'
else
Result:=fUpdateExe;
Result := fUpdateExe;
end;
function TLazAutoUpdate.AppIsActive(const ExeName: string): boolean;
@ -2140,12 +2253,12 @@ begin
Inc(CCount);
if cCount > 100000 then
begin
// Fire the OnUpdated event
If Assigned(fOnUpdated) then
// Fire the OnUpdated event
if Assigned(fOnUpdated) then
begin
fOnUpdated(Self,fGUIOnlineVersion,'Unsuccessful update');
Application.Processmessages;
Sleep(100);
fOnUpdated(Self, fGUIOnlineVersion, 'Unsuccessful update');
Application.ProcessMessages;
Sleep(100);
end;
Break; // Get out of jail in case updatehm.exe fails to copy file
end;
@ -2156,12 +2269,12 @@ begin
{$ENDIF}
CreateLocalLauImportFile; // Creates a new import file in GetAppConfigDirUTF8
// Fire the OnUpdated event
If Assigned(fOnUpdated) then
// Fire the OnUpdated event
if Assigned(fOnUpdated) then
begin
fOnUpdated(Self,fGUIOnlineVersion,'Successful update');
Application.Processmessages;
Sleep(100);
fOnUpdated(Self, fGUIOnlineVersion, 'Successful update');
Application.ProcessMessages;
Sleep(100);
end;
if fFireDebugEvent then

View File

@ -0,0 +1,225 @@
unit ushortcut;
{
License
=======
LazAutoUpdate (c)2015 Gordon Bamber (minesadorada@charcodelvalle.com)
This library is free software; you can redistribute it and/or modify it
under the terms of the GNU Library General Public License as published by
the Free Software Foundation; either version 2 of the License, or (at your
option) any later version with the following modification:
As a special exception, the copyright holders of this library give you
permission to link this library with independent modules to produce an
executable, regardless of the license terms of these independent modules,and
to copy and distribute the resulting executable under terms of your choice,
provided that you also meet, for each linked independent module, the terms
and conditions of the license of that module. An independent module is a
module which is not derived from or based on this library. If you modify
this library, you may extend this exception to your version of the library,
but you are not obligated to do so. If you do not wish to do so, delete this
exception statement from your version.
This program is distributed in the hope that it will be useful, but WITHOUT
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License
for more details.
You should have received a copy of the GNU Library General Public License
along with this library; if not, write to the Free Software Foundation,
Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
Linux Shortcut Info
===================
1. FreeDesktop Valid Categories
===============================
AudioVideo Application for presenting, creating, or processing multimedia (audio/video)
Audio An audio application Desktop entry must include AudioVideo as well
Audio A video application Desktop entry must include AudioVideo as well
Development An application for development
Education Educational software
Game A game
Graphics Application for viewing, creating, or processing graphics
Network Network application such as a web browser
Office An office type application
Science Scientific software
Settings Settings applications Entries may appear in a separate menu or as part of a "Control Center"
System System application, "System Tools" such as say a log viewer or network monitor
Utility Small utility application, "Accessories"
2. Example Desktop File
=======================
[Desktop Entry]
Version=1.0
Type=Application
Name=Foo Viewer
Comment=The best viewer for Foo objects available!
TryExec=fooview
Exec=fooview %F
Icon=fooview
MimeType=image/x-foo;
Actions=Gallery;Create;
[Desktop Action Gallery]
Exec=fooview --gallery
Name=Browse Gallery
[Desktop Action Create]
Exec=fooview --create-new
Name=Create a new Foo!
Icon=fooview-new
}
{$mode objfpc}{$H+}
interface
uses
Classes, SysUtils, LazUTF8, FileUtil, LazFileUtils
{$IFDEF LINUX}, process{$ENDIF}
{$IFDEF WINDOWS}, Windows, shlobj {for special folders}, ActiveX,
ComObj, ShellAPI{$ENDIF} ;
function CreateDesktopShortCut(Target, TargetArguments, ShortcutName,
IconFileName, Category: string): boolean;
implementation
{$IFDEF UNIX}
//Adapted from sysutils; Unix/Linux only
function XdgConfigHome: string;
{ Follows base-dir spec,
see [http://freedesktop.org/Standards/basedir-spec].
Always ends with PathDelim. }
begin
Result := GetEnvironmentVariable('XDG_CONFIG_HOME');
if (Result = '') then
Result := IncludeTrailingPathDelimiter(ExpandFileNameUTF8('~')) +
'.config' + DirectorySeparator
else
Result := IncludeTrailingPathDelimiter(Result);
end;
{$ENDIF UNIX}
{$IFDEF MSWINDOWS}
function CreateDesktopShortCut(Target, TargetArguments, ShortcutName,
IconFileName, Category: string): boolean;
var
IObject: IUnknown;
ISLink: IShellLink;
IPFile: IPersistFile;
PIDL: PItemIDList;
InFolder: array[0..MAX_PATH] of char;
LinkName: WideString;
begin
Result := True;
// Simple failure check
if not FileExistsUTF8(Target) then
Result := False;
if Result = False then
Exit;
try
{ Creates an instance of IShellLink }
IObject := CreateComObject(CLSID_ShellLink);
ISLink := IObject as IShellLink;
IPFile := IObject as IPersistFile;
ISLink.SetPath(PChar(Target));
ISLink.SetArguments(PChar(TargetArguments));
ISLink.SetWorkingDirectory(PChar(ExtractFilePath(Target)));
// ISLink.SetIconLocation(Pchar(ExtractFilePath(Target) + IconFileName));
{ Get the desktop location }
SHGetSpecialFolderLocation(0, CSIDL_DESKTOPDIRECTORY, PIDL);
SHGetPathFromIDList(PIDL, InFolder);
LinkName := IncludeTrailingPathDelimiter(InFolder) + ShortcutName + '.lnk';
{ Get rid of any existing shortcut first }
SysUtils.DeleteFile(LinkName);
{ Create the link }
IPFile.Save(PWChar(LinkName), False);
except
Result := False;
end;
end;
{$ENDIF MSWINDOWS}
{$IFDEF UNIX}
function CreateDesktopShortCut(Target, TargetArguments, ShortcutName,
IconFileName, Category: string): boolean;
var
XdgDesktopContent: TStringList;
XdgDesktopFile: string;
Aprocess: TProcess;
begin
// Suceed by default:
Result := True;
// Simple failure checks
if not FileExistsUTF8(Target) then
Result := False;
if not FileExistsUTF8(ExtractFilePath(Target) + IconFileName) then
Result := False;
if ShortCutName = '' then
Result := False;
if Result = False then
Exit;
if Category = '' then Category := 'Utility';
XdgDesktopFile := IncludeTrailingPathDelimiter(GetTempDir(False)) +
'fpcup-' + shortcutname + '.desktop';
XdgDesktopContent := TStringList.Create;
try
XdgDesktopContent.Add('[Desktop Entry]');
XdgDesktopContent.Add('Encoding=UTF-8');
XdgDesktopContent.Add('Type=Application');
XdgDesktopContent.Add('Icon=' + ExtractFilePath(Target) + IconFileName);
XdgDesktopContent.Add('Exec=' + Target + ' ' + TargetArguments);
XdgDesktopContent.Add('Name=' + ShortcutName);
XdgDesktopContent.Add('Category=' + Category + ';');
// We're going to try and call xdg-desktop-icon
// this may fail if shortcut exists already
AProcess := TProcess.Create(nil);
try
try
XdgDesktopContent.SaveToFile(XdgDesktopFile);
AProcess.Parameters.Add(XdgDesktopFile);
Aprocess.Executable := 'xdg-desktop-icon install';
Aprocess.WaitOnExit(2000);
Aprocess.Execute;
//OperationSucceeded:=(ExecuteCommand('xdg-desktop-icon install ' + XdgDesktopFile,false)=0);
except
Result := False;
end;
finally
AProcess.Free;
end;
if Result = False then
// Temp file is no longer needed....
try
DeleteFile(XdgDesktopFile);
finally
// Swallow, let filesystem maintenance clear it up
end;
finally
XdgDesktopContent.Free;
end;
end;
{$ENDIF UNIX}
{$IFDEF MSWINDOWS}
procedure DeleteDesktopShortcut(ShortcutName: string);
var
PIDL: PItemIDList;
InFolder: array[0..MAX_PATH] of char;
LinkName: WideString;
begin
{ Get the desktop location }
SHGetSpecialFolderLocation(0, CSIDL_DESKTOPDIRECTORY, PIDL);
SHGetPathFromIDList(PIDL, InFolder);
LinkName := IncludeTrailingPathDelimiter(InFolder) + ShortcutName + '.lnk';
SysUtils.DeleteFile(LinkName);
end;
{$ENDIF MSWINDOWS}
end.