/*
 * Newsbreaker.c
 *
 * Hier das Hauptprogramm, incl. main().
 *
 */

#include <Includes.h>	        /* System-/OS-Includes, -Protos */
#include <Globals.h>		/* globale Variablen */
#include <Protos.h>             /* Funktions-Prototypen */
#include <Module.h>		/* Funktionen */


/*
 * Lieber Leser, liebe Leserin.
 *
 * Vielen Dank für Dein Interesse am NewsBreaker-Source.
 *
 * Dieser Code ist das Ergebnis von zwei Jahren UMS-
 * und C- "Learning by doing".
 *
 * ACHTUNG
 * die längeren Kommentare, Texte zu Systemroutinen usw. habe
 * ich in erster Line für mich geschrieben. Mein Ziel
 * war, die Funktionen besser zu verstehen.
 *
 * Also: bitte
 * meine Texte nicht zu wörtlich nehmen. Sie sind
 * kein Ersatz für den Blick in die "richtige"
 * Dokumentation oder Original-Autodocs.
 *
 * Außerdem benutze ich (als Hobbyprogrammierer) mal den einen
 * oder anderen Fachbegriff auf meine eigene Art.
 *
 * Ich denke, die Texte sind eine gute Zusammenfassung:
 * deshalb ideal für den ersten Überblick und
 * schnellen Einstieg.
 *
 *
 * Wer Fehler findet, Vorschläge bringt:
 * über jede Korrektur, jeden Tip
 * freue ich. Idealerweise als E-Mail.
 * Bitte Originaltext kurz zitieren.
 *
 * An:  <sm@mk2.maus.sauerland.de>.
 * Thanks in advance!
 */



#define MINLIB 39		/* Mindestversion für AmigaOS-Libraries*/

