/*
***************************************************************************
*
* Datei:
*    RSysPreferenceLists.c
*
* Inhalt:
*    void SysPrefList(void);
*    void SysEnvList(void);
*    void SysExtPrinterData(void);
*
* 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 "RSysDebug.h"
#include "RSysFunc.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);

   (*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);

   (*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);

   (*num)++;

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

   (*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);

   (*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);

   (*num)++;

   return;
}

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

   AddNodeToList(*num, NO_SORT);

   (*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);

   (*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;
   struct Preferences PrefCopy,
        *PCptr;
   char *prtype = "Printer type",
        *prshade = "Print shade",
        *prpaper = "Paper size",
        *baudrate = "Baud rate",
        *parity = "Parity",
        *handshake = "Handshake",
        *baud = "Baud";

   DPOS;

   if (PCptr = GetPrefs(&PrefCopy, sizeof(struct 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);

      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"));

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

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

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

      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(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];
   struct ExAllControl *eac;
   struct ExAllData *EAData,
        *ead;
   int   more;
   long  s;
   int   d = 0;
   BPTR  lock;
   int ftyp;

   DPOS;

   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(struct ExAllData),
                             MEMF_ANY | MEMF_CLEAR, NO_KILL);

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

               if ((!more) && (IoErr()!= ERROR_NO_MORE_ENTRIES))
               {
                  ErrorHandle(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[18].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[18].ea_dataformat,
                                envname, (char *)envline);
                     }
                     else
                        sprintf(Entries[i].se_Entry,
                                EntryAttr[18].ea_dataformat,
                                envname, "<env error>");
                  }
                  else
                     sprintf(Entries[i].se_Entry,
                             EntryAttr[18].ea_dataformat,
                             envname, "<no text>");

                  AddNodeToList(i++, SORT);

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

            MyFreeVec(EAData);
         }

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

      UnLock(lock);
   }
   else
   {
      ErrorHandle(ENV_ERR, FIND_FAIL, NO_KILL);
      return;
   }

   PrintStatistics();

   return;
}



void
SysExtPrinterData(void)
{
   union printerIO
   {
       struct IOStdReq    ios;
       struct IODRPReq    iodrp;
       struct IOPrtCmdReq iopc;
   } *PIO;
   struct MsgPort *PrinterMP;
   struct PrinterData *PD;
   struct PrinterExtendedData *PED;
   int i = 0;

   DPOS;

   PrintHeader(PRINTERDATA, NULL);

   EmptyListView();

   countentries = 13;
   Entries = AllocScrollEntries(countentries);

   if (PrinterMP = (struct MsgPort *) CreateMsgPort())
   {
      if (PIO = (union printerIO *) CreateExtIO(PrinterMP,
                                                sizeof(union printerIO)))
      {
         if (!(OpenDevice((STRPTR)"printer.device", 0,
                          (struct IORequest *) PIO, 0)))
         {
            PD = (struct PrinterData *) PIO->iodrp.io_Device;
            PED = (struct 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((struct IORequest *) PIO);
         }

         DeleteExtIO((struct IORequest *) PIO);
      }

      DeleteMsgPort((struct MsgPort *) PrinterMP);
   }

   PrintStatistics();

   return;
}
