/*
   ***************************************************************************
   *
   * Datei:
   *      RSysPreferenceLists.c
   *
   * Inhalt:
   *
   *      --- Globale Routinen ---
   *
   *    void MakeHeadEntry ( int *num , char *title );
   *    void MakeHexEntry ( int *num , char *title , APTR entry );
   *    void SysEnvList ( void );
   *    void SysExtPrinterData ( void );
   *    void SysPrefList ( void );
   *
   *      --- Lokale  Routinen ---
   *
   *    static void MakeColEntry ( int *num , char *title , long entry );
   *    static void MakeMeasureEntry ( int *num , char *title , long entry , char *measure );
   *    static void MakeNumEntry ( int *num , char *title , long entry );
   *    static void MakeStringEntry ( int *num , char *title , char *entry );
   *    static void MakeTimeEntry ( int *num , char *title , TIMEVAL *tv );
   *
   * Bemerkungen:
   *      Liste der System- und Druckereinstellungen sowie der Env:-Variablen.
   *
   * Erstellungsdatum:
   *      07-Jul-93     Rolf Böhme
   *
   * Änderungen:
   *      07-Jul-93     Rolf Böhme        Erstellung
   *
   ***************************************************************************
 */

#include "RSys.h"
#include "protos.h"

 /*
  * MakeNumEntry() erzeugt ein Zahleneintrag für die
  * anzuzeigende Liste
  */
static void
MakeNumEntry (int *num, char *title, long entry)
{
  sprintf (Entries[*num].se_Entry, "%-22s : %ld", title, entry);
  AddNodeToList (*num, NO_SORT, 0);

  (*num)++;

  return;
}

 /*
  * MakeStringEntry() erzeugt ein Zeileneintrag für die
  * anzuzeigende Liste
  */
static void
MakeStringEntry (int *num, char *title, char *entry)
{
  sprintf (Entries[*num].se_Entry, "%-22s : %s", title, entry);
  AddNodeToList (*num, NO_SORT, 0);

  (*num)++;

  return;
}

 /*
  * MakeHeadEntry() erzeugt eine Titelzeileneintrag für die
  * anzuzeigende Liste
  */
void
MakeHeadEntry (int *num, char *title)
{
  strcpy (Entries[*num].se_Entry, field[BLANK_FIELD]);
  AddNodeToList (*num, NO_SORT, 0);

  (*num)++;

  strncpy (Entries[*num].se_Entry, title, BUFSIZE);
  AddNodeToList (*num, NO_SORT, 0);

  (*num)++;

  return;
}

 /*
  * MakeColEntry() erzeugt ein Zahleneintrag für die
  * anzuzeigende Liste in einem bestimmten Format
  */
static void
MakeColEntry (int *num, char *title, long entry)
{
  sprintf (Entries[*num].se_Entry, "%-22s : 0x%04lX", title, (long) entry);
  AddNodeToList (*num, NO_SORT, 0);

  (*num)++;

  return;
}

 /*
  * MakeHexEntry() erzeugt einen hexadezimalen
  * Zahleneintrag für die anzuzeigende Liste
  */
void
MakeHexEntry (int *num, char *title, APTR entry)
{
  sprintf (Entries[*num].se_Entry, "%-14s : 0x%08lX", title, entry);
  AddNodeToList (*num, NO_SORT, 0);

  (*num)++;

  return;
}

 /*
  * MakeTimeEntry() erzeugt einen Zeiteintrag für die
  * anzuzeigende Liste
  */
static void
MakeTimeEntry (int *num, char *title, TIMEVAL * tv)
{
  sprintf (Entries[*num].se_Entry, "%-22s : %ld sec %-6ld µsec",
	   title, tv->tv_secs, tv->tv_micro);

  AddNodeToList (*num, NO_SORT, 0);

  (*num)++;

  return;
}

 /*
  * MakeMeasureEntry() erzeugt ein Maßzahleneintrag für die
  * anzuzeigende Liste
  */
static void
MakeMeasureEntry (int *num, char *title, long entry, char *measure)
{
  sprintf (Entries[*num].se_Entry, "%-22s : %ld %s",
	   title, (long) entry, measure);

  AddNodeToList (*num, NO_SORT, 0);

  (*num)++;

  return;
}

 /*
  * SysPrefList() listet die Preferenceseinstellungen auf.
  * Diese werden NICHT aus den 2.0-IFF-Prefs-Dateien
  * geholt, sondern mit einer Systemfunktion ausgelesen
  */
