ThPartyPrivate.mesa
Copyright © 1985 by Xerox Corporation. All rights reserved.
last modified by Swinehart, May 22, 1986 3:53:51 pm PDT
DIRECTORY
BasicTime USING [ GMT ],
Lark USING [ KeyTable],
LarkPlay USING [ ToneSpec],
RefID USING [ ID, nullID ],
Thrush USING [ AlertKind, CallUrgency, ConversationHandle, ConvEvent, Credentials, Disposition, EventSequence, NB, PartyHandle, PartyType, nullHandle, Reason, RingEnable, ROPE, SHHH, SmartsHandle, StateID, StateInConv, ThHandle, Time, unencrypted ],
ThSmarts USING [ SmartsProperties ],
ThSmartsRpcControl USING [ InterfaceRecord, InterfaceRecordObject ]
;
ThPartyPrivate: CEDAR DEFINITIONS = {
LocalSmartsInterface: TYPE = ThSmartsRpcControl.InterfaceRecord;
LocalSmartsBody: TYPE = ThSmartsRpcControl.InterfaceRecordObject;
none: Thrush.SHHH = Thrush.unencrypted;
StateInConv: TYPE = Thrush.StateInConv;
nullHandle: Thrush.ThHandle = Thrush.nullHandle;
RingMethod: TYPE = { standard, ownTune, bothTunes };
Record Types
PartyData: data representing an individual, trunk, or voice recording within Thrush
PartyData: TYPE = REF PartyBody;
PartyBody: TYPE = RECORD [
numConvs: NAT ← 0,
numSmarts: NAT ← 0,
numEnabled: NAT ← 0, -- must be >0 for party to be visible to GetParty[].
actionNeeded: CONDITION,
supervisor: PROCESS,
supervisorGone: CONDITION,
partyActive: BOOLFALSE,
partyFailed: BOOLFALSE,
type: Thrush.PartyType←, -- Must be specified.
Fields used by parties representing individuals and some services
ringEnable: Thrush.RingEnable ← on, -- are we noisily accepting calls?
defaultRingEnable: Thrush.RingEnable ← on, -- are we noisily accepting calls?
ringDo: RingMethod ← standard, -- we use the ring tune?
ringTime: BasicTime.GMTNULL, -- if not, when again?
ringVolume: CARDINAL𡤁, -- sets up tune every time initialized
ringTune: LarkPlay.ToneSpec, -- Specification of ring tune
ringTuneRope: Thrush.ROPENIL,
Fields used by trunk parties
outgoing: Thrush.ROPE NIL, -- *
reservedBy: Thrush.PartyHandle ← NULL, -- **
For services, record "idle service" rName for use when party goes idle
serviceName: Thrush.ROPE
Names of recording smarts interface . . . use to get mgmt interfaces
];
* Set at GetParty time to called party number. This number is just what's needed to complete the call, with all alternatives removed. *x* in the number indicates the need for a pause of x 100 ms ticks.
** Since GetParty custom-tailors a trunk party for the specific outgoing call before initiating a conversation, need a way to make sure that the same smarts does start the conversation.
SmartsData: TYPE=REF SmartsBody;
Implementors say SmartsBody: PUBLIC TYPE=ThPartyPrivate.SmartsBody;
SmartsBody: TYPE = RECORD [
interface: ThSmartsRpcControl.InterfaceRecord, -- an RPC or direct interface
properties: ThSmarts.SmartsProperties,
type: Thrush.PartyType←individual,
shh: Thrush.SHHH, -- outgoing encryption handle; should be one for each Party-Smarts pair?
for now, callee in shh is RName associated of Party that creates smarts.
canProgress: BOOLEANTRUE, -- when FALSE, don't call Progress any more.
enablesParty: BOOLEANFALSE, -- when TRUE, we're contributing to party.numEnabled
authenticated: BOOLEAN
];
ConversationData: TYPE = REF ConversationBody;
ConversationBody: TYPE = RECORD [
subject: Thrush.ROPENIL,
numParties: NAT𡤀,
numActive: NAT𡤀,
creatorPartyID: Thrush.PartyHandle ← Thrush.nullHandle,
urgency: Thrush.CallUrgency,
alertKind: Thrush.AlertKind,
currentStateID: Thrush.StateID𡤀,
timeOfID: Thrush.Time,
convID: Thrush.ConversationHandle←NULL,
keyTable: Lark.KeyTable ← NIL, -- current key table for this conversation
newKeyTable: BOOLFALSE,  -- IF key table has changed but not yet been posted
log: Thrush.EventSequence
];
CFRef: TYPE = REF CFRec; -- Ref to party/conversation record
CFRec: TYPE = RECORD [ -- One such CFRec for each Party-Conversation pair
event: Thrush.ConvEvent, -- describes a state and the event that put it there.
voiceSmartsID: Thrush.SmartsHandle←Thrush.nullHandle,
-- the one that will carry the conversation load for this Party in this conversation
sockID: LONG CARDINALNULL,  -- local socket ID for this participant.
socket: RefID.ID ← RefID.nullID,  -- Needed by $service parties for short-term Cedar 6.1 accommodation
lastPostedID: Thrush.StateID𡤀, -- last time event referring to this party was posted
lastNotedID: Thrush.StateID𡤀  -- last time this party's smarts were informed.
];
logSizeIncrement: NAT = 16;
outsideRingTune: LarkPlay.ToneSpec;
Procedures
Get Party that this Smarts considers that it is currently associated with. << This might not be an adequate facility; may need an enumerator to get all connections, as well; quite likely, actually. >> There should be a function like this for each sort of smarts. This one works OK for both Lark Smarts and Lark Trunk Smarts.
GetCurrentParty: PROC[
shh: Thrush.SHHH←Thrush.unencrypted,
smartsID: Thrush.SmartsHandle]
RETURNS [partyID: Thrush.PartyHandle];
<< Very likely this now belongs in ThParty with the other Triples-mungers>>
GetPartySmarts: PROC[partyID: Thrush.PartyHandle, kind: ATOM]
RETURNS [smartsID: Thrush.SmartsHandle];
MakeServiceRname: PROC[serviceName: Thrush.ROPE]
RETURNS [serviceRname: Thrush.ROPE, serviceRnameAtom: ATOM];
Service Name is the formal descriptor of one of the voice services, such as "Recording", "Text-to-Speech", and so on. The result is "idle.<serviceName>.Lark", as a ROPE and as a corresponding ATOM. This is a procedure because the service name is stored, but several clients need the atom or rope values.
GetStdRingInfo: PROC [partyID: Thrush.PartyHandle];
SetStdRingInfo: PROC [partyID: Thrush.PartyHandle, update: BOOLFALSE];
DistributionProc: TYPE = PROC[ smarts: SmartsData ]
RETURNS [ d: Thrush.Disposition ]; -- controls whether distribution will progress.
Distribute: PROC[ party: PartyData, proc: DistributionProc]
RETURNS [ d: Thrush.Disposition ]; -- accept/reject/pass, depending on whether anybody did.
GetEvent: PROC[conv: ConversationData, stateID: Thrush.StateID]
RETURNS [ event: Thrush.ConvEvent ];
Supervisor: PROC[party: PartyData]; -- supervision process root.
Supervise: PROC[party: PartyData]; -- Creates or joggles a Supervisor. Use where one would normally do a NOTIFY party.actionNeeded
Verify: PROC[ credentials: Thrush.Credentials
] RETURNS [
conv: ConversationData,
party: PartyData,
cfRef: CFRef,
nb: Thrush.NB ];
FindOtherParty: PROC[myPartyID: Thrush.PartyHandle, conv: ConversationData]
RETURNS[partyID: Thrush.PartyHandle, conference: BOOL];
DoDescribeParty: PROC[partyID: Thrush.PartyHandle]
RETURNS[ description: Thrush.ROPE];
DoAdvance: PROC [
smartsID: Thrush.SmartsHandle,
party: PartyData,
conv: ConversationData,
cfRef: CFRef,
state: StateInConv,
reason: Thrush.Reason,
comment: Thrush.ROPENIL
] RETURNS [nb: Thrush.NB];
Inherited from ThPartyIn
Party Initialization
RegisterLocal: PROC[partyID: Thrush.PartyHandle, interface: LocalSmartsInterface,
properties: ThSmarts.SmartsProperties, oldSmartsID: Thrush.SmartsHandle←nullHandle]
RETURNS [smartsID: Thrush.SmartsHandle];
This is the local analog of ThParty.Register.
Conversations
Special dehandling operations
DehandleConv: PROC[convID: Thrush.ConversationHandle]
RETURNS [ conv: ConversationData ];
DehandleParty: PROC[partyID: Thrush.PartyHandle, insist: BOOLEANFALSE]
RETURNS[party: PartyData];
DehandleSmarts: PROC[smartsID: Thrush.SmartsHandle, insist: BOOLEANFALSE]
RETURNS[party: SmartsData];
DestroyConversation: PROC[ conv: ConversationData ];
}.
Swinehart, May 15, 1985 6:01:06 pm PDT
Cedar 6.0
changes to: PartyBody (incoming phone number removed), DIRECTORY
Swinehart, May 20, 1985 1:16:41 pm PDT
PartyBody is not a variant record any more.
changes to: PartyBody
Swinehart, May 22, 1985 10:32:47 am PDT
serviceNameAtom => serviceName
changes to: PartyBody
Swinehart, May 22, 1985 10:41:26 am PDT
changes to: MakeServiceRname, GetStdRingInfo, SetStdRingInfo, MakeServiceRname