home *** CD-ROM | disk | FTP | other *** search
/ Fresh Fish 8 / FreshFishVol8-CD2.bin / bbs / gnu / aplusplus-1.01-src.lha / APlusPlus-1.01 / include / APlusPlus / exec / TimedMsgPort.h < prev   
Encoding:
C/C++ Source or Header  |  1994-05-04  |  3.1 KB  |  94 lines

  1. #ifndef APP_TimedMsgPort_H
  2. #define APP_TimedMsgPort_H
  3. /******************************************************************************
  4.  **
  5.  **    C++ Class Library for the Amiga© system software.
  6.  **
  7.  **    Copyright (C) 1994 by Armin Vogt  **  EMail: armin@uni-paderborn.de
  8.  **    All Rights Reserved.
  9.  **
  10.  **    $VER: apphome:APlusPlus/exec/TimedMsgPort.h 1.04 (04.05.94) $
  11.  **    
  12.  ******************************************************************************/
  13.  
  14.  
  15. #include <APlusPlus/exec/SignalResponder.h>
  16. #include <APlusPlus/environment/APPObject.h>
  17. #include <APlusPlus/exec/MessageC.h>
  18. #include <APlusPlus/devices/TimerC.h>
  19.  
  20.  
  21. /******************************************************************************************
  22.       » TimedMsgPort class «   -  virtual base class
  23.  
  24.    A TimedMsgPort is a SignalResponder which waits for a MsgPort arrival signal, then
  25.    gets each arrived messages and delivers it to the subclass via the virtual callback
  26.    method.
  27.    After having returned from the processing routine the message will be replied. 
  28.     Therefore the subclass must not hold a reference to the message or reply the message 
  29.     itself.
  30.  
  31.  ******************************************************************************************/
  32. struct MsgEntry;
  33. class TimedMsgPort : private SignalResponder
  34. {
  35.    private:
  36.       struct MsgPort *port;
  37.       BOOL hasCreatedPort;    // true, if constructor 2 has created this msgport
  38.         UWORD windowSize;            // number of messages that the sending window can hold
  39.         
  40.         class SendingWindow
  41.         {
  42.             private:
  43.                  struct MsgEntry *entryTable;
  44.                 UWORD entries;
  45.                 UWORD findIndex;    
  46.             public:
  47.                 SendingWindow(UWORD size);
  48.                 ~SendingWindow();
  49.                 TimerC *insert(MessageC *msgC);    // returns timeout timer if a free slot was found.
  50.                 BOOL remove(MessageC *msgC);        // TRUE if message was found.
  51.                 MessageC *timeout(MessageC *timerMsg);    
  52.                 // returns the message timed out or NULL if it was no timerMsg.
  53.         } sendWindow;
  54.         
  55.       void actionCallback();   // inherited from SignalResponder
  56.  
  57.     protected:
  58.         APPObject::setError;
  59.         APPObject::setID;
  60.         
  61.         virtual void processMsg(MessageC *msg)=0;        // callback for incoming messages
  62.         virtual void processReply(MessageC *msg)=0;    // callback for returning messages
  63.  
  64.    public:
  65.       TimedMsgPort(struct MsgPort *port,UWORD sendWindowSize=1);
  66.         // add a MsgPortRSP to an already existing msg port.
  67.  
  68.       TimedMsgPort(const UBYTE *portName,BYTE portPri=0,UWORD sendWindowSize=1);
  69.         // create a new msg port with a MsgPortRSP.
  70.  
  71.       virtual ~TimedMsgPort();
  72.  
  73.         BOOL sendMsgToPort(MessageC *message,struct MsgPort *destinationPort);        
  74.         BOOL sendMsgToPort(MessageC *message,const UBYTE *destinationName);
  75.         /** sends the message only if there was place in the sending window, otherwise returns false.
  76.          ** 'destinationPort' may also be a 'TimedMsgPort'.
  77.          ** The message must not be deleted until it has been replied.
  78.          **/
  79.                 
  80.       operator struct MsgPort* () { return port; }
  81.       
  82.       // make APPObject public
  83.         APPObject::Ok;
  84.         APPObject::error;
  85.         APPObject::ID;
  86.         APPObject::status;
  87.         APPObject::isClass;
  88. };
  89.  
  90. // errors
  91. #define MSGPORTRESPONDER_CREATEMSGPORT_FAILED (MSGRESPONDER_CLASS+1)
  92.  
  93. #endif    /* APP_TimedMsgPort_H */
  94.