diff options
Diffstat (limited to 'gobi-api/GobiAPI_2013-07-31-1347/Core/ProtocolRequest.cpp')
-rw-r--r-- | gobi-api/GobiAPI_2013-07-31-1347/Core/ProtocolRequest.cpp | 253 |
1 files changed, 253 insertions, 0 deletions
diff --git a/gobi-api/GobiAPI_2013-07-31-1347/Core/ProtocolRequest.cpp b/gobi-api/GobiAPI_2013-07-31-1347/Core/ProtocolRequest.cpp new file mode 100644 index 0000000..c001415 --- /dev/null +++ b/gobi-api/GobiAPI_2013-07-31-1347/Core/ProtocolRequest.cpp @@ -0,0 +1,253 @@ +/*=========================================================================== +FILE: + ProtocolRequest.cpp + +DESCRIPTION: + Generic protocol request/command related structures and + affliated methods, these structures are used by clients of + the protocol server to specify outgoing requests + +PUBLIC CLASSES AND METHODS: + sProtocolRequest + +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. +===========================================================================*/ + +//--------------------------------------------------------------------------- +// Include Files +//--------------------------------------------------------------------------- +#include "StdAfx.h" + +#include "ProtocolRequest.h" +#include "ProtocolNotification.h" +#include "ProtocolServer.h" + +//--------------------------------------------------------------------------- +// Definitions +//--------------------------------------------------------------------------- + +// Default protocol request timeout +const ULONG DEFAULT_REQ_TIMEOUT = 1000; + +// Minimum and maximum allowable timeout values (in milliseconds) +const ULONG MIN_REQ_TIMEOUT = 100; +const ULONG MAX_REQ_TIMEOUT = 300000; + +// Minimum number of attempts a request can be scheduled for +const ULONG MIN_REQ_ATTEMPTS = 1; + +// Value to indicate that a request is to be sent out indefinately +const ULONG INFINITE_REQS = 0xFFFFFFFF; + +// Minimum/default amount of time between repeated requests (in milliseconds) +const ULONG MIN_REQ_FREQUENCY = 10; +const ULONG DEFAULT_REQ_FREQUENCY = 100; + +/*=========================================================================*/ +// sProtocolRequest Methods +/*=========================================================================*/ + +/*=========================================================================== +METHOD: + sProtocolRequest + +DESCRIPTION: + Parameterized constructor + +PARAMETERS: + pBuffer [ I ] - Shareable buffer representing the request (must be + valid) + + schedule [ I ] - When (from now, in milliseconds) to send the first + request, this isn't a hard value as the request is + only guaranteed to go out after this time elapses + + timeout [ I ] - Milliseconds to wait for a response to an individual + request before declaring a timeout. Regardless of + what is passed in the timeout value used will be + between MIN/MAX_REQ_TIMEOUT + + requests [ I ] - Number of request attempts to make, this isn't a + retry count rather this value is used to specify + repeating requests. Regardless of what is passed in + the requests value used will be at least + MIN_REQ_ATTEMPTS + + frequency [ I ] - If the 'requests' value is greater than the + MIN_REQ_ATTEMPTS than this represents the amount of + time to wait between requests (from the completion of + the last request attempt, in milliseconds), again this + isn't a hard value. Regardless of what is passed in + the frequency value used will be at least + MIN_REQ_FREQUENCY + + pNotifier [ I ] - Status notification mechanism (may be 0) + + +RETURN VALUE: + None +===========================================================================*/ +sProtocolRequest::sProtocolRequest( + sSharedBuffer * pBuffer, + ULONG schedule, + ULONG timeout, + ULONG requests, + ULONG frequency, + cProtocolNotification * pNotifier ) + : sProtocolBuffer( pBuffer ), + mSchedule( schedule ), + mTimeout( DEFAULT_REQ_TIMEOUT ), + mRequests( MIN_REQ_ATTEMPTS ), + mFrequency( DEFAULT_REQ_FREQUENCY ), + mpNotifier( 0 ), + mpAuxData( 0 ), + mAuxDataSize( 0 ), + mbTXOnly( false ) +{ + // Constrain requested timeout to allowable range + if (timeout < MIN_REQ_TIMEOUT) + { + timeout = MIN_REQ_TIMEOUT; + } + + if (timeout > MAX_REQ_TIMEOUT) + { + timeout = MAX_REQ_TIMEOUT; + } + + mTimeout = timeout; + + // Constrain request attempts + if (requests >= MIN_REQ_ATTEMPTS) + { + mRequests = requests; + } + + // Constrain frequency + if (frequency >= MIN_REQ_FREQUENCY) + { + mFrequency = frequency; + } + + // Clone notifier? + if (pNotifier != 0) + { + mpNotifier = pNotifier->Clone(); + } +} + +/*=========================================================================== +METHOD: + sProtocolRequest + +DESCRIPTION: + Parameterized constructor (notification with defaults) + +PARAMETERS: + pBuffer [ I ] - Shareable buffer representing the request (must be + valid) + + pNotifier [ I ] - Status notification mechanism (may be 0) + + +RETURN VALUE: + None +===========================================================================*/ +sProtocolRequest::sProtocolRequest( + sSharedBuffer * pBuffer, + cProtocolNotification * pNotifier ) + : sProtocolBuffer( pBuffer ), + mSchedule( 0 ), + mTimeout( DEFAULT_REQ_TIMEOUT ), + mRequests( MIN_REQ_ATTEMPTS ), + mFrequency( DEFAULT_REQ_FREQUENCY ), + mpNotifier( pNotifier ), + mpAuxData( 0 ), + mAuxDataSize( 0 ), + mbTXOnly( false ) +{ + // Clone notifier? + if (pNotifier != 0) + { + mpNotifier = pNotifier->Clone(); + } + + Validate(); +} + +/*=========================================================================== +METHOD: + sProtocolRequest + +DESCRIPTION: + Copy constructor + +PARAMETERS: + req [ I ] - Request to copy + +RETURN VALUE: + None +===========================================================================*/ +sProtocolRequest::sProtocolRequest( const sProtocolRequest & req ) + : sProtocolBuffer( req ), + mSchedule( req.mSchedule ), + mTimeout( req.mTimeout ), + mRequests( req.mRequests ), + mFrequency( req.mFrequency ), + mpNotifier( 0 ), + mpAuxData( req.mpAuxData ), + mAuxDataSize( req.mAuxDataSize ), + mbTXOnly( req.mbTXOnly ) +{ + // Clone notifier? + if (req.mpNotifier != 0) + { + mpNotifier = req.mpNotifier->Clone(); + } + + Validate(); +} + +/*=========================================================================== +METHOD: + ~sProtocolRequest + +DESCRIPTION: + Destructor + +RETURN VALUE: + None +===========================================================================*/ +sProtocolRequest::~sProtocolRequest() +{ + // Delete cloned notifier? + if (mpNotifier != 0) + { + delete mpNotifier; + mpNotifier = 0; + } +} |