-- File: NameServerDefs.Mesa,  Last Edit: HGM  March 12, 1981  10:55 PM

DIRECTORY
  InlineDefs USING [BcplLongNumber],
  Window USING [Handle],
  File USING [Capability],
  StatsDefs USING [StatCounterIndex],
  BufferDefs USING [OisBuffer, PupBuffer],
  PupTypes USING [PupType, PupAddress],
  Socket USING [ChannelHandle],
  MiscServerDefs USING [
    lockDirRequest, lockDirReply, unlockDirRequest, unlockDirReply,
    nameStatsRequest, nameStatsReply, whoAmI];

NameServerDefs: DEFINITIONS =
  BEGIN

  PupBuffer: TYPE = BufferDefs.PupBuffer;
  PupAddress: TYPE = PupTypes.PupAddress;

  PupDirServerOn: PROCEDURE;
  PupDirServerOff: PROCEDURE;
  PupDirServer: PROCEDURE [PupBuffer];
  PupNameServerOn: PROCEDURE;
  PupNameServerOff: PROCEDURE;
  PupNameServer: PROCEDURE [PupBuffer];
  OISCPNameServer: PROCEDURE [Socket.ChannelHandle, BufferDefs.OisBuffer];
  StartProbingForDirectory: PROCEDURE;
  GetDirectoryVersion: PROCEDURE RETURNS [CARDINAL]; -- 0 if none/unknown
  EnumerateCache: PROCEDURE [PROCEDURE [CacheEntry]];
  GetCacheLocation: PROCEDURE RETURNS [POINTER TO CacheEntry];
  UpdatePicture: PROCEDURE;

  lockDirRequest: PupTypes.PupType = MiscServerDefs.lockDirRequest;
  lockDirReply: PupTypes.PupType = MiscServerDefs.lockDirReply;
  unlockDirRequest: PupTypes.PupType = MiscServerDefs.unlockDirRequest;
  unlockDirReply: PupTypes.PupType = MiscServerDefs.unlockDirReply;

  nameStatsRequest: PupTypes.PupType = MiscServerDefs.nameStatsRequest;
  nameStatsReply: PupTypes.PupType = MiscServerDefs.nameStatsReply;
  whoAmI: PupTypes.PupType = MiscServerDefs.whoAmI;

  CacheEntry: TYPE = POINTER TO CacheEntryObject;
  CacheEntryObject: TYPE = RECORD [
    next: CacheEntry,
    size: CARDINAL,
    count: LONG CARDINAL,
    sequence: CARDINAL,
    names: DESCRIPTOR FOR ARRAY OF STRING,
    addrs: DESCRIPTOR FOR ARRAY OF PupAddress];


  -- Statistics
  statName, statAddress, statWhoAmI, statXlation, statConst, statBusy:
    StatsDefs.StatCounterIndex;
  statSend, statVers: StatsDefs.StatCounterIndex;
  statHits, statMisses, statNone, statFile: StatsDefs.StatCounterIndex;
  statMsScanningFile: StatsDefs.StatCounterIndex;

  NameStatsEntry: TYPE = RECORD [
    version: WORD,
    nameRequests: InlineDefs.BcplLongNumber,
    directoriesSend: InlineDefs.BcplLongNumber,
    cacheHits: InlineDefs.BcplLongNumber,
    cacheMisses: InlineDefs.BcplLongNumber];
  nameVersion: WORD = 1;

  SetCacheSize: PROCEDURE [CARDINAL];
  BumpCacheSize: PROCEDURE [INTEGER];


  -- internal things

  -- PupDirServer to PupNetDirFile and PupNetDirCache
  ResetDirectoryFile: PROCEDURE RETURNS [version: CARDINAL];
  CheckDirectoryFile: PROCEDURE [File.Capability] RETURNS [ok: BOOLEAN];
  OpenDirectoryFile: PROCEDURE;
  CloseDirectoryFile: PROCEDURE;
  FlushWholeCache: PROCEDURE;
  GetDirectoryFile: PROCEDURE RETURNS [File.Capability];

  -- PupNameServer to PupNetDirCache
  SearchCacheForName: PROCEDURE [STRING] RETURNS [CacheEntry];
  SearchCacheForAddress: PROCEDURE [PupAddress] RETURNS [CacheEntry];
  ForceNameIntoCache: PROCEDURE [STRING] RETURNS [CacheEntry];
  ForceAddressIntoCache: PROCEDURE [PupAddress] RETURNS [CacheEntry];

  -- PupNetDirCache to PupNetDirFile
  SearchNetDirForName: PROCEDURE [STRING, CacheEntry] RETURNS [BOOLEAN];
  SearchNetDirForAddress: PROCEDURE [PupAddress, CacheEntry] RETURNS [BOOLEAN];

  msg: Window.Handle;
  busy, nameRunning, dirRunning, probing, sending: BOOLEAN;


  END.