Subversion Repositories decoder

Rev

Rev 4 | Go to most recent revision | Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
2 daniel-mar 1
unit Main;
2
 
3
interface
4
 
5
uses
6
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, DECUtil,
7
  DECHash, DECCipher, registry, KAZip, shlobj, StdCtrls, math,
8
  shellapi, Buttons, ComCtrls, ExtCtrls, inifiles, DragDropFile, DragDrop,
9
  ImgList, base64, ZLib, wininet, OneInst, DCConst, Dialogs,
10
  Menus{, XPMenu};
11
 
12
type
13
  TCase = (tcUnknown, tcEncrypted, tcDecrypted);
14
 
15
  TProgress = class(TInterfacedObject, IDECProgress)
16
    procedure Process(const Min, Max, Pos: Int64); stdcall;
17
    constructor Create;
18
    destructor Destroy; override;
19
  end;
20
 
21
  TMainForm = class(TForm)
22
    dlg_open: TOpenDialog;
23
    dlg_save_dec: TSaveDialog;
24
    dlg_save_enc: TSaveDialog;
25
    tmr_capslock: TTimer;
26
    img_type: TImage;
27
    lbl_vle1: TLabel;
28
    edt_vle1: TEdit;
29
    edt_vle2: TEdit;
30
    lbl_vle2: TLabel;
31
    lbl_vle3: TLabel;
32
    edt_vle3: TEdit;
33
    lbl_vle4: TLabel;
34
    edt_vle4: TEdit;
35
    lbl_vle5: TLabel;
36
    edt_vle5: TEdit;
37
    lbl_vle6: TLabel;
38
    edt_vle6: TEdit;
39
    lbl_vle7: TLabel;
40
    edt_vle7: TEdit;
41
    lbl_passwort: TLabel;
42
    edt_passwort: TEdit;
43
    lbl_passwort2: TLabel;
44
    edt_passwort2: TEdit;
45
    img_warning: TImage;
46
    lbl_capswarning: TLabel;
47
    chk_securedelete: TCheckBox;
48
    lbl_entropy: TLabel;
49
    lbl_equal: TLabel;
50
    imagelist: TImageList;
51
    img_error: TImage;
52
    lbl_readerror: TLabel;
53
    b_encrypt: TBitBtn;
54
    b_decrypt: TBitBtn;
55
    b_direct: TBitBtn;
56
    b_open: TBitBtn;
57
    b_folder: TBitBtn;
58
    chk_compress: TCheckBox;
59
    tmr_refresh: TTimer;
60
    mainmenu: TMainMenu;
61
    mm_file: TMenuItem;
62
    m_open: TMenuItem;
63
    m_folder: TMenuItem;
64
    seperator1: TMenuItem;
65
    m_config: TMenuItem;
66
    seperator2: TMenuItem;
67
    m_close: TMenuItem;
68
    m_exit: TMenuItem;
69
    mm_actions: TMenuItem;
70
    mm_help: TMenuItem;
71
    m_help: TMenuItem;
72
    m_web_update: TMenuItem;
73
    m_info: TMenuItem;
74
    m_encrypt: TMenuItem;
75
    m_decrypt: TMenuItem;
76
    m_direct: TMenuItem;
77
    seperator5: TMenuItem;
78
    m_delete: TMenuItem;
79
    m_web: TMenuItem;
80
    seperator6: TMenuItem;
81
    m_web_dm: TMenuItem;
82
    m_web_vts: TMenuItem;
83
    m_web_project: TMenuItem;
84
    m_web_keytransmitter: TMenuItem;
85
    m_web_email: TMenuItem;
86
    mm_dateiensammlung: TMenuItem;
87
    m_dateiensammlung_add_file: TMenuItem;
88
    m_dateiensammlung_show: TMenuItem;
89
    m_dateiensammlung_neu: TMenuItem;
90
    dlg_open_element: TOpenDialog;
91
    seperator3: TMenuItem;
92
    seperator4: TMenuItem;
93
    m_dateiensammlung_add_folder: TMenuItem;
94
    tmp_progressdurchlauf: TTimer;
95
    m_web_forum: TMenuItem;
96
    m_web_infopages: TMenuItem;
97
    procedure form_closequery(Sender: TObject; var CanClose: Boolean);
98
    procedure kazip_actions_compress(Sender: TObject; Current, Total: Integer);
99
    procedure kazip_actions_decompress(Sender: TObject; Current, Total: Integer);
100
    procedure kazip_add(Sender: TObject; ItemName: string);
101
    procedure kazip_onchange(Sender: TObject; ChangeType: Integer);
102
    procedure kazip_overwrite(Sender:TObject; Var FileName : String; Var Action : TOverwriteAction);
103
    procedure tmr_capslock_timer(Sender: TObject);
104
    procedure form_create(Sender: TObject);
105
    procedure edt_dec_password_keypress(Sender: TObject; var Key: Char);
106
    procedure form_close(Sender: TObject; var Action: TCloseAction);
107
    procedure dropfile_drop(Sender: TObject; ShiftState: TShiftState;
108
      Point: TPoint; var Effect: Integer);
109
    procedure edt_password2_change(Sender: TObject);
110
    procedure edt_enc_password_keypress(Sender: TObject; var Key: Char);
111
    procedure edt_passwort_change(Sender: TObject);
112
    procedure edt_passwort2_keypress(Sender: TObject; var Key: Char);
113
    procedure m_open_execute(Sender: TObject);
114
    procedure m_folder_execute(Sender: TObject);
115
    procedure m_config_execute(Sender: TObject);
116
    procedure m_exit_execute(Sender: TObject);
117
    procedure m_close_execute(Sender: TObject);
118
    procedure m_delete_execute(Sender: TObject);
119
    procedure m_direct_execute(Sender: TObject);
120
    procedure m_encrypt_execute(Sender: TObject);
121
    procedure m_decrypt_execute(Sender: TObject);
122
    procedure mm_actions_execute(Sender: TObject);
123
    procedure mm_file_execute(Sender: TObject);
124
    procedure mm_help_execute(Sender: TObject);
125
    procedure m_help_execute(Sender: TObject);
126
    procedure m_info_execute(Sender: TObject);
127
    procedure edt_passwort_keypress(Sender: TObject; var Key: Char);
128
    procedure edt_passwort_enter(Sender: TObject);
129
    procedure m_web_update_execute(Sender: TObject);
130
    procedure form_show(Sender: TObject);
131
    procedure tmr_refresh_timer(Sender: TObject);
132
    procedure m_web_dm_click(Sender: TObject);
133
    procedure m_web_vts_click(Sender: TObject);
134
    procedure m_web_project_click(Sender: TObject);
135
    procedure m_web_keytransmitter_click(Sender: TObject);
136
    procedure m_web_email_click(Sender: TObject);
137
    procedure m_dateiensammlung_neu_click(Sender: TObject);
138
    procedure m_dateiensammlung_show_click(Sender: TObject);
139
    procedure m_dateiensammlung_add_file_click(Sender: TObject);
140
    procedure m_dateiensammlung_add_folder_click(Sender: TObject);
141
    procedure tmp_progressdurchlauf_timer(Sender: TObject);
142
    procedure m_web_forum_click(Sender: TObject);
143
    procedure m_web_infopages_click(Sender: TObject);
144
  private
145
    steuerelementegesperrt: boolean;
146
    LangArray: Array of TLanguageEntry;
147
    lg_StartFolder: String;
148
    temp_unique_number: string;
149
    DateienCounter, DateienImOrdner: integer;
150
    // Freigegebene Streams, die bei der spontanen Programmbeendigung
151
    // unter Abfang der Exceptions freigegeben werden
152
    BestimmeDateiGroesseSource: TStream;
153
    tempstream: TStream;
154
    CompressInputStream, CompressOutputStream: TFileStream;
155
    CompressionStream: ZLib.TCompressionStream;
156
    DeCompressionStream: ZLib.TDeCompressionStream;
157
    ZippingStream: TStream;
158
    // Ende
159
    procedure progress_position(pos: integer);
160
    procedure progress_text(text, item: string);
161
    procedure Compress(InputFileName, OutputFileName: string);
162
    procedure Decompress(InputFileName, OutputFileName: string);
163
    procedure WMCopyData(var Msg: TWMCopyData); message WM_COPYDATA;
164
  public
165
    // VCL-Ersatz start
166
    DropFile: TDropFileTarget;
167
    KaZip: TKaZip;
168
    //xpmenu: TXPMenu;
169
    // VCL-Ersatz ende
170
    fileopen: string; // geöffnete datei
171
    ersatzname: string; // wenn ein ordner verschlüsselt wird, ordnernamen statt zip-dateinamen angeben
172
    ausgabegesetzt: string; // befehlszeile, wenn gesetzt
173
    errorlevel: integer; // fehlerlevel für befehlszeilenanwendung
174
    flag: byte; // ordner oder datei verschlüsselt?
175
    mode: TCase; // status der geöffneten datei?
176
    fMenuBrush: TBrush;
177
    procedure steuerelementesperren(sperren: boolean);
178
    procedure zeige_wartenform(dothis: boolean);
179
    function GetLangEntry(name: string): string;
180
    procedure OpenFile(fil: string; alternativer_name: string = ''; dateiensammlung: boolean = false);
181
    procedure OpenFolder(fol: string);
182
    procedure SchliesseDatei();
183
    function Unzip(ZipFile, Verzeichnis: string): boolean;
184
    procedure zipfolder(verzeichnis, zipname: string);
185
    procedure addtozip(fileorfolder, zipfile: string);
186
    procedure CreateZipFile(zipfile: string);
187
    procedure freestreams();
188
    procedure DefaultHandler(var Message); override;
189
    procedure ProcessCommandline(lpData: Pointer);
190
    procedure Start;
191
    function BestimmeDateiGroesse(filename: string): string;
192
  end;
193
 
194
var
195
  MainForm: TMainForm;
196
 
197
implementation
198
 
199
uses Config, About, Warten, Elemente;
200
 
201
{$R *.dfm}
202
 
203
{$R WindowsXP.res}
204
 
205
const
206
  // Konstanten
207
  Terminus: String = 'DCTERMINUS';
208
  FileNameTerminus: Char = '?';
209
  DateiTag: Byte = $00;
210
  OrdnerTag: Byte = $01;
211
  DateiCompressTag: Byte = $02;
212
  OrdnerCompressTag: Byte = $03;
213
  TempPre = 'DeCoder_';
214
  TempDirect = 'DeCoder_Sensitiv';
215
  TempExtTmp = '.tmp';
216
  TempExtCmp = '.cmp';
217
  TempExtZip = '.zip';
218
  ExtDC4 = '.dc4';
219
  updateid = 'decoder';
220
 
221
  // Standardeinstellungen
222
 
223
  StZIPType: TZipCompressionType = ctNone;
224
  ZLibCompressFile: Boolean = True;
225
  ZLibCompressFolder: Boolean = True;
226
 
227
  // (De)Coder 4.1 Standardeinstellungen
228
  VTag: Byte = $02;
229
  IDBase: LongInt = $84671842;
230
  SeedSize: Byte = 32;
231
  StMode: TCipherMode = cmCTSx;
232
  StCipher: String = 'TCipher_Rijndael';
233
  StHash: String = 'THash_SHA512';
234
 
235
  // (De)Coder 4.0 Kompatibilitätseinstellungen
236
  DC40VTag: Byte = $01;
237
  DC40IDBase: LongInt = $59178954;
238
  DC40SeedSize: Byte = 16;
239
  DC40StMode: TCipherMode = cmCTSx;
240
  DC40StCipher: String = 'TCipher_Rijndael';
241
  DC40StHash: String = 'THash_SHA512';
242
 
243
  // Konstanten von DEC
244
  cyprefix: String = 'TCipher_';
245
  haprefix: String = 'THash_';
246
  CipherModeStr: array[0..8] of string = ('CTSx', 'CBCx', 'CFB8', 'CFBx', 'OFB8', 'OFBx', 'CFS8', 'CFSx', 'ECBx');
247
 
248
{ Eine zweite Instanz hat uns ihre Kommandozeilenparameter geschickt }
249
// von OneInst
250
procedure TMainForm.WMCopyData(var Msg: TWMCopyData);
251
var
252
  i: integer;
253
  temp: string;
254
  tpara: string;
255
begin
256
  if (Msg.CopyDataStruct.dwData = SecondInstMsgId) and (SecondInstMsgId <> 0) then
257
  begin
258
    if (steuerelementegesperrt or wartenform.Visible or
259
       (not mainform.Visible)) and (paramstr_firstposition('/c') <> -1) and
260
       (paramstr_firstposition('/x') <> -1) and (paramstr_firstposition('/e') <> -1) and
261
       (paramstr_firstposition('/?') <> -1) and (paramstr_firstposition('/clean') <> -1) then
262
    begin
263
      temp := ParamBlobToStr(Msg.CopyDataStruct.lpData);
264
      tpara := '';
265
      for i := 0 to ZaehleLinien(temp)-1 do
266
        tpara := tpara + '"'+GebeLinieaus(temp, i+1) + '" ';
267
 
268
      shellexecute(application.Handle, 'open', pchar(application.exename), pchar(tpara+'/newinstance'), pchar(extractfiledir(application.exename)), sw_normal);
269
    end
270
    else
271
      ProcessCommandline(Msg.CopyDataStruct.lpData);
272
  end
273
  else
274
    { Tcha wohl doch nicht ID - stimmte nicht }
275
    inherited;
276
end;
277
 
278
{----------------------------------------------------------------------------}
279
{ Wir überschreiben den DefaultHandler, der alle Nachrichten zuerst bekommt, }
280
{ damit wir auf die Nachricht mit der ID SecondInstMsgId reagieren können.   }
281
{ (Dies ist notwendig, da wir jetzt noch nicht wissen welchen Wert           }
282
{  die ID haben wird, weswegen wir keine statische Message-Prozedure,        }
283
{  so wie bei WM_COPYDATA, schreiben können.)                                }
284
{----------------------------------------------------------------------------}
285
// von OneInst
286
procedure TMainForm.DefaultHandler(var Message);
287
begin
288
  if TMessage(Message).Msg = SecondInstMsgId then
289
    { Eine zweite Instanz hat uns nach dem Handle gefragt }
290
    { Es wird in die Message-Queue des Threads gepostet.  }
291
    PostThreadMessage(TMessage(Message).WParam, SecondInstMsgId, Handle, 0)
292
  else
293
    { Ansonsten rufen wir die geerbte Methode auf }
294
    inherited;
295
end;
296
 
297
procedure Schlafen(nDelay: Cardinal);
298
var
299
  nStart: Cardinal;
300
begin
301
  nStart := GetTickCount;
302
  while GetTickCount-nStart < nDelay do
303
  begin
304
    Application.ProcessMessages;
305
    Sleep(0);
306
  end;
307
end;
308
 
309
procedure TMainForm.Compress(InputFileName, OutputFileName: string);
310
begin
311
  try
312
    CompressInputStream:=TFileStream.Create(InputFileName, fmOpenRead);
313
    try
314
      CompressOutputStream:=TFileStream.Create(OutputFileName, fmCreate);
315
      try
316
        CompressionStream:=TCompressionStream.Create(clMax, CompressOutputStream);
317
        try
318
          CompressionStream.CopyFrom(CompressInputStream, CompressInputStream.Size);
319
        finally
320
          CompressionStream.Free;
321
        end;
322
      finally
323
        CompressOutputStream.Free;
324
      end;
325
    finally
326
      CompressInputStream.Free;
327
    end;
328
  except
329
    // z.B. bei Programmabbruch
330
  end;
331
end;
332
 
333
procedure TMainForm.m_web_dm_click(Sender: TObject);
334
begin
335
  shellexecute(application.Handle, 'open', 'http://www.daniel-marschall.de/', '', '', sw_normal);
336
end;
337
 
338
procedure TMainForm.m_web_project_click(Sender: TObject);
339
begin
340
  shellexecute(application.Handle, 'open', 'http://www.viathinksoft.de/index.php?page=projektanzeige&seite=projekt-18', '', '', sw_normal);
341
end;
342
 
343
procedure TMainForm.Decompress(InputFileName, OutputFileName: string);
344
var
345
  Buf: array[0..4095] of Byte;
346
  Count: Integer;
347
begin
348
  try
349
    CompressInputStream:=TFileStream.Create(InputFileName, fmOpenRead);
350
    try
351
      CompressOutputStream:=TFileStream.Create(OutputFileName, fmCreate);
352
      try
353
        DecompressionStream := TDecompressionStream.Create(CompressInputStream);
354
        try
355
          while true do
356
          begin
357
            Count := DecompressionStream.Read(Buf[0], SizeOf(Buf));
358
            if Count = 0 then
359
              break
360
            else
361
              CompressOutputStream.Write(Buf[0], Count);
362
          end;
363
        finally
364
          DecompressionStream.Free;
365
        end;
366
      finally
367
        CompressOutputStream.Free;
368
      end;
369
    finally
370
      CompressInputStream.Free;
371
    end;
372
  except
373
    // z.B. bei Programmabbruch
374
  end;
375
end;
376
 
377
function TMainForm.GetLangEntry(name: string): string;
378
var
379
  i: integer;
380
begin
381
  for i := 0 to high(LangArray) do
382
  begin
383
    if LangArray[i].name = name then
384
    begin
385
      result := LangArray[i].text;
386
      break;
387
    end;
388
  end;
389
end;
390
 
391
function IsCapsLockOn: boolean;
392
begin
393
  Result := 0 <>
394
    (GetKeyState(VK_CAPITAL) and $01);
395
end;
396
 
397
procedure TMainForm.progress_position(pos: integer);
398
begin
399
  wartenform.pbr_progress.Position := pos;
400
  if ((wartenform.pbr_progress.Position <> wartenform.pbr_progress.Min) and (GebeLinieaus(ParamZeile, 2) <> '/silent')) and (not wartenform.visible) then
401
  begin
402
    wartenform.Visible := true;
403
    // tmr_openwartenform.Enabled := true;
404
  end;
405
 
406
  application.ProcessMessages;
407
end;
408
 
409
procedure TMainForm.zeige_wartenform(dothis: boolean);
410
begin
411
  if dothis then
412
  begin
413
    if (GebeLinieaus(ParamZeile, 2) <> '/silent') and (not wartenform.visible) then
414
    begin
415
      progress_text('', '');
416
      wartenform.Visible := true;
417
      // tmr_openwartenform.Enabled := true;
418
    end;
419
  end
420
  else
421
  begin
422
    progress_text('', '');
423
    wartenform.Visible := false;
424
    // wartenform.tmr_closetimer.enabled := true;
425
  end;
426
end;
427
 
428
procedure TMainForm.progress_text(text, item: string);
429
begin
430
  wartenform.lbl_info1.caption := text;
431
  wartenform.lbl_info2.caption := item;
432
  application.processmessages;
433
end;
434
 
435
function FormatiereZahlToStr(inp: extended): string;
436
begin
437
  result := FloatToStrF(inp, ffNumber, 14, 2);
438
end;
439
 
440
function lang_getdirectoryname(): string;
441
var
442
  myreg: tregistry;
443
begin
444
  result := '';
445
  myreg := TRegistry.Create;
446
  try
447
    myreg.RootKey := HKEY_CLASSES_ROOT;
448
    if myreg.OpenKey('Directory', false) then
449
    begin
450
      result := myreg.ReadString('');
451
    end;
452
  finally
453
    myreg.free;
454
  end;
455
end;
456
 
457
function kazip_numfiles(ka: tkazip): integer;
458
var
459
  i, a: Integer;
460
begin
461
  a := 0;
462
  for i := 0 to ka.FileNames.count - 1 do
463
  begin
464
    if copy(ka.FileNames.Strings[i], length(ka.FileNames.Strings[i]), 1) <> '\' then
465
      inc(a);
466
  end;
467
  result := a;
