(* ------------------------------------------------------------------------
  :Program.       WriteMessage
  :Contents.      writes a new message to UMS' messagebase
  :Author.        Kai Bolay [kai]
  :Address.       Snail Mail:              EMail:
  :Address.       Hoffmannstraße 168       UUCP: kai@amokle.stgt.sub.org
  :Address.       D-71229                  Leonberg  FIDO: 2:2407/106.3
  :History.       v1.0 [kai] 25-Mar-93 (added Martin's suggestion)
  :History.       v1.1 [kai] 31-Mar-93 (added new tags, toAddr only if private)
  :History.       v1.2 [kai] 15-Apr-93 (added SERVER keyword, better Login() failure)
  :History.       v1.3 [kai] 22-Sep-93 (updated for V40 Intefaces)
  :Copyright.     Public Domain
  :Language.      Oberon
  :Translator.    AMIGA OBERON v3.01d
  :Imports.       ums
  :Bugs.          Does not create links (crosspostings, carbon copies)
------------------------------------------------------------------------ *)
MODULE WriteMessage;

IMPORT
  ums,
  I: Intuition, d: Dos, e: Exec, u: Utility,
  NoGuru, Break,
  y: SYSTEM;
CONST
  Template = "USER/A,PASSWORD/A,SERVER/K\o$VER: WriteMessage 1.3 (22.9.93)\n\r";
  Msg = "This is an automatically created message because I'm too lazy to write\n"
        "a complete newsreader.\n"
        "\n"
        "If you improve this program in order to enable the user to write real\n"
        "messages please let me know.\n"
        "\n"
        "  Bye, Kai\n"
        "\n"
        "-- \n"
        "This is no signature :-)\n";
VAR
  RD: d.RDArgsPtr;
  Args: STRUCT (dummy: d.ArgsStruct)
    name: e.STRPTR;
    password: e.STRPTR;
    server: e.STRPTR;
  END;
  acc: LONGINT;
  Fields: ums.MsgTextFields;
  i: INTEGER;
  num: LONGINT;

(* $Debug- *)
PROCEDURE CheckErr;
VAR
  err: INTEGER;
  txt: ums.STRPTR;
BEGIN
  err := ums.ErrNum (acc);
  IF err # ums.ok THEN
    txt := ums.ErrTxt (acc);
    d.PrintF ("UMS-error: %ld, \"%s\"\n", err, txt);
    HALT (20);
  END;
END CheckErr;
(* $Debug= *)

PROCEDURE GetString (Prompt:  ARRAY OF CHAR): ums.STRPTR;
CONST
  MaxChars = 256;
VAR
  buffer: ums.STRPTR;
  i: INTEGER;
BEGIN
  IF d.FPuts (d.Output(), Prompt) AND d.Flush (d.Output()) THEN END;
  buffer := e.AllocVec (MaxChars, LONGSET {e.memClear});
  IF buffer # NIL THEN
    IF d.FGets (d.Input(), buffer^, MaxChars-1) = NIL THEN END;
    i := 0;
    REPEAT
      IF buffer[i] = '\n' THEN buffer[i] := 0X END;
      INC (i);
    UNTIL buffer[i] = 0X;
    IF buffer[0] = 0X THEN
      e.FreeVec (buffer); buffer := NIL;
    END;
  END;
  RETURN buffer;
END GetString;

BEGIN
  i := 0;
  REPEAT
    Fields[i] := NIL;
    INC (i);
  UNTIL i = ums.NumFields;

  RD := d.ReadArgs (Template, Args, NIL);
  IF RD = NIL THEN
    d.PrintF ("Usage: %s\n", y.ADR (Template));
    HALT (20);
  END;

  (* $OddChk- $NilChk- *)
  acc := ums.UMSRLogin (Args.server^, Args.name^, Args.password^);
  (* $OddChk= $NilChk= *)
  IF acc <= 0 THEN
    d.PrintF ("Unable to login\n");
    HALT (20);
  END;

  Fields[ums.group]        := GetString ("Group (<RETURN> for private mail): ");
  IF Fields[ums.group] # NIL THEN
    Fields[ums.replyGroup] := GetString ("Reply Group: ");
  END;
  Fields[ums.replyName]    := GetString ("Reply Name: ");
  IF Fields[ums.replyName] # NIL THEN
    Fields[ums.replyAddr]    := GetString ("Reply Addr: ");
  END;
  Fields[ums.toName]       := GetString ("To Name: ");
  IF Fields[ums.group] = NIL THEN
    Fields[ums.toAddr]     := GetString ("To Addr: ");
  END;
  Fields[ums.refID]        := GetString ("Refer-ID: ");
  Fields[ums.subject]      := GetString ("Subject: ");
  Fields[ums.attributes]   := GetString ("Attributes: ");
  Fields[ums.organization] := GetString ("Organization: ");
  Fields[ums.distribution] := GetString ("Distribution: ");
  Fields[ums.newsreader]   := y.ADR ("WriteMessage 1.2");
  Fields[ums.msgText]      := y.ADR (Msg);

  (* write the message *)
  num := ums.WriteUMSMsgTags (acc, ums.tagTextFields, y.ADR (Fields),
                                   u.done);
  CheckErr;
  d.PrintF ("Your message got number %ld.\n", num);
CLOSE
  IF acc # NIL THEN
    ums.Logout (acc); acc := 0;
  END;
  IF RD # NIL THEN
    d.FreeArgs (RD); RD := NIL;
  END;
  Fields[ums.newsreader] := NIL; (* not allocated by AllocVec() !! *)
  Fields[ums.msgText]    := NIL; (* not allocated by AllocVec() !! *)
  i := 0;
  REPEAT
    IF Fields[i] # NIL THEN
      e.FreeVec (Fields[i]); Fields[i] := NIL;
    END;
    INC (i);
  UNTIL i = ums.NumFields;
END WriteMessage.
