summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--popunit.pas155
1 files changed, 64 insertions, 91 deletions
diff --git a/popunit.pas b/popunit.pas
index 00b9844..1664f8a 100644
--- a/popunit.pas
+++ b/popunit.pas
@@ -10,6 +10,7 @@ uses
type
tMarkenValiditaet = (mvKeine,mvGueltig,mvUngueltig);
+ tBefehlAusfuehrenErgebnis = (baeOk,baeError,baeTimeout);
tPopClient = class;
@@ -72,6 +73,12 @@ type
procedure loeschen;
end;
+function readString(p: tProcess): string;
+procedure writeString(p: tProcess; s: string);
+function befehlAusfuehren(var pr: tProcess; bef: string; timeout: extended): tBefehlAusfuehrenErgebnis; overload; inline;
+function befehlAusfuehren(var pr: tProcess; bef: string; timeout: extended; out ausg: string): tBefehlAusfuehrenErgebnis; overload; inline;
+function befehlAusfuehren(var pr: tProcess; bef,ende: string; timeout: extended; out ausg: string): tBefehlAusfuehrenErgebnis; overload;
+
implementation
uses lowlevelunit;
@@ -101,6 +108,46 @@ begin
i:=i+p.input.write(s[i],length(s)-i+1);
end;
+function befehlAusfuehren(var pr: tProcess; bef: string; timeout: extended): tBefehlAusfuehrenErgebnis;
+var
+ dummy: string;
+begin
+ result:=befehlAusfuehren(pr,bef,timeout,dummy);
+end;
+
+function befehlAusfuehren(var pr: tProcess; bef: string; timeout: extended; out ausg: string): tBefehlAusfuehrenErgebnis;
+begin
+ result:=befehlAusfuehren(pr,bef,'+OK',timeout,ausg);
+end;
+
+function befehlAusfuehren(var pr: tProcess; bef,ende: string; timeout: extended; out ausg: string): tBefehlAusfuehrenErgebnis;
+var
+ zeit: extended;
+begin
+ writeString(pr,bef+#10);
+
+ zeit:=now+timeout/24/60/60;
+ ausg:='';
+ while (zeit>now) and (pos(ende,ausg)=0) and (pos('-ERR',ausg)=0) do
+ ausg:=ausg+readString(pr);
+
+ if pos(ende,ausg)>0 then begin
+ result:=baeOk;
+ exit;
+ end;
+
+ if pos('-ERR',ausg)>0 then begin
+ writeln(stderr,bef+' fehlgeschlagen (Antwort: '''+ausg+''')!');
+ result:=baeError;
+ exit;
+ end;
+
+ writeln(stderr,bef+' fehlgeschlagen (timeout erreicht)!');
+ pr.free;
+ pr:=nil;
+ result:=baeTimeout;
+end;
+
// tNachricht ******************************************************************
constructor tNachricht.create;
@@ -250,26 +297,18 @@ end;
procedure tPopThread.auszenWeltKontakt(var pr: tProcess);
var
i,j,k: longint;
- zeit: extended;
- buf: string;
begin
synchronize(@datenReinNehmen);
if assigned(pr) then begin
for i:=0 to length(_lIds)-1 do begin
- writeString(pr,'DELE '+intToStr(_lIds[i])+#10);
-
- zeit:=now+_besitzer.timeout/24/60/60;
- buf:='';
- while (zeit>now) and (pos('+OK',buf)=0) do
- buf:=buf+readString(pr);
-
- if pos('+OK',buf)=0 then begin
- pr.free;
- pr:=nil;
- writeln(stderr,'DELE '+intToStr(_lIds[i])+' fehlgeschlagen!');
- exit;
- end;
+ case befehlAusfuehren(pr,'DELE '+intToStr(_lIds[i]),_besitzer.timeout) of
+ baeTimeout: exit;
+ baeError: begin
+ if beenden then exit;
+ continue;
+ end;
+ end{of case};
if beenden then
exit;
@@ -309,18 +348,8 @@ begin
auszenWeltKontakt(pr);
if (_user<>'') and (_host<>'') and (_pass<>'') and (_port<>0) then begin
if assigned(pr) then begin
- writeString(pr,'QUIT'#10);
-
- zeit:=now+_besitzer.timeout/24/60/60;
- buf:='';
- while (zeit>now) and (pos('+OK',buf)=0) do
- buf:=buf+readString(pr);
-
- if pos('+OK',buf)=0 then begin
- pr.free;
- pr:=nil;
- writeln(stderr,'QUIT fehlgeschlagen!');
- end;
+ if befehlAusfuehren(pr,'QUIT',_besitzer.timeout)=baeOk then
+ pr.WaitOnExit;
pr.free;
pr:=nil;
@@ -363,50 +392,20 @@ begin
if beenden then
break;
- writeString(pr,'USER '+_user+#10);
- zeit:=now+_besitzer.timeout/24/60/60;
- buf:='';
- while (zeit>now) and (pos('+OK',buf)=0) do
- buf:=buf+readString(pr);
-
- if pos('+OK',buf)=0 then begin
- pr.free;
- pr:=nil;
- writeln(stderr,'USER fehlgeschlagen!');
+ if befehlAusfuehren(pr,'USER '+_user,_besitzer.timeout)<>baeOk then
continue;
- end;
if beenden then
break;
- writeString(pr,'PASS '+_pass+#10);
- zeit:=now+_besitzer.timeout/24/60/60;
- buf:='';
- while (zeit>now) and (pos('+OK',buf)=0) do
- buf:=buf+readString(pr);
-
- if pos('+OK',buf)=0 then begin
- pr.free;
- pr:=nil;
- writeln(stderr,'PASS fehlgeschlagen!');
+ if befehlAusfuehren(pr,'PASS '+_pass,_besitzer.timeout)<>baeOk then
continue;
- end;
if beenden then
break;
- writeString(pr,'LIST'#10);
- zeit:=now+_besitzer.timeout/24/60/60;
- buf:='';
- while (zeit>now) and (pos(#13#10'.'#13#10,buf)=0) do
- buf:=buf+readString(pr);
-
- if pos(#13#10'.'#13#10,buf)=0 then begin
- pr.free;
- pr:=nil;
- writeln(stderr,'LIST fehlgeschlagen!');
+ if befehlAusfuehren(pr,'LIST',#13#10'.'#13#10,_besitzer.timeout,buf)<>baeOk then
continue;
- end;
if beenden then
break;
@@ -447,19 +446,8 @@ begin
for i:=0 to length(_nachrichten)-1 do
if _nachrichten[i].count=0 then begin
- writeString(pr,'TOP '+intToStr(_nachrichten[i].id)+' 0'#10);
-
- zeit:=now+_besitzer.timeout/24/60/60;
- buf:='';
- while (zeit>now) and (pos(#13#10'.'#13#10,buf)=0) do
- buf:=buf+readString(pr);
-
- if pos(#13#10'.'#13#10,buf)=0 then begin
- pr.free;
- pr:=nil;
- writeln(stderr,'TOP '+intToStr(_nachrichten[i].id)+' fehlgeschlagen!');
+ if befehlAusfuehren(pr,'TOP '+intToStr(_nachrichten[i].id)+' 0',#13#10'.'#13#10,_besitzer.timeout,buf)<>baeOk then
break;
- end;
if beenden then
break;
@@ -487,18 +475,9 @@ begin
zeit:=now;
for i:=0 to 5 do begin
- writeString(pr,'NOOP'#10);
- zeit:=zeit+1/24/60/6;
- buf:='';
- while (zeit>now) and (pos('+OK',buf)=0) do
- buf:=buf+readString(pr);
-
- if pos('+OK',buf)=0 then begin
- pr.free;
- pr:=nil;
- writeln(stderr,'NOOP fehlgeschlagen!');
+ zeit:=now+1/24/60/6;
+ if befehlAusfuehren(pr,'NOOP',10)<>baeOk then
break;
- end;
while (not beenden) and (zeit>now) and (not esGibtArbeit) do
sleep(100);
@@ -510,14 +489,8 @@ begin
sleep(10);
end;
if assigned(pr) then begin
- writeString(pr,'QUIT'#10);
-
- zeit:=now+_besitzer.timeout/24/60/60;
- buf:='';
- while (zeit>now) and (pos('+OK',buf)=0) do
- buf:=buf+readString(pr);
- if pos('+OK',buf)=0 then
- writeln(stderr,'QUIT fehlgeschlagen!');
+ if befehlAusfuehren(pr,'QUIT',_besitzer.timeout)=baeOk then
+ pr.waitOnExit;
pr.free;
pr:=nil;