ClientMapImpl.mesa
Copyright © 1985 by Xerox Corporation. All rights reserved.
Last edited by
MBrown on February 2, 1984 11:15:20 am PST
Hauser, March 7, 1985 2:28:21 pm PST
DIRECTORY
AlpineEnvironment USING [Conversation, Principal],
Rope USING [IsEmpty],
RPC USING [ConversationID, GetCaller, GetConversationID],
ClientMap USING [];
ClientMapImpl: MONITOR
IMPORTS
Rope,
RPC
EXPORTS
ClientMap =
BEGIN
Conversation: TYPE = AlpineEnvironment.Conversation;
Principal: TYPE = AlpineEnvironment.Principal;
ConversationPrincipal: TYPE = RECORD [
conv: RPC.ConversationID,
prin: Principal ← NIL];
registeredPrincipalList: LIST OF ConversationPrincipal ← NIL;
Register: PUBLIC ENTRY PROC [conversation: Conversation, principal: Principal] = {
IF RPC.GetCaller[conversation].IsEmpty THEN {
l: LIST OF ConversationPrincipal ← GetRegisteredName[conversation];
IF l = NIL THEN {
l ← CONS[
first: [conv: RPC.GetConversationID[conversation]], rest: registeredPrincipalList];
registeredPrincipalList ← l;
};
l.first.prin ← principal;
};
};
Unregister: PUBLIC ENTRY PROC [conversation: Conversation] = {
l: LIST OF ConversationPrincipal ← GetRegisteredName[conversation];
IF l = NIL THEN RETURN;
RemoveRegisteredName[l];
};
GetName: PUBLIC ENTRY PROC [conversation: Conversation]
RETURNS [principal: Principal] = {
l: LIST OF ConversationPrincipal;
IF NOT (principal ← RPC.GetCaller[conversation]).IsEmpty THEN RETURN [principal];
RETURN[IF (l ← GetRegisteredName[conversation]) # NIL THEN l.first.prin ELSE NIL];
};
GetRegisteredName: INTERNAL PROC [conversation: Conversation]
RETURNS [LIST OF ConversationPrincipal] = {
conversationID: RPC.ConversationID = RPC.GetConversationID[conversation];
FOR l: LIST OF ConversationPrincipal ← registeredPrincipalList, l.rest
UNTIL l = NIL DO
IF l.first.conv = conversationID THEN RETURN [l];
ENDLOOP;
RETURN [NIL] };
RemoveRegisteredName: INTERNAL PROC [r: LIST OF ConversationPrincipal] = {
IF r = registeredPrincipalList THEN {
registeredPrincipalList ← registeredPrincipalList.rest;
RETURN };
FOR l: LIST OF ConversationPrincipal ← registeredPrincipalList, l.rest DO
IF l.rest = r THEN { l.rest ← r.rest; RETURN };
ENDLOOP;
};
END.
Hauser, March 7, 1985 2:27:59 pm PST
Nodified, added copyright.