void
SysPrefList (void)
{
  int i = 0;
  PREFERENCES PrefCopy, *PCptr;
  char *prtype = "Printer type", *prshade = "Print shade", *prpaper = "Paper size",
   *baudrate = "Baud rate", *parity = "Parity", *handshake = "Handshake",
   *baud = "Baud";

  DPOS;

  HandleHelp (MN_SysPrefList);

  if (PCptr = GetPrefs (&PrefCopy, sizeof (PREFERENCES)))
    {
      PrintHeader (PREFS, NULL);

      EmptyListView ();

      PrintInfo ("Read Preferences", NO_SPEAK, 0);

      countentries = 61;
      Entries = AllocScrollEntries (countentries);

      strcpy (Entries[i].se_Entry, "----- Input/Keyboard:");
      AddNodeToList (i++, NO_SORT, 0);

      MakeTimeEntry (&i, "Keyboard repeat speed", &PCptr->KeyRptSpeed);

      MakeTimeEntry (&i, "Keyboard repeat delay", &PCptr->KeyRptDelay);

      MakeTimeEntry (&i, "Double click time", &PCptr->DoubleClick);


      MakeHeadEntry (&i, "----- Pointer");

      /* Intuition Pointer data */
      MakeNumEntry (&i, "\"Hot spot\" X", (long) PCptr->XOffset);
      MakeNumEntry (&i, "\"Hot spot\" Y", (long) PCptr->YOffset);

      MakeColEntry (&i, "Pointer Sprite Col 0", (long) PCptr->color17);
      MakeColEntry (&i, "Pointer Sprite Col 1", (long) PCptr->color18);
      MakeColEntry (&i, "Pointer Sprite Col 2", (long) PCptr->color19);

      MakeNumEntry (&i, "Pointer Sensitivity", (long) PCptr->PointerTicks);



      MakeHeadEntry (&i, "----- Workbench");

      MakeNumEntry (&i, "Height default font", (long) PCptr->FontHeight);

      MakeColEntry (&i, "Standard Color 0", (long) PCptr->color0);
      MakeColEntry (&i, "Standard Color 1", (long) PCptr->color1);
      MakeColEntry (&i, "Standard Color 2", (long) PCptr->color2);
      MakeColEntry (&i, "Standard Color 3", (long) PCptr->color3);

      MakeNumEntry (&i, "View X-Offset", (long) PCptr->ViewXOffset);
      MakeNumEntry (&i, "View Y-Offset", (long) PCptr->ViewYOffset);
      MakeNumEntry (&i, "View init offset X", (long) PCptr->ViewInitX);
      MakeNumEntry (&i, "View init offset Y", (long) PCptr->ViewInitY);

      MakeNumEntry (&i, "Height default font", (long) PCptr->FontHeight);

      MakeStringEntry (&i, "CLI availability",
		       (PCptr->EnableCLI ? "CLI enabled" : "CLI disabled"));

      MakeStringEntry (&i, "Workbench interlaced",
		       (PCptr->LaceWB ? "Yes" : "No"));

      MakeNumEntry (&i, "Override WB width", (long) PCptr->wb_Width);

      MakeNumEntry (&i, "Override WB height", (long) PCptr->wb_Height);

      MakeNumEntry (&i, "Override WB depth", (long) PCptr->wb_Depth);

      MakeNumEntry (&i, "Extension Info size", (long) PCptr->ext_size);



      MakeHeadEntry (&i, "----- Printer");

      MakeStringEntry (&i, "Printer port",
		    (PCptr->PrinterPort ? "Serial port" : "Parallel port"));

      switch (PCptr->PrinterType)
	{
	case 0x00:
	  MakeStringEntry (&i, prtype, "Custom");
	  break;

	case 0x01:
	  MakeStringEntry (&i, prtype, "Alpha P101");
	  break;

	case 0x02:
	  MakeStringEntry (&i, prtype, "Brother 15XL");
	  break;

	case 0x03:
	  MakeStringEntry (&i, prtype, "CBM MPS1000");
	  break;

	case 0x04:
	  MakeStringEntry (&i, prtype, "Diabolo 630");
	  break;

	case 0x05:
	  MakeStringEntry (&i, prtype, "Diabolo ADV-D25");
	  break;

	case 0x06:
	  MakeStringEntry (&i, prtype, "Diabolo C-150");
	  break;

	case 0x07:
	  MakeStringEntry (&i, prtype, "Epson");
	  break;

	case 0x08:
	  MakeStringEntry (&i, prtype, "Epson JX-80");
	  break;

	case 0x09:
	  MakeStringEntry (&i, prtype, "Okimate 20");
	  break;

	case 0x0A:
	  MakeStringEntry (&i, prtype, "Qume-LP 20");
	  break;

	case 0x0B:
	  MakeStringEntry (&i, prtype, "HP-Laserjet");
	  break;

	case 0x0C:
	  MakeStringEntry (&i, prtype, "HP-Laserjet +");
	  break;

	default:
	  MakeStringEntry (&i, prtype, "Unknown");
	  break;
	}

      MakeStringEntry (&i, "Printer Driver", (char *) PCptr->PrinterFilename);

      MakeNumEntry (&i, "Print pitch", (long) PCptr->PrintPitch);

      MakeStringEntry (&i, "Print quality",
		       (PCptr->PrintQuality ? "Letter" : "Draft"));

      MakeStringEntry (&i, "Lines per inch",
		       (PCptr->PrintSpacing ? "8 LPI" : "6 LPI"));

      MakeNumEntry (&i, "Left margin", (long) PCptr->PrintLeftMargin);

      MakeMeasureEntry (&i, "Right margin", (long) PCptr->PrintRightMargin,
			"Chars");

      MakeStringEntry (&i, "Print image",
		       (PCptr->PrintImage ? "Negative" : "Positive"));

      MakeStringEntry (&i, "Print aspect",
		       (PCptr->PrintImage ? "Vertical" : "Horizontal"));


      switch (PCptr->PrintShade)
	{
	case 0:
	  MakeStringEntry (&i, prshade, "Black/White");
	  break;

	case 1:
	  MakeStringEntry (&i, prshade, "Grey scale");
	  break;

	default:
	  MakeStringEntry (&i, prshade, "Color");
	  break;
	}

      MakeNumEntry (&i, "Print Threshold", (long) PCptr->PrintThreshold);

      switch (PCptr->PaperSize)
	{
	case US_LETTER:
	  MakeStringEntry (&i, prpaper, "USA Letter");
	  break;

	case US_LEGAL:
	  MakeStringEntry (&i, prpaper, "USA Legal");
	  break;

	case N_TRACTOR:
	  MakeStringEntry (&i, prpaper, "Narrow tractor");
	  break;

	case W_TRACTOR:
	  MakeStringEntry (&i, prpaper, "Wide tractor");
	  break;

	case CUSTOM:
	  MakeStringEntry (&i, prpaper, "Custom width");
	  break;

	}

      MakeMeasureEntry (&i, "Paper length", (long) PCptr->PaperLength,
			"Rows");

      MakeStringEntry (&i, "Paper type",
		     (PCptr->PaperType ? "Single paper" : "Fanfold paper"));

#if 0
/*GMD 08Jul95 ; WorkName undefined */

      MakeStringEntry (&i, "Temp file for printer",
		     ((PCptr->WorkName != NULL) ? (char *) PCptr->WorkName :
		      (char *) "None"));
#endif

      MakeNumEntry (&i, "Affect Rows/Columns", (long) PCptr->RowSizeChange);

      sprintf (Entries[i].se_Entry, "User preference flags  : 0x%08lX",
	       PCptr->PrintFlags);
      AddNodeToList (i++, NO_SORT, 0);

      MakeMeasureEntry (&i, "Max width of picture", (long) PCptr->PrintMaxWidth / 10,
			"inch");

      MakeMeasureEntry (&i, "Max height of picture", (long) PCptr->PrintMaxHeight / 10,
			"inch");
      MakeMeasureEntry (&i, "Offset of picture", (long) PCptr->PrintXOffset / 10,
			"inch");
      MakeNumEntry (&i, "Print density", (long) PCptr->PrintDensity);



      MakeHeadEntry (&i, "----- Serial configuration");

      switch (PCptr->BaudRate)
	{
	case 0x00:
	  MakeMeasureEntry (&i, baudrate, 110L, baud);
	  break;

	case 0x01:
	  MakeMeasureEntry (&i, baudrate, 300L, baud);
	  break;

	case 0x02:
	  MakeMeasureEntry (&i, baudrate, 1200L, baud);
	  break;

	case 0x03:
	  MakeMeasureEntry (&i, baudrate, 2400L, baud);
	  break;

	case 0x04:
	  MakeMeasureEntry (&i, baudrate, 4800L, baud);
	  break;

	case 0x05:
	  MakeMeasureEntry (&i, baudrate, 9600L, baud);
	  break;

	case 0x06:
	  MakeMeasureEntry (&i, baudrate, 19200L, baud);
	  break;

	case 0x07:
	  MakeStringEntry (&i, baudrate, "MIDI (31.250 baud)");
	  break;

	default:
	  MakeStringEntry (&i, baudrate, (char *) field[NO_BAUD]);
	  break;
	}

      MakeNumEntry (&i, "Read bits", (long) SRBNUM (PCptr->SerRWBits));
      MakeNumEntry (&i, "Write bits", (long) SWBNUM (PCptr->SerRWBits));

      MakeNumEntry (&i, "Stop bits", (long) SSBNUM (PCptr->SerStopBuf));

      switch (SPARNUM (PCptr->SerParShk))
	{
	case SPARITY_NONE:
	  MakeStringEntry (&i, parity, "None");
	  break;

	case SPARITY_EVEN:
	  MakeStringEntry (&i, parity, "Even");
	  break;

	case SPARITY_ODD:
	  MakeStringEntry (&i, parity, "Odd");
	  break;

	default:
	  MakeStringEntry (&i, parity, (char *) field[NO_PARITY]);
	  break;
	}

      switch (SHAKNUM (PCptr->SerParShk))
	{
	case SHSHAKE_XON:
	  MakeStringEntry (&i, handshake, "XOn/XOff");
	  break;

	case SHSHAKE_RTS:
	  MakeStringEntry (&i, handshake, "RTS/CTS");
	  break;

	case SHSHAKE_NONE:
	  MakeStringEntry (&i, handshake, "None");
	  break;

	default:
	  MakeStringEntry (&i, handshake, (char *) field[NO_HANDSHK]);
	  break;
	}
    }
  else
    ErrorHandle ("GetPrefs()", ENV_ERR, INFO_FAIL, NO_KILL);

  PrintStatistics ();

  return;
}


 /*
  * SysEnvList() erzeugt eine Liste aller Dateien
  * (Environmentvariablen) im Verzeichnis ENV:
  */
