-- File: IFSFile.mesa
-- Last edited by:
-- Levin - 14-Sep-81 13:43:20


IFSFile: DEFINITIONS =

  BEGIN

  -- Types --

  FSInstance: TYPE = LONG POINTER TO FSObject;
  FSObject: TYPE;

  FileHandle: TYPE = LONG POINTER TO FileObject;
  FileObject: TYPE;

  OpenOptions: TYPE = {old, oldReadOnly, new, oldOrNew};

  Buffer: TYPE = LONG POINTER;
  Position: TYPE = LONG CARDINAL;
  ByteCount: TYPE = CARDINAL;

  Completer: TYPE = PROCEDURE [arg: CompleterArg, outcome: Problem];
  CompleterArg: TYPE = LONG UNSPECIFIED;
  Problem: TYPE = {ok, io, resources, credentials, illegalIO, other};
  AccessFailure: TYPE =
    {ok, io, notFound, alreadyExists, accessDenied, accessConflict, illegalFileName, other};

  FileTime: TYPE = LONG CARDINAL;
  defaultTime: FileTime = 0;


  -- Procedures and Signals --

  Error: ERROR [reason: Problem];

  Login: PROCEDURE [server, userName, password,
		 secondaryName, secondaryPassword: LONG STRING ← NIL] RETURNS [FSInstance];

  UnableToLogin: ERROR [reason: Problem];

  Logout: PROCEDURE [FSInstance];

  Open: PROCEDURE [instance: FSInstance, name: LONG STRING, options: OpenOptions ← oldReadOnly]
	  RETURNS [FileHandle];

  CantOpen: ERROR [reason: AccessFailure];

  Close: PROCEDURE [FileHandle];

  Abandon: PROCEDURE [FileHandle];

  Destroy: PROCEDURE [FileHandle];

  GetLength: PROCEDURE [FileHandle] RETURNS [Position];

  SetLength: PROCEDURE [FileHandle, Position];

  StartRead: PROCEDURE [FileHandle, Position, ByteCount, Buffer, Completer, CompleterArg];

  StartWrite: PROCEDURE [FileHandle, Position, ByteCount, Buffer, Completer, CompleterArg];

  GetTimes: PROCEDURE [FileHandle] RETURNS [read, write, create: FileTime];

  SetCreation: PROCEDURE [FileHandle, FileTime ← defaultTime];

  -- Initialization/Finalization Procedures --

  Initialize: PROCEDURE;

  Finalize: PROCEDURE;

  END.