/* UMSGrouping.c */
/* Messages mit gemeinsamen Merkmalen */
/* Features entfernen */

/*
Umbenenung. Es gibt Verwechslungsprobleme:

     Gruppe/Group ---- UMS: ein Feldbezeichner einer Nachricht
                  ---- NewsBreaker: eine Menge ähnlicher Nachrichten

Deshalb umbenennen:
  Gruppe (Newsbreaker) heißt jetzt "Grouping" vielleicht fällt mir
noch was besseres ein, schaun mer mal :-)
Ein wort gesucht für --> eine Menge gleichartiger Nachrichten
(Messages), die wegen gemeinsamer Regel zusammengefasst wurden;

                 Regeln wie sie z.B. sprachlich ausgedrückt werden können:

                 - "alle neuen Messages"
                 - "alle neuen Msg der Newsgruppe comp.sys.amiga.misc"

                 aber auch

                 - "alle emails von Martin Loos seit zehn Tagen von heute an"


       Der Sinn: flexibles Gruppieren. Idee: grouping als Objekt.
                 d.h. Funktion/Objekt die intern Liste hat. Und auf Anforderung
                 gewisse Daten "rausläßt", "erneuert", "vergißt" ...

                 Man könnte auch die gesamten UMS-Fkt wrappen,
                 in einer einheitlichen Klassenbibliothek.

             umsrootclass                o  kennt LibraryBase. Jeder Prozeß hat eine!
                  \
                umsaccountclass          o  loggt sich ein & aus. Hat account als
                    |                       lokale Instanzdata.
                     \
                   umsgroupingclass      o  eine Instanz dieser Klasse verwaltet
                      |                     ihre eigene Message-Liste,
                      |                     wie einige Zeilen oben angerissen.
                       \
                      umsmessageclass    o  diese letzte Klasse bildet die Struktur einer
                                            einzelnen UMS-Message ab:
                                            eine Instanz hält dann praktischerweise
                                            als Instanzdaten
                                            {
                                              UMSMsgNumFields[]
                                              MessageInfo (V 11)
                                            }
                                            Die Klasse bekommt eine Nachricht ala
                                            UO_NEW + MsgNum und verschafft sich dann
                                            über ihre Superklasse(n) alle wichtigen
                                            Parameter (die in einewr erweiterten Struct
                                            liegen). Dann ist sie wieder "zurück" und
                                            kann UMSRMsg() korrekt aufrufen und ihre Instanz
                                            Daten versuchen auszufüllen.

                                            Bei Msg UO_DISPOSE löscht sie allozierten Speicher.
                                            Und führt UMSFreeMsg() aus.

                                            Dann könnten weitere Methoden wie:
                                            UO_ (to be continued)
*/

/*
 * ChangeFlagsCurrentGroup
 *
 * INPUTS
 *   UMSSet set - welche Flag setzen (z.B. UMSUSTATF_Old)
 *   UMSSet unset - welche Flags löschen
 *
 * RESULT
 *   count -- Anzahl erfolgreich geänderter (Flags set/unset) Messages
 *            30 Messages --> set OLD, unset EXPIRED --> count <= 30
 *
 */

int
ChangeFlagsCurrentGroup (UMSSet set, UMSSet unset)
{
  int count = 0;
  struct List *list = GlobMsgList;
  struct MyNodes *name_node;
  struct MyNodes *next_node;
  int success = 0;
  UMSMsgNum num = 0;

  if (list)
    {
      name_node = (struct MyNodes *) (list->lh_Head);
      while (next_node = (struct MyNodes *) (name_node->node.ln_Succ))
	{
	  /* Messagenummer ermitteln */
	  num = name_node->num;

	  /* Flags bearbeiten: Lösche / Setze Flags einer Message */
	  success = UMSSelectTags (account,
				   UMSTAG_SelUnset, unset,
				   UMSTAG_SelSet, set,
				   UMSTAG_SelQuick, TRUE,
				   UMSTAG_SelMsg, num,
				   TAG_DONE);

	  /* Listenhandling, Zähler: */
	  name_node = next_node;

	  if (!success)
	    {
	      printf ("ChangeFlags: Fehler bei Message Nr. %ld\n", num);
	    }
	  else
	    {
	      count++;
	    }
	}
    }
  else
    printf ("ChangeFlags: Listheader ist nicht vorhanden.\n");
  return (count);
}

