123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205 |
- ////////////////////////////////////////////////////////////////////////////////
- //
- // Copyright 2016 RWS Inc, All Rights Reserved
- //
- // This program is free software; you can redistribute it and/or modify
- // it under the terms of version 2 of the GNU General Public License as published by
- // the Free Software Foundation
- //
- // This program is distributed in the hope that it will be useful,
- // but WITHOUT ANY WARRANTY; without even the implied warranty of
- // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- // GNU General Public License for more details.
- //
- // You should have received a copy of the GNU General Public License along
- // with this program; if not, write to the Free Software Foundation, Inc.,
- // 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- //
- #ifndef DISPATCH_H
- #define DISPATCH_H
- //////////////////////////////////////////////////////////////////////////////
- // Headers.
- //////////////////////////////////////////////////////////////////////////////
- #include "btime.h"
- #include "rttypes.h"
- #include "slist.h"
- #include "filter.h"
- //////////////////////////////////////////////////////////////////////////////
- // Macros.
- //////////////////////////////////////////////////////////////////////////////
- #define RET_FREE 0x0000
- #define RET_DONTFREE 0x0001
- //////////////////////////////////////////////////////////////////////////////
- // Typedefs.
- //////////////////////////////////////////////////////////////////////////////
- // This type is used to call the user to allow them to allocate space for the
- // data and return it to be filled. Return NULL if unable to allocate the
- // space or other errror.
- typedef UCHAR* (*ALLOC_DISPATCHFUNC)( long lSize, USHORT usType, UCHAR ucFlags,
- long lUser);
- // This type is used to call the user to allow them to DEallocate space al-
- // located by a previous call to their ALLOC_DISPATCHFUNC.
- typedef void (*FREE_DISPATCHFUNC)( UCHAR* puc, USHORT usType, UCHAR ucFlags,
- long lUser);
- // This type is used to pass the copied chunk to the user ready to be used.
- // Returning RET_FREE will cause puc to get freed if it meets the criteria
- // for freeing described in the dispatch.cpp header comment. Return
- // RET_DONTFREE to avoid this.
- typedef short (*USE_DISPATCHFUNC)( UCHAR* puc, long lSize, USHORT usType,
- UCHAR ucFlags,
- long lTime, long lUser);
- // This type is used to pass messages to the handler.
- typedef short (*MSG_DISPATCHFUNC)(USHORT usMsg);
- // For custom time handlers.
- typedef long (*TIME_DISPATCHFUNC)(long lTimeUser);
- class CDispatch
- {
- protected: // Local types.
- // Items waiting to be dispatched.
- typedef struct
- {
- UCHAR* puc; // Data.
- long lSize; // Size of data in bytes.
- USHORT usType; // Type of data.
- UCHAR ucFlags; // Flags for data.
- long lTime; // Time data is to be dispatched.
- } RTITEM, *PRTITEM;
-
- public: // Construction/Destruction.
- // Default constructor.
- CDispatch();
- // Destructor.
- ~CDispatch();
- public: // Methods.
- // Sets the data handler for usType to fnUse.
- void SetDataHandler(USHORT usType, USE_DISPATCHFUNC fnUse);
- // Sets the type handler for usType to fnAlloc.
- void SetAllocHandler(USHORT usType, ALLOC_DISPATCHFUNC fnAlloc);
- // Sets the type handler for usType to fnUse.
- void SetFreeHandler(USHORT usType, FREE_DISPATCHFUNC fnFree);
- // Sets the user value for usType to lUser.
- void SetUserVal(USHORT usType, long lUser);
- // Set filter.
- void SetFilter(CFilter* pfilter);
- // Start spewing/blowing chunks.
- // Returns 0 on success.
- short Start(void);
- // Stop spewing/blowing chunks.
- // Returns 0 on success.
- short Suspend(void);
- // Sets the time handler function.
- void SetTimeFunc(TIME_DISPATCHFUNC fnTime, long lTimeUser)
- { m_fnTime = fnTime; m_lTimeUser = lTimeUser; }
- // Sends a message to all type handlers.
- // Returns the number of handlers that returned an error.
- short SendHandlerMessage(USHORT usMsg);
- // Adds an item to the list of items to be dispatched.
- // Returns 0 on success.
- short AddItem( UCHAR* puc, long lSize, USHORT usType, UCHAR ucFlags,
- long lTime);
- public: // Querries.
- // Returns the time from the override function if set or, if not set, from
- // Blue.
- long GetTime(void)
- { return (m_fnTime != NULL ? (*m_fnTime)(m_lTimeUser) : Blu_GetTime()); }
- // Returns TRUE if critical handler is Blue's critical list.
- short IsActive(void)
- { return m_sActive; }
- // Returns TRUE if there are any chunks to be dispatched in the lists.
- short IsEmpty(void)
- { return m_slistRtItems.IsEmpty(); }
- protected: // Internal methods.
- // Sets members w/o regard for current value.
- void Set(void);
- // Resets members. Deallocates memory if necessary.
- void Reset(void);
- // Handles data callbacks from filter.
- void UseCall( UCHAR* puc, long lSize, USHORT usType, UCHAR ucFlags,
- long lTime);
- // Callback dispatcher (calls the implied this version).
- static void UseCallStatic( UCHAR* puc, long lSize, USHORT usType,
- UCHAR ucFlags, long lTime,
- long l_pDispatch);
- // Handles alloc callbacks from filter.
- UCHAR* AllocCall(long lSize, USHORT usType, UCHAR ucFlags);
- // Callback dispatcher (calls the implied this version).
- static UCHAR* AllocCallStatic( long lSize,
- USHORT usType, UCHAR ucFlags,
- long l_pDispatch);
- // Handles free callbacks from filter.
- void FreeCall(UCHAR* puc, USHORT usType, UCHAR ucFlags);
- // Callback dispatcher (calls the implied this version).
- static void FreeCallStatic( UCHAR* puc, USHORT usType, UCHAR ucFlags,
- long l_pDispatch);
- // Called via BlowStatic once Start()'ed. This blows chunks
- // at handlers at the chunks' specified time.
- void Blow(void);
- // Called by Blue critical once Start()'ed. Passes control
- // to implied this Blow().
- static void BlowStatic(long l_pDispatch);
- public: // Members.
- protected: // Members.
- ALLOC_DISPATCHFUNC m_afnAlloc[NUM_TYPES]; // User defined allocation
- // functions.
- FREE_DISPATCHFUNC m_afnFree[NUM_TYPES]; // User defined
- // de-allocation functions.
- USE_DISPATCHFUNC m_afnUse[NUM_TYPES]; // User function to be
- // passed data functions.
- MSG_DISPATCHFUNC m_afnMsg[NUM_TYPES]; // User function that
- // receives messages per-
- // tinent to handlers.
- long m_alUser[NUM_TYPES]; // User defined values.
- // To speed up the following list accesses we could use a hash table
- // of lists (like in CRes).
- CSList <RTITEM, long> m_slistRtItems; // Sorted list of items
- // waiting for their time
- // to be dispatched.
- CFilter* m_pfilter; // CFilter.
- TIME_DISPATCHFUNC m_fnTime; // Time function.
- long m_lTimeUser; // User time value sent to
- // user time function.
- short m_sActive; // TRUE if critical is
- // active, FALSE otherwise.
-
- };
- #endif // DISPATCH_H
- //////////////////////////////////////////////////////////////////////////////
- // EOF
- //////////////////////////////////////////////////////////////////////////////
|