QT + POP3
-
Hallo,
ich möchte gerne einen POP3 Clienten in QT schreiben.
Ich programmiere also eine Klasse POP3.
Dabei bin ich über folgendes Problem gestolpert: wenn ich nun z.B. eine Memberfunktion FetchMsg(int MessageID) habe, dann ist es ja nicht möglich, sofort die geholte Nachricht zurückzugeben, die Funktion kann ja erst mal nur das POP3 Kommando RETR 234 aussenden, bis der Server geantwortet hat kann ja das Programm nicht einfach warten.Also erstelle ich mir eine Funktion, ich habe sie EventHandler genannt, die per Signal und Slots auf das readyRead()-Signal des Sockets zum Server reagiert.
Dieser Event-Handler soll dann - so stelle ich mir das mal vor - den Antwortstring parsen, und entscheiden, welche Memberfunktion diesen weiterbehandeln soll (dafür habe ich mir einen LIFO Mechanismus ausgedacht, jede Funktion, die eine Anfrage an einen Server stellt soll sich in einen solchen Stack eintragen, da die Antworten in richtiger Reihenfolge kommen, weiß der EventHandler für wen eine Antwort bestimmt ist.)Nun gut, die Funktion, sagen wir MessageFetched wird also aufgerufen und bekommt die Mail übertragen, die FetchMsg bestellt hat.
Das Problem ist hier, dass die Funktion, die FetchMsg aufgerufen hat, und die Nachricht ja eigentlich erhalten hat diese nicht direkt bekommen kann, die Funktion MessageFetched hat sie, weiß allerdings nicht wohin damit.Ich könnte hier wieder mit Signalen und Slots arbeiten, aber macht das überhaupt Sinn? Das ganze wird imo dadurch unglaublich komplex...
Oder ist das ganze Layout scheisse und das Problem eventuell viel einfacher zu lösen?Vielen vielen Dank
(echt cooles Board hier)felix
-
Spontan fallen mir 2 Arten ein, wie du das loesen koenntest:
a) Callbacks: zu jedem Request muss auch ein Callback mitgegeben werden, dass dann aufgerufen wird, sobal die Mail empfangen wurde.
b) in fetchMessage gibst du ein Handle zurueck, mit einer isReady()-Funktion. Der Aufrufer kann dann (immer mal wieder) das Handle abfragen, ob die Daten schon bereit sind. Und sobald sie bereit sind, kann die echte Mail mit Hilfe des Handles abgefragt werden.
(dafür habe ich mir einen LIFO Mechanismus ausgedacht, jede Funktion, die eine Anfrage an einen Server stellt soll sich in einen solchen Stack eintragen, da die Antworten in richtiger Reihenfolge kommen, weiß der EventHandler für wen eine Antwort bestimmt ist.)
Bist du sicher dass die Antworten immer in der richtigen Reihenfolge kommen? (Ich kenn POP3 nicht, aber im Allgemeinen kannst du bei Netzwerkprogrammierung nicht davon ausgehen, dass deine Anfragen vom Server in der Reihenfolge bearbeitet werden, in der du sie abschickst!)
-
Bist du sicher dass die Antworten immer in der richtigen Reihenfolge kommen? (Ich kenn POP3 nicht, aber im Allgemeinen kannst du bei Netzwerkprogrammierung nicht davon ausgehen, dass deine Anfragen vom Server in der Reihenfolge bearbeitet werden, in der du sie abschickst!)
Ich denke mal dass muss so sein, da beispielsweise auf den DELE command einfach nur "+OK message deleted" "-ERR no such message" zurückgegeben wird, wenn das nicht zwangsweise in Reihenfolge erfolgt, wäre ja eine zuordnung unmöglich...
Wie funktioniert a) ? ist das das selbe wie wikipedia:Rückruffunktion? Wie kann ich das anwenden? Was meinst du mit Request?
Liege ich damit richtig, dass ich bei b) jede Anfrage mit Status irgendwie array-artig indizieren würde und dann dem isReady() die ID übergeben würde, die die fetchMsg() zurückgegeben hat?
-
Ich habe mich jetzt nochmal mit a) beschäftigt!
Meinst du, ich soll, wenn ich fetchMsg aufrufe als Parameter beispielsweise noch irgendwie einen Zeiger auf eine Funktion übergeben, wenn dann das Ergebnis da ist, diese Funktion aufrufen (als Parameter da dann die Mail anhängen)
Danke!
-
felix123 schrieb:
Ich habe mich jetzt nochmal mit a) beschäftigt!
Meinst du, ich soll, wenn ich fetchMsg aufrufe als Parameter beispielsweise noch irgendwie einen Zeiger auf eine Funktion übergeben, wenn dann das Ergebnis da ist, diese Funktion aufrufen (als Parameter da dann die Mail anhängen)
genau
Liege ich damit richtig, dass ich bei b) jede Anfrage mit Status irgendwie array-artig indizieren würde und dann dem isReady() die ID übergeben würde, die die fetchMsg() zurückgegeben hat?
Das waer eine moegliche Implementierung, ja
-
denkst du es ist für a) besser signals und slots zu verwenden oder soll ich wirklich funktionszeiger verwenden?
danke
-
felix123 schrieb:
denkst du es ist für a) besser signals und slots zu verwenden oder soll ich wirklich funktionszeiger verwenden?
danke
"Rohe" Funktionszeiger sind in der Regel immer etwas haesslich (IMO). Ich hab allerdings kaum Erfahrung mit Qt bzw. Signals&Slots, also k.A. was sich da eher anbietet. Nimm das, was dir einfacher erscheint
-
Unter QT ist signal & slot Standard.