/*=========================================================================== FILE: ProtocolNotification.h DESCRIPTION: Declaration of cProtocolNotification base class and derivations PUBLIC CLASSES AND METHODS: sProtocolNotificationEvent Generic protocol event notification structure cProtocolNotification This abstract base class provides notification of protocol server events sent from the protocol server to protocol server clients cProtocolQueueNotification This class provides notification via a cSyncQueue object populated with sProtocolNotificationEvent objects Copyright (c) 2013, The Linux Foundation. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. * Neither the name of The Linux Foundation nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ===========================================================================*/ //--------------------------------------------------------------------------- // Pragmas //--------------------------------------------------------------------------- #pragma once //--------------------------------------------------------------------------- // Include Files //--------------------------------------------------------------------------- #include "SyncQueue.h" //--------------------------------------------------------------------------- // Definitions //--------------------------------------------------------------------------- enum eProtocolEventType { ePROTOCOL_EVT_BEGIN = -1, ePROTOCOL_EVT_REQ_ERR, // There was an error sending the request ePROTOCOL_EVT_REQ_SENT, // The request has been sent ePROTOCOL_EVT_RSP_ERR, // There was an error receiving the response ePROTOCOL_EVT_RSP_RECV, // The response has been received ePROTOCOL_EVT_AUX_TU_SENT, // Auxiliary data transmission unit sent ePROTOCOL_EVT_END }; // NOTE: The arguments for each event are currently as follows: // // ePROTOCOL_EVT_REQ_ERR // param1: Request ID // param2: Error code // // ePROTOCOL_EVT_REQ_SENT // param1: Request ID // param2: Index of request buffer in associated protocol log // ePROTOCOL_EVT_RSP_ERR // param1: Request ID // param2: Error code // // ePROTOCOL_EVT_RSP_RECV // param1: Request ID // param2: Index of response buffer in associated protocol log // // ePROTOCOL_EVT_AUX_TU_SENT // param1: Request ID // param2: Size of transmission unit // NOTE: To handle protoocl events using the Windows notifier add the following // prototype to your Window class header file: // // afx_msg LRESULT OnProtocolEvent( // WPARAM wParam, // LPARAM lParam ); // // Then add an entry to the message map in your Window class source file: // // BEGIN_MESSAGE_MAP( CView, CChildView ) // ON_MESSAGE( PROTOCOL_WM_BASE + (ULONG)ePROTOCOL_EVT_XXX, OnProtocolEvent ) // END_MESSAGE_MAP() // // Finally write the handler itself: // // LRESULT CView::OnProtocolEvent( // WPARAM wParam, // LPARAM lParam ) // { // Do something // return 0; // } /*=========================================================================== METHOD: IsValid (Inline Method) DESCRIPTION: eProtocolEventType validity check PARAMETERS: evtType [ I ] - Enum value being verified RETURN VALUE: bool ===========================================================================*/ inline bool IsValid( eProtocolEventType evtType ) { bool bRC = false; if (evtType > ePROTOCOL_EVT_BEGIN && evtType < ePROTOCOL_EVT_END) { bRC = true; } return bRC; }; /*=========================================================================*/ // Struct sProtocolNotificationEvent /*=========================================================================*/ struct sProtocolNotificationEvent { public: // (Inline) Default constructor (results in invalid object) sProtocolNotificationEvent() : mEventType( ePROTOCOL_EVT_BEGIN ), mParam1( 0 ), mParam2( 0 ) { // Nothing to do }; // (Inline) Parameter constructor sProtocolNotificationEvent( eProtocolEventType eventType, DWORD param1, DWORD param2 ) : mEventType( eventType ), mParam1( param1 ), mParam2( param2 ) { // Nothing to do }; // (Inline) Is this object valid? bool IsValid() { return ::IsValid( mEventType ); } /* Event type */ eProtocolEventType mEventType; /* First parameter (see above) */ DWORD mParam1; /* Second parameter (see above) */ DWORD mParam2; }; /*=========================================================================*/ // Class cProtocolNotification // // This abstract base class provides notification of protocol server // events sent from the protocol server to protocol server clients /*=========================================================================*/ class cProtocolNotification { public: // Return an allocated copy of this object virtual cProtocolNotification * Clone() const = 0; // Notify view of a protocol event virtual void Notify( eProtocolEventType eventType, DWORD param1, DWORD param2 ) const = 0; }; /*=========================================================================*/ // Class cProtocolQueueNotification // // This class provides notification via a cSyncQueue object // populated with sProtocolNotificationEvent objects /*=========================================================================*/ class cProtocolQueueNotification : public cProtocolNotification { public: // Constructor cProtocolQueueNotification( cSyncQueue * pSQ ); // Copy constructor cProtocolQueueNotification( const cProtocolQueueNotification & notifier ); // Destructor virtual ~cProtocolQueueNotification(); // Return a copy of this object virtual cProtocolNotification * Clone() const; // Notify view of a MIS event virtual void Notify( eProtocolEventType eventType, DWORD param1, DWORD param2 ) const; protected: /* Event notification queue */ mutable cSyncQueue * mpSQ; };