/*
***************************************************************************
*
* Datei:
*    RSysHandlerList.c
*
* Inhalt:
*    void MakeHandlerList(void);
*
* Bemerkungen:
*    Erzeugung einer Liste von Inputhandlern.
*
* Erstellungsdatum:
*    07-Jul-93    Rolf Böhme
*
* Änderungen:
*    07-Jul-93    Rolf Böhme    Erstellung
*
***************************************************************************
*/

#include "RSysDebug.h"
#include "RSysFunc.h"

   /*
    * MakeHandlerList() erzeugt eine Liste aller angemeldeten
    * InputHandler im System. Dazu muß ein Dummy-Handler
    * installiert werden und über diesen werden die anderen
    * InputHandler gefunden. Es existiert keine (!) öffentliche
    * Liste mit allen InputHandlern.
    */
void
MakeHandlerList(void)
{
   int   count = 0,
         i = 0;
   struct MsgPort *InputDevPort = NULL;
   struct IOStdReq *InputRequestBlock = NULL;
   struct Interrupt HandlerStuff;
   struct Node *LoopNode,
        *StartNode,
        *node;

   DPOS;

   if (InputDevPort = (struct MsgPort *)CreatePort((UBYTE *) "RSys-Check-Port", NULL))
   {
      if (InputRequestBlock = (struct IOStdReq *)CreateStdIO(InputDevPort))
      {
         if (!OpenDevice((UBYTE *) "input.device", 0,
                         (struct IORequest *) InputRequestBlock, 0))
         {
            HandlerStuff.is_Code = NULL;
            HandlerStuff.is_Data = NULL;
            HandlerStuff.is_Node.ln_Pri = -127;
            HandlerStuff.is_Node.ln_Name = "RSys-Check-Handler";

            InputRequestBlock->io_Command = IND_ADDHANDLER;
            InputRequestBlock->io_Data = (APTR) & HandlerStuff;

            DoIO((struct IORequest *) InputRequestBlock);

               /*
                * Da InputHandler über Interrupts gesteuert werden
                * ist hier zum Auslesen ein Disable()/Enable()-
                * Paar zu verwenden
                */
            Disable();

            for (LoopNode = (struct Node *) & (HandlerStuff.is_Node);
                 LoopNode && LoopNode->ln_Pred;
                 LoopNode = LoopNode->ln_Pred) ;

            StartNode = LoopNode->ln_Succ;

            for (node = StartNode; node->ln_Succ;
                 node = node->ln_Succ)
               if (node != (struct Node *) & (HandlerStuff.is_Node))
                  count++;

            Enable();

            countentries = count;

            if(NOT(NoEntries()))
            {
               Entries = AllocScrollEntries(countentries);

               Disable();

               for (LoopNode = (struct Node *) & (HandlerStuff.is_Node);
                    LoopNode && LoopNode->ln_Pred;
                    LoopNode = LoopNode->ln_Pred) ;

               StartNode = LoopNode->ln_Succ;

               for (node = StartNode; node->ln_Succ && (i < countentries);
                    node = node->ln_Succ)
                  if (node != (struct Node *) & (HandlerStuff.is_Node))
                  {
                     savestrcpy(Entries[i].se_obj_id.fullname, node,
                                PARTSIZE, NT_INTERRUPT);

                     sprintf(Entries[i].se_Entry,
                             EntryAttr[INPUTHDL].ea_dataformat,
                             Entries[i].se_obj_id.fullname,
                             node->ln_Pri,
                             (long)((struct Interrupt *) node)->is_Data,
                             (long)((struct Interrupt *) node)->is_Code);

                     i++;
                  }

               countentries = i;

               Enable();

               CreateEntryList(SORT);
            }

            InputRequestBlock->io_Command = IND_REMHANDLER;
            InputRequestBlock->io_Data = (APTR) & HandlerStuff;

            DoIO((struct IORequest *) InputRequestBlock);

            CloseDevice((struct IORequest *) InputRequestBlock);
         }
         else
            ErrorHandle(DEVICE_ERR, OPEN_FAIL, NO_KILL);

         DeleteStdIO(InputRequestBlock);
      }
      else
         ErrorHandle(MISC_ERR, CREATE_FAIL, NO_KILL);

      DeletePort(InputDevPort);
   }
   else
      ErrorHandle(PORT_ERR, CREATE_FAIL, NO_KILL);

   return;
}