468
end;
469
 
470
{ function kazip_numfolders(ka: tkazip): integer;
471
var
472
  i, a: Integer;
473
begin
474
  a := 0;
475
  for i := 0 to ka.FileNames.count - 1 do
476
  begin
477
    if copy(ka.FileNames.Strings[i], length(ka.FileNames.Strings[i]), 1) = '\' then
478
      inc(a);
479
  end;
480
  result := a;
481
end; }
482
 
483
function IntelligenteDateigroesse(ibytes: int64): string;
484
begin
485
  if ibytes > power(1024, 5) then
486
    result := FormatiereZahlToStr(ibytes / power(1024, 4))+' EB'
487
  else if ibytes > power(1024, 4) then
488
    result := FormatiereZahlToStr(ibytes / power(1024, 4))+' TB'
489
  else if ibytes > power(1024, 3) then
490
    result := FormatiereZahlToStr(ibytes / power(1024, 3))+' GB'
491
  else if ibytes > power(1024, 2) then
492
    result := FormatiereZahlToStr(ibytes / power(1024, 2))+' MB'
493
  else if ibytes > power(1024, 1) then
494
    result := FormatiereZahlToStr(ibytes / power(1024, 1))+' KB'
495
  else
496
  begin
497
    if ibytes = 1 then
498
      result := FormatiereZahlToStr(ibytes)+' Byte'
499
    else
500
      result := FormatiereZahlToStr(ibytes)+' Bytes';
501
  end;
502
end;
503
 
504
procedure dc_deletefile(Filename: string);
505
const
506
  buf = 1024;
507
var
508
  S: TStream;
509
  size: int64;
510
  abbruch: boolean;
511
  lAttributes: integer;
512
begin
513
  if fileexists(filename) then
514
  begin
515
    try
516
      lAttributes := FileGetAttr(Filename);
517
      if lAttributes and SysUtils.faReadOnly <> 0 then
518
      begin
519
        lAttributes := lAttributes - SysUtils.faReadOnly;
520
        FileSetAttr(Filename, lAttributes);
521
      end;
522
      S := TFileStream.Create(Filename, fmOpenWrite or fmShareExclusive);
523
      try
524
        size := S.Size;
525
        mainform.progress_position(wartenform.pbr_progress.min);
526
        mainform.progress_text(mainform.GetLangEntry('deletefile'), filename);
527
        abbruch := false;
528
        while not abbruch do
529
        begin
530
          size := size - buf;
531
          if size > 0 then
532
          begin
533
            ProtectStream(S, buf);
534
            mainform.progress_position(floor((s.size-size) / s.Size * wartenform.pbr_progress.max));
535
          end
536
          else
537
          begin
538
            if size < 0 then
539
              ProtectStream(S, s.size-s.Position); // wenn nicht size = 0
540
 
541
            mainform.progress_position(wartenform.pbr_progress.min);
542
 
543
            abbruch := true;
544
          end;
545
        end;
546
      finally
547
        S.Free;
548
      end;
549
      deletefile(pchar(filename));
550
    except
551
 
552
    end;
553
  end;
554
end;
555
 
556
procedure dc_deletedir(const Directory: String);
557
var
558
  SR: TSearchRec;
559
  zus: string;
560
begin
561
  if copy(Directory, length(Directory), 1) <> '\' then
562
    zus := '\'
563
  else
564
    zus := '';
565
 
566
  if FindFirst(Directory + zus + '*.*', faAnyFile - faDirectory, SR) = 0 then
567
  try
568
    repeat
569
      try
570
        dc_deletefile(Directory + zus + SR.Name)
571
      except
572
        // z.B. durch Benutzung oder durch Schreibschutz verursacht
573
      end;
574
    until FindNext(SR) <> 0;
575
  finally
576
    SysUtils.FindClose(SR);
577
  end;
578
 
579
  if FindFirst(Directory + zus + '*.*', faAnyFile, SR) = 0 then
580
  try
581
    repeat
582
      if ((SR.attr and faDirectory) = faDirectory) and (SR.Name <> '.') and (SR.Name <> '..') then