void
SysEnvList (void)
{
  int i;
  UBYTE envline[MAXFULLNAME + 1];
  char envname[ENVLEN + 1], envfullname[MAXFULLNAME];
  EXALLCONTROL *eac;
  EXALLDATA *EAData, *ead;
  int more;
  long s;
  int d = 0;
  BPTR lock;
  int ftyp;

  DPOS;

  HandleHelp (MN_SysEnvList);

  PrintHeader (ENVVARS, NULL);

  EmptyListView ();

  if (lock = Lock ((UBYTE *) "ENV:", ACCESS_READ))
    {
      countentries = SizeOfDir (lock, &s, &d);
      countentries += d;

      if (NoEntries ())
	{
	  UnLock (lock);
	  return;
	}

      Entries = AllocScrollEntries (countentries);

      i = 0;

      if (eac = AllocDosObject (DOS_EXALLCONTROL, NULL))
	{
	  eac->eac_LastKey = 0;

	  EAData = MyAllocVec ((MAXLARGEMEM + 1) * sizeof (EXALLDATA),
			       MEMF_ANY | MEMF_CLEAR, NO_KILL);

	  if (EAData)
	    {
	      do
		{
		  more = ExAll (lock, EAData, MAXLARGEMEM * sizeof (EXALLDATA),
				ED_TYPE, eac);

		  if ((!more) && (IoErr () != ERROR_NO_MORE_ENTRIES))
		    {
		      ErrorHandle ("ENV:", DOS_EXALL_ERR, EXALL_FAIL, NO_KILL);
		      break;
		    }

		  if (eac->eac_Entries == 0)
		    continue;

		  ead = EAData;

		  do
		    {
		      strncpy (envname, (char *) ead->ed_Name, ENVLEN);
		      envname[ENVLEN] = STRINGEND;
		      sprintf (envfullname, "ENV:%s", envname);

		      ftyp = filetype ((char *) envfullname);

		      if (ead->ed_Type > 0)
			sprintf (Entries[i].se_Entry, EntryAttr[ENVVARS].ea_dataformat,
				 envname, "<dir>");
		      else if (ftyp == TYPE_TEXT)
			{
			  if (GetVar ((STRPTR) envname, envline, MAXFULLNAME, GVF_GLOBAL_ONLY) > 0)
			    {
			      envline[MAXSTRLEN - 1] = STRINGEND;

			      sprintf (Entries[i].se_Entry, EntryAttr[ENVVARS].ea_dataformat,
				       envname, (char *) envline);
			    }
			  else
			    sprintf (Entries[i].se_Entry,
				     EntryAttr[ENVVARS].ea_dataformat,
				     envname, "<env error>");
			}
		      else
			sprintf (Entries[i].se_Entry,
				 EntryAttr[ENVVARS].ea_dataformat,
				 envname, "<no text>");

		      AddNodeToList (i++, SORT, 0);

		      ead = ead->ed_Next;
		    }
		  while (ead && (i < countentries));
		}
	      while (more && (i < countentries));

	      MyFreeVec (EAData);
	    }

	  FreeDosObject (DOS_EXALLCONTROL, eac);
	}
      else
	ErrorHandle ("AllocDosObject()", MEMORY_ERR, ALLOC_FAIL, NO_KILL);

      UnLock (lock);
    }
  else
    {
      ErrorHandle ("ENV:-Lock", ENV_ERR, FIND_FAIL, NO_KILL);
      return;
    }

  PrintStatistics ();

  return;
}



