-- GrapevineUser:  DEFs for updates to the database

-- [Indigo]<Grapevine>User>NameUpdateDefs.mesa

-- Andrew Birrell  August 27, 1982 3:10 pm

DIRECTORY
  BodyDefs USING [Connect, Password, Remark, RName],
  ProtocolDefs USING [MakeKey, RSOperation],
  NameInfoDefs USING [Outcome];

NameUpdateDefs: DEFINITIONS IMPORTS ProtocolDefs =

  BEGIN

  -- Replicated from ProtocolDefs --

  MakeKey: PROC [text: STRING] RETURNS [BodyDefs.Password] = INLINE {
    RETURN[ProtocolDefs.MakeKey[text]]};




  -- Private subroutines --

  Update: PRIVATE PROC [
    user: BodyDefs.RName, password: BodyDefs.Password,
    op: ProtocolDefs.RSOperation, target: BodyDefs.RName, value: STRING ← NIL,
    newPwd: BodyDefs.Password ← [, , , ], reporter: PROC [STRING] ← NIL]
    RETURNS [NameInfoDefs.Outcome];




  -- Creation and Deletion --

  CreateIndividual: PROC [
    user: BodyDefs.RName, password: BodyDefs.Password, individual: BodyDefs.RName,
    newPwd: BodyDefs.Password ← [0, 0, 0, 0]] RETURNS [NameInfoDefs.Outcome] =
    INLINE {
    RETURN[Update[user, password, CreateIndividual, individual, NIL, newPwd]]};

  DeleteIndividual: PROC [
    user: BodyDefs.RName, password: BodyDefs.Password, individual: BodyDefs.RName]
    RETURNS [NameInfoDefs.Outcome] = INLINE {
    RETURN[Update[user, password, DeleteIndividual, individual]]};

  CreateGroup: PROC [
    user: BodyDefs.RName, password: BodyDefs.Password, group: BodyDefs.RName]
    RETURNS [NameInfoDefs.Outcome] = INLINE {
    RETURN[Update[user, password, CreateGroup, group]]};

  DeleteGroup: PROC [
    user: BodyDefs.RName, password: BodyDefs.Password, group: BodyDefs.RName]
    RETURNS [NameInfoDefs.Outcome] = INLINE {
    RETURN[Update[user, password, DeleteGroup, group]]};




  -- Updates to single-valued components --

  SetPassword: PROC [
    user: BodyDefs.RName, password: BodyDefs.Password, individual: BodyDefs.RName,
    newPwd: BodyDefs.Password] RETURNS [NameInfoDefs.Outcome] = INLINE {
    RETURN[Update[user, password, ChangePassword, individual, NIL, newPwd]]};

  SetConnect: PROC [
    user: BodyDefs.RName, password: BodyDefs.Password, individual: BodyDefs.RName,
    connect: BodyDefs.Connect] RETURNS [NameInfoDefs.Outcome] = INLINE {
    RETURN[Update[user, password, ChangeConnect, individual, connect]]};

  SetRemark: PROC [
    user: BodyDefs.RName, password: BodyDefs.Password, group: BodyDefs.RName,
    remark: BodyDefs.Remark] RETURNS [NameInfoDefs.Outcome] = INLINE {
    RETURN[Update[user, password, ChangeRemark, group, remark]]};




  -- Adding to list-valued components --

  AddMailbox: PROC [
    user: BodyDefs.RName, password: BodyDefs.Password, individual: BodyDefs.RName,
    site: BodyDefs.RName] RETURNS [NameInfoDefs.Outcome] = INLINE {
    RETURN[Update[user, password, AddMailBox, individual, site]]};

  AddForward: PROC [
    user: BodyDefs.RName, password: BodyDefs.Password, individual: BodyDefs.RName,
    dest: BodyDefs.RName] RETURNS [NameInfoDefs.Outcome] = INLINE {
    RETURN[Update[user, password, AddForward, individual, dest]]};

  AddMember: PROC [
    user: BodyDefs.RName, password: BodyDefs.Password, group: BodyDefs.RName,
    member: BodyDefs.RName] RETURNS [NameInfoDefs.Outcome] = INLINE {
    RETURN[Update[user, password, AddMember, group, member]]};

  AddOwner: PROC [
    user: BodyDefs.RName, password: BodyDefs.Password, group: BodyDefs.RName,
    owner: BodyDefs.RName] RETURNS [NameInfoDefs.Outcome] = INLINE {
    RETURN[Update[user, password, AddOwner, group, owner]]};

  AddFriend: PROC [
    user: BodyDefs.RName, password: BodyDefs.Password, group: BodyDefs.RName,
    friend: BodyDefs.RName] RETURNS [NameInfoDefs.Outcome] = INLINE {
    RETURN[Update[user, password, AddFriend, group, friend]]};




  -- Removing from list-valued components --

  RemoveMailbox: PROC [
    user: BodyDefs.RName, password: BodyDefs.Password, individual: BodyDefs.RName,
    site: BodyDefs.RName] RETURNS [NameInfoDefs.Outcome] = INLINE {
    RETURN[Update[user, password, DeleteMailBox, individual, site]]};

  RemoveForward: PROC [
    user: BodyDefs.RName, password: BodyDefs.Password, individual: BodyDefs.RName,
    dest: BodyDefs.RName] RETURNS [NameInfoDefs.Outcome] = INLINE {
    RETURN[Update[user, password, DeleteForward, individual, dest]]};

  RemoveMember: PROC [
    user: BodyDefs.RName, password: BodyDefs.Password, group: BodyDefs.RName,
    member: BodyDefs.RName] RETURNS [NameInfoDefs.Outcome] = INLINE {
    RETURN[Update[user, password, DeleteMember, group, member]]};

  RemoveOwner: PROC [
    user: BodyDefs.RName, password: BodyDefs.Password, group: BodyDefs.RName,
    owner: BodyDefs.RName] RETURNS [NameInfoDefs.Outcome] = INLINE {
    RETURN[Update[user, password, DeleteOwner, group, owner]]};

  RemoveFriend: PROC [
    user: BodyDefs.RName, password: BodyDefs.Password, group: BodyDefs.RName,
    friend: BodyDefs.RName] RETURNS [NameInfoDefs.Outcome] = INLINE {
    RETURN[Update[user, password, DeleteFriend, group, friend]]};


  END.