home *** CD-ROM | disk | FTP | other *** search
/ The CDPD Public Domain Collection for CDTV 3 / CDPDIII.bin / pd / programming / c / intuitionpp / ipp / waiter.cc < prev    next >
Encoding:
C/C++ Source or Header  |  1993-03-31  |  2.8 KB  |  151 lines

  1. ///////////////////////////////////////////////////////////////////////////////
  2. ///////////////////////////////////////////////////////////////////////////////
  3. ///////////////////                                        ////////////////////
  4. ///////////////////           file : waiter.cc             ////////////////////
  5. ///////////////////                                        ////////////////////
  6. ///////////////////////////////////////////////////////////////////////////////
  7. ///////////////////////////////////////////////////////////////////////////////
  8.  
  9.  
  10. #include <clib/exec_protos.h>
  11.  
  12. //extern "C" int Wait(unsigned long);
  13.  
  14.  
  15. #include "waiter.h"
  16.  
  17.  
  18. Waiter :: Waiter()
  19. {
  20.     mwlist=NULL;
  21. }
  22.  
  23.  
  24. Waiter :: ~Waiter()
  25. {
  26.     rmwindows();
  27. }
  28.  
  29.  
  30. BOOL Waiter :: linkwindow(MsgWindow& window)
  31. {
  32. MsgWNode *node;
  33.     if ((node=new MsgWNode)==NULL) return FALSE;
  34.     node->wn=&window;
  35.     node->nextwnode=mwlist;
  36.     mwlist=node;
  37.     return TRUE;
  38. }
  39.  
  40.  
  41. MsgWindow * Waiter :: rmwindow(MsgWindow& window)
  42. {
  43. MsgWNode *oldnode,*n;
  44.     if (mwlist==NULL) return NULL;
  45.     if (mwlist->wn==&window)
  46.     {
  47.         oldnode=mwlist;
  48.         mwlist=mwlist->nextwnode;
  49.         delete oldnode;
  50.         return &window;
  51.     }
  52.     for (n=mwlist;n->nextwnode;n=n->nextwnode)
  53.     {
  54.         if (n->nextwnode->wn==&window)
  55.         {
  56.             oldnode=n->nextwnode;;
  57.             n->nextwnode=n->nextwnode->nextwnode;
  58.             delete oldnode;
  59.             return &window;
  60.         }
  61.     }
  62.     return NULL;
  63. }
  64.  
  65.  
  66. void Waiter :: rmwindows()
  67. {
  68. MsgWNode *nextnode;
  69.     while (mwlist)
  70.     {
  71.         nextnode=mwlist->nextwnode;
  72.         delete mwlist;
  73.         mwlist=nextnode;
  74.     }
  75. }
  76.  
  77.  
  78. MsgWindow * Waiter :: softcontrol(IMessage &message)
  79. {
  80. MsgWNode *n;
  81. MsgWindow *concerned;
  82. unsigned long sig;
  83. IMessage *mess;
  84.     for (;;)
  85.     {
  86.         message.clear();
  87.         for (n=mwlist,waitingmask=0;n;n=n->nextwnode)
  88.             if (n->wn->isopen())
  89.                 waitingmask|=1<<n->wn->wind->UserPort->mp_SigBit;
  90.         sig=Wait(waitingmask);
  91.         if (sig==0) return NULL;
  92.         for (n=mwlist,concerned=NULL;n;n=n->nextwnode)
  93.             if (n->wn->isopen())
  94.                 if (sig & (1<<n->wn->wind->UserPort->mp_SigBit))
  95.                 {
  96.                     concerned=n->wn;
  97.                     break;
  98.                 }
  99.         if (concerned)
  100.         {
  101.             mess=concerned->getImsg(message);
  102.             if (mess)
  103.             {
  104.                 mess=concerned->filterImsg(message);
  105.                 if (mess) return concerned;
  106.             }
  107.         }
  108.     }
  109. }
  110.  
  111.  
  112. void Waiter :: hardcontrol()
  113. {
  114. MsgWNode *n;
  115. MsgWindow *concerned;
  116. unsigned long sig;
  117. IMessage *mess,message;
  118.     for (;;)
  119.     {
  120.         message.clear();
  121.         for (n=mwlist,waitingmask=0;n;n=n->nextwnode)
  122.             if (n->wn->isopen())
  123.                 waitingmask|=1<<n->wn->wind->UserPort->mp_SigBit;
  124.         sig=Wait(waitingmask);
  125.         if (sig==0) continue;
  126.         for (n=mwlist,concerned=NULL;n;n=n->nextwnode)
  127.             if (n->wn->isopen())
  128.                 if (sig & (1<<n->wn->wind->UserPort->mp_SigBit))
  129.                 {
  130.                     concerned=n->wn;
  131.                     break;
  132.                 }
  133.         if (concerned)
  134.         {
  135.             mess=concerned->getImsg(message);
  136.             if (mess) mess=concerned->filterImsg(message);
  137.         }
  138.     }
  139. }
  140.  
  141.  
  142. MsgWNode :: MsgWNode()
  143. {
  144.     wn=NULL;
  145.     nextwnode=NULL;
  146. }
  147.  
  148.  
  149. MsgWNode :: ~MsgWNode() {}
  150.  
  151.