void
SysExtPrinterData (void)
{
  union printerIO
  {
    IOSTDREQ ios;
    IODRPREQ iodrp;
    IOPRTCMDREQ iopc;
  }
   *PIO;
  MSGPORT *PrinterMP;
  PRINTERDATA *PD;
  PRINTEREXTENDEDDATA *PED;
  int i = 0;

  DPOS;

  HandleHelp (MN_SysExtPrinterData);

  PrintHeader (E_PRINTERDATA, NULL);

  EmptyListView ();

  countentries = 13;
  Entries = AllocScrollEntries (countentries);

  if (PrinterMP = (MSGPORT *) CreateMsgPort ())
    {
      if (PIO = (union printerIO *) CreateExtIO (PrinterMP,
						 sizeof (union printerIO)))
	{
	  if (!(OpenDevice ((STRPTR) "printer.device", 0,
			    (IOREQUEST *) PIO, 0)))
	    {
	      PD = (PRINTERDATA *) PIO->iodrp.io_Device;
	      PED = (PRINTEREXTENDEDDATA *) & PD->pd_SegmentData->ps_PED;

	      MakeStringEntry (&i, "Printer name", PED->ped_PrinterName);
	      MakeNumEntry (&i, "Version", (long) PD->pd_SegmentData->ps_Version);
	      MakeNumEntry (&i, "Revision", (long) PD->pd_SegmentData->ps_Revision);

	      MakeNumEntry (&i, "Printer class", (long) PED->ped_PrinterClass);
	      MakeNumEntry (&i, "Color class", (long) PED->ped_ColorClass);

	      MakeNumEntry (&i, "Print columns", (long) PED->ped_MaxColumns);
	      MakeNumEntry (&i, "Char sets", (long) PED->ped_NumCharSets);
	      MakeNumEntry (&i, "Print head pins", (long) PED->ped_NumRows);

	      MakeMeasureEntry (&i, "Max X-dots in dump", PED->ped_MaxXDots, "dots");
	      MakeMeasureEntry (&i, "Max Y-dots in dump", PED->ped_MaxYDots, "dots");
	      MakeMeasureEntry (&i, "Density X", (long) PED->ped_XDotsInch, "dots/inch");
	      MakeMeasureEntry (&i, "Density Y", (long) PED->ped_YDotsInch, "dots/inch");
	      MakeMeasureEntry (&i, "Timeout", (long) PED->ped_TimeoutSecs, "sec");

	      CloseDevice ((IOREQUEST *) PIO);
	    }

	  DeleteExtIO ((IOREQUEST *) PIO);
	}

      DeleteMsgPort ((MSGPORT *) PrinterMP);
    }

  PrintStatistics ();

  return;
}
