(* ------------------------------------------------------------------------
  :Program.       SelectMail
  :Contents.      selects all messages addressed to a certain user
  :Author.        Martin Horneffer [mh]
  :Address.       Snail Mail:              EMail:
  :Address.       Warmweiherstraße 18      UUCP: mh@umshq.adsp.sub.org
  :Address.       D-5100 Aachen            FIDO: 2:242/7.9
  :History.       v?.? [mh]  15-Apr-92
  :History.       v1.0 [kai] 04-Apr-93 adepted to new interfaces
  :Copyright.     Public Domain
  :Language.      Oberon
  :Translator.    AMIGA OBERON v3.01d
  :Imports.       ums, MHArgs
------------------------------------------------------------------------ *)
MODULE SelectMail;

IMPORT ums, MHArgs, io, u:Utility, sys:SYSTEM, NoGuru;

VAR
  login		: LONGINT;
  cfg		: MHArgs.Config;
  name,pwd,sname: ARRAY 256 OF CHAR;

  result	: LONGINT;

PROCEDURE CheckErr();
  VAR err: INTEGER; txt:ums.STRPTR;
  BEGIN
    err := ums.ErrNum( login );
    IF err # ums.ok THEN
      io.WriteString("UMS-error:");
      io.WriteInt( err, 3);
      io.WriteString(", '");
      txt := ums.ErrTxt( login );
      io.WriteString(txt^);
      io.WriteString("'\n");
      HALT(20);
    END;
  END CheckErr;

BEGIN
  cfg := MHArgs.OpenConfig( "NAME/A,PASSWORD/A,SELECT-NAME","Select Mail 1.0 - © 4.4.1992 by Martin Horneffer\n"
                            "Select messages addressed to a certain user.\n\n"
                            "name, password : your name and password for UMS.\n"
                            "   select-name : select all messages that are addressed to this user.\n"
                            "                 This is done by the 'to'-field as well as by threads.\n"
                            "                 Default is same as 'name'\n"
                            "\o$VER: SelectMail 1.0 (4.4.93)\n\r", NIL);

  IF cfg = NIL THEN  HALT(20)  END;
  IF cfg.GetString( "NAME", name) & cfg.GetString( "PASSWORD", pwd)  THEN
    IF ~cfg.GetString( "SELECT-NAME", sname) THEN  sname := name  END;

    login := ums.Login( name, pwd);
    IF login = 0 THEN
      io.WriteString("login failure\n");
    ELSE

    (* NOTE: since we just logged in all local flags are cleared.    *)
    (*       Usually you'll have to clear them by hand before using. *)


    (* set local flag 0 on all new messages *)

    io.WriteString("looking for new messages: ");
    result := ums.UMSSelectTags( login,
      ums.tagSelMask,		LONGSET{ums.ViewAccess,ums.postPoned,ums.Old},
      ums.tagSelMatch,		LONGSET{ums.ViewAccess},

      ums.tagSelWriteLocal,	1,
      ums.tagSelSet,		LONGSET{0},
      ums.tagSelUnset,		LONGSET{},
      u.done);
    io.WriteInt( result, 1);  io.WriteString(" found.\n");
    CheckErr();


    (* set local flag 1 on all messages with matching TONAME *)

    io.WriteString("selecting by name: ");
    result := ums.UMSSelectTags( login,
      ums.tagToName,		sys.ADR(sname),

      ums.tagSelWriteLocal,	1,
      ums.tagSelSet,		LONGSET{1},
      ums.tagSelUnset,		LONGSET{},
      ums.tagSelQuick,		1,
      u.done);
    io.WriteInt( result, 1);  io.WriteString(" selected.\n");
    CheckErr();

    (* set local flag 4 for the new ones amongst them *)

    io.WriteString("  new messages amongst these: ");
    result := ums.UMSSelectTags( login,
      ums.tagSelReadLocal,	1,
      ums.tagSelMask,		LONGSET{0,1},
      ums.tagSelMatch,		LONGSET{0,1},

      ums.tagSelWriteLocal,	1,
      ums.tagSelSet,		LONGSET{4},
      ums.tagSelUnset,		LONGSET{},
      ums.tagSelQuick,		1,
      u.done);
    io.WriteInt( result, 1);  io.WriteString(".\n");
    CheckErr();


    (* set local flag 2 on all messages with matching FROMNAME *)

    io.WriteString("looking for messages written by you: ");
    result := ums.UMSSelectTags( login,
      ums.tagFromName,		sys.ADR(sname),

      ums.tagSelWriteLocal,	1,
      ums.tagSelSet,		LONGSET{2},
      ums.tagSelUnset,		LONGSET{},
      ums.tagSelQuick,		1,
      u.done);
    io.WriteInt( result, 1);  io.WriteString(" found.\n");
    CheckErr();

    (* set local flag 3 on all replies to  messages with flag 2 *)

    io.WriteString("selecting replies to your msgs: ");
    result := ums.UMSSelectTags( login,
      ums.tagSelReadLocal,	1,
      ums.tagSelParent,		1,
      ums.tagSelMask,		LONGSET{2},
      ums.tagSelMatch,		LONGSET{2},

      ums.tagSelWriteLocal,	1,
      ums.tagSelSet,		LONGSET{3},
      ums.tagSelUnset,		LONGSET{},
      ums.tagSelQuick,		1,
      u.done);
    io.WriteInt( result, 1);  io.WriteString(" selected.\n");
    CheckErr();

    (* set local flag 4 for the new ones amongst them *)

    io.WriteString("  new messages amongst these: ");
    result := ums.UMSSelectTags( login,
      ums.tagSelReadLocal,	1,
      ums.tagSelMask,		LONGSET{0,3},
      ums.tagSelMatch,		LONGSET{0,3},

      ums.tagSelWriteLocal,	1,
      ums.tagSelSet,		LONGSET{4},
      ums.tagSelUnset,		LONGSET{},
      ums.tagSelQuick,		1,
      u.done);
    io.WriteInt( result, 1);  io.WriteString(".\n");
    CheckErr();


    (* set user-flag 7 on all messages with local flag 4 set *)

    io.WriteString("totally selected: ");
    result := ums.UMSSelectTags( login,
      ums.tagSelReadLocal,	1,
      ums.tagSelMask,		LONGSET{4},
      ums.tagSelMatch,		LONGSET{4},

      ums.tagSelSet,		LONGSET{ums.selected},
      ums.tagSelUnset,		LONGSET{},
      u.done);
    io.WriteInt( result, 1);  io.WriteString(".\n");
    CheckErr();

    END;
  END;

CLOSE
  IF login # 0 THEN  ums.Logout(login)  END;
END SelectMail.
