\begin{vdm_al} public IsMessageNumber: POP3Types`UserName * nat ==> bool
IsMessageNumber(user, index) == let mb = GetUserMessages(user) in return index insetinds mb;
public IsValidMessageNumber: POP3Types`UserName * nat ==> bool
IsValidMessageNumber(user, index) == let mb = GetUserMessages(user) in return index insetinds mb and not mb(index).IsDeleted();
public MessageIsDeleted: POP3Types`UserName * nat ==> bool
MessageIsDeleted(user, index) == let mb = GetUserMessages(user) in return index insetinds mb and
mb(index).IsDeleted();
public DeleteMessage: POP3Types`UserName * nat ==> ()
DeleteMessage(user, index) == let oldMsg = GetUserMessages(user)(index),
newMsg = oldMsg.Delete() in
SetUserMessages(user, GetUserMessages(user) ++ { index |-> newMsg }) pre user insetdom maildrop and let mb = maildrop(user).msgs in index insetinds mb and not mb(index).IsDeleted();
public GetMsgHeader: POP3Types`UserName * nat ==> seqofchar
GetMsgHeader(user, index) == let mb = GetUserMessages(user) in return mb(index).GetHeader() pre user insetdom maildrop and let mb = maildrop(user).msgs in index insetinds mb and not mb(index).IsDeleted();
public GetMsgBody: POP3Types`UserName * nat ==> seqofchar
GetMsgBody(user, index) == let mb = GetUserMessages(user) in return mb(index).GetBody() pre user insetdom maildrop and let mb = maildrop(user).msgs in index insetinds mb and not mb(index).IsDeleted();
public ResetDeletedMessages: POP3Types`UserName ==> ()
ResetDeletedMessages(user) == let oldMsgs = GetUserMessages(user),
newMsgs = [ oldMsgs(i).Undelete()
| i insetinds oldMsgs ] in
SetUserMessages(user, newMsgs) pre user insetdom maildrop;
public GetMessageText: POP3Types`UserName * nat ==> seqofchar
GetMessageText(user, index) == return GetUserMessages(user)(index).GetText() pre user insetdom maildrop and let mb = GetUserMessages(user) in
index insetinds mb and not mb(index).IsDeleted();
public GetMessageSize: POP3Types`UserName * nat ==> nat
GetMessageSize(user, index) == return GetUserMessages(user)(index).GetSize() pre user insetdom maildrop and let mb = maildrop(user).msgs in
index insetinds mb and not mb(index).IsDeleted();
public GetMessageInfo: POP3Types`UserName * [nat] ==> setof MessageInfo
GetMessageInfo(user, index) == let mb = GetUserMessages(user) in if index = nil then returnelems [mk_MessageInfo(i,
GetMessageSize(user, i)) |
i insetinds mb & not mb(i).IsDeleted()] else return { mk_MessageInfo(index,
GetMessageSize(user, index)) } pre index <> nil => (index insetinds maildrop(user).msgs and not maildrop(user).msgs(index).IsDeleted());
\end{vdm_al}
\begin{vdm_al}
public GetUidl: POP3Types`UserName * nat ==> seqofchar
GetUidl (user, index) == let mb = GetUserMessages(user) in return POP3ClientHandler`int2string(index) ^" " ^
mb(index).GetUniqueId();
public GetAllUidls: POP3Types`UserName ==> seqofseqofchar
GetAllUidls(user) == let mb = GetUserMessages(user) in return [GetUidl(user, index) | index insetinds mb];
\end{vdm_al}
\begin{vdm_al} public GetNumberOfMessages: POP3Types`UserName ==> nat
GetNumberOfMessages(user) == returnlen GetUserMessages(user) pre user insetdom maildrop;
\end{vdm_al}
\begin{vdm_al} public GetMailBoxSize: POP3Types`UserName ==> nat
GetMailBoxSize(user) == let mb = GetUserMail(user) in return sumseq ( [mb.msgs(i).GetSize()| i insetinds mb.msgs] ) pre user insetdom maildrop;
public GetChannel: () ==> MessageChannelBuffer
GetChannel() == return connChannel;
\end{vdm_al}
\begin{vdm_al} functions
public sumseq: seqofnat -> nat
sumseq(s) == if s = [] then 0 elsehd s + sumseq(tl s) measureLen;
Len: seqofnat -> nat Len(l) == len l;
\end{vdm_al}
\begin{vdm_al} thread
whiletruedo
( let msgChannel = connChannel.Get() in
CreateClientHandler(msgChannel);
serverStarted := true;
)
\end{vdm_al}
\begin{vdm_al} operations
public WaitForServerStart: () ==> ()
WaitForServerStart() == skip;
sync
per WaitForServerStart => serverStarted;
\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 und die Messung sind noch experimentell.