\begin{vdm_al}
ReceiveQUIT: POP3Types`QUIT ==> POP3Types`ServerResponse
ReceiveQUIT(-) ==
( dcl response: POP3Types`ServerResponse; cases ss:
<Authorization> -> response := mk_POP3Types`OkResponse(quitMsg),
<Transaction> -> let b = parent.RemoveDeletedMessages(user) in -- spec is unclear about update state - see pg 10 -- i.e. quit is actually received in the transaction state and -- then the server moves into the update state, but no commands -- can be received in the update state
( ss := <Update>;
parent.ReleaseLock(id);
response := if b then mk_POP3Types`OkResponse(quitMsg) else mk_POP3Types`ErrResponse(deleteFailMsg)
), others -> error end; return response
);
\begin{vdm_al}
ReceiveNOOP: POP3Types`NOOP ==> POP3Types`ServerResponse
ReceiveNOOP(-) == if ss = <Transaction> thenreturn mk_POP3Types`OkResponse("") elsereturn mk_POP3Types`ErrResponse(negativeStatusMsg);
\end{vdm_al}
\begin{vdm_al}
ReceiveRSET: POP3Types`RSET ==> POP3Types`ServerResponse
ReceiveRSET(-) == if ss = <Transaction> then ( parent.ResetDeletedMessages(user); return mk_POP3Types`OkResponse( "maildrop has " ^
int2string(parent.GetNumberOfMessages(user))^ " messages")
) elsereturn mk_POP3Types`ErrResponse(negativeStatusMsg);
\end{vdm_al}
\begin{vdm_al}
ReceiveTOP: POP3Types`TOP ==> POP3Types`ServerResponse
ReceiveTOP(top) == if ss = <Transaction> thenif parent.IsValidMessageNumber(user, top.messageNumber) thenlet header = parent.GetMsgHeader(user, top.messageNumber),
body = parent.GetMsgBody(user, top.messageNumber),
lines = MakeLineSeq(body) in return mk_POP3Types`OkResponse(
header ^"\n"^
MakeMultilineResponse(lines(1,...,
top.numLines))) elsereturn mk_POP3Types`ErrResponse(unknownMessageMsg) elsereturn mk_POP3Types`ErrResponse(negativeStatusMsg);
\end{vdm_al}
\begin{vdm_al}
ReceiveUIDL: POP3Types`UIDL ==> POP3Types`ServerResponse
ReceiveUIDL(uidl) == if ss = <Transaction> thenif uidl.messageNumber = nil thenlet uidlTxt = parent.GetAllUidls(user) in return mk_POP3Types`OkResponse(MakeMultilineResponse(uidlTxt)) elseif parent.IsMessageNumber(user, uidl.messageNumber) -- Note that the spec is unclear here as to whether we should -- allow viewing of a specific message's uidl if the message -- is marked as deleted thenreturn mk_POP3Types`OkResponse(parent.GetUidl(user,
uidl.messageNumber)) elsereturn mk_POP3Types`ErrResponse(unknownMessageMsg) elsereturn mk_POP3Types`ErrResponse(negativeStatusMsg);
\end{vdm_al}
\begin{vdm_al}
ReceiveUSER: POP3Types`USER ==> POP3Types`ServerResponse
ReceiveUSER(usercmd) == if ss = <Authorization> then ( user := usercmd.name; return mk_POP3Types`OkResponse(submitPasswordMsg)
) elsereturn mk_POP3Types`ErrResponse(negativeStatusMsg);
\end{vdm_al}
\begin{vdm_al}
ReceivePASS: POP3Types`PASS ==> POP3Types`ServerResponse
ReceivePASS(pass) == if ss = <Authorization> and lastWasUser then ( lastWasUser := false; if parent.AuthenticateUser(user, pass.string) thenif parent.IsLocked(user) thenreturn mk_POP3Types`ErrResponse(maildropLockedMsg) else ( parent.AcquireLock(id, user);
ss := <Transaction>; return mk_POP3Types`OkResponse(maildropReadyMsg)
) elsereturn mk_POP3Types`ErrResponse(passwordFailedMsg)
) elsereturn mk_POP3Types`ErrResponse(negativeStatusMsg);
\end{vdm_al}
\begin{vdm_al} functions
staticpublic int2string: int -> seqofchar
int2string(i) == if i = 0 then"0" elseif i < 0 then"-"^int2string(-i) else int2stringR(i) measureAbs;
staticAbs: int -> nat Abs(i) == abs i;
static int2stringR: nat -> seqofchar
int2stringR(n) == if n = 0 then"" elselet first= n div 10,
last = n mod 10 in
int2stringR(first) ^ cases last:
0 -> "0",
1 -> "1",
2 -> "2",
3 -> "3",
4 -> "4",
5 -> "5",
6 -> "6",
7 -> "7",
8 -> "8",
9 -> "9" end measure Id;
static Id: nat -> nat
Id(n) == n;
\end{vdm_al}
\begin{vdm_al} thread
( dcl cmd: POP3Types`ClientCommand;
id := threadid;
cmd := msgChannel.ServerListen(); while (cmd <> mk_POP3Types`QUIT()) do
( msgChannel.ServerSend(ReceiveCommand(cmd));
cmd := msgChannel.ServerListen()
);
msgChannel.ServerSend(ReceiveCommand(cmd));
)
\end{vdm_al}
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung ist noch experimentell.