Eine andere Möglichkeit wäre vom obigen Konzept abzurücken. Man benutzt ein einheitliches IDECStream Objekt, das aber eine Liste der zu verwendenden Filter-Objekte verwaltet. Die Konvertierung nach/vom MIME 64 oder ein Cipher oder eine Komprimierung wären nur Filter Objecte. Somit enthält der IDECStream eine Liste solcher Filterobjete. Deren Reihenfolge bei der Registration im IDECStream bestimmt in welcher Reihenfolge welche Aktionen getätigt werden. Nun, der IDECStream alloziert intern einen Buffer der eine Minimal und Maximale Größe besitzt. Am Anfang stehen in diesem Buffer 3 Bytes und nun müssen diese per inplaced Operationen durch den MIME64 Filter auf 4 Bytes expandiert werden. Usw. usw.
Das Klassendesign könnte dann so aussehen:
Delphi-Quellcode:
type
IDECFilter = interface
function Encode(Data: Pointer; DataSize: Integer): Integer; stdcall;
function Decode(Data: Pointer; DataSize: Integer): Integer; stdcall;
function MinChunkSize: Integer; stdcall;
end;
IDECFilters = interface
function Count: Integer; stdcall;
function GetFilter(Index: Integer): IDECFilter; stdcall;
procedure Add(const Filter: IDECFilter); stdcall;
end;
IDECStream = interface
procedure Write(const Data: Pointer; DataSize: Integer); stdcall;
procedure Read(out Data: Pointer; DataSize: Integer); stdcall;
procedure Write(const Data: IDECStream; DataSize: Integer); stdcall;
procedure Read(const Data: IDECStream; DataSize: Integer); stdcall;
function Filters: IDECFilters;
end;
Im obigen Beispiel habe ich absichtlich noch mit Pointern gearbeitet, normalerweise müssten diese durch Interface Objecte ersetzt werden.
Desweiteren müsste der IDECStream eben direkte ordinale Typen unterstützen, also WriteByte(), WriteChar(), WriteWord() etc.
Tja, was ist aber nun besser ??
Gruß Hagen