int
main (int argc, char *argv[])
{
  BOOL okay = FALSE;
  ULONG exitvalue = NULL;
  TextFieldBase = NULL;

  printf ("\n\n\n--------- Programm Start " NB_VERSION " ---\n\n");

/* Öffne benötigte Libraries. Exec und Dos sind schon offen */

  if (IntuitionBase = OpenLib ("intuition.library", MINLIB))
    if (GfxBase = OpenLib ("graphics.library", MINLIB))
      if (IFFParseBase = OpenLib ("iffparse.library", MINLIB))
	if (GadToolsBase = OpenLib ("gadtools.library", MINLIB))
	  if (UtilityBase = OpenLib ("utility.library", MINLIB))
	    if (DataTypesBase = OpenLib ("datatypes.library", MINLIB))
	      if (DiskFontBase = OpenLib ("diskfont.library", MINLIB))
		if (UMSBase = OpenLib ("ums.library", 11L))
		  if (UMSSupportBase = OpenLib ("umssupport.library", 0L))
		    if (TextFieldBase = OpenLib ("gadgets/textfield.gadget", 0))
		      if (gLib = OpenLib ("gadgets/button.gadget", 37))
			if (TextLabelBase = OpenLibrary ("textitem.class", 0))
			  if (ItemListBase = OpenLibrary ("itemlist.class", 0))
			    if (CompListViewBase = OpenLibrary ("complistview.class", 0))
			      {
				okay = TRUE;	/* alles ist da */
			      }
			    else
			      {
				if (IntuitionBase)	/*  (ShowError() öffnet Intuition/EasyRequest) */
				  ShowError ("Nicht alle Libraries wurden erfolgreich geöffnet.\nAbbruch!");
			      }

/*
   todo: UMS Standard für Login implementieren.

   Prob: wie wird WBench-Message korrekt ausgewertet? Außerdem
   muß ein GUI dafür gebaut werden, drei string.gadgets usw. ala
   IntuiNews.
 */

  if (okay)
    {
      okay = Login ();		/* beschaffe diese Strings */
    }

  if (okay)
    {
      account = UMSRLogin (server, user, passwd);
      if (!account)
	{
	  ShowError ("Login fehlgeschlagen.\nAbbruch!");
	}
    }

  if (account)
    {
      ReadConfig ();
    }

/*
   Fenster öffnen.
   Die zahlreichen Parameter in OpenWindowTags() bestimmen Aussehen und
   Eigenschaften des NewsBreaker-Fensters: 
   - Wie groß?
   - Welche System-Gadgets?

   Parameter:
   Kann das Fenster verschoben werden, kann es auf einem anderen Screen
   auftauchen, eventuell als 'Backdrop' komplett ausfüllen? (n/a)

   Taglisten:
   Es könnte eine Prefs-Tagliste geben, die ti-Data Werte in die hardcoded
   Tagliste werden gemischt.
 */

  if (account)
    {
      TextFieldClass = TEXTFIELD_GetClass ();

      /* Hauptfenster öffnen */
      Mywindow = OpenWindowTags (NULL,
				 WA_Flags, WFLG_DEPTHGADGET |
				 WFLG_DRAGBAR |
				 WFLG_CLOSEGADGET |
				 WFLG_SIZEGADGET |
				 WFLG_SIZEBBOTTOM |
				 WFLG_SIZEBRIGHT,
				 WA_Activate, TRUE,
				 WA_IDCMP, IDCMP_CLOSEWINDOW |
				 IDCMP_REFRESHWINDOW |
				 IDCMP_VANILLAKEY |
				 IDCMP_RAWKEY |
				 IDCMP_GADGETUP |
				 IDCMP_IDCMPUPDATE |
				 IDCMP_MENUPICK,
				 WA_Top, 5,
				 WA_Left, 10,
				 WA_NewLookMenus, TRUE,
				 WA_ScreenTitle, NB_VERSION,
				 WA_Title, NB_NAME,	/* Title "NewsBreaker" */
      				 //WA_Width, 0,
      				 //WA_Height, 0,
				 TAG_DONE);
    }

/*
   1. Signale.
   -----------
   Unter Amiga OS warten Tasks und Prozesse auf bestimmte
   Signale. Der Wert im mp_SigBit-Feld vom Window-Userport
   ist die Nummer eines bestimmten Signals. Auf dieses
   Signal wartet NewsBreaker.

   Ereignisse, die bei Fenstern auftreten, erzeugen ein Signal für den
   NewsBreaker-Prozeß. Beispiele: Menupunkt ausgewählt, Gadget angeklickt,
   Taste gedrückt.

   Das Signal erreicht den wartenden Prozeß. NewsBreaker wacht auf
   und verarbeitet die dann eventuell eingetroffenen Messages. Zu
   den Messages mehr in <MainLoop.c>.

   2. DrawInfo.
   ------------
   DrawInfo wurde in OS 2.0 eingeführt, um das allgemeine
   Aussehen von Amiga-GUIs zu verbessern. DrawInfo enthält
   u.a. Farbnummern (pens) für zahlreiche Grafikelemente.
   NewsBreaker richtet sich nach diesen (User-)Vorgaben. Grafiken
   und Schriften werden passend zur restlichen, nicht-
   NewsBreaker-Oberfläche eingefärbt. Das ergibt ein einheitliches
   Erscheinungsbild.

   GetScreenDrawInfo() holt die DrawInfo-Struktur systemkonform aus der
   Screen-Struktur, beachtet Zugriffsrechte auf die Screen-Struktur.
 */

  if (Mywindow)
    {
      window_sig = 1L << Mywindow->UserPort->mp_SigBit;		/* Signal für IDCMP */
      sigs = window_sig;
      dri = GetScreenDrawInfo (Mywindow->WScreen);	/* DrawInfo */
    }

  if (dri)
    {
      pens = dri->dri_Pens;

      /* Abstände Gadgets zu Rahmen festlegen todo */

/* dies wird eine IBox: A data structure common in V36 Intuition
   processing: struct IBox { WORD Left; WORD Top; WORD Width; WORD Height;}; */

      /*IBox gap */
      gap_w = Mywindow->RPort->TxWidth;
      gap_h = Mywindow->RPort->TxHeight;

      /* setze Rahmen Informationsfeldes infobar todo */
      /* das wird eine IBox infobar */
      infobar_h = (Mywindow->RPort->TxHeight * 3) / 2;

      /* Ändere die Fensterausdehnung */
      WindowLimits (Mywindow, 160, Mywindow->BorderTop + Mywindow->BorderBottom + Mywindow->WScreen->RastPort.TxHeight + 46, -1, -1);
      creategads (Mywindow);	/* BOOPSI Gadgets */

      okay = CreateMyMenus ();	/* Intuition Menus erzeugen */

    }
  else
    {
      okay = FALSE;
    }

  if (okay)
    {
      /* Displayfeld löschen -- todo */
      InfoBarClear (Mywindow, infobar_h);	/* todo */

      MainLoop ();		/* Einsprung in Hauptschleife */
    }
  else
    {
      ShowError ("SCHWERER FEHLER!\nKonnte MainLoop nicht starten\n");
    }

/*----------------- Aufräumen -------------------- */


  if (Mywindow)
    {
      RemoveMyMenus ();		/* Intuition Menus entfernen */

      if (gLib)
	{
	  deletegads (Mywindow);
	  CloseLibrary ((struct Library *) gLib);
	}
      CloseWindow (Mywindow);
    }

  if (account)
    {
      UMSLogout (account);
    }


/* globale Listen */

  if (GlobGroupList)
    {
      FreeMyList (GlobGroupList); /* interne Liste löschen */
      GlobGroupList = NULL;
    }

  if (GlobMsgList)
    {
      SetGlobMsgList (NULL);	/* Globale korrigieren */
      SetGlobMsgGroup (NULL);	/* String löschen */
    }

  if (AktMsgGroup)
    {
      printf ("free(AktMsgGroup) String %s\n", AktMsgGroup);
      free (AktMsgGroup);
      AktMsgGroup = NULL;
    }

  CloseLibrary (IntuitionBase);
  CloseLibrary (GfxBase);
  CloseLibrary (IFFParseBase);
  CloseLibrary (GadToolsBase);
  CloseLibrary (UtilityBase);
  CloseLibrary (DataTypesBase);
  CloseLibrary (DiskFontBase);
  CloseLibrary (UMSBase);
  CloseLibrary (UMSSupportBase);
  CloseLibrary (ItemListBase);
  CloseLibrary (TextLabelBase);
  CloseLibrary (CompListViewBase);

  TextFieldClass = NULL;
  CloseLibrary (TextFieldBase);


  printf ("--------- Programm Ende " NB_VERSION " ---\n");

  exit (exitvalue);

/* todo: check ob alle Ressourcen geschlossen werden. */
/* todo: 17K wurden/werden nicht freigegeben !!! */

}				/* END MAIN */