583
        dc_deletedir(Directory + zus + SR.Name + '\');
584
    until FindNext(SR) <> 0;
585
  finally
586
    SysUtils.FindClose(SR);
587
  end;
588
 
589
  removedirectory(pchar(Directory));
590
end;
591
 
592
// http://www.swissdelphicenter.ch/torry/showcode.php?id=144
593
function GetTempDir: string;
594
var
595
  Buffer: array[0..MAX_PATH] of Char;
596
begin
597
  GetTempPath(SizeOf(Buffer) - 1, Buffer);
598
  Result := StrPas(Buffer);
599
end;
600
 
601
// http://www.delphipraxis.net/post50248.html
602
  function PassphraseQuality(const Password: String): Extended;
603
// returns computed Quality in range 0.0 to 1.0
604
// source extracted from Delphi Encryption Compendium, DEC 
605
 
606
  function Entropy(P: PByteArray; L: Integer): Extended;
607
  var
608
    Freq: Extended;
609
    I: Integer;
610
    Accu: array[Byte] of LongWord;
611
  begin
612
    Result := 0.0;
613
    if L <= 0 then Exit;
614
    FillChar(Accu, SizeOf(Accu), 0);
615
    for I := 0 to L-1 do Inc(Accu[P[I]]);
616
    for I := 0 to 255 do
617
      if Accu[I] <> 0 then
618
      begin
619
        Freq := Accu[I] / L;
620
        Result := Result - Freq * (Ln(Freq) / Ln(2));
621
      end;
622
  end;
623
 
624
  function Differency: Extended;
625
  var
626
    S: String;
627
    L,I: Integer;
628
  begin
629
    Result := 0.0;
630
    L := Length(Password);
631
    if L <= 1 then Exit;
632
    SetLength(S, L-1);
633
    for I := 2 to L do
634
      Byte(S[I-1]) := Byte(Password[I-1]) - Byte(Password[I]);
635
    Result := Entropy(Pointer(S), Length(S));
636
  end;
637
 
638
  function KeyDiff: Extended;
639
  const
640
    Table = '^1234567890ß´qwertzuiopü+asdfghjklöä#<yxcvbnm,.-°!"§$%&/()=?`QWERTZUIOPÜ*ASDFGHJKLÖÄ''>YXCVBNM;:_';
641
  var
642
    S: String;
643
    L,I,J: Integer;
644
  begin
645
    Result := 0.0;
646
    L := Length(Password);
647
    if L <= 1 then Exit;
648
    S := Password;
649
    UniqueString(S);
650
    for I := 1 to L do
651
    begin
652
      J := Pos(S[I], Table);
653
      if J > 0 then S[I] := Char(J);
654
    end;
655
    for I := 2 to L do
656
      Byte(S[I-1]) := Byte(S[I-1]) - Byte(S[I]);
657
    Result := Entropy(Pointer(S), L-1);
658
  end;
659
 
660
const
661
  GoodLength = 10.0; // good length of Passphrases 
662
var
663
  L: Extended;
664
begin
665
  Result := Entropy(Pointer(Password), Length(Password));
666
  if Result <> 0 then
667
  begin
668
    Result := Result * (Ln(Length(Password)) / Ln(GoodLength));
669
    L := KeyDiff + Differency;
670
    if L <> 0 then L := L / 64;
671
    Result := Result * L;
672
    if Result < 0 then Result := -Result;
673
    if Result > 1 then Result := 1;
674
  end;
675
end;
676
 
677
///////////////////////////////////////////////////////////////////
678
// Call back function used to set the initial browse directory.
679
///////////////////////////////////////////////////////////////////
680
function BrowseForFolderCallBack(Wnd: HWND; uMsg: UINT;
681
        lParam, lpData: LPARAM): Integer stdcall;
682
begin
683
  if uMsg = BFFM_INITIALIZED then
684
    SendMessage(Wnd,BFFM_SETSELECTION,1,Integer(@mainform.lg_StartFolder[1]));
685
  result := 0;
686
end;
687
 
688
///////////////////////////////////////////////////////////////////
689
// This function allows the user to browse for a folder
690
//
691
// Arguments:-
692
//    browseTitle : The title to display on the browse dialog.
693
//  NewFolder : Allow to create a new folder
694
//  initialFolder : Optional argument. Use to specify the folder
695
//                  initially selected when the dialog opens.
696
//
697
// Returns: The empty string if no folder was selected (i.e. if the
698
//          user clicked cancel), otherwise the full folder path.
699
///////////////////////////////////////////////////////////////////
700
function BrowseForFolder(const browseTitle: String; const NewFolder: boolean = false;
701
        const initialFolder: String =''): String;
702
var
703
  browse_info: TBrowseInfo;
704
  folder: array[0..MAX_PATH] of char;
705
  find_context: PItemIDList;
706
const
707
  BIF_NEWDIALOGSTYLE=$40;
708
begin
709
  FillChar(browse_info,SizeOf(browse_info),#0);
710
  mainform.lg_StartFolder := initialFolder;
711
  browse_info.pszDisplayName := @folder[0];
712
  browse_info.lpszTitle := PChar(browseTitle);
713
  if NewFolder then
714
    browse_info.ulFlags := BIF_RETURNONLYFSDIRS or BIF_NEWDIALOGSTYLE
715
  else
716
    browse_info.ulFlags := BIF_RETURNONLYFSDIRS;
717
  browse_info.hwndOwner := Application.Handle;
718
  if initialFolder <> '' then
719
    browse_info.lpfn := BrowseForFolderCallBack;
720
  find_context := SHBrowseForFolder(browse_info);
721
  if Assigned(find_context) then
722
  begin
723
    if SHGetPathFromIDList(find_context,folder) then
724
      result := folder
725
    else
726
      result := '';
727
    GlobalFreePtr(find_context);
728
  end
729
  else
730
    result := '';
731
end;
732
 
733
// Entnommen von FileCtrl
734
procedure CutFirstDirectory(var S: TFileName);
735
var
736
  Root: Boolean;
737
  P: Integer;
738
begin
739
  if S = '\' then
740
    S := ''
741
  else
742
  begin
743
    if S[1] = '\' then
744
    begin
745
      Root := True;
746
      Delete(S, 1, 1);
747
    end
748
    else
749
      Root := False;
750
    if S[1] = '.' then
751
      Delete(S, 1, 4);
752
    P := AnsiPos('\',S);
753
    if P <> 0 then
754
    begin
755
      Delete(S, 1, P);
756
      S := '...\' + S;
757
    end
758
    else
759
      S := '';
760
    if Root then
761
      S := '\' + S;
762
  end;
763
end;
764
 
765
// Entnommen von http://www.delphipraxis.net/post429178.html
766
function IsFileName(FileName: String): Boolean;
767
const ForbiddenChars = ['"', '<', '>', '|', '*', '/', '\', '?']; // verbotene Zeichen 
768
 
769
const ForbiddenNames: Array[0..22] of String[6] = ('AUX', 'NUL', 'PRN' ,'CON', 'CLOCK$',  // verbotene Namen 
770
'COM1', 'COM2', 'COM3', 'COM4', 'COM5', 'COM6', 'COM7', 'COM8', 'COM9',
771
'LPT1', 'LPT2', 'LPT3', 'LPT4', 'LPT5', 'LPT6', 'LPT7', 'LPT8', 'LPT9');
772
 
773
var i: Integer;
774
var p: PChar;
775
var FileNameU: String;
776
begin
777
Result := False;
778
 
779
  if FileName <> '' then // Name darf nicht leer sein 
780
  begin
781
    i := Length(FileName);
782
 
783
    if FileName[i] <> '.' then // letze Zeichen darf kein Punkt sein 
784
    begin
785
      p := Pointer(FileName);
786
 
787
      repeat if p^ in ForbiddenChars then
788
        Exit;
789
        inc(p);
790
      until p^ = #0;
791
 
792
      if (i < 7) and (i > 2) then
793
      begin
794
        FileNameU := UpperCase(FileName);
795
        for i := 0 to High(ForbiddenNames) do
796
        begin
797
          if CompareStr(ForbiddenNames[i], FileNameU) = 0 then
798
          Exit;
799
        end;
800
      end;
801
 
802
    Result := True;
803
  end;
804
  end;
805
end;
806
 
807
  // Original von Codebeispiel von Hagen Reddmann
808
  procedure EncodeFile(const AFileName, AOutput: String; const APassword: Binary);
809
 
810
    procedure Write(const Value; Size: Integer);
811
    begin
812
      mainform.tempstream.WriteBuffer(Value, Size);
813
    end;
814
 
815
    procedure WriteByte(Value: Byte);
816
    begin
817
      Write(Value, SizeOf(Value));
818
    end;
819
 
820
    procedure WriteLong(Value: LongWord);
821
    begin
822
      Value := SwapLong(Value);
823
      Write(Value, SizeOf(Value));
824
    end;
825
 
826
    procedure WriteBinary(const Value: Binary);
827
    begin
828
      WriteByte(Length(Value));
829
      Write(Value[1], Length(Value));
830
    end;
831
 
832
    procedure WriteRaw(const Value: Binary);
833
    begin
834
      Write(Value[1], Length(Value));
835
    end;
836
 
837
  var
838
    Source: TStream;
839
    Seed: Binary;
840
    P: IDECProgress;
841
    ACipher: TDECCipherClass;
842
    AHash: TDECHashClass;
843
    ACFileName: String;
844
  begin
845
    mainform.progress_position(wartenform.pbr_progress.min);
846
    mainform.progress_text(mainform.GetLangEntry('encodedata'), afilename);
847
 
848
    ACipher := CipherByName(StCipher);
849
    AHash := HashByName(StHash);
850
 
851
    ACipher := ValidCipher(ACipher);
852
    AHash := ValidHash(AHash);
853
 
854
    Seed := RandomBinary(SeedSize);
855
 
856
    ACFileName := GetTempDir+TempPre+mainform.temp_unique_number+TempExtCmp;
857
 
858
    // Ordner (-> ZIP-Dateien) werden nicht nocheinmal komprimiert ... oder doch?
859
    // if (ZLibCompressFile and (mainform.ersatzname = '')) or (ZLibCompressFolder and (mainform.ersatzname <> '')) then
860
    if mainform.chk_compress.checked then
861
      mainform.Compress(AFileName, ACFileName)
862
    else
863
      ACFileName := AFileName;
864
 
865
    Source := TFileStream.Create(ACFileName, fmOpenRead or fmShareDenyNone);
866
    try
867
      try
868
        mainform.tempstream := TFileStream.Create(AOutput, fmOpenReadWrite or fmCreate);
869
        try
870
          with ACipher.Create do
871
          try
872
            try
873
              Mode := TCipherMode(StMode);
874
 
875
              Init(AHash.KDFx(APassword, Seed, Context.KeySize));
876
 
877
              if mainform.ersatzname <> '' then
878
              begin
879
                if mainform.chk_compress.Checked then
880
                  writebyte(OrdnerCompressTag)
881
                else
882
                  writebyte(OrdnerTag);
883
              end
884
              else
885
              begin
886
                if mainform.chk_compress.Checked then
887
                  writebyte(DateiCompressTag)
888
                else
889
                  writebyte(DateiTag);
890
              end;
891
 
892
              WriteByte(VTag);
893
              {if mainform.ersatzname <> '' then
894
                WriteRaw(Base64Encode(ExtractFileName(mainform.ersatzname)))
895
              else
896
                WriteRaw(Base64Encode(ExtractFileName(AFileName)));}
897
              WriteRaw(Base64Encode(mainform.edt_vle1.text));
898
              WriteRaw(FileNameTerminus);
899
              WriteLong(IDBase);
900
              WriteLong(acipher.Identity);
901
              WriteByte(Byte(Mode));
902
              WriteLong(ahash.Identity);
903
              WriteByte(SeedSize);
904
              WriteRaw(Seed);
905
 
906
              P := TProgress.Create;
907
              try
908
                EncodeStream(Source, mainform.tempstream, Source.Size, P);
909
              except
910
                // Kann auftreten, wenn das Programm beim Verschlüsseln geschlossen wird
911
                exit;
912
              end;
913
              source.Position := 0;
914
              WriteRaw(ahash.CalcBinary(ahash.CalcStream(source, source.size)+Seed+APassword));
915
              WriteRaw(Base64Encode(Terminus));
916
            finally
917
              Free;
918
            end;
919
          except
920
            raise;
921
          end;
922
        finally
923
          try
924
            mainform.tempstream.Free;
925
          except
926
            // kann passieren, wenn der Stream bereits durch FormClose geschlossen wurde
927
          end;
928
        end;
929
      except
930
        // Ist eine temporäre Datei und wird bei Programmbeendigung gelöscht
931
        // dc_deletefile(aoutput);
932
        mainform.steuerelementesperren(false);
933
        raise; // programmablauf endet hier
934
      end;
935
    finally
936
      Source.Free;
937
    end;
938
  end;
939
 
940
  // Original von Codebeispiel von Hagen Reddmann
941
  procedure DecodeFile(const AFileName, AOutput: String; const APassword: Binary);
942
  var
943
    Source: TStream;
944
    OrigName: string;
945
    ahash: TDECHashClass;
946
 
947
    procedure Read(var Value; Size: Integer);
948
    begin
949
      Source.ReadBuffer(Value, Size);
950
    end;
951
 
952
    function ReadByte: Byte;
953
    begin
954
      Read(Result, SizeOf(Result));
955
    end;
956
 
957
    function ReadLong: LongWord;
958
    begin
959
      Read(Result, SizeOf(Result));
960
      Result := SwapLong(Result);
961
    end;
962
 
963
    function ReadBinary: Binary;
964
    begin
965
      SetLength(Result, ReadByte);
966
      Read(Result[1], Length(Result));
967
    end;
968
 
969
    function ReadRaw(leng: integer): Binary;
970
    begin
971
      SetLength(Result, leng);
972
      Read(Result[1], Length(Result));
973
    end;
974
 
975
  var
976
    ch: string;
977
    {F, }V: Byte;
978
    P: IDECProgress;
979
    Cipher: TDECCipher;
980
    Seed: String;
981
  begin
982
    mainform.progress_position(wartenform.pbr_progress.min);
983
    mainform.progress_text(mainform.GetLangEntry('decodedata'), afilename);
984
 
985
    Source := TFileStream.Create(AFileName, fmOpenRead or fmShareDenyNone);
986
    try
987
      try
988
        {F := }ReadByte;
989
        V := ReadByte;
990
 
991
        OrigName := '';
992
        ch := readraw(1);
993
        while ch <> FileNameTerminus do
994
        begin
995
          OrigName := OrigName + ch;
996
          ch := readraw(1);
997
        end;
998
 
999
        if V = VTag then
1000
        begin
1001
          OrigName := Base64Decode(OrigName);
1002
          ReadLong; // IdendityBase wird bereits bei FileOpen gesetzt
1003
        end;
1004
 
1005
        mainform.tempstream := TFileStream.Create(AOutput, fmOpenReadWrite or fmCreate);
1006
        try
1007
          try
1008
            Cipher := nil;
1009
            if V = DC40VTag then Cipher := ValidCipher(CipherByName(DC40StCipher)).Create;
1010
            if V = VTag then Cipher := ValidCipher(CipherByIdentity(ReadLong)).Create;
1011
            try
1012
              AHash := nil;
1013
              if V = DC40VTag then
1014
              begin
1015
                Cipher.Mode := TCipherMode(DC40StMode);
1016
                AHash := HashByName(DC40StHash);
1017
              end;
1018
              if V = VTag then
1019
              begin
1020
                Cipher.Mode := TCipherMode(ReadByte);
1021
                AHash := HashByIdentity(ReadLong);
1022
              end;
1023
              AHash := ValidHash(AHash);
1024
 
1025
              if V = DC40VTag then
1026
                Seed := ReadRaw(DC40SeedSize);
1027
              if V = VTag then
1028
                Seed := ReadRaw(ReadByte);
1029
 
1030
              Cipher.Init(ahash.KDFx(APassword, Seed, Cipher.Context.KeySize));
1031
 
1032
              P := TProgress.Create;
1033
              try
1034
                if V = DC40VTag then
1035
                  Cipher.DecodeStream(Source, mainform.tempstream, source.size-source.Position-ahash.DigestSize, P);
1036
                if V = VTag then
1037
                  Cipher.DecodeStream(Source, mainform.tempstream, source.size-source.Position-ahash.DigestSize-Length(Base64Encode(Terminus)), P);
1038
              except
1039
                // Kann auftreten, wenn das Programm beim Verschlüsseln geschlossen wird
1040
                exit;
1041
              end;
1042
              mainform.tempstream.position := 0;
1043
              if V = DC40VTag then
1044
              begin
1045
                if readraw(ahash.DigestSize) <> ahash.CalcStream(mainform.tempstream, mainform.tempstream.size) then
1046
                  raise EDECException.Create(mainform.GetLangEntry('hasherror'));
1047
              end;
1048
              if V = VTag then
1049
              begin
1050
                if readraw(ahash.DigestSize) <> ahash.CalcBinary(ahash.CalcStream(mainform.tempstream, mainform.tempstream.size)+Seed+APassword) then
1051
                  raise EDECException.Create(mainform.GetLangEntry('hasherror'));
1052
              end;
1053
            finally
1054
              Cipher.Free;
1055
            end;
1056
          except
1057
            // ProtectStream wird in dc_deletefile durchgeführt
1058
            // ProtectStream(Dest);
1059
            raise;
1060
          end;
1061
        finally
1062
          try
1063
            mainform.tempstream.Free;
1064
          except
1065
            // kann passieren, wenn der Stream bereits durch FormClose geschlossen wurde
1066
          end;
1067
        end;
1068
      except
1069
        // Ist eine temporäre Datei und wird bei Programmbeendigung gelöscht
1070
        // dc_deletefile(aoutput);
1071
        mainform.steuerelementesperren(false);
1072
        raise; // programmablauf endet hier
1073
      end;
1074
    finally
1075
      Source.Free;
1076
    end;
1077
  end;
1078
 
1079
function FindeDateityp(filename: string): string;
1080
var
1081
  Reg: TRegistry;
1082
  temp: string;
1083
begin
1084
  {* Dateityp herausfinden *}
1085
  if ExtractFileExt(filename) <> '' then
1086
  begin
1087
    Reg := TRegistry.Create;
1088
    try
1089
      Reg.RootKey := HKEY_CLASSES_ROOT;
1090
      if Reg.OpenKey(ExtractFileExt(filename), false) then
1091
      begin
1092
        temp := Reg.ReadString('');
1093
        Reg.CloseKey();
1094
        if temp <> '' then
1095
        begin
1096
          Reg.OpenKey(temp, false);
1097
          temp := Reg.ReadString('');
1098
          Reg.CloseKey();
1099
          if temp <> '' then
1100
            result := temp
1101
          else
1102
            result := ''; {* Weiterleitung hat keinen Namen für den Dateityp *}
1103
        end
1104
        else
1105
          result := ''; {* Konnte keine Weiterleitung in der Registry finden *}
1106
      end
1107
      else
1108
        result := ''; {* Keinen Eintrag der Erweiterung in der Registry gefunden *}
1109
    finally
1110
      Reg.free;
1111
    end;
1112
  end
1113
  else
1114
    result := ''; {* Keine Erweiterung *}
1115
end;
1116
 
1117
{ function SecureDeleteWhenUnlocked(Filename: string): boolean;
1118
var
1119
  exc: boolean;
1120
  chk: TStream;
1121
  versuche: integer;
1122
begin
1123
  result := true;
1124
  if fileexists(Filename) then
1125
  begin
1126
    // Wenn die Datei nicht innerhalb von 5 Sekunden freigegeben, es einfach lassen
1127
    versuche := 0;
1128
    while versuche <= 500 do
1129
    begin
1130
      inc(versuche);
1131
      try
1132
        exc := false;
1133
        // DE: shutdownwait=Warte, bis temporäre Dateien freigegeben sind.
1134
        // EN: shutdownwait=Wait, till temporary files are unlocked...
1135
        // mainform.progress_text(mainform.GetLangEntry('shutdownwait'));
1136
        // mainform.progress_position(progress_min);
1137
        application.ProcessMessages;
1138
        chk := TFileStream.Create(Filename, fmOpenWrite or fmShareExclusive);
1139
        Schlafen(10);
1140
        chk.free;
1141
      except
1142
        exc := true; // immer noch gesperrt
1143
      end;
1144
      if not exc then break; // datei ist wieder schreibbar und somit löschbar
1145
    end;
1146
    dc_deletefile(Filename);
1147
    if fileexists(Filename) then result := false; // Fehlgeschlagen
1148
  end;
1149
end; }
1150
 
1151
// http://www.swissdelphicenter.ch/torry/showcode.php?id=2413
1152
function DirectoryIsEmpty(Directory: string): Boolean;
1153
var
1154
  SR: TSearchRec;
1155
  i: Integer;
1156
begin
1157
  Result := False;
1158
  FindFirst(IncludeTrailingPathDelimiter(Directory) + '*', faAnyFile, SR);
1159
  for i := 1 to 2 do
1160
    if (SR.Name = '.') or (SR.Name = '..') then
1161
      Result := FindNext(SR) <> 0;
1162
  FindClose(SR);
1163
end;
1164
 
1165
procedure DeleteTempFiles();
1166
var
1167
  searchResult: TSearchRec;
1168
  allesok, nichtsda: boolean;
1169
  uqnr: string;
1170
begin
1171
  mainform.zeige_wartenform(true);
1172
  mainform.steuerelementesperren(true);
1173
  try
1174
 
1175
  allesok := true;
1176
  nichtsda := true;
1177
 
1178
  if (copy(lowercase(GebeLinieaus(ParamZeile, 2)), 0, 6) = '/only=') or (copy(lowercase(gebelinieaus(ParamZeile, 3)), 0, 6) = '/only=') then
1179
  begin
1180
    // Nur Sitzungsdaten von einer Sitzung löscchen
1181
 
1182
    if copy(lowercase(GebeLinieaus(ParamZeile, 2)), 0, 6) = '/only=' then
1183
      uqnr := copy(GebeLinieaus(ParamZeile, 2), 7, length(GebeLinieaus(ParamZeile, 2))-6);
1184
    if copy(lowercase(GebeLinieaus(ParamZeile, 3)), 0, 6) = '/only=' then
1185
      uqnr := copy(GebeLinieaus(ParamZeile, 3), 7, length(GebeLinieaus(ParamZeile, 3))-6);
1186
 
1187
    if FindFirst(GetTempDir+'*.*', faAnyFile, searchResult) = 0 then
1188
    begin
1189
      repeat
1190
        if (lowercase(copy(extractfilename(searchResult.Name), 0, length(extractfilename(searchResult.Name))-length(extractfileext(searchResult.Name)))) = lowercase(TempPre+uqnr)) and fileexists(GetTempDir+searchResult.Name) then
1191
        begin
1192
          nichtsda := false;
1193
          dc_deletefile(GetTempDir+extractfilename(searchResult.Name));
1194
          if fileexists(GetTempDir+extractfilename(searchResult.Name)) then
1195
            allesok := false;
1196
        end;
1197
      until FindNext(searchResult) <> 0;
1198
      FindClose(searchResult);
1199
    end;
1200
 
1201
    if (directoryexists(GetTempDir+TempDirect+'\'+uqnr) and not DirectoryIsEmpty(GetTempDir+TempDirect+'\'+uqnr)) then
1202
    begin
1203
      nichtsda := false;
1204
      dc_deletedir(GetTempDir+TempDirect+'\'+uqnr);
1205
      if directoryexists(GetTempDir+TempDirect+'\'+uqnr) then
1206
        allesok := false;
1207
    end;
1208
 
1209
  end
1210
  else
1211
  begin
1212
    // Alle Sitzungsdaten löschen
1213
 
1214
    if FindFirst(GetTempDir+'*.*', faAnyFile, searchResult) = 0 then
1215
    begin
1216
      repeat
1217
        if (lowercase(copy(searchResult.Name, 0, length(TempPre))) = lowercase(TempPre)) and fileexists(GetTempDir+searchResult.Name) then
1218
        begin
1219
          nichtsda := false;
1220
          dc_deletefile(GetTempDir+searchResult.Name);
1221
          if fileexists(GetTempDir+searchResult.Name) then
1222
            allesok := false;
1223
        end;
1224
      until FindNext(searchResult) <> 0;
1225
      FindClose(searchResult);
1226
    end;
1227
 
1228
    if directoryexists(GetTempDir+TempDirect) then
1229
    begin
1230
      nichtsda := false;
1231
      dc_deletedir(GetTempDir+TempDirect);
1232
      if directoryexists(GetTempDir+TempDirect) then
1233
        allesok := false;
1234
    end;
1235
  end;
1236
 
1237
  if (lowercase(GebeLinieaus(ParamZeile, 2)) <> '/silent') then
1238
  begin
1239
    if nichtsda then
1240
      Application.MessageBox(pchar(MainForm.GetLangEntry('nothingtoclean')), pchar(MainForm.GetLangEntry('information')), MB_OK + MB_ICONASTERISK)
1241
    else
1242
    begin
1243
      if not allesok then
1244
        Application.MessageBox(pchar(MainForm.GetLangEntry('cleaningerror')), pchar(MainForm.GetLangEntry('warning')), MB_OK + MB_ICONEXCLAMATION)
1245
      else
1246
        Application.MessageBox(pchar(MainForm.GetLangEntry('cleaningok')), pchar(MainForm.GetLangEntry('information')), MB_OK + MB_ICONASTERISK);
1247
    end;
1248
  end
1249
  else
1250
  begin
1251
    if not allesok then
1252
      MainForm.errorlevel := 8; // Datei oder Ordner konnte nicht oder nur teilweise entfernt werden.
1253
  end;
1254
 
1255
  finally
1256
  mainform.steuerelementesperren(false);
1257
  mainform.zeige_wartenform(false);
1258
  end;
1259
end;
1260
 
1261
{ function HexAnsicht(inp: string): string;
1262
var
1263
  i: integer;
1264
begin
1265
  result := '';
1266
  for i := 1 to length(inp) do
1267
    result := result + inttohex(ord(inp[i]), 2) + ' ';
1268
end; }
1269
 
1270
procedure TMainForm.OpenFile(fil: string; alternativer_name: string = ''; dateiensammlung: boolean = false);
1271
var
1272
  Source: TStream;
1273
  O, T: string;
1274
  F, V: byte;
1275
  Dateigroesse: int64;
1276
  ch: string;
1277
  hash: TDECHashClass;
1278
  cipher: TDECCipherClass;
1279
  InfoSeedSize: byte;
1280
  InfoMode: byte;
1281
  FileInfo: SHFILEINFO;
1282
 
1283
  procedure Read(var Value; Size: Integer);
1284
  begin
1285
    Source.ReadBuffer(Value, Size);
1286
  end;
1287
 
1288
  function ReadByte: Byte;
1289
  begin
1290
    Read(Result, SizeOf(Result));
1291
  end;
1292
 
1293
  function ReadLong: LongWord;
1294
  begin
1295
    Read(Result, SizeOf(Result));
1296
    Result := SwapLong(Result);
1297
  end;
1298
 
1299
  function ReadBinary: Binary;
1300
  begin
1301
    SetLength(Result, ReadByte);
1302
    Read(Result[1], Length(Result));
1303
  end;
1304
 
1305
  function ReadRaw(leng: integer): Binary;
1306
  begin
1307
    SetLength(Result, leng);
1308
    Read(Result[1], Length(Result));
1309
  end;
1310
 
1311
  procedure Dateibeschaedigt();
1312
  begin
1313
    // ClientHeight := formanfangsgroesse;
1314
    edt_vle3.Text := '-';
1315
    edt_vle4.Text := '-';
1316
    edt_vle5.Text := GetLangEntry('broken');
1317
    edt_vle6.Text := '-';
1318
    edt_vle7.Text := '-';
1319
 
1320
    lbl_passwort.Visible := false;
1321
    lbl_passwort2.Visible := false;
1322
    edt_passwort.Visible := false;
1323
    edt_passwort2.Visible := false;
1324
    lbl_entropy.Visible := false;
1325
    lbl_equal.Visible := false;
1326
    chk_securedelete.Visible := false;
1327
    chk_compress.Visible := false;
1328
    tmr_capslock.Enabled := false;
1329
    lbl_capswarning.Visible := false;
1330
    img_warning.Visible := false;
1331
 
1332
    b_decrypt.Visible := false;
1333
    b_encrypt.Visible := false;
1334
    b_direct.Visible := false;
1335
    b_open.Visible := true;
1336
    b_folder.Visible := true;
1337
 
1338
    if ausgabegesetzt <> '' then
1339
      errorlevel := 1 // DC4 Datei beschädigt
1340
    else
1341
    begin
1342
      // Application.MessageBox(pchar(GetLangEntry('errorreading')), pchar(GetLangEntry('error')), MB_OK + MB_ICONSTOP);
1343
      img_error.visible := true;
1344
      lbl_readerror.visible := true;
1345
    end;
1346
  end;
1347
 
1348
begin
1349
  steuerelementesperren(true);
1350
  zeige_wartenform(true);
1351
  try
1352
 
1353
  m_close.enabled := true;
1354
  fileopen := fil;
1355
 
1356
  if (alternativer_name <> '') and (fileexists(alternativer_name) or directoryexists(alternativer_name)) then
1357
    SHGetFileInfo(PChar(alternativer_name), 0, FileInfo, SizeOf(FileInfo), SHGFI_ICON or SHGFI_LARGEICON)
1358
  else
1359
    SHGetFileInfo(PChar(fil), 0, FileInfo, SizeOf(FileInfo), SHGFI_ICON or SHGFI_LARGEICON);
1360
 
1361
  img_type.Picture.Icon.Handle := FileInfo.hIcon;
1362
 
1363
  if alternativer_name <> '' then
1364
  begin
1365
    edt_vle1.Text := ExtractFileName(alternativer_name);
1366
    if fileexists(alternativer_name) or directoryexists(alternativer_name) then
1367
      edt_vle2.Text := ExtractFilePath(alternativer_name)
1368
    else
1369
      edt_vle2.Text := ExtractFilePath(fil);
1370
    caption := '(De)Coder '+DC4Ver+' [' + extractfilename(alternativer_name) + ']';
1371
  end
1372
  else
1373
  begin
1374
    edt_vle1.Text := ExtractFileName(fil);
1375
    edt_vle2.Text := ExtractFilePath(fil);
1376
    caption := '(De)Coder '+DC4Ver+' [' + extractfilename(fil) + ']';
1377
  end;
1378
 
1379
  edt_vle3.Text := '';
1380
  edt_vle4.Text := '';
1381
  edt_vle5.Text := '';
1382
  edt_vle6.Text := '';
1383
  edt_vle7.Text := '';
1384
 
1385
  edt_passwort.Text := '';
1386
  edt_passwort2.Text := '';
1387
  edt_passwort_change(edt_passwort);
1388
  chk_securedelete.Checked := paramzeile_firstposition('/x') <> -1;
1389
  chk_compress.Checked := true;
1390
  // wird durch edt_enc_password_change automatisch aufgerufen
1391
  // edt_enc_password2_change(edt_enc_password2);
1392
 
1393
  dlg_save_dec.filter := GetLangEntry('filter_all')+' (*.*)|*.*';
1394
  dlg_save_dec.filename := '';
1395
  dlg_save_dec.defaultext := '';
1396
  dlg_save_enc.filename := '';
1397
 
1398
  mode := tcUnknown;
1399
 
1400
  Source := TFileStream.Create(fil, fmOpenRead or fmShareDenyNone);
1401
 
1402
  try
1403
    try
1404
      if lowercase(extractfileext(fil)) = lowercase(ExtDC4) then
1405
      begin
1406
        edt_vle1.Color := clBtnFace;
1407
        edt_vle1.ReadOnly := true;
1408
        edt_vle1.TabStop := false;
1409
 
1410
        F := ReadByte; // ID-Flag (Datei/Ordner)
1411
        V := ReadByte; // Versions-Flag
1412
 
1413
        if V = DC40VTag then edt_vle5.Text := Format(GetLangEntry('encrypted'), ['(De)Coder 4.0']);
1414
        if V = VTag then edt_vle5.Text := Format(GetLangEntry('encrypted'), ['(De)Coder 4.1']);
1415
 
1416
        if ((F <> DateiTag) and (F <> DateiCompressTag) and (F <> OrdnerTag) and (F <> OrdnerCompressTag)) or ((V <> DC40VTag) and (V <> VTag)) then
1417
        begin
1418
          Dateibeschaedigt;
1419
          steuerelementesperren(false);
1420
          exit;
1421
        end;
1422
 
1423
        cipher := nil;
1424
        hash := nil;
1425
 
1426
        if V = DC40VTag then
1427
        begin
1428
          cipher := CipherByName(DC40StCipher);
1429
          hash := HashByName(DC40StHash);
1430
        end;
1431
 
1432
        if V = VTag then
1433
        begin
1434
          cipher := CipherByName(StCipher);
1435
          hash := HashByName(StHash);
1436
        end;
1437
 
1438
        cipher := validcipher(cipher);
1439
        hash := validhash(hash);
1440
 
1441
        // damit später bei DecodeFile entschieden werden kann, ob entzippt werden muss
1442
        flag := F;
1443
 
1444
        O := '';
1445
        ch := readraw(1);
1446
        while ch <> FileNameTerminus do
1447
        begin
1448
          O := O + ch;
1449
          ch := readraw(1);
1450
        end;
1451
        if V = VTag then O := Base64Decode(O);
1452
 
1453
        // Idendity Base
1454
        if (V = VTag) then
1455
          IdentityBase := ReadLong
1456
        else
1457
          IdentityBase := DC40IDBase;
1458
 
1459
        InfoSeedSize := DC40SeedSize;
1460
        InfoMode := Byte(DC40StMode);
1461
        if (V = VTag) then
1462
        begin
1463
          cipher := CipherByIdentity(ReadLong);
1464
          InfoMode := ReadByte;
1465
          hash := HashByIdentity(ReadLong);
1466
 
1467
          cipher := ValidCipher(cipher);
1468
          hash := ValidHash(hash);
1469
 
1470
          InfoSeedSize := ReadByte;
1471
        end;
1472
 
1473
        if IsFileName(O) then
1474
        begin
1475
          dlg_save_dec.FileName := O;
1476
          dlg_save_dec.DefaultExt := copy(extractfileext(O), 1, length(extractfileext(O)));
1477
        end
1478
        else
1479
        begin
1480
          dateibeschaedigt;
1481
          steuerelementesperren(false);
1482
          exit;
1483
        end;
1484
 
1485
        edt_vle6.Text := O;
1486
 
1487
        if (F = OrdnerTag) or (F = OrdnerCompressTag) then
1488
        begin
1489
          T := lang_getdirectoryname;
1490
          ersatzname := O; // damit nach decodefile der richtige ordnername verwendet wird
1491
        end;
1492
        if (F = DateiTag) or (F = DateiCompressTag) then
1493
        begin
1494
          T := FindeDateityp(O);
1495
          ersatzname := '';
1496
        end;
1497
 
1498
        if (T = '') then T := Format(GetLangEntry('x-file'), [uppercase(copy(extractfileext(O), 2, length(extractfileext(O))-1))]);
1499
        edt_vle3.Text := T;
1500
 
1501
        dlg_save_dec.Filter := T+' (*'+lowercase(extractfileext(O))+')|*'+lowercase(extractfileext(O))+'|'+GetLangEntry('filter_all')+' (*.*)|*.*';
1502
 
1503
        Dateigroesse := source.size - hash.DigestSize - source.Position - InfoSeedSize;
1504
        If V = VTag then Dateigroesse := Dateigroesse - length(Base64Encode(Terminus));
1505
 
1506
        if Dateigroesse < 0 then
1507
        begin
1508
          dateibeschaedigt;
1509
          steuerelementesperren(false);
1510
          exit;
1511
        end
1512
        else
1513
        begin
1514
          if (F = DateiCompressTag) or (F = OrdnerTag) or (F = OrdnerCompressTag) then edt_vle4.Text := GetLangEntry('compressed')+': ';
1515
          edt_vle4.Text := edt_vle4.Text + IntelligenteDateigroesse(Dateigroesse);
1516
        end;
1517
 
1518
        if V = VTag then
1519
        begin
1520
          source.Position := source.Size - length(Base64Encode(terminus));
1521
          if ReadRaw(length(Base64Encode(terminus))) <> Base64Encode(terminus) then
1522
          begin
1523
            dateibeschaedigt;
1524
            steuerelementesperren(false);
1525
            exit;
1526
          end;
1527
        end;
1528
 
1529
        edt_vle7.Text := copy(cipher.ClassName, length(cyprefix)+1, length(cipher.ClassName)-length(cyprefix)) +
1530
                         ' ('+CipherModeStr[InfoMode]+'), ' +
1531
                         copy(hash.ClassName, length(haprefix)+1, length(hash.ClassName)-length(haprefix)) +
1532
                         ' (' + Format(GetLangEntry('x-byte-seed'), [InfoSeedSize]) + ')';
1533
 
1534
        // source.Position := source.size - cipher.context.BufferSize - hash.DigestSize;
1535
        // l_calcmac, HexAnsicht(readraw(cipher.context.BufferSize)
1536
        // l_filehash, HexAnsicht(readraw(hash.DigestSize)
1537
 
1538
        b_decrypt.Visible := true;
1539
        b_encrypt.Visible := false;
1540
        b_direct.Visible := true;
1541
        b_open.Visible := false;
1542
        b_folder.Visible := false;
1543
 
1544
        chk_compress.Visible := false;
1545
 
1546
        mode := tcEncrypted;
1547
      end
1548
      else
1549
      begin
1550
        edt_vle1.Color := clWindow;
1551
        edt_vle1.ReadOnly := false;
1552
        edt_vle1.TabStop := true;
1553
 
1554
        IdentityBase := IDBase;
1555
 
1556
        // damit später in EncodeFile nicht der Name der DeCoder.zip geschrieben wird, sondern der Verzeichnisname
1557
        ersatzname := alternativer_name;
1558
 
1559
        edt_vle5.Text := GetLangEntry('unencrypted');
1560
 
1561
        edt_vle6.Text := '-';
1562
 
1563
        if alternativer_name <> '' then
1564
        begin
1565
          if alternativer_name = getlangentry('dateiensammlung') then
1566
            T := getlangentry('dateiensammlung')
1567
          else
1568
            T := lang_getdirectoryname;
1569
        end
1570
        else
1571
        begin
1572
          T := FindeDateityp(fil);
1573
          if (T = '') then T := Format(GetLangEntry('x-file'), [uppercase(copy(extractfileext(fil), 2, length(extractfileext(fil))-1))]);
1574
        end;
1575
        edt_vle3.Text := T;
1576
 
1577
        edt_vle4.Text := IntelligenteDateigroesse(source.size);
1578
 
1579
        edt_vle7.Text := '-';
1580
 
1581
        b_decrypt.Visible := false;
1582
        b_encrypt.Visible := true;
1583
        b_direct.Visible := false;
1584
        b_open.Visible := false;
1585
        b_folder.Visible := false;
1586
 
1587
        chk_compress.Visible := true;
1588
        if alternativer_name = '' then
1589
          chk_compress.Checked := ZLibCompressFile
1590
        else
1591
          chk_compress.Checked := ZLibCompressFolder;
1592
 
1593
        mode := tcDecrypted;
1594
      end;
1595
 
1596
    finally
1597
      source.free;
1598
    end;
1599
  except
1600
    dateibeschaedigt;
1601
    steuerelementesperren(false);
1602
    exit;
1603
  end;
1604
 
1605
  finally
1606
  steuerelementesperren(false);
1607
  zeige_wartenform(false);
1608
  end;
1609
 
1610
  lbl_passwort.Visible := true;
1611
  lbl_passwort2.Visible := mode <> tcEncrypted;
1612
  edt_passwort.Visible := true;
1613
  edt_passwort2.Visible := mode <> tcEncrypted;
1614
  lbl_entropy.Visible := mode <> tcEncrypted;
1615
  lbl_equal.Visible := mode <> tcEncrypted;
1616
  chk_securedelete.Visible := true;
1617
  lbl_readerror.Visible := false;
1618
  img_error.Visible := false;
1619
  tmr_capslock.Enabled := true;
1620
 
1621
  if ((mode = tcDecrypted) or (mode = tcEncrypted)) and (edt_passwort.Showing) then edt_passwort.SetFocus;
1622
  mm_actions.visible := mode <> tcUnknown;
1623
  m_encrypt.Enabled := mode = tcDecrypted;
1624
  m_decrypt.Enabled := mode = tcEncrypted;
1625
  m_direct.Enabled := mode = tcEncrypted;
1626
 
1627
  if (alternativer_name = getlangentry('dateiensammlung')) and (mode = tcDecrypted) then
1628
  begin
1629
    m_dateiensammlung_add_file.Enabled := true;
1630
    m_dateiensammlung_add_folder.Enabled := true;
1631
    m_dateiensammlung_show.Enabled := true;
1632
  end
1633
  else
1634
  begin
1635
    m_dateiensammlung_add_file.Enabled := false;
1636
    m_dateiensammlung_add_folder.Enabled := false;
1637
    m_dateiensammlung_show.Enabled := false;
1638
  end;
1639
 
1640
  application.Restore;
1641
  application.BringToFront;
1642
 
1643
  tmr_refresh.Enabled := true;
1644
end;
1645
 
1646
procedure TMainForm.kazip_onchange(Sender: TObject; ChangeType: Integer);
1647
begin
1648
  //
1649
end;
1650
 
1651
procedure TMainForm.kazip_overwrite(Sender:TObject; Var FileName : String; Var Action : TOverwriteAction);
1652
begin
1653
  //
1654
end;
1655
 
1656
procedure TMainForm.form_create(Sender: TObject);
1657
var
1658
  ini: TIniFile;
1659
  str: TStringList;
1660
  i: integer;
1661
begin
1662
  ClientHeight := 297; // Bug in Delphi verändert manchmal Formhöhe
1663
 
1664
  errorlevel := 0; // Keine Fehler
1665
 
1666
  // Sprachdatei einlesen
1667
  if fileexists(ExtractFilePath(Application.ExeName)+'Language.ini') then
1668
  begin
1669
    ini := TIniFile.Create(ExtractFilePath(Application.ExeName)+'Language.ini');
1670
 
1671
    // Version prüfen
1672
    if (ini.ReadString('Signature', 'Version', '') <> DC4Ver) then
1673
    begin
1674
      // paramstr() wird verwendet, weil ParamZeile erst bei Start() gesetzt wird
1675
      if not ((paramstr_firstposition('/clean') <> -1) and (paramstr_firstposition('/silent') <> -1)) then
1676
      begin
1677
        Application.MessageBox('Language.ini', 'Signature?', MB_OK + MB_ICONERROR);
1678
        errorlevel := 11;
1679
        close;
1680
        exit;
1681
      end;
1682
    end;
1683
 
1684
    str := TStringList.Create();
1685
    try
1686
      ini.ReadSection(Name, str);
1687
      for i := 0 to str.count-1 do
1688
      begin
1689
        setlength(LangArray, length(LangArray)+1);
1690
        LangArray[length(LangArray)-1].name := str.strings[i];
1691
        LangArray[length(LangArray)-1].text := ini.ReadString(name, str.strings[i], '?');
1692
        LangArray[length(LangArray)-1].text := StringReplace(LangArray[length(LangArray)-1].text, '###', #13#10, [rfReplaceAll]);
1693
      end;
1694
    finally
1695
      ini.free;
1696
      str.Free;
1697
    end;
1698
  end
1699
  else
1700
  begin
1701
    Application.MessageBox('Language.ini', 'Error', MB_OK + MB_ICONERROR);
1702
    errorlevel := 11;
1703
    close;
1704
    exit;
1705
  end;
1706
 
1707
  // Jetzt gehts los...
1708
 
1709
  // VCL-Ersatz
1710
 
1711
  DropFile := TDropFileTarget.Create(self);
1712
  DropFile.Dragtypes := [dtCopy];
1713
  DropFile.OnDrop := dropfile_drop;
1714
 
1715
  KaZip := TKaZip.Create(self);
1716
  KaZip.UseTempFiles := false;
1717
  kazip.CompressionType := StZIPType;
1718
  KaZip.OverwriteAction := oaOverwriteAll;
1719
  KaZip.OnDecompressFile := kazip_actions_decompress;
1720
  KaZip.OnCompressFile := kazip_actions_compress;
1721
  KaZip.OnZipChange := kazip_onchange;
1722
  //KaZip.OnZipOpen := kazip_actions;
1723
  KaZip.OnAddItem := kazip_add;
1724
  //KaZip.OnRebuildZip := kazip_actions;
1725
  //KaZip.OnRemoveItems := kazip_actions;
1726
  KaZip.OnOverwriteFile := kazip_overwrite;
1727
 
1728
  {xpmenu := TXPMenu.Create(self);
1729
  xpmenu.XPControls := [xcMainMenu];
1730
  xpmenu.Gradient := true;
1731
  xpmenu.Active := true;}
1732
 
1733
  // Anwendung vorbereiten
1734
 
1735
  RegisterDECClasses([TCipher_Blowfish, TCipher_Twofish, TCipher_IDEA,
1736
    TCipher_Cast256, TCipher_Mars, TCipher_RC4, TCipher_RC6, TCipher_Rijndael,
1737
    TCipher_Square, TCipher_SCOP, TCipher_Sapphire, TCipher_1DES, TCipher_2DES,
1738
    TCipher_3DES, TCipher_2DDES, TCipher_3DDES, TCipher_3TDES, TCipher_3Way,
1739
    TCipher_Cast128, TCipher_Gost, TCipher_Misty, TCipher_NewDES, TCipher_Q128,
1740
    TCipher_RC2, TCipher_RC5, TCipher_SAFER, TCipher_Shark, TCipher_Skipjack,
1741
    TCipher_TEA, TCipher_TEAN]);
1742
 
1743
  RegisterDECClasses([THash_MD2, THash_MD4, THash_MD5, THash_SHA, THash_SHA1,
1744
    THash_SHA256, THash_SHA384, THash_SHA512, THash_Sapphire, THash_Panama,
1745
    THash_Tiger, THash_RipeMD128, THash_RipeMD160, THash_RipeMD256,
1746
    THash_RipeMD320, THash_Haval128, THash_Haval160, THash_Haval192,
1747
    THash_Haval224, THash_Haval256, THash_Whirlpool, THash_Whirlpool1,
1748
    THash_Square, THash_Snefru128, THash_Snefru256]);
1749
 
1750
  SetDefaultCipherClass(CipherByName(StCipher));
1751
  SetDefaultHashClass(HashByName(StHash));
1752
 
1753
  RandomSeed;
1754
 
1755
  Randomize;
1756
  temp_unique_number := inttostr(random(2147483647));
1757
 
1758
  // Formular vorbereiten
1759
  img_warning.Picture.Bitmap.LoadFromResourceName(hInstance, 'WARNING');
1760
  img_error.Picture.Bitmap.LoadFromResourceName(hInstance, 'ERROR');
1761
  img_type.Picture.Bitmap.LoadFromResourceName(hInstance, 'NOOPEN');
1762
 
1763
  mm_file.Caption := GetLangEntry('file');
1764
  m_open.Caption := GetLangEntry('openhint');
1765
  m_folder.Caption := GetLangEntry('folderhint');
1766
  m_config.Caption := GetLangEntry('confighint');
1767
  m_close.Caption := GetLangEntry('closefile');
1768
  m_exit.Caption := GetLangEntry('exit');
1769
 
1770
  mm_dateiensammlung.caption := GetLangEntry('dateiensammlung');
1771
  m_dateiensammlung_neu.caption := GetLangEntry('dateiensammlung_neu');
1772
  m_dateiensammlung_add_file.caption := GetLangEntry('dateiensammlung_add_file');
1773
  m_dateiensammlung_add_folder.caption := GetLangEntry('dateiensammlung_add_folder');
1774
  m_dateiensammlung_show.caption := GetLangEntry('dateiensammlung_show');
1775
 
1776
  mm_actions.Caption := GetLangEntry('actions');
1777
  m_encrypt.Caption := GetLangEntry('enchint');
1778
  m_decrypt.Caption := GetLangEntry('dechint');
1779
  m_direct.Caption := GetLangEntry('direct');
1780
  m_delete.Caption := GetLangEntry('erase');
1781
 
1782
  mm_help.Caption := GetLangEntry('help');
1783
  m_help.Caption := GetLangEntry('helphint');
1784
  m_web_update.Caption := GetLangEntry('updates');
1785
  m_web_email.Caption := GetLangEntry('web_email');
1786
  m_web_keytransmitter.Caption := GetLangEntry('web_keytransmitter');
1787
  m_info.Caption := GetLangEntry('about');
1788
  m_web.Caption := GetLangEntry('web_ressources');
1789
  m_web_dm.Caption := GetLangEntry('web_dm');
1790
  m_web_vts.Caption := GetLangEntry('web_vts');
1791
  m_web_project.Caption := GetLangEntry('web_project');
1792
  m_web_infopages.Caption := GetLangEntry('web_infopages');
1793
  m_web_forum.Caption := GetLangEntry('web_forum');
1794
 
1795
  b_open.Caption := GetLangEntry('openhint');
1796
  b_folder.Caption := GetLangEntry('folderhint');
1797
  b_encrypt.Caption := GetLangEntry('enchint');
1798
  b_decrypt.Caption := GetLangEntry('dechint');
1799
  b_direct.Caption := GetLangEntry('direct');
1800
 
1801
  caption := '(De)Coder '+DC4Ver;
1802
  lbl_vle1.Caption := GetLangEntry('opened');
1803
  lbl_vle2.Caption := GetLangEntry('location');
1804
  lbl_vle3.Caption := GetLangEntry('filetype');
1805
  lbl_vle4.Caption := GetLangEntry('filesize');
1806
  lbl_vle5.Caption := GetLangEntry('status');
1807
  lbl_vle6.Caption := GetLangEntry('originalname');
1808
  lbl_vle7.Caption := GetLangEntry('cryptmode');
1809
  lbl_passwort.caption := GetLangEntry('password');
1810
  lbl_passwort2.caption := GetLangEntry('repassword');
1811
  lbl_equal.Hint := GetLangEntry('equalhint');
1812
  lbl_equal.caption := '';
1813
  lbl_entropy.Hint := GetLangEntry('entropy');
1814
  chk_securedelete.Caption := GetLangEntry('securedelete');
1815
  chk_compress.Caption := GetLangEntry('compress');
1816
  img_warning.Hint := GetLangEntry('capswarning');
1817
  lbl_capswarning.caption := GetLangEntry('capslock');
1818
  lbl_capswarning.Hint := GetLangEntry('capswarning');
1819
  dlg_open.filter := GetLangEntry('filter_all')+' (*.*)|*.*|'+GetLangEntry('filter_encrypted')+' (*.dc4)|*.dc4';
1820
  dlg_open_element.filter := GetLangEntry('filter_all')+' (*.*)|*.*';
1821
  dlg_save_dec.filter := GetLangEntry('filter_all')+' (*.*)|*.*';
1822
  dlg_save_enc.filter := GetLangEntry('filter_encrypted')+' (*.dc4)|*.dc4';
1823
  lbl_readerror.caption := GetLangEntry('errorreading');
1824
  //progress_position(wartenform.ProgressBar1.min);
1825
 
1826
  edt_vle1.text := GetLangEntry('nofile');
1827
  lbl_entropy.Caption := '';
1828
 
1829
  DropFile.Register(mainform);
1830
 
1831
  // Dynamische Größenanpassung der Elemente aufgrund verschiedener Sprachen
1832
 
1833
  edt_vle1.left := lbl_vle1.Left + 8 + max_7(lbl_vle1.Width, lbl_vle2.Width, lbl_vle3.Width, lbl_vle4.Width, lbl_vle5.Width, lbl_vle6.Width, lbl_vle7.Width);
1834
  edt_vle2.left := edt_vle1.left;
1835
  edt_vle3.left := edt_vle1.left;
1836
  edt_vle4.left := edt_vle1.left;
1837
  edt_vle5.left := edt_vle1.left;
1838
  edt_vle6.left := edt_vle1.left;
1839
  edt_vle7.left := edt_vle1.left;
1840
 
1841
  edt_vle1.Width := clientwidth - edt_vle1.Left - 8;
1842
  edt_vle2.Width := edt_vle1.Width;
1843
  edt_vle3.Width := edt_vle1.Width;
1844
  edt_vle4.Width := edt_vle1.Width;
1845
  edt_vle5.Width := edt_vle1.Width;
1846
  edt_vle6.Width := edt_vle1.Width;
1847
  edt_vle7.Width := edt_vle1.Width;
1848
 
1849
  edt_passwort.left := lbl_passwort.left + max_2(lbl_passwort.width, lbl_passwort2.width) + 8;
1850
  edt_passwort2.left := edt_passwort.left;
1851
  lbl_entropy.left := edt_passwort.left + edt_passwort.width + 8;
1852
  lbl_equal.left := lbl_entropy.left;
1853
end;
1854
 
1855
function FindeFreienOrdnernamen(verzeichnis: string): string;
1856
var
1857
  i: integer;
1858
  act: string;
1859
begin
1860
  act := verzeichnis;
1861
  i := 1;
1862
  while directoryexists(act) or fileexists(act) do
1863
  begin
1864
    inc(i);
1865
    act := verzeichnis+' ('+inttostr(i)+')';
1866
  end;
1867
  result := act;
1868
end;
1869
 
1870
function NumberOfFiles(RootFolder: string): integer;
1871
var
1872
  SR: TSearchRec;
1873
  Num: integer;
1874
begin
1875
  Num := 0;
1876
  result := 0;
1877
 
1878
  if RootFolder = '' then
1879
    Exit;
1880
  if AnsiLastChar(RootFolder)^ <> '\' then
1881
    RootFolder := RootFolder + '\';
1882
 
1883
  RootFolder := IncludeTrailingPathDelimiter(RootFolder);
1884
 
1885
  if FindFirst(RootFolder + '*.*', faAnyFile, SR) = 0 then
1886
    try
1887
      repeat
1888
        if SR.Attr and faDirectory = faDirectory then
1889
          // --> ein Verzeichnis wurde gefunden
1890
          if (SR.Name <> '.') and (SR.Name <> '..') then
1891
            Num := Num + NumberOfFiles(RootFolder + SR.Name);
1892
      until FindNext(SR) <> 0;
1893
    finally
1894
      FindClose(SR);
1895
    end;
1896
  if FindFirst(RootFolder + '*.*', faAnyFile, SR) = 0 then
1897
    try
1898
      repeat
1899
        if SR.Attr and faDirectory <> faDirectory then
1900
        begin
1901
          // --> eine Datei wurde gefunden
1902
          inc(Num);
1903
        end;
1904
      until FindNext(SR) <> 0;
1905
    finally
1906
      FindClose(SR);
1907
    end;
1908
 
1909
  result := Num;
1910
end;
1911
 
1912
procedure TMainForm.openfolder(fol: string);
1913
var
1914
  tz: string;
1915
begin
1916
  steuerelementesperren(true);
1917
  zeige_wartenform(true);
1918
  try
1919
 
1920
  // Vorrausberechnung für ZIP-Vorgang
1921
  DateienImOrdner := NumberOfFiles(fol);
1922
  DateienCounter := 0;
1923
 
1924
  // Tempname
1925
  tz := GetTempDir+TempPre+temp_unique_number+TempExtZip;
1926
 
1927
  dc_deletefile(tz);
1928
  zipfolder(fol, tz);
1929
 
1930
  if fileexists(tz) then
1931
  begin
1932
    // Oha! Ein ganzes Laufwerk wurde verschlüsselt (da hat jemand zu viel Zeit...)
1933
    if copy(fol, length(fol)-1, 2) = ':\' then
1934
      fol := GetLangEntry('drive')+' '+copy(fol, 0, 1);
1935
    openfile(tz, fol, false);
1936
  end;
1937
 
1938
  finally
1939
  steuerelementesperren(false);
1940
  zeige_wartenform(false);
1941
  end;
1942
end;
1943
 
1944
procedure TMainForm.zipfolder(verzeichnis, zipname: string);
1945
begin
1946
  try
1947
    KAZip.Close;
1948
  except
1949
 
1950
  end;
1951
 
1952
  progress_position(wartenform.pbr_progress.min);
1953
  progress_text(GetLangEntry('zip_folder'), verzeichnis);
1954
 
1955
  try
1956
    CreateZipFile(zipname);
1957
 
1958
    KAZip.Open(zipname);
1959
    kazip.AddFolder(verzeichnis, verzeichnis, '*', true);
1960
    kazip.close;
1961
  except
1962
    // Kann auftreten, wenn Anwendung beim Zippen geschlossen wurde
1963
  end;
1964
 
1965
  progress_position(wartenform.pbr_progress.min);
1966
end;
1967
 
1968
procedure TMainForm.freestreams();
1969
begin
1970
  // ich kenne keine andere möglichkeit, den laufenden cipher-prozess zu beenden
1971
  // ich gebe einfach den stream frei und fange die exceptions ab
1972
 
1973
  try
1974
    kazip.Close;
1975
  except
1976
  end;
1977
 
1978
  try
1979
    tempstream.Free;
1980
  except
1981
  end;
1982
 
1983
  try
1984
    CompressInputStream.free;
1985
  except
1986
  end;
1987
 
1988
  try
1989
    CompressOutputStream.free;
1990
  except
1991
  end;
1992
 
1993
  try
1994
    CompressionStream.free;
1995
  except
1996
  end;
1997
 
1998
  try
1999
    DeCompressionStream.Free;
2000
  except
2001
  end;
2002
 
2003
  try
2004
    ZippingStream.Free;
2005
  except
2006
  end;
2007
 
2008
  try
2009
    DropFile.unregister;
2010
  except
2011
  end;
2012
 
2013
  try
2014
    DropFile.Free;
2015
  except
2016
  end;
2017
 
2018
  try
2019
    KaZip.Free;
2020
  except
2021
  end;
2022
 
2023
  try
2024
    BestimmeDateiGroesseSource.Free;
2025
  except
2026
  end;
2027
 
2028
  {try
2029
    XPMenu.Free;
2030
  except
2031
  end;}
2032
end;
2033
 
2034
procedure TMainForm.form_close(Sender: TObject; var Action: TCloseAction);
2035
begin
2036
  steuerelementesperren(true);
2037
  bordericons := [];
2038
 
2039
  // Weitermachen, bis die Dateien nicht mehr gesperrt ist
2040
  // wird nun von eigenen Prozess übernommen
2041
  // SecureDeleteWhenUnlocked(GetTempDir+TempPre+temp_unique_number+TempExtTmp);
2042
  // SecureDeleteWhenUnlocked(GetTempDir+TempPre+temp_unique_number+TempExtZip);
2043
 
2044
  // Beim Beenden, sollen nur die temporären Dateien der aktuellen Sitzung entfernt werden,
2045
  // daher macht diese Zeile wenig Sinn!
2046
  // if paramzeile_firstposition('/clean') = -1 then
2047
  //   ShellExecute(application.Handle, 'open', pchar(application.exename), pchar('/clean /silent'), pchar(extractfilepath(application.exename)), SW_HIDE);
2048
 
2049
  // Information: Da 10 Sekunden bei /clean /silent gewartet wird, kann bereits hier gestartet werden
2050
 
2051
  if (paramzeile_firstposition('/clean') = -1) and (errorlevel <> 11) then
2052
    ShellExecute(application.Handle, 'open', pchar(application.exename), pchar('/clean /silent /only='+temp_unique_number), pchar(extractfilepath(application.exename)), SW_HIDE);
2053
 
2054
  try
2055
    freestreams;
2056
  except
2057
 
2058
  end;
2059
 
2060
  halt(mainform.errorlevel);
2061
 
2062
  //application.Terminate; // Wenn über Befehlszeile verschlüsselt wird,
2063
                           // dann ist diese Zeile notwendig, ansonsten endet
2064
                           // die Anwendung nie
2065
end;
2066
 
2067
function TMainForm.Unzip(ZipFile, Verzeichnis: string): boolean;
2068
begin
2069
  result := true;
2070
  steuerelementesperren(true);
2071
  zeige_wartenform(true);
2072
  try
2073
  progress_position(wartenform.pbr_progress.min);
2074
  progress_text(GetLangEntry('unzip_folder'), zipfile);
2075
  kazip.Open(ZipFile);
2076
  DateienImOrdner := kazip_numfiles(kazip);
2077
  DateienCounter := 0;
2078
  if (not kazip.IsZipFile) and (not kazip.HasBadEntries) then
2079
  begin
2080
    removedir(Verzeichnis);
2081
    if ausgabegesetzt = '' then
2082
      Application.MessageBox(pchar(GetLangEntry('archivecorrupt')), pchar(GetLangEntry('error')), MB_OK + MB_ICONSTOP);
2083
    result := false;
2084
  end
2085
  else
2086
  begin
2087
    try
2088
      kazip.ExtractAll(Verzeichnis);
2089
    except
2090
 
2091
    end;
2092
  end;
2093
  kazip.Close;
2094
  progress_position(wartenform.pbr_progress.min);
2095
  finally
2096
  steuerelementesperren(false);
2097
  zeige_wartenform(false);
2098
  end;
2099
end;
2100
 
2101
procedure TMainForm.m_web_vts_click(Sender: TObject);
2102
begin
2103
  shellexecute(application.Handle, 'open', 'http://www.viathinksoft.de/', '', '', sw_normal);
2104
end;
2105
 
2106
procedure TMainForm.mm_actions_execute(Sender: TObject);
2107
begin
2108
  // platzhalter, damit enabled
2109
end;
2110
 
2111
procedure TMainForm.mm_file_execute(Sender: TObject);
2112
begin
2113
  // platzhalter, damit enabled
2114
end;
2115
 
2116
procedure TMainForm.mm_help_execute(Sender: TObject);
2117
begin
2118
  // platzhalter, damit enabled
2119
end;
2120
 
2121
procedure TMainForm.m_web_infopages_click(Sender: TObject);
2122
begin
2123
  shellexecute(application.Handle, 'open', 'http://www.viathinksoft.de/info/decoder/', '', '', sw_normal);
2124
end;
2125
 
2126
procedure TMainForm.m_web_forum_click(Sender: TObject);
2127
begin
2128
  shellexecute(application.Handle, 'open', 'http://www.viathinksoft.de/devboard/viewforum.php?f=32', '', '', sw_normal);
2129
end;
2130
 
2131
procedure TMainForm.m_help_execute(Sender: TObject);
2132
begin
2133
  if fileexists(extractfilepath(application.exename)+'help.html') then
2134
    ShellExecute(Application.Handle, 'open', PChar(extractfilepath(application.exename)+'help.html'), '', '', SC_DEFAULT)
2135
  else
2136
    Application.MessageBox(pchar(GetLangEntry('helpnotfound')), pchar(GetLangEntry('error')), MB_OK + MB_ICONSTOP);
2137
end;
2138
 
2139
procedure TMainForm.dropfile_drop(Sender: TObject; ShiftState: TShiftState;
2140
  Point: TPoint; var Effect: Integer);
2141
var
2142
  i: integer;
2143
begin
2144
  effect := DROPEFFECT_NONE; // damit stürzt Windows 95 nicht ab
2145
 
2146
  steuerelementesperren(true);
2147
  zeige_wartenform(true);
2148
  try
2149
 
2150
  if DropFile.Files.Count > 1 then
2151
  begin
2152
    try
2153
      kazip.close;
2154
    except
2155
 
2156
    end;
2157
 
2158
    if fileexists(GetTempDir+TempPre+mainform.temp_unique_number+TempExtZip) then
2159
      deletefile(GetTempDir+TempPre+mainform.temp_unique_number+TempExtZip);
2160
    CreateZipFile(GetTempDir+TempPre+mainform.temp_unique_number+TempExtZip);
2161
    for i := 0 to dropfile.Files.Count - 1 do
2162
    begin
2163
      addtozip(dropfile.Files.strings[i], GetTempDir+TempPre+mainform.temp_unique_number+TempExtZip)
2164
    end;
2165
 
2166
    openfile(GetTempDir+TempPre+mainform.temp_unique_number+TempExtZip, GetLangEntry('dateiensammlung'), true);
2167
  end
2168
  else
2169
  begin
2170
    if fileexists(dropfile.Files.strings[0]) then
2171
      openfile(dropfile.Files.strings[0], '', false);
2172
 
2173
    if directoryexists(dropfile.Files.strings[0]) then
2174
      openfolder(dropfile.Files.strings[0]);
2175
  end;
2176
 
2177
  finally
2178
  steuerelementesperren(false);
2179
  zeige_wartenform(false);
2180
  end;
2181
end;
2182
 
2183
procedure TMainForm.edt_passwort_change(Sender: TObject);
2184
var
2185
  qu: extended;
2186
  r, g: integer;
2187
const
2188
  helligkeit: byte = 128;
2189
begin
2190
  qu := PassphraseQuality(edt_passwort.Text);
2191
 
2192
  if qu <= 0.5 then
2193
  begin
2194
    r := helligkeit;
2195
    g := floor(qu*helligkeit*2);
2196
  end
2197
  else
2198
  begin
2199
    r := helligkeit-floor((qu-0.5)*helligkeit*2);
2200
    g := helligkeit;
2201
  end;
2202
 
2203
  lbl_entropy.Caption := inttostr(round(qu*100)) + '%';
2204
  lbl_entropy.font.color := rgb(r, g, 0);
2205
 
2206
  edt_password2_change(sender);
2207
end;
2208
 
2209
procedure TMainForm.m_exit_execute(Sender: TObject);
2210
begin
2211
  close;
2212
end;
2213
 
2214
// von Krypto Anarkist
2215
procedure TMainForm.edt_passwort2_keypress(Sender: TObject; var Key: Char);
2216
begin
2217
  if key = #13 then
2218
  begin
2219
    Key := #0;
2220
    // Ist Shift zusätzlich gedrückt?
2221
    if GetKeyState(VK_Shift) and $8000 <> 0 then
2222
      PostMessage(Handle, WM_NEXTDLGCTL, 1, 0) //edt_enc_password.SetFocus;
2223
    else
2224
      if m_encrypt.Enabled then m_encrypt.Click;
2225
  end;
2226
 
2227
  edt_passwort_keypress(sender, key);
2228
end;
2229
 
2230
// von Krypto Anarkist
2231
procedure SimulateKeyDown(Key : byte);
2232
begin
2233
  keybd_event(Key, 0, 0, 0);
2234
end;
2235
 
2236
// von Krypto Anarkist
2237
procedure SimulateKeyUp(Key : byte);
2238
begin
2239
  keybd_event(Key, 0, KEYEVENTF_KEYUP, 0);
2240
end;
2241
 
2242
// von Krypto Anarkist
2243
procedure SimulateKeystroke(Key : byte; extra : DWORD);
2244
begin
2245
  keybd_event(Key,
2246
              extra,
2247
              0,
2248
              0);
2249
  keybd_event(Key,
2250
              extra,
2251
              KEYEVENTF_KEYUP,
2252
              0);
2253
end;
2254
 
2255
// von Krypto Anarkist
2256
procedure SendKeys(s : string);
2257
var
2258
  i : integer;
2259
  flag : bool;
2260
  w : word;
2261
begin
2262
 {Get the state of the caps lock key}
2263
  flag := not GetKeyState(VK_CAPITAL) and 1 = 0;
2264
 {If the caps lock key is on then turn it off}
2265
  if flag then
2266
    SimulateKeystroke(VK_CAPITAL, 0);
2267
  for i := 1 to Length(s) do begin
2268
    w := VkKeyScan(s[i]);
2269
   {If there is not an error in the key translation}
2270
    if ((HiByte(w) <> $FF) and
2271
        (LoByte(w) <> $FF)) then begin
2272
     {If the key requires the shift key down - hold it down}
2273
      if HiByte(w) and 1 = 1 then
2274
        SimulateKeyDown(VK_SHIFT);
2275
     {Send the VK_KEY}
2276
      SimulateKeystroke(LoByte(w), 0);
2277
     {If the key required the shift key down - release it}
2278
      if HiByte(w) and 1 = 1 then
2279
        SimulateKeyUp(VK_SHIFT);
2280
    end;
2281
  end;
2282
 {if the caps lock key was on at start, turn it back on}
2283
  if flag then
2284
    SimulateKeystroke(VK_CAPITAL, 0);
2285
end;
2286
 
2287
// von Krypto Anarkist
2288
function genGarbageString(chars: integer):string;
2289
var
2290
   i: integer;
2291
begin
2292
   result := '';
2293
   for i := 1 to chars do
2294
      result := result + chr(random(95)+32);
2295
end;
2296
 
2297
// http://www.dsdt.info/tipps/?id=28
2298
function KeyPressed(Key: Integer): Boolean;
2299
begin
2300
  KeyPressed := (GetAsyncKeyState(Key) and $8000 <> 0);
2301
end;
2302
 
2303
procedure TMainForm.edt_passwort_enter(Sender: TObject);
2304
begin
2305
  if not KeyPressed(vk_Menu) and not KeyPressed(vk_Control) then
2306
  begin
2307
    tedit(sender).Tag := random(configform.upd_garbarge.Position);
2308
    sendKeys(genGarbageString(tedit(sender).Tag));
2309
  end;
2310
end;
2311
 
2312
// idee von Krypto Anarkist... hat in seiner komponente keypress verwendet, was bugs bei Strg-Kombinationen verursacht hat
2313
procedure TMainForm.edt_passwort_keypress(Sender: TObject; var Key: Char);
2314
begin
2315
  if Key = #13 then
2316
  begin
2317
    if m_encrypt.Enabled then m_encrypt.Click;
2318
    if m_decrypt.Enabled then m_decrypt.Click;
2319
  end
2320
  else
2321
  begin
2322
    if tedit(sender).Tag > 0 then
2323
    begin
2324
      tedit(sender).Tag := tedit(sender).Tag - 1;
2325
      Key := chr(0);
2326
    end
2327
    else
2328
    begin
2329
      if not KeyPressed(vk_Menu) and not KeyPressed(vk_Control) then
2330
      begin
2331
        tedit(sender).Tag := random(configform.upd_garbarge.Position);
2332
        sendKeys(genGarbageString(tedit(sender).Tag));
2333
      end;
2334
    end;
2335
  end;
2336
end;
2337
 
2338
procedure TMainForm.form_show(Sender: TObject);
2339
begin
2340
  application.Restore;
2341
  application.BringToFront;
2342
end;
2343
 
2344
procedure TMainForm.steuerelementesperren(sperren: boolean);
2345
begin
2346
  steuerelementegesperrt := sperren;
2347
 
2348
  chk_securedelete.enabled := not sperren;
2349
  chk_compress.Enabled := not sperren;
2350
  img_type.enabled := not sperren;
2351
  img_warning.enabled := not sperren;
2352
  lbl_capswarning.enabled := not sperren;
2353
  img_error.enabled := not sperren;
2354
  lbl_readerror.enabled := not sperren;
2355
  lbl_passwort.enabled := not sperren;
2356
  lbl_passwort2.enabled := not sperren;
2357
  lbl_entropy.Enabled := not sperren;
2358
  lbl_equal.enabled := not sperren;
2359
  lbl_vle1.enabled := not sperren;
2360
  lbl_vle2.enabled := not sperren;
2361
  lbl_vle3.enabled := not sperren;
2362
  lbl_vle4.enabled := not sperren;
2363
  lbl_vle5.enabled := not sperren;
2364
  lbl_vle6.enabled := not sperren;
2365
  lbl_vle7.enabled := not sperren;
2366
  edt_vle1.enabled := not sperren;
2367
  edt_vle2.enabled := not sperren;
2368
  edt_vle3.enabled := not sperren;
2369
  edt_vle4.enabled := not sperren;
2370
  edt_vle5.enabled := not sperren;
2371
  edt_vle6.enabled := not sperren;
2372
  edt_vle7.enabled := not sperren;
2373
  mm_file.enabled := not sperren;
2374
  mm_dateiensammlung.enabled := not sperren;
2375
  mm_actions.enabled := not sperren;
2376
  mm_help.enabled := not sperren;
2377
  b_encrypt.enabled := not sperren;
2378
  b_decrypt.enabled := not sperren;
2379
  b_direct.enabled := not sperren;
2380
  b_open.enabled := not sperren;
2381
  b_folder.enabled := not sperren;
2382
  edt_passwort.enabled := not sperren;
2383
  edt_passwort2.enabled := not sperren;
2384
 
2385
  if sperren then
2386
    screen.Cursor := crHourGlass
2387
  else
2388
    screen.Cursor := crDefault;
2389
 
2390
  application.ProcessMessages;
2391
end;
2392
 
2393
procedure TMainForm.tmr_refresh_timer(Sender: TObject);
2394
begin
2395
  // Bei einem Test mit meinem Windows 98 System kam es zu Fehlern bei den vle-Editboxen
2396
  // nach dem Drag&Drop. Daher werden sie her neu gezeichnet nach OpenFile.
2397
 
2398
  tmr_refresh.Enabled := false;
2399
 
2400
  mainform.edt_vle1.Repaint;
2401
  mainform.edt_vle2.Repaint;
2402
  mainform.edt_vle3.Repaint;
2403
  mainform.edt_vle4.Repaint;
2404
  mainform.edt_vle5.Repaint;
2405
  mainform.edt_vle6.Repaint;
2406
  mainform.edt_vle7.Repaint;
2407
 
2408
  lbl_vle1.Repaint;
2409
  lbl_vle2.Repaint;
2410
  lbl_vle3.Repaint;
2411
  lbl_vle4.Repaint;
2412
  lbl_vle5.Repaint;
2413
  lbl_vle6.Repaint;
2414
  lbl_vle7.Repaint;
2415
 
2416
  img_error.Repaint;
2417
  lbl_readerror.Repaint;
2418
  lbl_entropy.Repaint;
2419
  lbl_equal.Repaint;
2420
  lbl_passwort.Repaint;
2421
  lbl_passwort2.Repaint;
2422
  edt_passwort.Repaint;
2423
  edt_passwort2.Repaint;
2424
  chk_securedelete.Repaint;
2425
  chk_compress.Repaint;
2426
  lbl_capswarning.Repaint;
2427
  img_warning.Repaint;
2428
  img_type.Repaint;
2429
 
2430
  b_direct.Repaint;
2431
  b_encrypt.Repaint;
2432
  b_decrypt.Repaint;
2433
  b_open.Repaint;
2434
  b_folder.Repaint;
2435
 
2436
  mainform.Repaint;
2437
 
2438
  application.ProcessMessages;
2439
end;
2440
 
2441
procedure TMainForm.edt_password2_change(Sender: TObject);
2442
begin
2443
  if edt_passwort.Text = edt_passwort2.text then
2444
  begin
2445
    lbl_equal.caption := GetLangEntry('equal');
2446
    lbl_equal.Font.Color := clGreen;
2447
  end
2448
  else
2449
  begin
2450
    lbl_equal.caption := GetLangEntry('notequal');
2451
    lbl_equal.Font.Color := clMaroon;
2452
  end;
2453
end;
2454
 
2455
procedure TMainForm.edt_dec_password_keypress(Sender: TObject; var Key: Char);
2456
begin
2457
  if key = #13 then
2458
  begin
2459
    key := #0;
2460
    m_decrypt.Click;
2461
  end;
2462
end;
2463
 
2464
procedure TMainForm.edt_enc_password_keypress(Sender: TObject;
2465
  var Key: Char);
2466
begin
2467
  if key = #13 then
2468
  begin
2469
    key := #0;
2470
    if not GetKeyState(VK_Shift) and $8000 <> 0 then
2471
      PostMessage(Handle, WM_NEXTDLGCTL, 0, 0); //edt_enc_password2.SetFocus;
2472
  end;
2473
end;
2474
 
2475
procedure TMainForm.tmp_progressdurchlauf_timer(Sender: TObject);
2476
begin
2477
  if wartenform.pbr_progress.Position + (wartenform.pbr_progress.max div ttimer(self).tag) >= wartenform.pbr_progress.max then
2478
    progress_position(wartenform.pbr_progress.min)
2479
  else
2480
    progress_position(wartenform.pbr_progress.position + wartenform.pbr_progress.max div ttimer(self).tag);
2481
end;
2482
 
2483
procedure TMainForm.tmr_capslock_timer(Sender: TObject);
2484
begin
2485
  img_warning.visible := IsCapsLockOn;
2486
  lbl_capswarning.visible := IsCapsLockOn;
2487
end;
2488
 
2489
procedure TMainForm.kazip_add(Sender: TObject; ItemName: string);
2490
begin
2491
  progress_text(GetLangEntry('zip_folder'), ItemName);
2492
  inc(DateienCounter);
2493
  application.processmessages;
2494
end;
2495
 
2496
procedure TMainForm.m_delete_execute(Sender: TObject);
2497
var
2498
  res: integer;
2499
  old_ersatzname: string;
2500
begin
2501
  res := Application.MessageBox(pchar(GetLangEntry('erasewarning')), pchar(GetLangEntry('warning')), MB_YESNOCANCEL + MB_ICONEXCLAMATION);
2502
 
2503
  if res = ID_YES then
2504
  begin
2505
    zeige_wartenform(true);
2506
    steuerelementesperren(true);
2507
    try
2508
 
2509
    // Ersatzname bei geöffneten Ordner:          X:\BlaBlaBla\xxxx\
2510
    // Ersatzname bei DC4-Datei mit Ordner-Flag:  xxxx
2511
    if (copy(ersatzname, 2, 2) = ':\') then
2512
    begin
2513
      old_ersatzname := ersatzname;
2514
      schliessedatei;
2515
      dc_deletedir(old_ersatzname);
2516
      if directoryexists(old_ersatzname) then
2517
        Application.MessageBox(pchar(GetLangEntry('notdeleted')), pchar(GetLangEntry('error')), MB_OK + MB_ICONSTOP)
2518
      else
2519
        Application.MessageBox(pchar(GetLangEntry('erasesuccessful')), pchar(GetLangEntry('information')), MB_OK + MB_ICONINFORMATION);
2520
    end
2521
    else
2522
    begin
2523
      dc_deletefile(fileopen);
2524
      if fileexists(fileopen) then
2525
      begin
2526
        Application.MessageBox(pchar(GetLangEntry('notdeleted')), pchar(GetLangEntry('error')), MB_OK + MB_ICONSTOP);
2527
      end
2528
      else
2529
      begin
2530
        schliessedatei;
2531
        Application.MessageBox(pchar(GetLangEntry('erasesuccessful')), pchar(GetLangEntry('information')), MB_OK + MB_ICONINFORMATION);
2532
      end;
2533
    end;
2534
 
2535
    finally
2536
    steuerelementesperren(false);
2537
    zeige_wartenform(false);
2538
    end;
2539
  end;
2540
end;
2541
 
2542
procedure TMainForm.m_info_execute(Sender: TObject);
2543
begin
2544
  AboutForm.PopupParent := Screen.ActiveForm; // http://www.delphipraxis.net/topic75743,0,asc,0.html
2545
  AboutForm.showmodal;
2546
end;
2547
 
2548
procedure TMainForm.m_open_execute(Sender: TObject);
2549
var
2550
  i: integer;
2551
begin
2552
  if dlg_open.execute then
2553
  begin
2554
    if dlg_open.Files.Count > 1 then
2555
    begin
2556
      steuerelementesperren(true);
2557
      zeige_wartenform(true);
2558
      try
2559
 
2560
      try
2561
        kazip.close;
2562
      except
2563
 
2564
      end;
2565
 
2566
      if fileexists(GetTempDir+TempPre+mainform.temp_unique_number+TempExtZip) then
2567
        deletefile(GetTempDir+TempPre+mainform.temp_unique_number+TempExtZip);
2568
      CreateZipFile(GetTempDir+TempPre+mainform.temp_unique_number+TempExtZip);
2569
      for i := 0 to dlg_open.Files.Count - 1 do
2570
      begin
2571
        addtozip(dlg_open.Files.strings[i], GetTempDir+TempPre+mainform.temp_unique_number+TempExtZip)
2572
      end;
2573
 
2574
      openfile(GetTempDir+TempPre+mainform.temp_unique_number+TempExtZip, GetLangEntry('dateiensammlung'), true);
2575
 
2576
      finally
2577
      steuerelementesperren(false);
2578
      zeige_wartenform(false);
2579
      end;
2580
    end
2581
    else
2582
      openfile(dlg_open.FileName, '', false);
2583
  end;
2584
end;
2585
 
2586
// http://www.delphipraxis.net/post43515.html
2587
Function GetHTML(AUrl: string): string;
2588
var
2589
  databuffer : array[0..4095] of char;
2590
  ResStr : string;
2591
  hSession, hfile: hInternet;
2592
  dwindex,dwcodelen,dwread,dwNumber: cardinal;
2593
  dwcode : array[1..20] of char;
2594
  res    : pchar;
2595
  Str    : pchar;
2596
begin
2597
  ResStr:='';
2598
  if pos('http://',lowercase(AUrl))=0 then
2599
     AUrl:='http://'+AUrl;
2600
 
2601
  // Hinzugefügt
2602
  application.ProcessMessages;
2603
 
2604
  hSession:=InternetOpen('InetURL:/1.0',
2605
                         INTERNET_OPEN_TYPE_PRECONFIG,
2606
                         nil,
2607
                         nil,
2608
                         0);
2609
  if assigned(hsession) then
2610
  begin
2611
    // Hinzugefügt
2612
    application.ProcessMessages;
2613
 
2614
    hfile:=InternetOpenUrl(
2615
           hsession,
2616
           pchar(AUrl),
2617
           nil,
2618
           0,
2619
           INTERNET_FLAG_RELOAD,
2620
           0);
2621
    dwIndex  := 0;
2622
    dwCodeLen := 10;
2623
 
2624
    // Hinzugefügt
2625
    application.ProcessMessages;
2626
 
2627
    HttpQueryInfo(hfile,
2628
                  HTTP_QUERY_STATUS_CODE,
2629
                  @dwcode,
2630
                  dwcodeLen,
2631
                  dwIndex);
2632
    res := pchar(@dwcode);
2633
    dwNumber := sizeof(databuffer)-1;
2634
    if (res ='200') or (res ='302') then
2635
    begin
2636
      while (InternetReadfile(hfile,
2637
                              @databuffer,
2638
                              dwNumber,
2639
                              DwRead)) do
2640
      begin
2641
 
2642
        // Hinzugefügt
2643
        application.ProcessMessages;
2644
 
2645
        if dwRead =0 then
2646
          break;
2647
        databuffer[dwread]:=#0;
2648
        Str := pchar(@databuffer);
2649
        resStr := resStr + Str;
2650
      end;
2651
    end
2652
    else
2653
      ResStr := 'Status:'+res;
2654
    if assigned(hfile) then
2655
      InternetCloseHandle(hfile);
2656
  end;
2657
 
2658
  // Hinzugefügt
2659
  application.ProcessMessages;
2660
 
2661
  InternetCloseHandle(hsession);
2662
  Result := resStr;
2663
end;
2664
 
2665
procedure TMainForm.m_web_update_execute(Sender: TObject);
2666
var
2667
  temp: string;
2668
begin
2669
  zeige_wartenform(true);
2670
  steuerelementesperren(true);
2671
 
2672
  progress_position(wartenform.pbr_progress.Min);
2673
  progress_text(getlangentry('wait_internet'), '');
2674
 
2675
  ttimer(self).tag := 2;
2676
  tmp_progressdurchlauf.Enabled := true;
2677
 
2678
  temp := GetHTML('http://www.viathinksoft.de/update/?id='+updateid);
2679
  if copy(temp, 0, 7) = 'Status:' then
2680
  begin
2681
    tmp_progressdurchlauf.Enabled := false;
2682
    zeige_wartenform(false);
2683
    steuerelementesperren(false);
2684
 
2685
    Application.MessageBox(pchar(MainForm.GetLangEntry('update_error')), pchar(MainForm.GetLangEntry('error')), MB_OK + MB_ICONERROR)
2686
  end
2687
  else
2688
  begin
2689
    if GetHTML('http://www.viathinksoft.de/update/?id='+updateid) <> DC4Ver then
2690
    begin
2691
      tmp_progressdurchlauf.Enabled := false;
2692
      zeige_wartenform(false);
2693
      steuerelementesperren(false);
2694
 
2695
      if Application.MessageBox(pchar(MainForm.GetLangEntry('update_yes')), pchar(MainForm.GetLangEntry('information')), MB_YESNO + MB_ICONASTERISK) = ID_YES then
2696
        shellexecute(application.handle, 'open', pchar('http://www.viathinksoft.de/update/?id=@'+updateid), '', '', sw_normal);
2697
    end
2698
    else
2699
    begin
2700
      tmp_progressdurchlauf.Enabled := false;
2701
      zeige_wartenform(false);
2702
      steuerelementesperren(false);
2703
 
2704
      Application.MessageBox(pchar(MainForm.GetLangEntry('update_no')), pchar(MainForm.GetLangEntry('information')), MB_OK + MB_ICONASTERISK);
2705
    end;
2706
  end;
2707
end;
2708
 
2709
procedure TMainForm.m_web_email_click(Sender: TObject);
2710
begin
2711
  shellexecute(application.Handle, 'open', pchar('mailto:info@daniel-marschall.de?subject=(De)Coder '+DC4Ver), '', '', sw_normal);
2712
end;
2713
 
2714
procedure TMainForm.m_config_execute(Sender: TObject);
2715
begin
2716
  ConfigForm.PopupParent := Screen.ActiveForm; // http://www.delphipraxis.net/topic75743,0,asc,0.html
2717
  ConfigForm.showmodal;
2718
end;
2719
 
2720
procedure TProgress.Process(const Min,Max,Pos: Int64);
2721
var
2722
  P: Integer;
2723
begin
2724
  P := floor((Pos - Min) / (Max - Min) * wartenform.pbr_progress.max);
2725
  mainform.progress_position(P);
2726
  application.ProcessMessages;
2727
end;
2728
 
2729
constructor TProgress.Create;
2730
begin
2731
  inherited Create;
2732
  mainform.progress_position(wartenform.pbr_progress.min);
2733
end;
2734
 
2735
destructor TProgress.Destroy;
2736
begin
2737
  inherited Destroy;
2738
  mainform.progress_position(wartenform.pbr_progress.min);
2739
end;
2740
 
2741
procedure TMainForm.kazip_actions_compress(Sender: TObject; Current,
2742
  Total: Integer);
2743
begin
2744
  progress_position(floor(wartenform.pbr_progress.max / DateienImOrdner * (DateienCounter + (Current / Total))));
2745
  Application.ProcessMessages;
2746
end;
2747
 
2748
procedure TMainForm.kazip_actions_decompress(Sender: TObject; Current,
2749
  Total: Integer);
2750
begin
2751
  // Jede einzelne Datei:
2752
  // progress_position(floor(Current / Total * wartenform.ProgressBar1.max));
2753
 
2754
  inc(DateienCounter);
2755
  progress_position(floor(wartenform.pbr_progress.max / DateienImOrdner * DateienCounter));
2756
  Application.ProcessMessages;
2757
end;
2758
 
2759
procedure TMainForm.form_closequery(Sender: TObject; var CanClose: Boolean);
2760
begin
2761
  CanClose := BorderIcons <> [];
2762
end;
2763
 
2764
procedure TMainForm.m_folder_execute(Sender: TObject);
2765
var
2766
  fol: string;
2767
begin
2768
  fol := BrowseForFolder(GetLangEntry('foldermessageopen'), true);
2769
  if fol <> '' then
2770
    OpenFolder(fol);
2771
end;
2772
 
2773
// http://www.delphipraxis.net/post478066.html#478066
2774
procedure ExecuteProgramm(const PFileName: string);
2775
var
2776
  SEInfo: TShellExecuteInfo;
2777
  ExitCode: DWORD;
2778
  ExecuteFile: string;
2779
begin
2780
  ExecuteFile := '"' + PFileName + '"';
2781
  FillChar(SEInfo, SizeOf(SEInfo), 0);
2782
  SEInfo.cbSize := SizeOf(TShellExecuteInfo);
2783
 
2784
  with SEInfo do
2785
  begin
2786
    fMask := SEE_MASK_NOCLOSEPROCESS;
2787
    Wnd := Application.Handle;
2788
    lpFile := PChar(ExecuteFile);
2789
    nShow := SW_SHOWNORMAL;
2790
  end;
2791
 
2792
  if ShellExecuteEx(@SEInfo) then
2793
  begin
2794
    repeat
2795
      Application.ProcessMessages;
2796
      GetExitCodeProcess(SEInfo.hProcess, ExitCode);
2797
    until (ExitCode <> STILL_ACTIVE) or
2798
      Application.Terminated;
2799
  end else
2800
  begin
2801
    // Application.MessageBox('Fehler beim Starten des Programms', 'Hinweis', MB_OK + MB_ICONERROR);
2802
  end;
2803
end;
2804
 
2805
procedure TMainForm.m_direct_execute(Sender: TObject);
2806
var
2807
  ctemp, temp: string;
2808
  error: boolean;
2809
begin
2810
  zeige_wartenform(true);
2811
  steuerelementesperren(true);
2812
  try
2813
 
2814
  forcedirectories(GetTempDir+TempDirect+'\'+temp_unique_number+'\');
2815
 
2816
  // Datei
2817
  if (flag = DateiTag) or (flag = DateiCompressTag) then
2818
  begin
2819
    temp := GetTempDir+TempDirect+'\'+temp_unique_number+'\'+edt_vle6.text;
2820
    ctemp := GetTempDir+TempPre+temp_unique_number+TempExtCmp;
2821
 
2822
    dc_deletefile(temp);
2823
    error := false;
2824
    try
2825
      if (flag = DateiTag) then
2826
        DecodeFile(fileopen, temp, edt_passwort.Text);
2827
      if (flag = DateiCompressTag) then
2828
      begin
2829
        DecodeFile(fileopen, ctemp, edt_passwort.Text);
2830
        DeCompress(ctemp, temp);
2831
      end;
2832
    except
2833
      // Kann auftreten, wenn das Programm beim entschlüsseln geschlossen wird
2834
      on EDECException do
2835
      begin
2836
        edt_passwort.Text := '';
2837
        edt_passwort.SetFocus; // wirkt durch Exception nicht -.-
2838
        error := true;
2839
        if bordericons <> [] then raise;
2840
      end;
2841
    else
2842
      error := true;
2843
    end;
2844
 
2845
    if not error then
2846
      ExecuteProgramm(temp);
2847
  end;
2848
 
2849
  // Ordner
2850
  if (flag = OrdnerTag) or (flag = OrdnerCompressTag) then
2851
  begin
2852
    temp := GetTempDir+TempPre+temp_unique_number+TempExtZip;
2853
    ctemp := GetTempDir+TempPre+temp_unique_number+TempExtCmp;
2854
 
2855
    dc_deletefile(temp);
2856
    error := false;
2857
    try
2858
      if (flag = OrdnerTag) then
2859
        DecodeFile(fileopen, temp, edt_passwort.text);
2860
      if (flag = OrdnerCompressTag) then
2861
      begin
2862
        DecodeFile(fileopen, ctemp, edt_passwort.Text);
2863
        DeCompress(ctemp, temp);
2864
      end;
2865
    except
2866
      // Kann auftreten, wenn das Programm beim entschlüsseln geschlossen wird
2867
      edt_passwort.Text := '';
2868
      edt_passwort.SetFocus; // wirkt durch Exception nicht -.-
2869
      error := true;
2870
      if bordericons <> [] then raise;
2871
    end;
2872
 
2873
    if not error then
2874
    begin
2875
      if directoryexists(GetTempDir+TempDirect+'\'+temp_unique_number+'\'+edt_vle6.text) then
2876
        dc_deletedir(GetTempDir+TempDirect+'\'+temp_unique_number+'\'+edt_vle6.text);
2877
      mkdir(GetTempDir+TempDirect+'\'+temp_unique_number+'\'+edt_vle6.text);
2878
      if Unzip(temp, GetTempDir+TempDirect+'\'+temp_unique_number+'\'+edt_vle6.text) then
2879
      begin
2880
        ExecuteProgramm(GetTempDir+TempDirect+'\'+temp_unique_number+'\'+edt_vle6.text);
2881
      end;
2882
    end;
2883
  end;
2884
 
2885
  finally
2886
  steuerelementesperren(false);
2887
  mainform.zeige_wartenform(false);
2888
  end;
2889
end;
2890
 
2891
procedure TMainForm.m_dateiensammlung_add_file_click(Sender: TObject);
2892
var
2893
  i: integer;
2894
begin
2895
  if dlg_open_element.Execute then
2896
  begin
2897
    steuerelementesperren(true);
2898
    zeige_wartenform(true);
2899
    try
2900
 
2901
    if dlg_open_element.Files.Count > 1 then
2902
    begin
2903
      for i := 0 to dlg_open_element.Files.Count - 1 do
2904
      begin
2905
        addtozip(dlg_open_element.Files.Strings[i], fileopen);
2906
      end;
2907
    end
2908
    else
2909
    begin
2910
      addtozip(dlg_open_element.filename, fileopen);
2911
    end;
2912
 
2913
    edt_vle4.Text := BestimmeDateiGroesse(fileopen);
2914
 
2915
    finally
2916
    steuerelementesperren(false);
2917
    zeige_wartenform(false);
2918
    end;
2919
  end;
2920
end;
2921
 
2922
function TMainForm.BestimmeDateiGroesse(filename: string): string;
2923
begin
2924
  BestimmeDateiGroesseSource := TFileStream.Create(filename, fmOpenRead or fmShareDenyNone);
2925
  try
2926
    try
2927
      result := IntelligenteDateigroesse(BestimmeDateiGroesseSource.size);
2928
    except
2929
      result := IntelligenteDateigroesse(0);
2930
    end;
2931
  finally
2932
    BestimmeDateiGroesseSource.free;
2933
  end;
2934
end;
2935
 
2936
procedure TMainForm.m_dateiensammlung_add_folder_click(Sender: TObject);
2937
var
2938
  fol: string;
2939
begin
2940
  fol := BrowseForFolder(getlangentry('dateisammlung_folder_add_message'), true);
2941
  if fol <> '' then
2942
  begin
2943
    steuerelementesperren(true);
2944
    zeige_wartenform(true);
2945
    try
2946
 
2947
    addtozip(fol, fileopen);
2948
    edt_vle4.Text := BestimmeDateiGroesse(fileopen);
2949
 
2950
    finally
2951
    steuerelementesperren(false);
2952
    zeige_wartenform(false);
2953
    end;
2954
  end;
2955
end;
2956
 
2957
procedure TMainForm.m_dateiensammlung_neu_click(Sender: TObject);
2958
begin
2959
  steuerelementesperren(true);
2960
  zeige_wartenform(true);
2961
  try
2962
 
2963
    try
2964
      kazip.close;
2965
    except
2966
 
2967
    end;
2968
 
2969
    if fileexists(GetTempDir+TempPre+mainform.temp_unique_number+TempExtZip) then
2970
      deletefile(GetTempDir+TempPre+mainform.temp_unique_number+TempExtZip);
2971
    CreateZipFile(GetTempDir+TempPre+mainform.temp_unique_number+TempExtZip);
2972
 
2973
    openfile(GetTempDir+TempPre+mainform.temp_unique_number+TempExtZip, GetLangEntry('dateiensammlung'), true);
2974
 
2975
  finally
2976
  steuerelementesperren(false);
2977
  zeige_wartenform(false);
2978
  end;
2979
end;
2980
 
2981
procedure TMainForm.m_dateiensammlung_show_click(Sender: TObject);
2982
begin
2983
  elementeform.PopupParent := Screen.ActiveForm; // http://www.delphipraxis.net/topic75743,0,asc,0.html
2984
  elementeform.showmodal;
2985
end;
2986
 
2987
procedure TMainForm.m_decrypt_execute(Sender: TObject);
2988
var
2989
  temp, ctemp, fol, neu: string;
2990
  error: boolean;
2991
begin
2992
  zeige_wartenform(true);
2993
  steuerelementesperren(true);
2994
  try
2995
 
2996
  // Datei
2997
  if (flag = DateiTag) or (flag = DateiCompressTag) then
2998
  begin
2999
    temp := GetTempDir+TempPre+temp_unique_number+TempExtTmp;
3000
    ctemp := GetTempDir+TempPre+temp_unique_number+TempExtCmp;
3001
 
3002
    dc_deletefile(temp);
3003
    error := false;
3004
    try
3005
      DecodeFile(fileopen, temp, edt_passwort.Text);
3006
      if flag = DateiCompressTag then
3007
        DeCompress(temp, ctemp)
3008
      else
3009
        ctemp := temp;
3010
    except
3011
      // Kann auftreten, wenn das Programm beim entschlüsseln geschlossen wird
3012
      on EDECException do
3013
      begin
3014
        edt_passwort.Text := '';
3015
        edt_passwort.SetFocus; // wirkt durch Exception nicht -.-
3016
        error := true;
3017
        if bordericons <> [] then raise;
3018
      end;
3019
    else
3020
      error := true;
3021
    end;
3022
 
3023
    // Wenn es zu keinem Fehler kam,
3024
    // dann den User fragen, wohin endgültig speichern
3025
    if not error then
3026
    begin
3027
      if ausgabegesetzt <> '' then
3028
      begin
3029
        // Ausgabeverzeichnis ist durch Befehlszeileneingabe bereits gesetzt
3030
        dc_deletefile(ausgabegesetzt);
3031
        if movefile(pchar(ctemp), pchar(ausgabegesetzt)) then
3032
        begin
3033
          if chk_securedelete.Checked then
3034
          begin
3035
            dc_deletefile(fileopen);
3036
            if fileexists(fileopen) then
3037
              errorlevel := 6;
3038
          end;
3039
        end
3040
        else
3041
          errorlevel := 5;
3042
      end
3043
      else
3044
      begin
3045
        if dlg_save_dec.Execute then
3046
        begin
3047
          dc_deletefile(dlg_save_dec.FileName);
3048
          forcedirectories(extractfilepath(dlg_save_dec.filename));
3049
          if movefile(pchar(ctemp), pchar(dlg_save_dec.FileName)) then
3050
          begin
3051
            if chk_securedelete.Checked then
3052
            begin
3053
              dc_deletefile(fileopen);
3054
              if fileexists(fileopen) then
3055
                Application.MessageBox(pchar(GetLangEntry('notdeleted')), pchar(GetLangEntry('warning')), MB_OK + MB_ICONEXCLAMATION)
3056
              else
3057
                schliessedatei;
3058
            end;
3059
          end
3060
          else
3061
            Application.MessageBox(pchar(GetLangEntry('moveerror')), pchar(GetLangEntry('error')), MB_OK + MB_ICONSTOP);
3062
        end
3063
      end;
3064
    end;
3065
  end;
3066
 
3067
  // Ordner
3068
  if (flag = OrdnerTag) or (flag = OrdnerCompressTag) then
3069
  begin
3070
    temp := GetTempDir+TempPre+temp_unique_number+TempExtZip;
3071
    ctemp := GetTempDir+TempPre+temp_unique_number+TempExtCmp;
3072
 
3073
    dc_deletefile(temp);
3074
    error := false;
3075
    try
3076
      DecodeFile(fileopen, temp, edt_passwort.text);
3077
      if flag = OrdnerCompressTag then
3078
      begin
3079
        DeCompress(temp, ctemp);
3080
        dc_deletefile(temp);
3081
        movefile(pchar(ctemp), pchar(temp)); // KaZIP kann nur ZIP-Dateien öffnen, keine CMP
3082
      end;
3083
    except
3084
      // Kann auftreten, wenn das Programm beim entschlüsseln geschlossen wird
3085
      edt_passwort.Text := '';
3086
      edt_passwort.SetFocus; // wirkt durch Exception nicht -.-
3087
      error := true;
3088
      if bordericons <> [] then raise;
3089
    end;
3090
 
3091
    // Wenn es zu keinem Fehler kam,
3092
    // dann den User fragen, wohin extrahieren (unzippen)
3093
    if not error then
3094
    begin
3095
      if (ausgabegesetzt <> '') then
3096
      begin
3097
        if copy(ausgabegesetzt, length(ausgabegesetzt), 1) = '\' then
3098
          neu := FindeFreienOrdnernamen(ausgabegesetzt+ersatzname)
3099
        else
3100
          neu := FindeFreienOrdnernamen(ausgabegesetzt+'\'+ersatzname);
3101
        if not ForceDirectories(neu) then
3102
          errorlevel := 4 // Ausgabeverzeichnis konnte nicht erstellt werden
3103
        else
3104
        begin
3105
          if Unzip(temp, neu) then
3106
          begin
3107
            if chk_securedelete.Checked then
3108
            begin
3109
              dc_deletefile(fileopen);
3110
              if fileexists(fileopen) then
3111
                errorlevel := 6;
3112
            end;
3113
          end
3114
          else
3115
            errorlevel := 7;
3116
        end;
3117
      end
3118
      else
3119
      begin
3120
        fol := BrowseForFolder(GetLangEntry('foldermessagesave'), true);
3121
        if fol <> '' then
3122
        begin
3123
          neu := FindeFreienOrdnernamen(fol+'\'+ersatzname);
3124
          if not ForceDirectories(neu) then
3125
            Application.MessageBox(pchar(GetLangEntry('mkdirerror')), pchar(GetLangEntry('error')), MB_OK + MB_ICONSTOP)
3126
          else
3127
          begin
3128
            if Unzip(temp, neu) then
3129
            begin
3130
              if chk_securedelete.Checked then
3131
              begin
3132
                dc_deletefile(fileopen);
3133
                if fileexists(fileopen) then
3134
                  Application.MessageBox(pchar(GetLangEntry('notdeleted')), pchar(GetLangEntry('error')), MB_OK + MB_ICONSTOP)
3135
                else
3136
                  schliessedatei;
3137
              end;
3138
            end;
3139
          end;
3140
        end;
3141
      end;
3142
    end;
3143
  end;
3144
 
3145
  // Wird sowieso beim Programmende ausgeführt
3146
  // dc_deletefile(temp);
3147
 
3148
  finally
3149
  steuerelementesperren(false);
3150
  zeige_wartenform(false);
3151
  end;
3152
end;
3153
 
3154
procedure TMainForm.m_encrypt_execute(Sender: TObject);
3155
var
3156
  temp: string;
3157
  error: boolean;
3158
begin
3159
  if edt_passwort.text <> edt_passwort2.text then
3160
    Application.MessageBox(pchar(GetLangEntry('passwordsdifferent')), pchar(GetLangEntry('error')), MB_OK + MB_ICONSTOP)
3161
  else
3162
  begin
3163
    steuerelementesperren(true);
3164
    zeige_wartenform(true);
3165
    try
3166
 
3167
    temp := GetTempDir+TempPre+temp_unique_number+TempExtTmp;
3168
 
3169
    dc_deletefile(temp);
3170
    error := false;
3171
    try
3172
      EncodeFile(fileopen, temp, edt_passwort.text);
3173
    except
3174
      // Kann auftreten, wenn das Programm beim verschlüsseln geschlossen wird
3175
      on EDECException do
3176
      begin
3177
        error := true;
3178
        if bordericons <> [] then raise;
3179
      end;
3180
    else
3181
      error := true;
3182
    end;
3183
 
3184
    // Wenn es zu keinem Fehler kam,
3185
    // dann den User fragen, wohin endgültig speichern
3186
    if not error then
3187
    begin
3188
      if ausgabegesetzt <> '' then
3189
      begin
3190
        // Ausgabeverzeichnis ist durch Befehlszeileneingabe bereits gesetzt
3191
        dc_deletefile(ausgabegesetzt);
3192
        if (extractfilepath(ausgabegesetzt) <> '') and not ForceDirectories(extractfilepath(ausgabegesetzt)) then
3193
          errorlevel := 4
3194
        else
3195
        begin
3196
          if movefile(pchar(temp), pchar(ausgabegesetzt)) then
3197
          begin
3198
            if chk_securedelete.Checked then
3199
            begin
3200
              if ersatzname <> '' then
3201
              begin
3202
                try
3203
                  dc_deletedir(ersatzname);
3204
                except
3205
                  // Fehler abfangen, sodas er nicht durchgeleitet wird und EL=2 verursacht
3206
                end;
3207
                if directoryexists(ersatzname) then
3208
                  errorlevel := 6;
3209
              end
3210
              else
3211
              begin
3212
                dc_deletefile(fileopen);
3213
                if fileexists(fileopen) then
3214
                  errorlevel := 6;
3215
              end;
3216
            end;
3217
          end
3218
          else
3219
            errorlevel := 5;
3220
        end;
3221
      end
3222
      else
3223
      begin
3224
        if dlg_save_enc.Execute then
3225
        begin
3226
          dc_deletefile(dlg_save_enc.FileName);
3227
          forcedirectories(extractfilepath(dlg_save_enc.filename));
3228
          if movefile(pchar(temp), pchar(dlg_save_enc.FileName)) then
3229
          begin
3230
            if chk_securedelete.Checked then
3231
            begin
3232
              if ersatzname <> '' then
3233
              begin
3234
                dc_deletedir(ersatzname);
3235
                if directoryexists(ersatzname) then
3236
                  Application.MessageBox(pchar(GetLangEntry('notdeleted')), pchar(GetLangEntry('warning')), MB_OK + MB_ICONEXCLAMATION)
3237
                else
3238
                  schliessedatei;
3239
              end
3240
              else
3241
              begin
3242
                dc_deletefile(fileopen);
3243
                if fileexists(fileopen) then
3244
                  Application.MessageBox(pchar(GetLangEntry('notdeleted')), pchar(GetLangEntry('warning')), MB_OK + MB_ICONEXCLAMATION)
3245
                else
3246
                  schliessedatei;
3247
              end;
3248
            end;
3249
          end
3250
          else
3251
            Application.MessageBox(pchar(GetLangEntry('moveerror')), pchar(GetLangEntry('error')), MB_OK + MB_ICONSTOP);
3252
        end
3253
      end;
3254
    end;
3255
 
3256
    // Wird bei Programmbeendigung ausgeführt
3257
    // dc_deletefile(temp);
3258
 
3259
    finally
3260
    steuerelementesperren(false);
3261
    zeige_wartenform(false);
3262
    end;
3263
  end;
3264
end;
3265
 
3266
procedure TMainForm.m_close_execute(Sender: TObject);
3267
begin
3268
  SchliesseDatei;
3269
end;
3270
 
3271
procedure TMainForm.schliessedatei();
3272
begin
3273
  m_close.Enabled := false;
3274
  mm_actions.visible := false;
3275
  m_dateiensammlung_add_file.Enabled := false;
3276
  m_dateiensammlung_add_folder.Enabled := false;
3277
  m_dateiensammlung_show.Enabled := false;
3278
 
3279
  fileopen := '';
3280
  ersatzname := '';
3281
  ausgabegesetzt := '';
3282
  flag := 0;
3283
  mode := tcUnknown;
3284
  kazip.Close;
3285
 
3286
  edt_passwort.Text := '';
3287
  edt_passwort2.Text := '';
3288
 
3289
  chk_securedelete.Checked := false;
3290
  caption := '(De)Coder '+DC4Ver;
3291
  progress_position(wartenform.pbr_progress.min);
3292
 
3293
  edt_vle1.Text := GetLangEntry('nofile');
3294
  edt_vle2.text := '-';
3295
  edt_vle3.Text := '-';
3296
  edt_vle4.Text := '-';
3297
  edt_vle5.Text := '-';
3298
  edt_vle6.Text := '-';
3299
  edt_vle7.Text := '-';
3300
 
3301
  edt_vle1.Color := clBtnFace;
3302
  edt_vle1.ReadOnly := true;
3303
  edt_vle1.TabStop := false;
3304
 
3305
  b_decrypt.Visible := false;
3306
  b_encrypt.Visible := false;
3307
  b_direct.Visible := false;
3308
  b_open.Visible := true;
3309
  b_folder.Visible := true;
3310
 
3311
  lbl_passwort.Visible := false;
3312
  lbl_passwort2.Visible := false;
3313
  edt_passwort.Visible := false;
3314
  edt_passwort2.Visible := false;
3315
  lbl_entropy.Visible := false;
3316
  lbl_equal.Visible := false;
3317
  chk_securedelete.Visible := false;
3318
  lbl_readerror.Visible := false;
3319
  img_error.Visible := false;
3320
  tmr_capslock.Enabled := false;
3321
  lbl_capswarning.Visible := false;
3322
  img_warning.Visible := false;
3323
  chk_compress.Visible := false;
3324
 
3325
  img_type.Picture.Bitmap.LoadFromResourceName(hInstance, 'NOOPEN');
3326
end;
3327
 
3328
procedure TMainForm.m_web_keytransmitter_click(Sender: TObject);
3329
begin
3330
  shellexecute(application.Handle, 'open', 'http://www.viathinksoft.de/keytransmitter/', '', '', sw_normal);
3331
end;
3332
 
3333
{ Allgemeine Funktion zum Verarbeiten der Kommandozeilenparameter }
3334
// ursprünglich von OneInst
3335
procedure TMainForm.ProcessCommandline(lpData: Pointer);
3336
var
3337
  arbeitsverzeichnis: string;
3338
  i: integer;
3339
  SR: TSearchRec;
3340
  ts: tstringlist;
3341
  fehler: boolean;
3342
begin
3343
  ParamZeile := ParamBlobToStr(lpData);
3344
 
3345
  // Syntaxprüfung der Befehlszeile
3346
 
3347
  if ((paramzeile_firstposition('/c') <> -1) and (ZaehleLinien(ParamZeile) > paramzeile_firstposition('/c')+2)) or
3348
     ((paramzeile_firstposition('/x') <> -1) and (ZaehleLinien(ParamZeile) > paramzeile_firstposition('/x')+2)) or
3349
     ((paramzeile_firstposition('/e') <> -1) and (ZaehleLinien(ParamZeile) > paramzeile_firstposition('/e')+1)) or
3350
     ((paramzeile_firstposition('/?') <> -1) and (ZaehleLinien(ParamZeile) > paramzeile_firstposition('/?')+0)) or
3351
     ((paramzeile_firstposition('/clean') <> -1) and (ZaehleLinien(ParamZeile) > paramzeile_firstposition('/clean')+2)) then
3352
  begin
3353
    errorlevel := 3; // Falsche Syntax
3354
  end;
3355
 
3356
  // Anwendung dient nur als Hilfeaufruf
3357
 
3358
  if GebeLinieaus(ParamZeile, 1) = '/?' then
3359
  begin
3360
    m_help.Click;
3361
    close;
3362
    exit;
3363
  end;
3364
 
3365
  // Anwendung dient nur als Cleaner
3366
 
3367
  if GebeLinieaus(ParamZeile, 1) = '/clean' then
3368
  begin
3369
    // 10 Sekunden warten, bis ggf. die temporären Dateien freigegeben wurden
3370
    if (lowercase(GebeLinieaus(ParamZeile, 2)) = '/silent') then Schlafen(10000);
3371
    DeleteTempFiles;
3372
    close;
3373
    exit;
3374
  end;
3375
 
3376
  // Verarbeitung der Befehlszeile
3377
 
3378
  if (ZaehleLinien(ParamZeile) > 1) then
3379
  begin
3380
    if (paramzeile_firstposition('/c') <> -1) then
3381
    begin
3382
      GetDir(0, arbeitsverzeichnis);
3383
      ausgabegesetzt := arbeitsverzeichnis+'\'+GebeLinieaus(ParamZeile, paramzeile_firstposition('/c')+2);
3384
      if paramzeile_firstposition('/c') = 2 then
3385
      begin
3386
        // 1 Datei soll geöffnet werden
3387
        if not fileexists(GebeLinieaus(ParamZeile, 1)) and not directoryexists(GebeLinieaus(ParamZeile, 1)) then
3388
        begin
3389
          errorlevel := 9; // Datei oder Ordner nicht gefunden.
3390
        end
3391
        else
3392
        begin
3393
          ts := tstringlist.Create;
3394
          try
3395
            if FindFirst(GebeLinieaus(ParamZeile, 1), faAnyFile, SR) = 0 then
3396
            try
3397
              repeat
3398
                ts.Add(sr.Name);
3399
              until FindNext(SR) <> 0;
3400
            finally
3401
              SysUtils.FindClose(SR);
3402
            end;
3403
 
3404
            if ts.count = 1 then
3405
            begin
3406
              if fileexists(GebeLinieaus(ParamZeile, 1)) then
3407
              begin
3408
                openfile(GebeLinieaus(ParamZeile, 1), '', true);
3409
 
3410
                if mode = tcDecrypted then
3411
                begin
3412
                  // Datei verschlüsseln
3413
                  if lowercase(extractfileext(ausgabegesetzt)) <> lowercase(ExtDC4) then
3414
                    ausgabegesetzt := ausgabegesetzt + ExtDC4; // Ausgabe muss .dc4 haben!
3415
                  edt_passwort.Text := GebeLinieaus(ParamZeile, paramzeile_firstposition('/c')+1);
3416
                  edt_passwort2.Text := GebeLinieaus(ParamZeile, paramzeile_firstposition('/c')+1);
3417
                  try
3418
                    m_encrypt.Click;
3419
                  except
3420
                    // Falls ein Fehler auftreten sollte, soll der Ablauf hier nicht stehen
3421
                    // bleiben, deswegen der Try-Except-Block.
3422
                    errorlevel := 2; // Fehler bei Ver/Entschlüsselung
3423
                  end;
3424
                end;
3425
 
3426
                if mode = tcEncrypted then
3427
                begin
3428
                  // Datei oder Ordner entschlüsseln
3429
                  if lowercase(extractfileext(ausgabegesetzt)) = lowercase(ExtDC4) then
3430
                    ausgabegesetzt := copy(ausgabegesetzt, 0, length(ausgabegesetzt)-length(ExtDC4)); // Ausgabe darf nicht .dc4 haben!
3431
                  edt_passwort.Text := GebeLinieaus(ParamZeile, paramzeile_firstposition('/c')+1);
3432
                  try
3433
                    m_decrypt.Click;
3434
                  except
3435
                    // Falls ein Fehler auftreten sollte, soll der Ablauf hier nicht stehen
3436
                    // bleiben, deswegen der Try-Except-Block.
3437
                    errorlevel := 2; // Fehler bei Ver/Entschlüsselung
3438
                  end;
3439
                end;
3440
              end
3441
              else if directoryexists(GebeLinieaus(ParamZeile, 1)) then
3442
              begin
3443
                // Ordner verschlüsseln
3444
                openfolder(GebeLinieaus(ParamZeile, 1));
3445
                edt_passwort.Text := GebeLinieaus(ParamZeile, paramzeile_firstposition('/c')+1);
3446
                edt_passwort2.Text := GebeLinieaus(ParamZeile, paramzeile_firstposition('/c')+1);
3447
                if lowercase(extractfileext(ausgabegesetzt)) <> lowercase(ExtDC4) then
3448
                  ausgabegesetzt := ausgabegesetzt + ExtDC4; // Ausgabe muss .dc4 haben!
3449
                try
3450
                  m_encrypt.Click;
3451
                except
3452
                  // Falls ein Fehler auftreten sollte, soll der Ablauf hier nicht stehen
3453
                  // bleiben, deswegen der Try-Except-Block.
3454
                  errorlevel := 2; // Fehler bei Ver/Entschlüsselung
3455
                end;
3456
              end;
3457
            end
3458
            else
3459
            begin
3460
              // Dateiliste soll angelegt werden
3461
              m_dateiensammlung_neu.Click;
3462
              for i := 0 to ts.Count - 1 do
3463
              begin
3464
                addtozip(ts.Strings[i], fileopen);
3465
              end;
3466
              edt_passwort.Text := GebeLinieaus(ParamZeile, paramzeile_firstposition('/c')+1);
3467
              edt_passwort2.Text := GebeLinieaus(ParamZeile, paramzeile_firstposition('/c')+1);
3468
              if lowercase(extractfileext(ausgabegesetzt)) <> lowercase(ExtDC4) then
3469
                ausgabegesetzt := ausgabegesetzt + ExtDC4; // Ausgabe muss .dc4 haben!
3470
              try
3471
                m_encrypt.Click;
3472
              except
3473
                // Falls ein Fehler auftreten sollte, soll der Ablauf hier nicht stehen
3474
                // bleiben, deswegen der Try-Except-Block.
3475
                errorlevel := 2; // Fehler bei Ver/Entschlüsselung
3476
              end;
3477
            end;
3478
          finally
3479
            ts.Free;
3480
          end;
3481
        end;
3482
      end
3483
      else
3484
      begin
3485
        // Dateiliste soll angelegt werden
3486
        m_dateiensammlung_neu.Click;
3487
        for i := 1 to paramzeile_firstposition('/c') - 1 do
3488
        begin
3489
          addtozip(dlg_open_element.filename, fileopen);
3490
        end;
3491
        edt_passwort.Text := GebeLinieaus(ParamZeile, paramzeile_firstposition('/c')+1);
3492
        edt_passwort2.Text := GebeLinieaus(ParamZeile, paramzeile_firstposition('/c')+1);
3493
        if lowercase(extractfileext(ausgabegesetzt)) <> lowercase(ExtDC4) then
3494
          ausgabegesetzt := ausgabegesetzt + ExtDC4; // Ausgabe muss .dc4 haben!
3495
        try
3496
          m_encrypt.Click;
3497
        except
3498
          // Falls ein Fehler auftreten sollte, soll der Ablauf hier nicht stehen
3499
          // bleiben, deswegen der Try-Except-Block.
3500
          errorlevel := 2; // Fehler bei Ver/Entschlüsselung
3501
        end;
3502
      end;
3503
      close;
3504
    end
3505
 
3506
    // Der Unterschied von /x zu /c ist, dass openfile() anders reagiert und die checkbox chk_securedelete anwählt
3507
    else if (paramzeile_firstposition('/x') <> -1) then
3508
    begin
3509
      GetDir(0, arbeitsverzeichnis);
3510
      ausgabegesetzt := arbeitsverzeichnis+'\'+GebeLinieaus(ParamZeile, paramzeile_firstposition('/x')+2);
3511
      if paramzeile_firstposition('/x') = 2 then
3512
      begin
3513
        // 1 Datei soll geöffnet werden
3514
        if not fileexists(GebeLinieaus(ParamZeile, 1)) and not directoryexists(GebeLinieaus(ParamZeile, 1)) then
3515
        begin
3516
          errorlevel := 9; // Datei oder Ordner nicht gefunden.
3517
        end
3518
        else
3519
        begin
3520
          ts := tstringlist.Create;
3521
          try
3522
            if FindFirst(GebeLinieaus(ParamZeile, 1), faAnyFile, SR) = 0 then
3523
            try
3524
              repeat
3525
                ts.Add(sr.Name);
3526
              until FindNext(SR) <> 0;
3527
            finally
3528
              SysUtils.FindClose(SR);
3529
            end;
3530
 
3531
            if ts.count = 1 then
3532
            begin
3533
              if fileexists(GebeLinieaus(ParamZeile, 1)) then
3534
              begin
3535
                openfile(GebeLinieaus(ParamZeile, 1), '', true);
3536
 
3537
                if mode = tcDecrypted then
3538
                begin
3539
                  // Datei verschlüsseln
3540
                  if lowercase(extractfileext(ausgabegesetzt)) <> lowercase(ExtDC4) then
3541
                    ausgabegesetzt := ausgabegesetzt + ExtDC4; // Ausgabe muss .dc4 haben!
3542
                  edt_passwort.Text := GebeLinieaus(ParamZeile, paramzeile_firstposition('/x')+1);
3543
                  edt_passwort2.Text := GebeLinieaus(ParamZeile, paramzeile_firstposition('/x')+1);
3544
                  try
3545
                    m_encrypt.Click;
3546
                  except
3547
                    // Falls ein Fehler auftreten sollte, soll der Ablauf hier nicht stehen
3548
                    // bleiben, deswegen der Try-Except-Block.
3549
                    errorlevel := 2; // Fehler bei Ver/Entschlüsselung
3550
                  end;
3551
                end;
3552
 
3553
                if mode = tcEncrypted then
3554
                begin
3555
                  // Datei oder Ordner entschlüsseln
3556
                  if lowercase(extractfileext(ausgabegesetzt)) = lowercase(ExtDC4) then
3557
                    ausgabegesetzt := copy(ausgabegesetzt, 0, length(ausgabegesetzt)-length(ExtDC4)); // Ausgabe darf nicht .dc4 haben!
3558
                  edt_passwort.Text := GebeLinieaus(ParamZeile, paramzeile_firstposition('/x')+1);
3559
                  try
3560
                    m_decrypt.Click;
3561
                  except
3562
                    // Falls ein Fehler auftreten sollte, soll der Ablauf hier nicht stehen
3563
                    // bleiben, deswegen der Try-Except-Block.
3564
                    errorlevel := 2; // Fehler bei Ver/Entschlüsselung
3565
                  end;
3566
                end;
3567
              end
3568
              else if directoryexists(GebeLinieaus(ParamZeile, 1)) then
3569
              begin
3570
                // Ordner verschlüsseln
3571
                openfolder(GebeLinieaus(ParamZeile, 1));
3572
                edt_passwort.Text := GebeLinieaus(ParamZeile, paramzeile_firstposition('/x')+1);
3573
                edt_passwort2.Text := GebeLinieaus(ParamZeile, paramzeile_firstposition('/x')+1);
3574
                if lowercase(extractfileext(ausgabegesetzt)) <> lowercase(ExtDC4) then
3575
                  ausgabegesetzt := ausgabegesetzt + ExtDC4; // Ausgabe muss .dc4 haben!
3576
                try
3577
                  m_encrypt.Click;
3578
                except
3579
                  // Falls ein Fehler auftreten sollte, soll der Ablauf hier nicht stehen
3580
                  // bleiben, deswegen der Try-Except-Block.
3581
                  errorlevel := 2; // Fehler bei Ver/Entschlüsselung
3582
                end;
3583
              end;
3584
            end
3585
            else
3586
            begin
3587
              // Dateiliste soll angelegt werden
3588
              m_dateiensammlung_neu.Click;
3589
              for i := 0 to ts.Count - 1  do
3590
              begin
3591
                addtozip(ts.Strings[i], fileopen);
3592
              end;
3593
              edt_passwort.Text := GebeLinieaus(ParamZeile, paramzeile_firstposition('/x')+1);
3594
              edt_passwort2.Text := GebeLinieaus(ParamZeile, paramzeile_firstposition('/x')+1);
3595
              if lowercase(extractfileext(ausgabegesetzt)) <> lowercase(ExtDC4) then
3596
                ausgabegesetzt := ausgabegesetzt + ExtDC4; // Ausgabe muss .dc4 haben!
3597
              try
3598
                m_encrypt.Click;
3599
              except
3600
                // Falls ein Fehler auftreten sollte, soll der Ablauf hier nicht stehen
3601
                // bleiben, deswegen der Try-Except-Block.
3602
                errorlevel := 2; // Fehler bei Ver/Entschlüsselung
3603
              end;
3604
            end;
3605
          finally
3606
            ts.Free;
3607
          end;
3608
        end;
3609
      end
3610
      else
3611
      begin
3612
        // Dateiliste soll angelegt werden
3613
        m_dateiensammlung_neu.Click;
3614
        for i := 1 to paramzeile_firstposition('/x') - 1 do
3615
        begin
3616
          addtozip(dlg_open_element.filename, fileopen);
3617
        end;
3618
        edt_passwort.Text := GebeLinieaus(ParamZeile, paramzeile_firstposition('/x')+1);
3619
        edt_passwort2.Text := GebeLinieaus(ParamZeile, paramzeile_firstposition('/x')+1);
3620
        if lowercase(extractfileext(ausgabegesetzt)) <> lowercase(ExtDC4) then
3621
          ausgabegesetzt := ausgabegesetzt + ExtDC4; // Ausgabe muss .dc4 haben!
3622
        try
3623
          m_encrypt.Click;
3624
        except
3625
          // Falls ein Fehler auftreten sollte, soll der Ablauf hier nicht stehen
3626
          // bleiben, deswegen der Try-Except-Block.
3627
          errorlevel := 2; // Fehler bei Ver/Entschlüsselung
3628
        end;
3629
      end;
3630
      close;
3631
    end
3632
 
3633
    // Dateien löschen
3634
    else if (lowercase(GebeLinieaus(ParamZeile, 2)) = '/e') then
3635
    begin
3636
      if (ZaehleLinien(ParamZeile) = 2) or ((ZaehleLinien(ParamZeile) = 3) and (GebeLinieaus(ParamZeile, 3) = '/notsilent')) then
3637
      begin
3638
 
3639
        ts := tstringlist.Create;
3640
        try
3641
          if FindFirst(GebeLinieaus(ParamZeile, 1), faAnyFile, SR) = 0 then
3642
          try
3643
            repeat
3644
               ts.add(sr.name);
3645
            until FindNext(SR) <> 0;
3646
          finally
3647
            SysUtils.FindClose(SR);
3648
          end;
3649
 
3650
          if ts.count = 1 then
3651
          begin
3652
            // 1 Datei
3653
            if directoryexists(GebeLinieaus(ParamZeile, 1)) then
3654
            begin
3655
              dc_deletedir(GebeLinieaus(ParamZeile, 1));
3656
              if directoryexists(GebeLinieaus(ParamZeile, 1)) then
3657
              begin
3658
                if (GebeLinieaus(ParamZeile, 3) = '/notsilent') then
3659
                  Application.MessageBox(pchar(GetLangEntry('delerror')), pchar(GetLangEntry('error')), MB_OK + MB_ICONERROR)
3660
                else
3661
                  errorlevel := 8; // Datei oder Ordner konnte nicht oder nur teilweise entfernt werden.
3662
              end
3663
              else if (GebeLinieaus(ParamZeile, 3) = '/notsilent') then
3664
                Application.MessageBox(pchar(GetLangEntry('delok')), pchar(GetLangEntry('information')), MB_OK + MB_ICONINFORMATION)
3665
            end
3666
            else if fileexists(GebeLinieaus(ParamZeile, 1)) then
3667
            begin
3668
              dc_deletefile(GebeLinieaus(ParamZeile, 1));
3669
              if fileexists(GebeLinieaus(ParamZeile, 1)) then
3670
              begin
3671
                if (GebeLinieaus(ParamZeile, 3) = '/notsilent') then
3672
                  Application.MessageBox(pchar(GetLangEntry('delerror')), pchar(GetLangEntry('error')), MB_OK + MB_ICONERROR)
3673
                else
3674
                  errorlevel := 8; // Datei oder Ordner konnte nicht oder nur teilweise entfernt werden.
3675
              end
3676
              else if (GebeLinieaus(ParamZeile, 3) = '/notsilent') then
3677
                Application.MessageBox(pchar(GetLangEntry('delok')), pchar(GetLangEntry('information')), MB_OK + MB_ICONINFORMATION)
3678
            end
3679
            else
3680
            begin
3681
              if (GebeLinieaus(ParamZeile, 3) = '/notsilent') then
3682
                Application.MessageBox(pchar(GetLangEntry('fileorfoldernotfound')), pchar(GetLangEntry('error')), MB_OK + MB_ICONERROR)
3683
              else
3684
                errorlevel := 9; // Datei oder Ordner nicht gefunden.
3685
            end;
3686
          end
3687
          else
3688
          begin
3689
            // Wildcard verwendet
3690
            fehler := false;
3691
            for i := 0 to ts.count - 1 do
3692
            begin
3693
              if fileexists(ts.strings[i]) then
3694
                dc_deletefile(ts.strings[i]);
3695
              if directoryexists(ts.strings[i]) then
3696
                dc_deletedir(ts.strings[i]);
3697
 
3698
              if (fileexists(ts.strings[i]) or directoryexists(ts.strings[i])) and
3699
                 (GebeLinieaus(ParamZeile, 3) = '/notsilent') then
3700
              begin
3701
                fehler := true;
3702
              end;
3703
            end;
3704
 
3705
            if fehler then
3706
              Application.MessageBox(pchar(GetLangEntry('delerror')), pchar(GetLangEntry('error')), MB_OK + MB_ICONERROR)
3707
          end;
3708
        finally
3709
          ts.free;
3710
        end;
3711
 
3712
      end
3713
      else
3714
      begin
3715
        errorlevel := 3; // Falsche Syntax
3716
      end;
3717
      close;
3718
    end
3719
 
3720
    // Mehrere Dateien öffnen
3721
    else
3722
    begin
3723
      show;
3724
 
3725
      steuerelementesperren(true);
3726
      zeige_wartenform(true);
3727
      try
3728
 
3729
      try
3730
        kazip.close;
3731
      except
3732
 
3733
      end;
3734
 
3735
      if fileexists(GetTempDir+TempPre+mainform.temp_unique_number+TempExtZip) then deletefile(GetTempDir+TempPre+mainform.temp_unique_number+TempExtZip);
3736
      CreateZipFile(GetTempDir+TempPre+mainform.temp_unique_number+TempExtZip);
3737
      for i := 1 to ZaehleLinien(ParamZeile) do
3738
      begin
3739
        addtozip(GebeLinieaus(ParamZeile, i), GetTempDir+TempPre+mainform.temp_unique_number+TempExtZip)
3740
      end;
3741
 
3742
      openfile(GetTempDir+TempPre+mainform.temp_unique_number+TempExtZip, GetLangEntry('dateiensammlung'), true);
3743
 
3744
      finally
3745
      steuerelementesperren(false);
3746
      zeige_wartenform(false);
3747
      end;
3748
 
3749
      application.Restore;
3750
      application.BringToFront;
3751
    end;
3752
  end
3753
  else
3754
  begin
3755
    show;
3756
 
3757
    ts := tstringlist.Create;
3758
    try
3759
      if FindFirst(GebeLinieaus(ParamZeile, 1), faAnyFile, SR) = 0 then
3760
      try
3761
        repeat
3762
          ts.Add(sr.Name);
3763
        until FindNext(SR) <> 0;
3764
      finally
3765
        SysUtils.FindClose(SR);
3766
      end;
3767
 
3768
      if ts.Count = 1 then
3769
      begin
3770
        // 1 Datei öffnen
3771
        if fileexists(GebeLinieaus(ParamZeile, 1)) then
3772
        begin
3773
          steuerelementesperren(true);
3774
          zeige_wartenform(true);
3775
          try
3776
            openfile(GebeLinieaus(ParamZeile, 1), '', false);
3777
          finally
3778
            steuerelementesperren(false);
3779
            zeige_wartenform(false);
3780
          end;
3781
        end
3782
        else if directoryexists(GebeLinieaus(ParamZeile, 1)) then
3783
        begin
3784
          steuerelementesperren(true);
3785
          zeige_wartenform(true);
3786
          try
3787
            openfolder(GebeLinieaus(ParamZeile, 1));
3788
          finally
3789
            steuerelementesperren(false);
3790
            zeige_wartenform(false);
3791
          end;
3792
        end;
3793
      end
3794
      else if ts.Count > 1 then
3795
      begin
3796
        // Dateiliste soll angelegt werden
3797
 
3798
        steuerelementesperren(true);
3799
        zeige_wartenform(true);
3800
        try
3801
 
3802
        m_dateiensammlung_neu.Click;
3803
        for i := 0 to ts.count - 1 do
3804
        begin
3805
          addtozip(ts.Strings[i], fileopen);
3806
        end;
3807
 
3808
        finally
3809
        steuerelementesperren(false);
3810
        zeige_wartenform(false);
3811
        end;
3812
      end;
3813
    finally
3814
      ts.free;
3815
    end;
3816
 
3817
    application.Restore;
3818
    application.BringToFront;
3819
  end;
3820
end;
3821
 
3822
procedure TMainForm.CreateZipFile(zipfile: string);
3823
begin
3824
  // kazip.CreateZip(zipfile);
3825
 
3826
  try
3827
    ZippingStream := TFileStream.Create(zipfile, fmOpenReadWrite or fmCreate);
3828
    try
3829
      KAZip.CreateZip(ZippingStream);
3830
    finally
3831
      ZippingStream.Free;
3832
    end;
3833
  except
3834
 
3835
  end;
3836
end;
3837
 
3838
procedure TMainForm.addtozip(fileorfolder, zipfile: string);
3839
begin
3840
  try
3841
    kazip.close;
3842
  except
3843
 
3844
  end;
3845
 
3846
  DateienImOrdner := 0;
3847
  if directoryexists(fileorfolder) then
3848
    DateienImOrdner := NumberOfFiles(fileorfolder);
3849
  if fileexists(fileorfolder) then
3850
    DateienImOrdner := 1;
3851
 
3852
  DateienCounter := 0;
3853
 
3854
  kazip.Open(zipfile);
3855
  try
3856
    try
3857
      if fileexists(fileorfolder) then
3858
        kazip.AddFile(fileorfolder, extractfilename(fileorfolder));
3859
      if directoryexists(fileorfolder) then
3860
        kazip.AddFolder(fileorfolder, extractfilepath(fileorfolder), '*', true);
3861
    except
3862
 
3863
    end;
3864
  finally
3865
    kazip.Close;
3866
  end;
3867
end;
3868
 
3869
// von OneInst
3870
procedure TMainForm.Start;
3871
var
3872
  lpData: Pointer;
3873
  cbData: DWORD;
3874
begin
3875
  lpData := ParamStrToBlob(cbData);
3876
  try
3877
    ProcessCommandline(lpData);
3878
  finally
3879
    FreeMemory(lpData);
3880
  end;
3881
end;
3882
 
3883
end.