Einzelnen Beitrag anzeigen

Benutzerbild von negaH
negaH

Registriert seit: 25. Jun 2003
Ort: Thüringen
2.950 Beiträge
 
#6

Re: DEC onProgress-Ereignis bei mehreren Threads

  Alt 10. Aug 2003, 12:09
Hi Luckie,

sorry für die späte Antwort, aber es gibt auch mal einen Geburtstag zu feiern.

Also, es ist schon erschreckend wie du so schnell die Schwachstellen im DEC findest. OnProgress() ist ein globales Event das 1. nicht threadsafe ist und 2. global immer nur einen Verschlüsselungsprozess unterstützt.

D.h. mit OnProgress() wirst du das was du willst nie hinbekommen. Vergiss es also. Verzichte auf TCipherManager/THashManager, beides sind Komponenten die ich für die DAU's coden musste, es sind Drag&Design Hilfsmittel.


Nachfolgend zeige ich wie man jeden Stream mit Progress Funktionalität ausbauen kann. D.h. deine Progressbar sollte individuell zum Streaming sein, dann ist sie auch threadsafe. Desweiteren zeige ich wie man Verschlüsselt ohne TCipherManager, die Entschlüsselung bekommste damit selber hin.

Delphi-Quellcode:
type
  TStreamProgressAdapter = class(TStream)
  private
    FStream: TStream;
  protected
    procedure SetSize(NewSize: Longint); override;
  public
    constructor Create(AStream: TStream);
    destructor Destroy; override;
    function Read(var Buffer; Count: Longint): Longint; override;
    function Write(const Buffer; Count: Longint): Longint; override;
    function Seek(Offset: Longint; Origin: Word): Longint; override;

    procedure DoProgress(Writing: Boolean); virtual;
  end;

procedure TStreamProgressAdapter.SetSize(NewSize: Longint);
begin
  TStreamProgressAdapter(FStream).SetSize(NewSize);
end;

constructor TStreamProgressAdapter.Create(AStream: TStream);
begin
  inherited Create;
  FStream := AStream;
end;

destructor TStreamProgressAdapter.Destroy;
begin
  inherited Destroy;
  FStream.Free;
end;

function TStreamProgressAdapter.Read(var Buffer; Count: Longint): Longint;
begin
  Result := FStream.Read(Buffer, Count);
  DoProgress(False);
end;

function TStreamProgressAdapter.Write(const Buffer; Count: Longint): Longint;
begin
  Result := FStream.Write(Buffer, Count);
  DoProgress(False);
end;

function TStreamProgressAdapter.Seek(Offset: Longint; Origin: Word): Longint;
begin
  Result := FStream.Seek(Offset, Origin);
end;

procedure TStreamProgressAdapter.DoProgress(Writing: Boolean);
begin
  // hier deine Progress Funktionen einbauen
end;

procedure Encrypt(Stream: TStream; const Password: String; CipherClass: TCipherClass = nil); overload;
begin
  if CipherClass = nil then
    CipherClass := TCipher_Blowfish;
  with CipherClass.Create('', nil) do
  try
    Mode := cmCTS;
    InitKey(Password, nil);
    EncodeStream(Stream, Stream, -1);
  finally
    Free;
  end;
end;

procedure Encrypt(const FileName, Password: String; CipherClass: TCipherClass = nil); overload;
var
  Stream: TStream;
begin
  Stream := TStreamProgressAdapter.Create(TFileStream.Create(FileName, fmOpenReadWrite or fmShareExclusive));
  try
    Encrypt(Stream, Password, CipherClass);
  finally
    Stream.Free;
  end;
end;

procedure TestC;
begin
  Encrypt('d:\test.bin', 'Test');
  Encrypt('d:\test.bin', 'Test', TCipher_Rijndael);
  Encrypt('d:\test.bin', 'Test', TCipherClass(DECClassByName('IDEA', TCipher)));
end;
Gruß Hagen
  Mit Zitat antworten Zitat