(* ------------------------------------------------------------------------
  :Program.       ReadMessage
  :Contents.      reads a message from 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 (new tags)
  :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 display links (crosspostings, carbon copies)
------------------------------------------------------------------------ *)
MODULE ReadMessage;

IMPORT
  ums,
  I: Intuition, d: Dos, e: Exec, u: Utility,
  NoGuru, Break,
  y: SYSTEM;
CONST
  Template = "USER/A,PASSWORD/A,SERVER/K,NUM/A/N\o$VER: ReadMessage 1.3 (22.9.93)\n\r";
VAR
  RD: d.RDArgsPtr;
  Args: STRUCT (dummy: d.ArgsStruct)
    name: e.STRPTR;
    password: e.STRPTR;
    server: e.STRPTR;
    num: UNTRACED POINTER TO LONGINT;
  END;
  acc: LONGINT;
  Fields: ums.MsgTextFields;
  Chain: ARRAY 4 OF 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= *)

BEGIN
  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;

  (* read the message *)
  IF ums.ReadUMSMsgTags (acc, ums.tagMsgNum,     Args.num^,
                              ums.tagTextFields, y.ADR (Fields),
                              ums.tagRReadAll,   I.LTRUE,
                              ums.tagRChainUp,   y.ADR (Chain[0]),
                              ums.tagRChainDn,   y.ADR (Chain[1]),
                              ums.tagRChainLt,   y.ADR (Chain[2]),
                              ums.tagRChainRt,   y.ADR (Chain[3]),
                              u.done) THEN END;
  CheckErr;

  IF Fields[ums.fromName] # NIL THEN
    IF Fields[ums.fromAddr] = NIL THEN Fields[ums.fromAddr] := y.VAL (ums.STRPTR, y.ADR ("")) END;
    d.PrintF ("From: %s <%s>\n", Fields[ums.fromName], Fields[ums.fromAddr]);
  END;

  IF Fields[ums.replyName] # NIL THEN
    IF Fields[ums.replyAddr] = NIL THEN Fields[ums.replyAddr] := y.VAL (ums.STRPTR, y.ADR ("")) END;
    d.PrintF ("Reply To: %s <%s>\n", Fields[ums.replyName], Fields[ums.replyAddr]);
  END;

  IF Fields[ums.toName] # NIL THEN
    IF Fields[ums.toAddr] = NIL THEN Fields[ums.toAddr] :=  y.VAL (ums.STRPTR, y.ADR ("")) END;
    d.PrintF ("To: %s <%s>\n", Fields[ums.toName], Fields[ums.toAddr]);
  END;

  IF Fields[ums.group]        # NIL THEN d.PrintF ("Group: %s\n",        Fields[ums.group])        END;
  IF Fields[ums.replyGroup]   # NIL THEN d.PrintF ("Reply Group: %s\n",  Fields[ums.replyGroup])   END;
  IF Fields[ums.subject]      # NIL THEN d.PrintF ("Subject: %s\n",      Fields[ums.subject])      END;
  IF Fields[ums.msgID]        # NIL THEN d.PrintF ("Message ID: %s\n",   Fields[ums.msgID])        END;
  IF Fields[ums.refID]        # NIL THEN d.PrintF ("Refer ID: %s\n",     Fields[ums.refID])        END;
  IF Fields[ums.creationDate] # NIL THEN d.PrintF ("Creation Date: %s\n",Fields[ums.creationDate]) END;
  IF Fields[ums.receiveDate]  # NIL THEN d.PrintF ("Receive Date: %s\n", Fields[ums.receiveDate])  END;
  IF Fields[ums.attributes]   # NIL THEN d.PrintF ("Attributes: %s\n",   Fields[ums.attributes])   END;
  IF Fields[ums.organization] # NIL THEN d.PrintF ("Organization: %s\n", Fields[ums.organization]) END;
  IF Fields[ums.distribution] # NIL THEN d.PrintF ("Distribution: %s\n", Fields[ums.distribution]) END;
  IF Fields[ums.newsreader]   # NIL THEN d.PrintF ("Newsreader: %s\n",   Fields[ums.newsreader])   END;

  (*    Message-Tree   This is a tree of messages build by UMS regarding     *)
  (*          a        the reference IDs of messages. (a) and (c) both       *)
  (*         / \       refer to (a). (d), (e) and (f) refer to (b) and       *)
  (*        b   c      (g) refers to (e). If you read message (e) you'll     *)
  (*       /|\         get (b) for chain up ("-"), (g) for chain down ("+")  *)
  (*      d e f        and (d) and (f) as chain left ("<") and right (">").  *)
  (*        |          Please support this in a newsreader and don't forget  *)
  (*        g          to create reference IDs in replies and follow-up      *)

  d.PrintF ("Chain: -%-5ld +%-5ld <%-5ld >%-5ld\n", Chain[0], Chain[1], Chain[2], Chain[3]);

  d.PrintF ("\n%s\n%s\n", Fields[ums.msgText], Fields[ums.comments]);

  ums.FreeUMSMsg (acc, Args.num^);
CLOSE
  IF acc # NIL THEN
    ums.Logout (acc); acc := 0;
  END;
  IF RD # NIL THEN
    d.FreeArgs (RD); RD := NIL;
  END;
END ReadMessage.
