Copyright (C) 1994, Digital Equipment Corp.
Siphon.m3
MODULE Siphon;
IMPORT Site, PkgErr, Text, Thread;
IMPORT IP, NetObj, TCPNetObj;
FROM LockOps IMPORT SiteName;
FROM PkgErr IMPORT ImportError;
VAR
default: T := NIL;
defaultSite: SiteName := NIL;
PROCEDURE New (site: SiteName): T
RAISES {PkgErr.E, NetObj.Error, Thread.Alerted} =
VAR rem: Site.Remote;
VAR obj: NetObj.T;
siteT: Site.T;
loc: NetObj.Address;
addr: IP.Address;
BEGIN
IF (site = NIL) OR Text.Empty(site) THEN
IF default # NIL THEN RETURN default; END;
ELSE
IF (default # NIL) AND Text.Equal(site, defaultSite) THEN
RETURN default;
END;
END;
TRY
siteT := Site.Get();
IF (site = NIL) OR Text.Empty(site) OR Text.Equal(site, siteT.name) THEN
IF siteT.ipPort = IP.NullPort THEN
loc := NetObj.Locate(siteT.siphonserver);
ELSE
IF NOT IP.GetHostByName(siteT.siphonserver, addr) THEN
PkgErr.Raise(ImportError);
END;
loc := TCPNetObj.Locate(IP.Endpoint{addr, siteT.ipPort});
END;
ELSE
IF NOT Site.FindRemote(site, rem) THEN
PkgErr.Raise(PkgErr.NoSuchSite);
END;
IF rem.ipPort = IP.NullPort THEN
loc := NetObj.Locate(rem.siphonserver);
ELSE
IF NOT IP.GetHostByName(rem.siphonserver, addr) THEN
PkgErr.Raise(ImportError);
END;
loc := TCPNetObj.Locate(IP.Endpoint{addr, rem.ipPort});
END;
END;
obj := NetObj.Import(SiphonExportName, loc);
EXCEPT
| IP.Error(ipErr) => PkgErr.Raise(ImportError, ipErr);
| NetObj.Invalid => PkgErr.Raise(ImportError);
END;
IF (obj = NIL) OR NOT ISTYPE(obj, T) THEN
PkgErr.Raise(ImportError);
END;
RETURN NARROW(obj, T);
END New;
PROCEDURE SetServerT(t: T; site: SiteName) =
BEGIN
default := t;
defaultSite := site;
END SetServerT;
BEGIN
END Siphon.