home *** CD-ROM | disk | FTP | other *** search
/ World of A1200 / World_Of_A1200.iso / programs / monitors / rsys / source.lha / src / RSysHandlerList.c < prev    next >
C/C++ Source or Header  |  1995-01-09  |  4KB  |  143 lines

  1. /*
  2. ***************************************************************************
  3. *
  4. * Datei:
  5. *    RSysHandlerList.c
  6. *
  7. * Inhalt:
  8. *    void MakeHandlerList(void);
  9. *
  10. * Bemerkungen:
  11. *    Erzeugung einer Liste von Inputhandlern.
  12. *
  13. * Erstellungsdatum:
  14. *    07-Jul-93    Rolf Böhme
  15. *
  16. * Änderungen:
  17. *    07-Jul-93    Rolf Böhme    Erstellung
  18. *
  19. ***************************************************************************
  20. */
  21.  
  22. #include "RSysDebug.h"
  23. #include "RSysFunc.h"
  24.  
  25.    /*
  26.     * MakeHandlerList() erzeugt eine Liste aller angemeldeten
  27.     * InputHandler im System. Dazu muß ein Dummy-Handler
  28.     * installiert werden und über diesen werden die anderen
  29.     * InputHandler gefunden. Es existiert keine (!) öffentliche
  30.     * Liste mit allen InputHandlern.
  31.     */
  32. void
  33. MakeHandlerList(void)
  34. {
  35.    int   count = 0,
  36.          i = 0;
  37.    struct MsgPort *InputDevPort = NULL;
  38.    struct IOStdReq *InputRequestBlock = NULL;
  39.    struct Interrupt HandlerStuff;
  40.    struct Node *LoopNode,
  41.         *StartNode,
  42.         *node;
  43.  
  44.    DPOS;
  45.  
  46.    if (InputDevPort = (struct MsgPort *)CreatePort((UBYTE *) "RSys-Check-Port", NULL))
  47.    {
  48.       if (InputRequestBlock = (struct IOStdReq *)CreateStdIO(InputDevPort))
  49.       {
  50.          if (!OpenDevice((UBYTE *) "input.device", 0,
  51.                          (struct IORequest *) InputRequestBlock, 0))
  52.          {
  53.             HandlerStuff.is_Code = NULL;
  54.             HandlerStuff.is_Data = NULL;
  55.             HandlerStuff.is_Node.ln_Pri = -127;
  56.             HandlerStuff.is_Node.ln_Name = "RSys-Check-Handler";
  57.  
  58.             InputRequestBlock->io_Command = IND_ADDHANDLER;
  59.             InputRequestBlock->io_Data = (APTR) & HandlerStuff;
  60.  
  61.             DoIO((struct IORequest *) InputRequestBlock);
  62.  
  63.                /*
  64.                 * Da InputHandler über Interrupts gesteuert werden
  65.                 * ist hier zum Auslesen ein Disable()/Enable()-
  66.                 * Paar zu verwenden
  67.                 */
  68.             Disable();
  69.  
  70.             for (LoopNode = (struct Node *) & (HandlerStuff.is_Node);
  71.                  LoopNode && LoopNode->ln_Pred;
  72.                  LoopNode = LoopNode->ln_Pred) ;
  73.  
  74.             StartNode = LoopNode->ln_Succ;
  75.  
  76.             for (node = StartNode; node->ln_Succ;
  77.                  node = node->ln_Succ)
  78.                if (node != (struct Node *) & (HandlerStuff.is_Node))
  79.                   count++;
  80.  
  81.             Enable();
  82.  
  83.             countentries = count;
  84.  
  85.             if(NOT(NoEntries()))
  86.             {
  87.                Entries = AllocScrollEntries(countentries);
  88.  
  89.                Disable();
  90.  
  91.                for (LoopNode = (struct Node *) & (HandlerStuff.is_Node);
  92.                     LoopNode && LoopNode->ln_Pred;
  93.                     LoopNode = LoopNode->ln_Pred) ;
  94.  
  95.                StartNode = LoopNode->ln_Succ;
  96.  
  97.                for (node = StartNode; node->ln_Succ && (i < countentries);
  98.                     node = node->ln_Succ)
  99.                   if (node != (struct Node *) & (HandlerStuff.is_Node))
  100.                   {
  101.                      savestrcpy(Entries[i].se_obj_id.fullname, node,
  102.                                 PARTSIZE, NT_INTERRUPT);
  103.  
  104.                      sprintf(Entries[i].se_Entry,
  105.                              EntryAttr[INPUTHDL].ea_dataformat,
  106.                              Entries[i].se_obj_id.fullname,
  107.                              node->ln_Pri,
  108.                              (long)((struct Interrupt *) node)->is_Data,
  109.                              (long)((struct Interrupt *) node)->is_Code);
  110.  
  111.                      i++;
  112.                   }
  113.  
  114.                countentries = i;
  115.  
  116.                Enable();
  117.  
  118.                CreateEntryList(SORT);
  119.             }
  120.  
  121.             InputRequestBlock->io_Command = IND_REMHANDLER;
  122.             InputRequestBlock->io_Data = (APTR) & HandlerStuff;
  123.  
  124.             DoIO((struct IORequest *) InputRequestBlock);
  125.  
  126.             CloseDevice((struct IORequest *) InputRequestBlock);
  127.          }
  128.          else
  129.             ErrorHandle(DEVICE_ERR, OPEN_FAIL, NO_KILL);
  130.  
  131.          DeleteStdIO(InputRequestBlock);
  132.       }
  133.       else
  134.          ErrorHandle(MISC_ERR, CREATE_FAIL, NO_KILL);
  135.  
  136.       DeletePort(InputDevPort);
  137.    }
  138.    else
  139.       ErrorHandle(PORT_ERR, CREATE_FAIL, NO_KILL);
  140.  
  141.    return;
  142. }
  143.