Um ein ähnliches Problem habe ich mir auch schon Gedanken gemacht.
Angenommen man möchte EMails per
SMTP versenden.
Sobald der Socket offen ist, benötigt man ja nur noch Lese- und Schreibfunktionen.
Welcher Art von Socket oder ob man über einen Proxyserver geht oder die Daten verschlüsselt ist ja mal egal.
Man könnte sich auch folgendes Szenarios vorstellen:
Code:
SMTP-Protokoll <---> [HTTP Packer/Entpacker] <---> [
TCP Socket] <-> Netzwerk
SMTP-Protokoll <---> [Secure Socket Layer] <--> [Serielle Schnittstelle]
An den Stellen, die mit "<--->" gekennzeichnet sind, besteht eine bidirektionale Schreib-/Leseverbindung.
Ich nenne dies mal eine "Pipeline".
Die Pipeline könne man über folgendes Interface implementieren:
Delphi-Quellcode:
IPipeline = interface;
IPipelineCallback = interface(IUnknown)
procedure DataAvailable(Sender:IPipeline);
end;
IPipeline = interface(IUnknown)
function Read(var Buffer; Count: Longint): Longint;
function Write(const Buffer; Count: Longint): Longint;
function GetReadSize: Integer; // Anzahl der Bytes, die mit Read gelesen werden können
procedure SetCallBack(cb:IPipelineCallback);
end;
Damit der Benutzer von IPipeline nicht ständig fragen muss, ob Daten zum Lesen vorhanden ist, gibt es das Interface IPipelineCallback.
Mit diesem Ansatz könnte man nun Blöcke hintereinander schalten.
Code:
SMTP-Protokoll <---> [StreamCompressor/Dekompressor] <--->
TCP Socket
Der StreamCompressor/Dekompressor würde also einerseits das Interface IPipeline implementieren, damit es vom
SMTP-Protokoll benützt wird,
andererseits benützt es ein IPipeline-Interface, das von
TCP Socket implementiert wird.
Auf diese Weise entsteht ein Baukastensystem, deren Teile man zu Ketten zusammenschalten kann.