pkgobj/src/Common/PackageObj.m3


Copyright (C) 1994, Digital Equipment Corp.
PackageObj.m3

MODULE PackageObj;

IMPORT Site, Text, Thread;
IMPORT IP, NetObj, TCPNetObj, PkgProt, PkgErr;
FROM PkgErr IMPORT ImportError;

VAR
  default: T := NIL;
  defaultReplica: TEXT := NIL;

PROCEDURE New(replica: TEXT): T
    RAISES {PkgErr.E, NetObj.Error, Thread.Alerted} =
  VAR ipPort: IP.Port;
  VAR obj: NetObj.T;
      addr: IP.Address;
  BEGIN
    IF (replica = NIL) OR Text.Empty(replica) THEN
      IF default # NIL THEN RETURN default; END;
      PkgErr.Raise(ImportError);
    ELSE
      IF (default # NIL) AND Text.Equal(replica, defaultReplica) THEN
        RETURN default;
      END;
    END;
    TRY
      <* ASSERT replica # NIL *>
      ipPort := Site.Get().ipPort;
      IF ipPort = IP.NullPort THEN
        obj := NetObj.Import(
          PkgProt.PkgExportName, NetObj.Locate(replica));
      ELSE
        IF NOT IP.GetHostByName(replica, addr) THEN
          PkgErr.Raise(ImportError);
        END;
        obj := NetObj.Import(
          PkgProt.PkgExportName,
          TCPNetObj.Locate(IP.Endpoint{addr, ipPort}));
      END;
    EXCEPT
    | IP.Error(ipErr) => PkgErr.Raise(ImportError, ipErr);
    | NetObj.Invalid => PkgErr.Raise(ImportError, NIL);
    END;
    IF (obj = NIL) OR NOT ISTYPE(obj, T) THEN
      PkgErr.Raise(ImportError, NIL);
    END;
    RETURN NARROW(obj, T);
  END New;

PROCEDURE SetServerT(t: T; replica: TEXT) =
  BEGIN
    default := t;
    defaultReplica := replica;
  END SetServerT;

BEGIN
END PackageObj.