BEGIN
fileStoreName: XNSCHName.Name;
realFileStore: Rope.ROPE ← fileStore;
Remove any .alpine from the name -- backward compatibility hack
alpinePos: INT ← Rope.FindBackward[s1: fileStore, s2: ".alpine", case: FALSE];
IF fileStore.Length[] - alpinePos = 7 THEN realFileStore ← fileStore.Substr[len: alpinePos];
First, get a three part name for the fileStore (completing the domain and organization)
fileStoreName ← XNSCHName.NameFromRope[realFileStore];
subsequently, use the Rope version of the fully qualified name
realFileStore ← XNSCHName.RopeFromName[fileStoreName];
FOR list:
LIST
OF CacheRec ← objectCache, list.rest
UNTIL list =
NIL DO
IF Rope.Equal[list.first.object.fileStore, fileStore,
FALSE]
THEN
BEGIN
IF Rope.Equal[list.first.caller, caller, FALSE] AND (key = list.first.object.key) THEN RETURN[list.first.object];
END;
ENDLOOP;
handle ←
NEW[AlpI.Object ← [
This is a terrible abuse of AlpInstance.Objects; for Courier we don't need trans, file, owner, and volume because we are never doing a local import. On the other hand, we need a place to hang our Courier handle and conversation so we'll use otherInterfaces in a stylized way.
trans: NIL,
file: NIL,
owner: NIL,
volume: NIL,
otherInterfaces: NIL,
conversation: NIL,
key: key,
fileStore: fileStore]];
{
serverAddress: REF XNS.Address ~ NEW[XNS.Address ← XNSCH.LookupAddressFromRope[realFileStore].address];
courierHandle: CrRPC.Handle ~ CrRPC.CreateClientHandle[$SPP, serverAddress];
authenticatedConversation: XNSAuth.Conversation ~ XNSAuth.Initiate[identity, fileStoreName];
credentials: XNSAuth.Credentials ~ XNSAuth.GetCredentials[authenticatedConversation];
verifier: XNSAuth.Verifier ← XNSAuth.GetNextVerifier[authenticatedConversation];
session: AlpineP2202V2.Session;
[session, verifier] ← AlpineP2202V2.Logon[courierHandle, fileStoreName, credentials, [caller, pwd], verifier];
handle.otherInterfaces ← LIST[NEW[AlpInstanceV2Internal.InstanceObject ← [ , courierHandle, authenticatedConversation, credentials, session]]];
};
objectCache ← CONS[ [handle, caller], objectCache];