libqmi-qmuxd/gobi-api/GobiAPI_2013-07-31-1347/Core/ProtocolNotification.h

237 lines
7.8 KiB
C++

/*===========================================================================
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 <sProtocolNotificationEvent> * 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 <sProtocolNotificationEvent> * mpSQ;
};