<<>> <> <> <> <> <> <> DIRECTORY Basics USING [Card16FromH], SunPMap USING [ipProtocolUDP], SunPMapLocal USING [SetLocal, UnsetLocal], SunRPC, ThPartySunRPC, ThPartySunRPCServer, ThrushSunRPC; ThPartySunRPCServerStub: CEDAR PROGRAM IMPORTS Basics, SunPMapLocal, SunRPC, ThPartySunRPCServer ~ { OPEN ThPartySunRPC, ThPartySunRPCServer; <> Handle: TYPE ~ SunRPC.Handle; LookupServiceInterfaceCaller: PROC [h: Handle, beginReturn: SunRPCBeginReturnProc] ~ { shhh: CARD32; credentials: ThrushSunRPC.Credentials; serviceParty: CARD32; type: ROPE; nb: ROPE; interfaceSpec: ThrushSunRPC.InterfaceSpec; { shhh _ SunRPC.GetCard32[h]; }; { credentials.partyID _ SunRPC.GetCard32[h]; credentials.smartsID _ SunRPC.GetCard32[h]; credentials.convID _ SunRPC.GetCard32[h]; credentials.state _ VAL[CARDINAL[SunRPC.GetCard32[h]]]; credentials.stateID _ SunRPC.GetCard32[h]; }; { serviceParty _ SunRPC.GetCard32[h]; }; { type _ SunRPC.GetRope[h]; }; [nb, interfaceSpec] _ LookupServiceInterface[h, shhh, credentials, serviceParty, type]; beginReturn[h]; { SunRPC.PutRope[h, nb]; }; { SunRPC.PutRope[h, interfaceSpec.interfaceName.type]; SunRPC.PutRope[h, interfaceSpec.interfaceName.instance]; SunRPC.PutCard32[h, interfaceSpec.interfaceName.version.first]; SunRPC.PutCard32[h, interfaceSpec.interfaceName.version.last]; SunRPC.PutCard32[h, interfaceSpec.hostHint.net.net]; SunRPC.PutCard32[h, interfaceSpec.hostHint.host.host]; SunRPC.PutCard32[h, interfaceSpec.hostHint.socket.a]; SunRPC.PutCard32[h, interfaceSpec.hostHint.socket.b]; SunRPC.PutCard32[h, interfaceSpec.hostHint.socket.c]; SunRPC.PutCard32[h, interfaceSpec.hostHint.socket.d]; SunRPC.PutCard32[h, interfaceSpec.serviceID]; SunRPC.PutCard32[h, interfaceSpec.interfaceID]; }; }; RegisterCaller: PROC [h: Handle, beginReturn: SunRPCBeginReturnProc] ~ { shh: CARD32; rName: ROPE; type: ROPE; clonePartyID: CARD32; interface: ThrushSunRPC.InterfaceName; properties: SmartsProperties; nb: ROPE; credentials: ThrushSunRPC.Credentials; { shh _ SunRPC.GetCard32[h]; }; { rName _ SunRPC.GetRope[h]; }; { type _ SunRPC.GetRope[h]; }; { clonePartyID _ SunRPC.GetCard32[h]; }; { interface.type _ SunRPC.GetRope[h]; interface.instance _ SunRPC.GetRope[h]; interface.version.first _ SunRPC.GetCard32[h]; interface.version.last _ SunRPC.GetCard32[h]; }; { properties.role _ SunRPC.GetRope[h]; properties.netAddress.net.net _ SunRPC.GetCard32[h]; properties.netAddress.host.host _ SunRPC.GetCard32[h]; properties.netAddress.socket.a _ SunRPC.GetCard32[h]; properties.netAddress.socket.b _ SunRPC.GetCard32[h]; properties.netAddress.socket.c _ SunRPC.GetCard32[h]; properties.netAddress.socket.d _ SunRPC.GetCard32[h]; }; [nb, credentials] _ Register[h, shh, rName, type, clonePartyID, interface, properties]; beginReturn[h]; { SunRPC.PutRope[h, nb]; }; { SunRPC.PutCard32[h, credentials.partyID]; SunRPC.PutCard32[h, credentials.smartsID]; SunRPC.PutCard32[h, credentials.convID]; SunRPC.PutCard32[h, ORD[credentials.state]]; SunRPC.PutCard32[h, credentials.stateID]; }; }; DisableCaller: PROC [h: Handle, beginReturn: SunRPCBeginReturnProc] ~ { shh: CARD32; smartsID: CARD32; nb: ROPE; { shh _ SunRPC.GetCard32[h]; }; { smartsID _ SunRPC.GetCard32[h]; }; [nb] _ Disable[h, shh, smartsID]; beginReturn[h]; { SunRPC.PutRope[h, nb]; }; }; DescribePartyCaller: PROC [h: Handle, beginReturn: SunRPCBeginReturnProc] ~ { partyID: CARD32; nameReq: ROPE; nb: ROPE; description: ROPE; type: ROPE; partner: CARD32; visitee: CARD32; visitors: VisitorList; { partyID _ SunRPC.GetCard32[h]; }; { nameReq _ SunRPC.GetRope[h]; }; [nb, description, type, partner, visitee, visitors] _ DescribeParty[h, partyID, nameReq]; beginReturn[h]; { SunRPC.PutRope[h, nb]; }; { SunRPC.PutRope[h, description]; }; { SunRPC.PutRope[h, type]; }; { SunRPC.PutCard32[h, partner]; }; { SunRPC.PutCard32[h, visitee]; }; { MProc25[h, visitors]; }; }; VisitCaller: PROC [h: Handle, beginReturn: SunRPCBeginReturnProc] ~ { shh: CARD32; hostPartyID: CARD32; guestPartyID: CARD32; guestPassword: ThrushSunRPC.Password; nb: ROPE; { shh _ SunRPC.GetCard32[h]; }; { hostPartyID _ SunRPC.GetCard32[h]; }; { guestPartyID _ SunRPC.GetCard32[h]; }; { FOR i26: CARDINAL IN [0..2) DO guestPassword[i26] _ SunRPC.GetCard32[h]; ENDLOOP; }; [nb] _ Visit[h, shh, hostPartyID, guestPartyID, guestPassword]; beginReturn[h]; { SunRPC.PutRope[h, nb]; }; }; GetNumbersForRNameCaller: PROC [h: Handle, beginReturn: SunRPCBeginReturnProc] ~ { shh: CARD32; rName: ROPE; fullRName: ROPE; number: ROPE; homeNumber: ROPE; { shh _ SunRPC.GetCard32[h]; }; { rName _ SunRPC.GetRope[h]; }; [fullRName, number, homeNumber] _ GetNumbersForRName[h, shh, rName]; beginReturn[h]; { SunRPC.PutRope[h, fullRName]; }; { SunRPC.PutRope[h, number]; }; { SunRPC.PutRope[h, homeNumber]; }; }; UnregisterKeyCaller: PROC [h: Handle, beginReturn: SunRPCBeginReturnProc] ~ { shh: CARD32; credentials: ThrushSunRPC.Credentials; key: ThrushSunRPC.Key; nb: ROPE; { shh _ SunRPC.GetCard32[h]; }; { credentials.partyID _ SunRPC.GetCard32[h]; credentials.smartsID _ SunRPC.GetCard32[h]; credentials.convID _ SunRPC.GetCard32[h]; credentials.state _ VAL[CARDINAL[SunRPC.GetCard32[h]]]; credentials.stateID _ SunRPC.GetCard32[h]; }; { FOR i27: CARDINAL IN [0..2) DO key[i27] _ SunRPC.GetCard32[h]; ENDLOOP; }; [nb] _ UnregisterKey[h, shh, credentials, key]; beginReturn[h]; { SunRPC.PutRope[h, nb]; }; }; CheckInCaller: PROC [h: Handle, beginReturn: SunRPCBeginReturnProc] ~ { shh: CARD32; credentials: ThrushSunRPC.Credentials; nb: ROPE; { shh _ SunRPC.GetCard32[h]; }; { credentials.partyID _ SunRPC.GetCard32[h]; credentials.smartsID _ SunRPC.GetCard32[h]; credentials.convID _ SunRPC.GetCard32[h]; credentials.state _ VAL[CARDINAL[SunRPC.GetCard32[h]]]; credentials.stateID _ SunRPC.GetCard32[h]; }; [nb] _ CheckIn[h, shh, credentials]; beginReturn[h]; { SunRPC.PutRope[h, nb]; }; }; CreateConversationCaller: PROC [h: Handle, beginReturn: SunRPCBeginReturnProc] ~ { shhh: CARD32; credentials: ThrushSunRPC.Credentials; state: ThrushSunRPC.StateInConv; reason: ROPE; comment: ROPE; convAttributes: Entry; partyAttributes: Entry; checkConflict: BOOLEAN; nb: ROPE; convEvent: ThrushSunRPC.ConvEvent; { shhh _ SunRPC.GetCard32[h]; }; { credentials.partyID _ SunRPC.GetCard32[h]; credentials.smartsID _ SunRPC.GetCard32[h]; credentials.convID _ SunRPC.GetCard32[h]; credentials.state _ VAL[CARDINAL[SunRPC.GetCard32[h]]]; credentials.stateID _ SunRPC.GetCard32[h]; }; { state _ VAL[CARDINAL[SunRPC.GetCard32[h]]]; }; { reason _ SunRPC.GetRope[h]; }; { comment _ SunRPC.GetRope[h]; }; { convAttributes _ UProc28[h]; }; { partyAttributes _ UProc28[h]; }; { checkConflict _ SunRPCGetBool[h]; }; [nb, convEvent] _ CreateConversation[h, shhh, credentials, state, reason, comment, convAttributes, partyAttributes, checkConflict]; beginReturn[h]; { SunRPC.PutRope[h, nb]; }; { SunRPC.PutCard32[h, convEvent.self.partyID]; SunRPC.PutCard32[h, convEvent.self.smartsID]; SunRPC.PutCard32[h, convEvent.self.convID]; SunRPC.PutCard32[h, ORD[convEvent.self.state]]; SunRPC.PutCard32[h, convEvent.self.stateID]; SunRPC.PutCard32[h, convEvent.other.partyID]; SunRPC.PutCard32[h, convEvent.other.smartsID]; SunRPC.PutCard32[h, convEvent.other.convID]; SunRPC.PutCard32[h, ORD[convEvent.other.state]]; SunRPC.PutCard32[h, convEvent.other.stateID]; SunRPC.PutCard32[h, convEvent.time]; SunRPC.PutRope[h, convEvent.reason]; SunRPC.PutRope[h, convEvent.comment]; }; }; UnvisitSelfCaller: PROC [h: Handle, beginReturn: SunRPCBeginReturnProc] ~ { shh: CARD32; guestPartyID: CARD32; nb: ROPE; { shh _ SunRPC.GetCard32[h]; }; { guestPartyID _ SunRPC.GetCard32[h]; }; [nb] _ UnvisitSelf[h, shh, guestPartyID]; beginReturn[h]; { SunRPC.PutRope[h, nb]; }; }; GetConversationInfoCaller: PROC [h: Handle, beginReturn: SunRPCBeginReturnProc] ~ { shh: CARD32; convID: CARD32; nb: ROPE; cInfo: ConversationInfo; { shh _ SunRPC.GetCard32[h]; }; { convID _ SunRPC.GetCard32[h]; }; [nb, cInfo] _ GetConversationInfo[h, shh, convID]; beginReturn[h]; { SunRPC.PutRope[h, nb]; }; { SunRPC.PutCard32[h, cInfo.convID]; SunRPC.PutCard32[h, cInfo.numParties]; SunRPC.PutCard32[h, cInfo.numActive]; SunRPC.PutCard32[h, cInfo.numIdle]; SunRPC.PutCard32[h, cInfo.originator]; SunRPC.PutCard32[h, cInfo.conferenceHost.net.net]; SunRPC.PutCard32[h, cInfo.conferenceHost.host.host]; SunRPC.PutCard32[h, cInfo.conferenceHost.socket.a]; SunRPC.PutCard32[h, cInfo.conferenceHost.socket.b]; SunRPC.PutCard32[h, cInfo.conferenceHost.socket.c]; SunRPC.PutCard32[h, cInfo.conferenceHost.socket.d]; SunRPC.PutCard32[h, ORD[cInfo.convType]]; SunRPCPutBool[h, cInfo.bilateralConv]; SunRPC.PutCard32[h, cInfo.startTime]; MProc29[h, cInfo.convAttributes]; SunRPC.PutCard32[h, cInfo.moderator]; SunRPC.PutCard32[h, cInfo.commentator]; }; }; GetKeyTableCaller: PROC [h: Handle, beginReturn: SunRPCBeginReturnProc] ~ { shh: CARD32; credentials: ThrushSunRPC.Credentials; nb: ROPE; keyTable: ThrushSunRPC.KeyTable; { shh _ SunRPC.GetCard32[h]; }; { credentials.partyID _ SunRPC.GetCard32[h]; credentials.smartsID _ SunRPC.GetCard32[h]; credentials.convID _ SunRPC.GetCard32[h]; credentials.state _ VAL[CARDINAL[SunRPC.GetCard32[h]]]; credentials.stateID _ SunRPC.GetCard32[h]; }; [nb, keyTable] _ GetKeyTable[h, shh, credentials]; beginReturn[h]; { SunRPC.PutRope[h, nb]; }; { MProc30[h, keyTable.s]; }; }; GetPartyFromFeepNumCaller: PROC [h: Handle, beginReturn: SunRPCBeginReturnProc] ~ { shh: CARD32; partyID: CARD32; feepNum: ROPE; nb: ROPE; newPartyID: CARD32; { shh _ SunRPC.GetCard32[h]; }; { partyID _ SunRPC.GetCard32[h]; }; { feepNum _ SunRPC.GetRope[h]; }; [nb, newPartyID] _ GetPartyFromFeepNum[h, shh, partyID, feepNum]; beginReturn[h]; { SunRPC.PutRope[h, nb]; }; { SunRPC.PutCard32[h, newPartyID]; }; }; ReportActionCaller: PROC [h: Handle, beginReturn: SunRPCBeginReturnProc] ~ { shhh: CARD32; report: ThrushSunRPC.ActionReport; reportToAll: BOOLEAN; selfOnCompletion: BOOLEAN; nb: ROPE; numReportsIssued: CARD16; { shhh _ SunRPC.GetCard32[h]; }; { report.self.partyID _ SunRPC.GetCard32[h]; report.self.smartsID _ SunRPC.GetCard32[h]; report.self.convID _ SunRPC.GetCard32[h]; report.self.state _ VAL[CARDINAL[SunRPC.GetCard32[h]]]; report.self.stateID _ SunRPC.GetCard32[h]; report.other.partyID _ SunRPC.GetCard32[h]; report.other.smartsID _ SunRPC.GetCard32[h]; report.other.convID _ SunRPC.GetCard32[h]; report.other.state _ VAL[CARDINAL[SunRPC.GetCard32[h]]]; report.other.stateID _ SunRPC.GetCard32[h]; report.requestingParty _ SunRPC.GetCard32[h]; report.actionID _ SunRPC.GetCard32[h]; report.actionClass _ SunRPC.GetRope[h]; report.actionType _ SunRPC.GetRope[h]; report.actionInfo _ SunRPC.GetRope[h]; }; { reportToAll _ SunRPCGetBool[h]; }; { selfOnCompletion _ SunRPCGetBool[h]; }; [nb, numReportsIssued] _ ReportAction[h, shhh, report, reportToAll, selfOnCompletion]; beginReturn[h]; { SunRPC.PutRope[h, nb]; }; { SunRPC.PutCard32[h, numReportsIssued]; }; }; GetPartyCaller: PROC [h: Handle, beginReturn: SunRPCBeginReturnProc] ~ { shh: CARD32; partyID: CARD32; rName: ROPE; type: ROPE; nb: ROPE; newPartyID: CARD32; { shh _ SunRPC.GetCard32[h]; }; { partyID _ SunRPC.GetCard32[h]; }; { rName _ SunRPC.GetRope[h]; }; { type _ SunRPC.GetRope[h]; }; [nb, newPartyID] _ GetParty[h, shh, partyID, rName, type]; beginReturn[h]; { SunRPC.PutRope[h, nb]; }; { SunRPC.PutCard32[h, newPartyID]; }; }; GetPartyInfoCaller: PROC [h: Handle, beginReturn: SunRPCBeginReturnProc] ~ { shh: CARD32; credentials: ThrushSunRPC.Credentials; nameReq: ROPE; allParties: BOOLEAN; nb: ROPE; pInfo: PartyInfo; { shh _ SunRPC.GetCard32[h]; }; { credentials.partyID _ SunRPC.GetCard32[h]; credentials.smartsID _ SunRPC.GetCard32[h]; credentials.convID _ SunRPC.GetCard32[h]; credentials.state _ VAL[CARDINAL[SunRPC.GetCard32[h]]]; credentials.stateID _ SunRPC.GetCard32[h]; }; { nameReq _ SunRPC.GetRope[h]; }; { allParties _ SunRPCGetBool[h]; }; [nb, pInfo] _ GetPartyInfo[h, shh, credentials, nameReq, allParties]; beginReturn[h]; { SunRPC.PutRope[h, nb]; }; { SunRPC.PutCard32[h, pInfo.numParties]; SunRPC.PutCard32[h, pInfo.conversationInfo.convID]; SunRPC.PutCard32[h, pInfo.conversationInfo.numParties]; SunRPC.PutCard32[h, pInfo.conversationInfo.numActive]; SunRPC.PutCard32[h, pInfo.conversationInfo.numIdle]; SunRPC.PutCard32[h, pInfo.conversationInfo.originator]; SunRPC.PutCard32[h, pInfo.conversationInfo.conferenceHost.net.net]; SunRPC.PutCard32[h, pInfo.conversationInfo.conferenceHost.host.host]; SunRPC.PutCard32[h, pInfo.conversationInfo.conferenceHost.socket.a]; SunRPC.PutCard32[h, pInfo.conversationInfo.conferenceHost.socket.b]; SunRPC.PutCard32[h, pInfo.conversationInfo.conferenceHost.socket.c]; SunRPC.PutCard32[h, pInfo.conversationInfo.conferenceHost.socket.d]; SunRPC.PutCard32[h, ORD[pInfo.conversationInfo.convType]]; SunRPCPutBool[h, pInfo.conversationInfo.bilateralConv]; SunRPC.PutCard32[h, pInfo.conversationInfo.startTime]; MProc29[h, pInfo.conversationInfo.convAttributes]; SunRPC.PutCard32[h, pInfo.conversationInfo.moderator]; SunRPC.PutCard32[h, pInfo.conversationInfo.commentator]; SunRPC.PutCard32[h, pInfo.ixSelf]; SunRPC.PutCard32[h, pInfo.ixOther]; SunRPC.PutCard32[h, pInfo.ixModerator]; SunRPC.PutCard32[h, pInfo.ixCommentator]; SunRPC.PutCard32[h, pInfo.ixCommSock]; SunRPC.PutCard32[h, pInfo.ixOriginator]; MProc31[h, pInfo.parties]; }; }; AdvanceCaller: PROC [h: Handle, beginReturn: SunRPCBeginReturnProc] ~ { shhh: CARD32; credentials: ThrushSunRPC.Credentials; state: ThrushSunRPC.StateInConv; reportToAll: BOOLEAN; reason: ROPE; comment: ROPE; convAttributes: Entry; partyAttributes: Entry; bilateral: BOOLEAN; checkConflict: BOOLEAN; nb: ROPE; convEvent: ThrushSunRPC.ConvEvent; { shhh _ SunRPC.GetCard32[h]; }; { credentials.partyID _ SunRPC.GetCard32[h]; credentials.smartsID _ SunRPC.GetCard32[h]; credentials.convID _ SunRPC.GetCard32[h]; credentials.state _ VAL[CARDINAL[SunRPC.GetCard32[h]]]; credentials.stateID _ SunRPC.GetCard32[h]; }; { state _ VAL[CARDINAL[SunRPC.GetCard32[h]]]; }; { reportToAll _ SunRPCGetBool[h]; }; { reason _ SunRPC.GetRope[h]; }; { comment _ SunRPC.GetRope[h]; }; { convAttributes _ UProc28[h]; }; { partyAttributes _ UProc28[h]; }; { bilateral _ SunRPCGetBool[h]; }; { checkConflict _ SunRPCGetBool[h]; }; [nb, convEvent] _ Advance[h, shhh, credentials, state, reportToAll, reason, comment, convAttributes, partyAttributes, bilateral, checkConflict]; beginReturn[h]; { SunRPC.PutRope[h, nb]; }; { SunRPC.PutCard32[h, convEvent.self.partyID]; SunRPC.PutCard32[h, convEvent.self.smartsID]; SunRPC.PutCard32[h, convEvent.self.convID]; SunRPC.PutCard32[h, ORD[convEvent.self.state]]; SunRPC.PutCard32[h, convEvent.self.stateID]; SunRPC.PutCard32[h, convEvent.other.partyID]; SunRPC.PutCard32[h, convEvent.other.smartsID]; SunRPC.PutCard32[h, convEvent.other.convID]; SunRPC.PutCard32[h, ORD[convEvent.other.state]]; SunRPC.PutCard32[h, convEvent.other.stateID]; SunRPC.PutCard32[h, convEvent.time]; SunRPC.PutRope[h, convEvent.reason]; SunRPC.PutRope[h, convEvent.comment]; }; }; AlertCaller: PROC [h: Handle, beginReturn: SunRPCBeginReturnProc] ~ { shhh: CARD32; credentials: ThrushSunRPC.Credentials; calledPartyID: CARD32; comment: ROPE; convAttributes: Entry; partyAttributes: Entry; nb: ROPE; { shhh _ SunRPC.GetCard32[h]; }; { credentials.partyID _ SunRPC.GetCard32[h]; credentials.smartsID _ SunRPC.GetCard32[h]; credentials.convID _ SunRPC.GetCard32[h]; credentials.state _ VAL[CARDINAL[SunRPC.GetCard32[h]]]; credentials.stateID _ SunRPC.GetCard32[h]; }; { calledPartyID _ SunRPC.GetCard32[h]; }; { comment _ SunRPC.GetRope[h]; }; { convAttributes _ UProc28[h]; }; { partyAttributes _ UProc28[h]; }; [nb] _ Alert[h, shhh, credentials, calledPartyID, comment, convAttributes, partyAttributes]; beginReturn[h]; { SunRPC.PutRope[h, nb]; }; }; UnvisitCaller: PROC [h: Handle, beginReturn: SunRPCBeginReturnProc] ~ { shh: CARD32; hostPartyID: CARD32; guestPartyID: CARD32; guestPassword: ThrushSunRPC.Password; nb: ROPE; { shh _ SunRPC.GetCard32[h]; }; { hostPartyID _ SunRPC.GetCard32[h]; }; { guestPartyID _ SunRPC.GetCard32[h]; }; { FOR i32: CARDINAL IN [0..2) DO guestPassword[i32] _ SunRPC.GetCard32[h]; ENDLOOP; }; [nb] _ Unvisit[h, shh, hostPartyID, guestPartyID, guestPassword]; beginReturn[h]; { SunRPC.PutRope[h, nb]; }; }; EnableCaller: PROC [h: Handle, beginReturn: SunRPCBeginReturnProc] ~ { shh: CARD32; smartsID: CARD32; nb: ROPE; { shh _ SunRPC.GetCard32[h]; }; { smartsID _ SunRPC.GetCard32[h]; }; [nb] _ Enable[h, shh, smartsID]; beginReturn[h]; { SunRPC.PutRope[h, nb]; }; }; GetCurrentPartyCaller: PROC [h: Handle, beginReturn: SunRPCBeginReturnProc] ~ { shh: CARD32; smartsID: CARD32; nb: ROPE; partyID: CARD32; { shh _ SunRPC.GetCard32[h]; }; { smartsID _ SunRPC.GetCard32[h]; }; [nb, partyID] _ GetCurrentParty[h, shh, smartsID]; beginReturn[h]; { SunRPC.PutRope[h, nb]; }; { SunRPC.PutCard32[h, partyID]; }; }; ReleasePartyCaller: PROC [h: Handle, beginReturn: SunRPCBeginReturnProc] ~ { shh: CARD32; partyID: CARD32; targetPartyID: CARD32; nb: ROPE; { shh _ SunRPC.GetCard32[h]; }; { partyID _ SunRPC.GetCard32[h]; }; { targetPartyID _ SunRPC.GetCard32[h]; }; [nb] _ ReleaseParty[h, shh, partyID, targetPartyID]; beginReturn[h]; { SunRPC.PutRope[h, nb]; }; }; GetPartyFromNumberCaller: PROC [h: Handle, beginReturn: SunRPCBeginReturnProc] ~ { shh: CARD32; partyID: CARD32; phoneNumber: ROPE; description: ROPE; nb: ROPE; newPartyID: CARD32; { shh _ SunRPC.GetCard32[h]; }; { partyID _ SunRPC.GetCard32[h]; }; { phoneNumber _ SunRPC.GetRope[h]; }; { description _ SunRPC.GetRope[h]; }; [nb, newPartyID] _ GetPartyFromNumber[h, shh, partyID, phoneNumber, description]; beginReturn[h]; { SunRPC.PutRope[h, nb]; }; { SunRPC.PutCard32[h, newPartyID]; }; }; EnumerateNamedConversationsCaller: PROC [h: Handle, beginReturn: SunRPCBeginReturnProc] ~ { shhh: CARD32; partyID: CARD32; nb: ROPE; candidates: CandidateList; { shhh _ SunRPC.GetCard32[h]; }; { partyID _ SunRPC.GetCard32[h]; }; [nb, candidates] _ EnumerateNamedConversations[h, shhh, partyID]; beginReturn[h]; { SunRPC.PutRope[h, nb]; }; { MProc33[h, candidates]; }; }; RegisterConversationCaller: PROC [h: Handle, beginReturn: SunRPCBeginReturnProc] ~ { shhh: CARD32; credentials: ThrushSunRPC.Credentials; name: ROPE; convType: ConvType; convAttributes: Entry; accessList: AccessList; nb: ROPE; { shhh _ SunRPC.GetCard32[h]; }; { credentials.partyID _ SunRPC.GetCard32[h]; credentials.smartsID _ SunRPC.GetCard32[h]; credentials.convID _ SunRPC.GetCard32[h]; credentials.state _ VAL[CARDINAL[SunRPC.GetCard32[h]]]; credentials.stateID _ SunRPC.GetCard32[h]; }; { name _ SunRPC.GetRope[h]; }; { convType _ VAL[CARDINAL[SunRPC.GetCard32[h]]]; }; { convAttributes _ UProc28[h]; }; { accessList _ UProc34[h]; }; [nb] _ RegisterConversation[h, shhh, credentials, name, convType, convAttributes, accessList]; beginReturn[h]; { SunRPC.PutRope[h, nb]; }; }; AddAttributesCaller: PROC [h: Handle, beginReturn: SunRPCBeginReturnProc] ~ { credentials: ThrushSunRPC.Credentials; convAttributes: Entry; partyAttributes: Entry; nb: ROPE; { credentials.partyID _ SunRPC.GetCard32[h]; credentials.smartsID _ SunRPC.GetCard32[h]; credentials.convID _ SunRPC.GetCard32[h]; credentials.state _ VAL[CARDINAL[SunRPC.GetCard32[h]]]; credentials.stateID _ SunRPC.GetCard32[h]; }; { convAttributes _ UProc28[h]; }; { partyAttributes _ UProc28[h]; }; [nb] _ AddAttributes[h, credentials, convAttributes, partyAttributes]; beginReturn[h]; { SunRPC.PutRope[h, nb]; }; }; RegisterServiceInterfaceCaller: PROC [h: Handle, beginReturn: SunRPCBeginReturnProc] ~ { shhh: CARD32; credentials: ThrushSunRPC.Credentials; interfaceSpecPattern: ThrushSunRPC.InterfaceSpec; nb: ROPE; interfaceSpec: ThrushSunRPC.InterfaceSpec; { shhh _ SunRPC.GetCard32[h]; }; { credentials.partyID _ SunRPC.GetCard32[h]; credentials.smartsID _ SunRPC.GetCard32[h]; credentials.convID _ SunRPC.GetCard32[h]; credentials.state _ VAL[CARDINAL[SunRPC.GetCard32[h]]]; credentials.stateID _ SunRPC.GetCard32[h]; }; { interfaceSpecPattern.interfaceName.type _ SunRPC.GetRope[h]; interfaceSpecPattern.interfaceName.instance _ SunRPC.GetRope[h]; interfaceSpecPattern.interfaceName.version.first _ SunRPC.GetCard32[h]; interfaceSpecPattern.interfaceName.version.last _ SunRPC.GetCard32[h]; interfaceSpecPattern.hostHint.net.net _ SunRPC.GetCard32[h]; interfaceSpecPattern.hostHint.host.host _ SunRPC.GetCard32[h]; interfaceSpecPattern.hostHint.socket.a _ SunRPC.GetCard32[h]; interfaceSpecPattern.hostHint.socket.b _ SunRPC.GetCard32[h]; interfaceSpecPattern.hostHint.socket.c _ SunRPC.GetCard32[h]; interfaceSpecPattern.hostHint.socket.d _ SunRPC.GetCard32[h]; interfaceSpecPattern.serviceID _ SunRPC.GetCard32[h]; interfaceSpecPattern.interfaceID _ SunRPC.GetCard32[h]; }; [nb, interfaceSpec] _ RegisterServiceInterface[h, shhh, credentials, interfaceSpecPattern]; beginReturn[h]; { SunRPC.PutRope[h, nb]; }; { SunRPC.PutRope[h, interfaceSpec.interfaceName.type]; SunRPC.PutRope[h, interfaceSpec.interfaceName.instance]; SunRPC.PutCard32[h, interfaceSpec.interfaceName.version.first]; SunRPC.PutCard32[h, interfaceSpec.interfaceName.version.last]; SunRPC.PutCard32[h, interfaceSpec.hostHint.net.net]; SunRPC.PutCard32[h, interfaceSpec.hostHint.host.host]; SunRPC.PutCard32[h, interfaceSpec.hostHint.socket.a]; SunRPC.PutCard32[h, interfaceSpec.hostHint.socket.b]; SunRPC.PutCard32[h, interfaceSpec.hostHint.socket.c]; SunRPC.PutCard32[h, interfaceSpec.hostHint.socket.d]; SunRPC.PutCard32[h, interfaceSpec.serviceID]; SunRPC.PutCard32[h, interfaceSpec.interfaceID]; }; }; GetConversationFromNameCaller: PROC [h: Handle, beginReturn: SunRPCBeginReturnProc] ~ { shhh: CARD32; partyID: CARD32; name: ROPE; nb: ROPE; cInfo: ConversationInfo; { shhh _ SunRPC.GetCard32[h]; }; { partyID _ SunRPC.GetCard32[h]; }; { name _ SunRPC.GetRope[h]; }; [nb, cInfo] _ GetConversationFromName[h, shhh, partyID, name]; beginReturn[h]; { SunRPC.PutRope[h, nb]; }; { SunRPC.PutCard32[h, cInfo.convID]; SunRPC.PutCard32[h, cInfo.numParties]; SunRPC.PutCard32[h, cInfo.numActive]; SunRPC.PutCard32[h, cInfo.numIdle]; SunRPC.PutCard32[h, cInfo.originator]; SunRPC.PutCard32[h, cInfo.conferenceHost.net.net]; SunRPC.PutCard32[h, cInfo.conferenceHost.host.host]; SunRPC.PutCard32[h, cInfo.conferenceHost.socket.a]; SunRPC.PutCard32[h, cInfo.conferenceHost.socket.b]; SunRPC.PutCard32[h, cInfo.conferenceHost.socket.c]; SunRPC.PutCard32[h, cInfo.conferenceHost.socket.d]; SunRPC.PutCard32[h, ORD[cInfo.convType]]; SunRPCPutBool[h, cInfo.bilateralConv]; SunRPC.PutCard32[h, cInfo.startTime]; MProc29[h, cInfo.convAttributes]; SunRPC.PutCard32[h, cInfo.moderator]; SunRPC.PutCard32[h, cInfo.commentator]; }; }; RegisterKeyCaller: PROC [h: Handle, beginReturn: SunRPCBeginReturnProc] ~ { shh: CARD32; credentials: ThrushSunRPC.Credentials; key: ThrushSunRPC.Key; reportNewKeys: BOOLEAN; nb: ROPE; keyIndex: CARD16; { shh _ SunRPC.GetCard32[h]; }; { credentials.partyID _ SunRPC.GetCard32[h]; credentials.smartsID _ SunRPC.GetCard32[h]; credentials.convID _ SunRPC.GetCard32[h]; credentials.state _ VAL[CARDINAL[SunRPC.GetCard32[h]]]; credentials.stateID _ SunRPC.GetCard32[h]; }; { FOR i35: CARDINAL IN [0..2) DO key[i35] _ SunRPC.GetCard32[h]; ENDLOOP; }; { reportNewKeys _ SunRPCGetBool[h]; }; [nb, keyIndex] _ RegisterKey[h, shh, credentials, key, reportNewKeys]; beginReturn[h]; { SunRPC.PutRope[h, nb]; }; { SunRPC.PutCard32[h, keyIndex]; }; }; DeregisterCaller: PROC [h: Handle, beginReturn: SunRPCBeginReturnProc] ~ { shh: CARD32; smartsID: CARD32; nb: ROPE; { shh _ SunRPC.GetCard32[h]; }; { smartsID _ SunRPC.GetCard32[h]; }; [nb] _ Deregister[h, shh, smartsID]; beginReturn[h]; { SunRPC.PutRope[h, nb]; }; }; SunRPCBeginReturnProc: TYPE ~ PROC [h: Handle]; Server: SunRPC.ServerProc ~ { <<[h: Handle, c: Conversation, proc: CARD, clientData: REF] RETURNS [doReply: BOOL, replyTimeToLive: CARDINAL]>> ENABLE { < { -- (1 )>> <> <> <> <> <<};>> }; beginReturn: SunRPCBeginReturnProc ~ { SunRPC.StartReply[h]; <> <> <> }; doReply _ TRUE; replyTimeToLive _ 2; SELECT proc FROM 12 => LookupServiceInterfaceCaller[h, beginReturn]; 22 => RegisterCaller[h, beginReturn]; 26 => DisableCaller[h, beginReturn]; 9 => DescribePartyCaller[h, beginReturn]; 27 => VisitCaller[h, beginReturn]; 21 => GetNumbersForRNameCaller[h, beginReturn]; 15 => UnregisterKeyCaller[h, beginReturn]; 23 => CheckInCaller[h, beginReturn]; 0 => CreateConversationCaller[h, beginReturn]; 29 => UnvisitSelfCaller[h, beginReturn]; 4 => GetConversationInfoCaller[h, beginReturn]; 14 => GetKeyTableCaller[h, beginReturn]; 18 => GetPartyFromFeepNumCaller[h, beginReturn]; 3 => ReportActionCaller[h, beginReturn]; 16 => GetPartyCaller[h, beginReturn]; 8 => GetPartyInfoCaller[h, beginReturn]; 2 => AdvanceCaller[h, beginReturn]; 1 => AlertCaller[h, beginReturn]; 28 => UnvisitCaller[h, beginReturn]; 25 => EnableCaller[h, beginReturn]; 19 => GetCurrentPartyCaller[h, beginReturn]; 20 => ReleasePartyCaller[h, beginReturn]; 17 => GetPartyFromNumberCaller[h, beginReturn]; 7 => EnumerateNamedConversationsCaller[h, beginReturn]; 5 => RegisterConversationCaller[h, beginReturn]; 10 => AddAttributesCaller[h, beginReturn]; 11 => RegisterServiceInterfaceCaller[h, beginReturn]; 6 => GetConversationFromNameCaller[h, beginReturn]; 13 => RegisterKeyCaller[h, beginReturn]; 24 => DeregisterCaller[h, beginReturn]; ENDCASE => ERROR SunRPC.Error[$wrongProc]; <> < { NULL };>> }; <> SunRPCGetBool: PROC [h: SunRPC.Handle] RETURNS [BOOL] ~ INLINE { RETURN [SunRPC.GetCard32[h] # 0] }; SunRPCPutBool: PROC [h: SunRPC.Handle, bool: BOOL] ~ INLINE { SunRPC.PutCard32[h, IF bool THEN 1 ELSE 0] }; MProc25: PROC [h: Handle, val: VisitorList] ~ { SunRPC.PutCard32[h, val.length]; FOR i36: CARDINAL IN [0..val.length) DO SunRPC.PutCard32[h, val.body[i36]]; ENDLOOP; }; MProc30: PROC [h: Handle, val: ThrushSunRPC.Keys] ~ { SunRPC.PutCard32[h, val.length]; FOR i37: CARDINAL IN [0..val.length) DO FOR i38: CARDINAL IN [0..2) DO SunRPC.PutCard32[h, val.body[i37][i38]]; ENDLOOP; ENDLOOP; }; UProc28: PROC [h: Handle] RETURNS [res: Entry] ~ { { length40: CARDINAL ~ SunRPC.GetCard32[h]; res _ NEW[EntryObject[length40]]; FOR i39: CARDINAL IN [0..length40) DO res.body[i39].type _ SunRPC.GetRope[h]; res.body[i39].value _ SunRPC.GetRope[h]; ENDLOOP; }; }; MProc31: PROC [h: Handle, val: PartyList] ~ { SunRPC.PutCard32[h, val.length]; FOR i41: CARDINAL IN [0..val.length) DO SunRPC.PutCard32[h, val.body[i41].partyID]; SunRPC.PutRope[h, val.body[i41].name]; SunRPC.PutCard32[h, val.body[i41].intendedPartyID]; SunRPC.PutRope[h, val.body[i41].intendedName]; SunRPC.PutRope[h, val.body[i41].type]; SunRPC.PutCard32[h, ORD[val.body[i41].state]]; SunRPC.PutCard32[h, val.body[i41].numConvs]; SunRPCPutBool[h, val.body[i41].enabled]; SunRPCPutBool[h, val.body[i41].voicePath]; SunRPCPutBool[h, val.body[i41].partyActive]; SunRPCPutBool[h, val.body[i41].partyEngaged]; SunRPC.PutCard32[h, val.body[i41].socket.net.net]; SunRPC.PutCard32[h, val.body[i41].socket.host.host]; SunRPC.PutCard32[h, val.body[i41].socket.socket.a]; SunRPC.PutCard32[h, val.body[i41].socket.socket.b]; SunRPC.PutCard32[h, val.body[i41].socket.socket.c]; SunRPC.PutCard32[h, val.body[i41].socket.socket.d]; MProc29[h, val.body[i41].partyAttributes]; ENDLOOP; }; UProc34: PROC [h: Handle] RETURNS [res: AccessList] ~ { { length43: CARDINAL ~ SunRPC.GetCard32[h]; res _ NEW[AccessListObject[length43]]; FOR i42: CARDINAL IN [0..length43) DO res.body[i42] _ SunRPC.GetRope[h]; ENDLOOP; }; }; MProc33: PROC [h: Handle, val: CandidateList] ~ { SunRPC.PutCard32[h, val.length]; FOR i44: CARDINAL IN [0..val.length) DO SunRPC.PutCard32[h, val.body[i44].convID]; SunRPC.PutCard32[h, val.body[i44].numParties]; SunRPC.PutCard32[h, val.body[i44].numActive]; SunRPC.PutCard32[h, val.body[i44].numIdle]; SunRPC.PutCard32[h, val.body[i44].originator]; SunRPC.PutCard32[h, val.body[i44].conferenceHost.net.net]; SunRPC.PutCard32[h, val.body[i44].conferenceHost.host.host]; SunRPC.PutCard32[h, val.body[i44].conferenceHost.socket.a]; SunRPC.PutCard32[h, val.body[i44].conferenceHost.socket.b]; SunRPC.PutCard32[h, val.body[i44].conferenceHost.socket.c]; SunRPC.PutCard32[h, val.body[i44].conferenceHost.socket.d]; SunRPC.PutCard32[h, ORD[val.body[i44].convType]]; SunRPCPutBool[h, val.body[i44].bilateralConv]; SunRPC.PutCard32[h, val.body[i44].startTime]; MProc29[h, val.body[i44].convAttributes]; SunRPC.PutCard32[h, val.body[i44].moderator]; SunRPC.PutCard32[h, val.body[i44].commentator]; ENDLOOP; }; MProc29: PROC [h: Handle, val: Entry] ~ { SunRPC.PutCard32[h, val.length]; FOR i45: CARDINAL IN [0..val.length) DO SunRPC.PutRope[h, val.body[i45].type]; SunRPC.PutRope[h, val.body[i45].value]; ENDLOOP; }; <> sunPgm: CARD _ 390909; -- decimal program number sunPgmVersion: CARD _ 1; theServer: SunRPC.Server; [] _ SunPMapLocal.UnsetLocal[program~sunPgm, version~sunPgmVersion]; -- in case server already running theServer _ SunRPC.CreateServer[pgm~sunPgm, serverProc~Server, version~sunPgmVersion]; [] _ SunPMapLocal.SetLocal[program~sunPgm, version~sunPgmVersion, protocol~SunPMap.ipProtocolUDP, port~Basics.Card16FromH[SunRPC.GetServerPort[theServer]]]; }... <> <> <> <> <> <<>>