Subversion Repositories autosfx

Compare Revisions

No changes between revisions

Regard whitespace Rev 3 → Rev 2

/Extractor.exe.manifest
File deleted
/Extractor.rc
File deleted
/BrowseFolder.pas
File deleted
/MakeSFX.rc
File deleted
/MakeSFX.exe.manifest
File deleted
/resource.h
File deleted
/ExtractorMain.pas
2,6 → 2,8
 
{$DEFINE USE_DZIP_UNPACK}
 
// todo: compilerswitch, der auch selectdirectory() anzeigt (ohne foldercreate)
 
interface
 
uses
24,8 → 26,6
procedure AutoTimerTimer(Sender: TObject);
procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean);
private
ExtractionInProcess: boolean;
uz: TZipMaster19;
RenamingOldPrefix: string;
RenamingNewPrefix: string;
zb: TZIPBehavior;
33,21 → 33,21
AbortUnzip: boolean;
StopAskingPassword: boolean;
LastTriedPassword: string;
CachedOverwriteDecision: TOverwriteDecision;
OverwriteDecision: TOverwriteDecision;
{$IFNDEF USE_DZIP_UNPACK}
procedure ExtractDllFromResource(ADirectory: string);
{$ENDIF}
procedure ExtractZipHere(AZipfile: string);
procedure EvExtFNChange(Sender: TObject; var FileName: TZMString; const BaseDir: TZMString; var IsChanged: Boolean);
procedure EvProgress(Sender: TObject; details: TZMProgressDetails);
procedure EvTick(Sender: TObject);
procedure EvCheckTerminate(Sender: TObject; var abort: Boolean);
procedure EvConfirmOverwrite(Sender: TObject; const ForFile: TZMString;
procedure ArcExtFNChange(Sender: TObject; var FileName: TZMString; const BaseDir: TZMString; var IsChanged: Boolean);
procedure ArcProzess(Sender: TObject; details: TZMProgressDetails);
procedure ArcTick(Sender: TObject);
procedure ArcCheckTerminate(Sender: TObject; var abort: Boolean);
procedure ConfirmOverwrite(Sender: TObject; const ForFile: TZMString;
IsOlder: Boolean; var DoOverwrite: Boolean; DirIndex: Integer);
procedure EvPasswordEvent(Sender: TObject; IsZipAction: Boolean;
procedure ArcPassword(Sender: TObject; IsZipAction: Boolean;
var NewPassword: String; const ForFile: TZMString; var RepeatCount: Longword;
var Action: TMsgDlgBtn);
procedure EvSkipEvent(Sender: TObject; const ForFile: TZMString;
procedure SkipEvent(Sender: TObject; const ForFile: TZMString;
SkipType: TZMSkipTypes; var ExtError: Integer);
function StripBaseDir(const s: string): string;
end;
58,11 → 58,10
implementation
 
uses
ExtractorPassword, ExtractorError, Functions, SFXAutoRun, ExtractorComment,
BrowseFolder;
ExtractorPassword, ExtractorError, Functions, SFXAutoRun, ExtractorComment;
 
const
EvPasswordTries = 15;
MaxTries = 15;
 
{$R *.dfm}
 
144,15 → 143,12
 
procedure TMainForm.ExtractZipHere(AZipfile: string);
var
uz: TZipMaster19;
l: TStringList;
s: string;
ec: Integer;
ar: TExecuteSFXAutoRunResult;
GeneralBaseDir: string;
const
C_Explorer_Open_Param = '"%s"';
C_Explorer_Select_Param = '/n,/select,"%s"';
EXPLORER_EXE = 'explorer';
resourcestring
Lng_Aborted = 'Der laufende Prozess wurde abgebrochen. Das extrahierten Dateien sind somit unvollständig.';
Lng_Zip_Error = 'ZIP-Master Fehler "%s" (%d)';
164,11 → 160,8
RenamingOldPrefix := '';
RenamingNewPrefix := '';
 
if Assigned(uz) then uz.Free; // uz ist global, damit AbortDLL aufgerufen werden kann
 
uz := TZipMaster19.Create(nil);
try
ExtractionInProcess := true;
{$IFNDEF USE_DZIP_UNPACK}
uz.DLLDirectory := GetTempDirectory + DelZipDLL_Name;
{$ENDIF}
182,14 → 175,18
uz.ExtrOptions := [ExtrDirNames, ExtrOverWrite, ExtrFreshen, ExtrUpdate,
ExtrForceDirs, ExtrNTFS];
 
uz.OnExtractOverwrite := EvConfirmOverwrite;
uz.OnProgress := EvProgress;
uz.OnTick := EvTick;
uz.OnCheckTerminate := EvCheckTerminate;
uz.OnPasswordError := EvPasswordEvent;
uz.PasswordReqCount := EvPasswordTries;
uz.OnSkipped := EvSkipEvent;
uz.OnSetExtName := EvExtFNChange;
if zb.ConflictBehavior <> cbAvoid then
begin
uz.OnExtractOverwrite := ConfirmOverwrite;
end;
uz.OnProgress := ArcProzess;
uz.OnTick := ArcTick;
uz.OnCheckTerminate := ArcCheckTerminate;
uz.OnPasswordError := ArcPassword;
uz.PasswordReqCount := MaxTries;
uz.OnSkipped := SkipEvent;
uz.OnSetExtName := ArcExtFNChange;
// TODO: Mehr events?
 
// Find out base dirtory
 
205,10 → 202,12
end;
etAsk:
begin
GeneralBaseDir := MySelectDirectory(Lng_SelectDir);
if GeneralBaseDir = '' then Exit;
if not AdvSelectDirectory(Lng_SelectDir, '', GeneralBaseDir, False, False, True) then
begin
Exit;
end;
end;
end;
GeneralBaseDir := IncludeTrailingPathDelimiter(GeneralBaseDir);
 
// Semantic scanning of ZIP to determinate the final extraction directory
312,9 → 311,8
if DirectoryExists(s) then
begin
// If it is a folder, open it
 
ShellExecute(0, 'open', EXPLORER_EXE,
PChar(Format(C_Explorer_Open_Param, [s])), '', SW_NORMAL);
ShellExecute(0, 'open', 'explorer',
PChar('"'+s+'"'), '', SW_NORMAL);
end
else if FileExists(s) then
begin
324,27 → 322,23
// Im Moment wird bei einem BESTEHENDEN Fenster
// die Selektion nicht durchgeführt.
 
ShellExecute(0, 'open', EXPLORER_EXE,
PChar(Format(C_Explorer_Select_Param, [s])), '', SW_NORMAL);
ShellExecute(0, 'open', 'explorer',
PChar('/n,/select,"'+s+'"'), '', SW_NORMAL);
end
else
begin
if not AbortUnzip then
begin
MessageDlg(Lng_Unknown_Error, mtError, [mbOk], 0);
end;
end;
end;
finally
l.Free;
end;
finally
uz.Free;
ExtractionInProcess := false;
end;
end;
 
procedure TMainForm.EvProgress(Sender: TObject; details: TZMProgressDetails);
procedure TMainForm.ArcProzess(Sender: TObject; details: TZMProgressDetails);
begin
CurrentFileLabel.Caption := details.ItemName;
 
357,7 → 351,7
Application.ProcessMessages;
end;
 
procedure TMainForm.EvExtFNChange(Sender: TObject;
procedure TMainForm.ArcExtFNChange(Sender: TObject;
var FileName: TZMString; const BaseDir: TZMString;
var IsChanged: Boolean);
begin
366,17 → 360,17
IsChanged := true;
end;
 
procedure TMainForm.EvTick(Sender: TObject);
procedure TMainForm.ArcTick(Sender: TObject);
begin
Application.ProcessMessages;
end;
 
procedure TMainForm.EvCheckTerminate(Sender: TObject; var abort: Boolean);
procedure TMainForm.ArcCheckTerminate(Sender: TObject; var abort: Boolean);
begin
abort := AbortUnzip;
end;
 
procedure TMainForm.EvConfirmOverwrite(Sender: TObject; const ForFile: TZMString;
procedure TMainForm.ConfirmOverwrite(Sender: TObject; const ForFile: TZMString;
IsOlder: Boolean; var DoOverwrite: Boolean; DirIndex: Integer);
resourcestring
Lng_Overwrite = 'Bestehende Datei "%s" überschreiben?';
403,31 → 397,27
Exit;
end;
 
if CachedOverwriteDecision = odUndefined then
if OverwriteDecision = odUndefined then
begin
res := MessageDlg(Format(Lng_Overwrite, [ForFile]), mtConfirmation, [mbYes, mbNo, mbYesToAll, mbNoToAll], 0);
DoOverwrite := (res = mrYes) or (res = mrYesToAll);
if res = mrNoToAll then CachedOverwriteDecision := odOverwriteNothing;
if res = mrYesToAll then CachedOverwriteDecision := odOverwriteAll;
if res = mrNoToAll then OverwriteDecision := odOverwriteNothing;
if res = mrYesToAll then OverwriteDecision := odOverwriteAll;
end
else
begin
DoOverwrite := CachedOverwriteDecision = odOverwriteAll;
DoOverwrite := OverwriteDecision = odOverwriteAll;
end;
end
else if zb.ConflictBehavior = cbAvoid then
begin
// Nothing to do
end;
end;
 
procedure TMainForm.EvPasswordEvent(Sender: TObject; IsZipAction: Boolean;
procedure TMainForm.ArcPassword(Sender: TObject; IsZipAction: Boolean;
var NewPassword: String; const ForFile: TZMString; var RepeatCount: Longword;
var Action: TMsgDlgBtn);
var
repc: integer;
begin
repc := EvPasswordTries - RepeatCount + 1;
repc := MaxTries - RepeatCount + 1;
 
// Eine Passworteingabe wurde abgebrochen. Frage nicht mehr nach.
if StopAskingPassword then Exit;
449,7 → 439,7
end;
end;
 
if PasswordDlg.ShowModal(StripBaseDir(ForFile), repc, EvPasswordTries) = mrOk then
if PasswordDlg.ShowModal(StripBaseDir(ForFile), repc, MaxTries) = mrOk then
begin
NewPassword := PasswordDlg.Password.Text;
if NewPassword = '' then NewPassword := ' '; // Neue Eingabe erzwingen.
466,34 → 456,19
resourcestring
Lng_AbortExtract = 'Extrahieren abbrechen?';
begin
if not ExtractionInProcess then
begin
Close;
Exit;
end;
 
if MessageDlg(Lng_AbortExtract, mtConfirmation, mbYesNoCancel, 0) = mrYes then
begin
CancelBtn.Enabled := false;
uz.AbortDLL;
AbortUnzip := true;
// Close wird durch den Timer durchgeführt
Exit;
end;
end;
 
procedure TMainForm.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
begin
if not ExtractionInProcess then
begin
CanClose := true;
Exit;
end;
 
if not AbortUnzip then
begin
CancelBtn.Click;
CanClose := false;
CancelBtn.Click;
end;
end;
 
590,6 → 565,7
end;
end;
finally
AbortUnzip := true; // Damit es zu keiner Abfrage in OnCloseQuery kommt
Close;
end;
end;
601,7 → 577,7
result := Copy(s, Length(BaseDir)+1, Length(s)-Length(BaseDir));
end;
 
procedure TMainForm.EvSkipEvent(Sender: TObject; const ForFile: TZMString;
procedure TMainForm.SkipEvent(Sender: TObject; const ForFile: TZMString;
SkipType: TZMSkipTypes; var ExtError: Integer);
resourcestring
Lng_PasswordWrong = 'Das Passwort wurde zu oft falsch eingegeben. Die Datei "%s" wird nicht extrahiert.';
/MakeSFX.exe
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
/td.txt
1,9 → 1,3
sfxmaker ohne argumente: datei open dialog + folder selection dialog
 
wenn sich das sfx auf cd oder diskette befindet, auf desktop oder ASK extrahieren
 
Kompatibel mit Filenameencryption?
 
- ein besseres win7 highres icon machen?
- spanned sfx possible?
test 2files, 1file, 1folder
/Functions.pas
3,8 → 3,8
interface
 
uses
Forms, Windows, Classes, SysUtils, ShellAPI,
ZipMstr19, ZmUtils19, ShlObj, ActiveX;
Forms, Windows, Classes, SysUtils, ShellAPI, ShlObj, ActiveX,
ZipMstr19, ZmUtils19;
 
type
TLineBreak = (lbWindows, lbLinux, lbMac);
17,6 → 17,9
function NormalizeLineBreaks(s: string; mode: TLineBreak): string;
function ExtractFileNameWithoutExt(const fil: string): string;
function SearchNextFreeName(s: string; wantDir: boolean): string;
function AdvSelectDirectory(const Caption: string; const Root: WideString;
var Directory: string; EditBox: Boolean = False; ShowFiles: Boolean = False;
AllowCreateDirs: Boolean = True): Boolean;
function GetSpecialFolderPath(const Folder: integer): string;
function IsExtractable(AFilename: string): boolean;
 
184,8 → 187,114
end;
end;
 
// GetSpecialFolderPath
// Ref: http://www.wer-weiss-was.de/theme159/article1058561.html
{
This code shows the SelectDirectory dialog with additional expansions:
- an edit box, where the user can type the path name,
- also files can appear in the list,
- a button to create new directories.
 
 
Dieser Code zeigt den SelectDirectory-Dialog mit zusätzlichen Erweiterungen:
- eine Edit-Box, wo der Benutzer den Verzeichnisnamen eingeben kann,
- auch Dateien können in der Liste angezeigt werden,
- eine Schaltfläche zum Erstellen neuer Verzeichnisse.
 
 
Ref: http://www.swissdelphicenter.ch/de/showcode.php?id=1802
}
 
function AdvSelectDirectory(const Caption: string; const Root: WideString;
var Directory: string; EditBox: Boolean = False; ShowFiles: Boolean = False;
AllowCreateDirs: Boolean = True): Boolean;
// callback function that is called when the dialog has been initialized
//or a new directory has been selected
 
// Callback-Funktion, die aufgerufen wird, wenn der Dialog initialisiert oder
//ein neues Verzeichnis selektiert wurde
function SelectDirCB(Wnd: HWND; uMsg: UINT; lParam, lpData: lParam): Integer;
stdcall;
// var
// PathName: array[0..MAX_PATH] of Char;
begin
case uMsg of
BFFM_INITIALIZED: SendMessage(Wnd, BFFM_SETSELECTION, Ord(True), Integer(lpData));
// include the following comment into your code if you want to react on the
//event that is called when a new directory has been selected
// binde den folgenden Kommentar in deinen Code ein, wenn du auf das Ereignis
//reagieren willst, das aufgerufen wird, wenn ein neues Verzeichnis selektiert wurde
{BFFM_SELCHANGED:
begin
SHGetPathFromIDList(PItemIDList(lParam), @PathName);
// the directory "PathName" has been selected
// das Verzeichnis "PathName" wurde selektiert
end;}
end;
Result := 0;
end;
var
WindowList: Pointer;
BrowseInfo: TBrowseInfo;
Buffer: PChar;
RootItemIDList, ItemIDList: PItemIDList;
ShellMalloc: IMalloc;
IDesktopFolder: IShellFolder;
Eaten, Flags: LongWord;
const
// necessary for some of the additional expansions
// notwendig für einige der zusätzlichen Erweiterungen
BIF_USENEWUI = $0040;
BIF_NOCREATEDIRS = $0200;
begin
Result := False;
if not DirectoryExists(Directory) then
Directory := '';
FillChar(BrowseInfo, SizeOf(BrowseInfo), 0);
if (ShGetMalloc(ShellMalloc) = S_OK) and (ShellMalloc <> nil) then
begin
Buffer := ShellMalloc.Alloc(MAX_PATH);
try
RootItemIDList := nil;
if Root <> '' then
begin
SHGetDesktopFolder(IDesktopFolder);
IDesktopFolder.ParseDisplayName(Application.Handle, nil,
POleStr(Root), Eaten, RootItemIDList, Flags);
end;
OleInitialize(nil);
with BrowseInfo do
begin
hwndOwner := Application.Handle;
pidlRoot := RootItemIDList;
pszDisplayName := Buffer;
lpszTitle := PChar(Caption);
// defines how the dialog will appear:
// legt fest, wie der Dialog erscheint:
ulFlags := BIF_RETURNONLYFSDIRS or BIF_USENEWUI or
BIF_EDITBOX * Ord(EditBox) or BIF_BROWSEINCLUDEFILES * Ord(ShowFiles) or
BIF_NOCREATEDIRS * Ord(not AllowCreateDirs);
lpfn := @SelectDirCB;
if Directory <> '' then
lParam := Integer(PChar(Directory));
end;
WindowList := DisableTaskWindows(0);
try
ItemIDList := ShBrowseForFolder(BrowseInfo);
finally
EnableTaskWindows(WindowList);
end;
Result := ItemIDList <> nil;
if Result then
begin
ShGetPathFromIDList(ItemIDList, Buffer);
ShellMalloc.Free(ItemIDList);
Directory := Buffer;
end;
finally
ShellMalloc.Free(Buffer);
end;
end;
end;
 
function GetSpecialFolderPath(const Folder: integer): string;
var
PIDL: PItemIDList;
216,7 → 325,7
if (q and zqbHasLocal) <> zqbHasLocal then result := false;
if (q and zqbHasCentral) <> zqbHasCentral then result := false;
if ((q and zqbHasEOC) <> zqbHasEOC) and
((q and zqbHasEOC64) <> zqbHasEOC64) then result := false;
((q and zqbHasEOC64) <> zqbHasEOC) then result := false;
finally
uz.Free;
end;
/Extractor.exe
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
/Tools/RemoveSignature.exe
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
/Tools/Sources.txt
6,6 → 6,3
 
upx.exe
http://upx.sourceforge.net/
 
rc.dll, rcdll.dll
Windows Server 2003 SP1 SDK
/Extractor.bdsproj
53,7 → 53,7
<Compiler Name="SymbolPlatform">True</Compiler>
<Compiler Name="SymbolExperimental">True</Compiler>
<Compiler Name="UnitLibrary">True</Compiler>
<Compiler Name="UnitPlatform">False</Compiler>
<Compiler Name="UnitPlatform">True</Compiler>
<Compiler Name="UnitDeprecated">True</Compiler>
<Compiler Name="UnitExperimental">True</Compiler>
<Compiler Name="HResultCompat">True</Compiler>
130,7 → 130,7
<Directories Name="UsePackages">False</Directories>
</Directories>
<Parameters>
<Parameters Name="RunParams">Tests\single_file.zip</Parameters>
<Parameters Name="RunParams">single_file.zip</Parameters>
<Parameters Name="HostApplication"></Parameters>
<Parameters Name="Launcher"></Parameters>
<Parameters Name="UseLauncher">False</Parameters>
172,7 → 172,8
<VersionInfoKeys Name="Comments"></VersionInfoKeys>
<VersionInfoKeys Name="Webseite">www.viathinksoft.de</VersionInfoKeys>
<VersionInfoKeys Name="Projektleiter">Daniel Marschall - www.daniel-marschall.de</VersionInfoKeys>
</VersionInfoKeys> <Excluded_Packages>
</VersionInfoKeys>
<Excluded_Packages>
<Excluded_Packages Name="c:\programme\borland\bds\4.0\Bin\dclib100.bpl">Borland InterBase Express Components</Excluded_Packages>
<Excluded_Packages Name="c:\programme\borland\bds\4.0\Bin\dclIntraweb_80_100.bpl">Intraweb 8.0 Design Package for Borland Development Studio 2006</Excluded_Packages>
<Excluded_Packages Name="c:\programme\borland\bds\4.0\Bin\dclIndyCore100.bpl">Indy 10 Core Design Time</Excluded_Packages>
/MakeSFX.res
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
/Extractor.res
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
/Extractor.cfg
37,7 → 37,6
-O"c:\programme\borland\bds\4.0\lib\Debug;c:\programme\borland\bds\4.0\Lib\Debug\Indy10;zmstr1900102"
-I"c:\programme\borland\bds\4.0\lib\Debug;c:\programme\borland\bds\4.0\Lib\Debug\Indy10;zmstr1900102"
-R"c:\programme\borland\bds\4.0\lib\Debug;c:\programme\borland\bds\4.0\Lib\Debug\Indy10;zmstr1900102"
-w-UNIT_PLATFORM
-w-UNSAFE_TYPE
-w-UNSAFE_CODE
-w-UNSAFE_CAST
/Icons/Software used.txt
File deleted
/Icons/RarSFX.ico
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Deleted: svn:mime-type
-application/octet-stream
\ No newline at end of property
/Icons/RarSFX Source/RarSFX.png
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Deleted: svn:mime-type
-application/octet-stream
\ No newline at end of property
/Icons/RarSFX Source/RarSFX.psd
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Deleted: svn:mime-type
-application/octet-stream
\ No newline at end of property
/Icons/RarSFX Source/Source.txt
File deleted
/ExtractorMain.dfm
67,7 → 67,6
Font.Style = []
ParentFont = False
TabOrder = 1
TabStop = False
OnClick = CancelBtnClick
end
object itemBar: TProgressBar
79,6 → 78,7
TabOrder = 2
end
object AutoTimer: TTimer
Interval = 100
OnTimer = AutoTimerTimer
Left = 320
Top = 8
/Extractor.dpr
14,8 → 14,7
ExtractorComment in 'ExtractorComment.pas' {CommentForm},
Functions in 'Functions.pas',
SFXAutoRun in 'SFXAutoRun.pas',
SFXBehavior in 'SFXBehavior.pas',
BrowseFolder in 'BrowseFolder.pas';
SFXBehavior in 'SFXBehavior.pas';
 
{$R *.res}
 
/_PreBuild.bat
1,10 → 1,4
@echo off
 
rem brcc32 is not compatible with Vista icons
Tools\rc Extractor.rc
Tools\rc MakeSFX.rc
 
cd zmstr1900102\DLL\ResDLL-Maker\
call MakeResDll.bat
 
pause.