Subversion Repositories autosfx

Compare Revisions

Regard whitespace Rev 2 → Rev 1

/ExtractorMain.pas
1,8 → 1,10
unit ExtractorMain;
 
{$DEFINE DEBUG_MODE}
 
{$DEFINE USE_DZIP_UNPACK}
 
// todo: compilerswitch, der auch selectdirectory() anzeigt (ohne foldercreate)
// TODO: Implement ExtractionTarget switch
 
interface
 
9,7 → 11,7
uses
Windows, SysUtils, Classes, Controls, Forms, Dialogs, StdCtrls, ShellAPI,
ExtCtrls, ComCtrls, ZipMstr19, ZMMsgStr19, ZMMsg19, ZMDelZip19,
ZMCompat19, SFXBehavior, ShlObj;
ZMCompat19, SFXBehavior;
 
type
TOverwriteDecision = (odUndefined, odOverwriteAll, odOverwriteNothing);
148,13 → 150,11
s: string;
ec: Integer;
ar: TExecuteSFXAutoRunResult;
GeneralBaseDir: string;
resourcestring
Lng_Aborted = 'Der laufende Prozess wurde abgebrochen. Das extrahierten Dateien sind somit unvollständig.';
Lng_Zip_Error = 'ZIP-Master Fehler "%s" (%d)';
Lng_AutoRunFailed = 'SFX-AutoRun fehlgeschlagen. Die entpackten Inhalte werden nun angezeigt.';
Lng_Unknown_Error = 'Unbekannter Fehler: Dateien sind nicht aufzufinden!';
Lng_SelectDir = 'Bitte wählen Sie ein Verzeichnis zum Extrahieren aus. Es wird maximal 1 Datei bzw. Ordner erstellt!';
begin
AZipfile := ExpandUNCFileName(AZipfile);
RenamingOldPrefix := '';
184,34 → 184,10
uz.OnCheckTerminate := ArcCheckTerminate;
uz.OnPasswordError := ArcPassword;
uz.PasswordReqCount := MaxTries;
// TODO: Mehr events?
uz.OnSkipped := SkipEvent;
uz.OnSetExtName := ArcExtFNChange;
// TODO: Mehr events?
 
// Find out base dirtory
 
GeneralBaseDir := '';
case zb.ExtractionTarget of
etExtractHere:
begin
GeneralBaseDir := ExtractFilePath(AZipfile); // Default
end;
etDesktop:
begin
GeneralBaseDir := GetSpecialFolderPath(CSIDL_DESKTOP);
end;
etAsk:
begin
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
 
l := TStringList.Create;
try
// Count the root objects (files OR dirs) in the ZIP
226,25 → 202,23
else if l.Count = 1 then
begin
// 1 Object = Extract it right here!
BaseDir := GeneralBaseDir;
s := BaseDir + l.Strings[0];
 
RenamingOldPrefix := l.Strings[0]; // = StripBaseDir(S);
 
s := ExtractFilePath(AZipfile) + l.Strings[0];
BaseDir := ExtractFilePath(AZipfile);
RenamingOldPrefix := StripBaseDir(S);
if zb.ConflictBehavior = cbAvoid then
begin
s := SearchNextFreeName(s, LooksLikeDir(s));
s := SearchNextFreeName(s);
end;
 
RenamingNewPrefix := StripBaseDir(s);
// TODO: helloworld.exe schlägt fehl!
RenamingNewPrefix := StripBaseDir(S); // We need to change the name!
end
else
begin
// 2+ Objects = Extract them in a separate folder
s := GeneralBaseDir + ExtractFileNameWithoutExt(AZipfile) + PathDelim;
s := ChangeFileExt(AZipfile, '');
if zb.ConflictBehavior = cbAvoid then
begin
s := SearchNextFreeName(s, true);
s := SearchNextFreeName(s);
MkDir(s);
end
else
255,7 → 229,7
end;
BaseDir := IncludeTrailingPathDelimiter(BaseDir);
 
uz.ExtrBaseDir := BaseDir;
uz.ExtrBaseDir := BaseDir; // TODO: andere ordner erlauben
 
// Pre-Extract-Dialog
 
355,7 → 329,8
var FileName: TZMString; const BaseDir: TZMString;
var IsChanged: Boolean);
begin
if RenamingOldPrefix = RenamingNewPrefix then Exit;
if RenamingOldPrefix = RenamingOldPrefix then Exit;
 
FileName := RenamingNewPrefix + Copy(FileName, 1+Length(RenamingOldPrefix), Length(FileName)-Length(RenamingOldPrefix));
IsChanged := true;
end;
476,6 → 451,9
resourcestring
Lng_Extracting = 'Extrahiere Dateien. Bitte warten...';
begin
{$IFDEF DEBUG_MODE}
Caption := Caption + ' (Debug)';
{$ENDIF}
WaitLabel.Caption := Lng_Extracting;
WaitLabel.Left := progressBar.Width div 2 - WaitLabel.Width div 2;
CurrentFileLabel.Caption := '';
522,10 → 500,6
{$ENDIF}
 
procedure TMainForm.AutoTimerTimer(Sender: TObject);
resourcestring
Lng_NakedSFX = 'Das selbstentpackende Archiv (SFX) beschädigt oder ungültig. Wenn Sie diese Datei aus dem Internet bezogen haben, laden Sie sie bitte erneut herunter.';
Lng_FileNotFound = 'Die durch Parameter angegebene Datei "%s" kann nicht gefunden werden!';
Lng_TooManyArguments = 'Zu viele Argumente!';
begin
AutoTimer.Enabled := false;
 
534,21 → 508,7
{$ENDIF}
 
try
if IsExtractable(ParamStr(0)) then
begin
ExtractZipHere(ParamStr(0));
end
else
begin
// Der Extractor ist "nackt" oder das SFX beschädigt
 
if ParamCount = 0 then
begin
MessageDlg(Lng_NakedSFX, mtError, [mbOk], 0);
end
else if ParamCount = 1 then
begin
// In diesem Zustand erlauben wir, fremde SFX zu entpacken (auch für Debugging-Zwecke)
{$IFDEF DEBUG_MODE}
if FileExists(ParamStr(1)) then
begin
ExtractZipHere(ParamStr(1));
555,17 → 515,15
end
else
begin
MessageDlg(Lng_FileNotFound, mtError, [mbOk], 0);
{$ENDIF}
 
ExtractZipHere(ParamStr(0));
 
{$IFDEF DEBUG_MODE}
end;
end
else if ParamCount = 2 then
begin
// Future: Mehr als nur 1 Parameter erlauben?
MessageDlg(Lng_TooManyArguments, mtError, [mbOk], 0);
end;
end;
{$ENDIF}
finally
AbortUnzip := true; // Damit es zu keiner Abfrage in OnCloseQuery kommt
AbortUnzip := true; // Damit es zu keiner Abfrage kommt
Close;
end;
end;