270 lines
7.6 KiB
C++
Executable File
270 lines
7.6 KiB
C++
Executable File
/*===========================================================================
|
|
FILE:
|
|
QDLProtocolServer.cpp
|
|
|
|
DESCRIPTION:
|
|
QDL protocol packet server
|
|
|
|
PUBLIC CLASSES AND METHODS:
|
|
cQDLProtocolServer
|
|
|
|
Copyright (c) 2011, Code Aurora Forum. 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 Code Aurora Forum 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 "QDLProtocolServer.h"
|
|
#include "QDLEnum.h"
|
|
|
|
//---------------------------------------------------------------------------
|
|
// Definitions
|
|
//---------------------------------------------------------------------------
|
|
|
|
/*=========================================================================*/
|
|
// cQDLProtocolServer Methods
|
|
/*=========================================================================*/
|
|
|
|
/*===========================================================================
|
|
METHOD:
|
|
cQDLProtocolServer (Public Method)
|
|
|
|
DESCRIPTION:
|
|
Constructor
|
|
|
|
PARAMETERS:
|
|
bufferSzRx [ I ] - Size of data buffer for incoming data
|
|
|
|
SEQUENCING:
|
|
None (constructs sequencing objects)
|
|
|
|
RETURN VALUE:
|
|
None
|
|
===========================================================================*/
|
|
cQDLProtocolServer::cQDLProtocolServer(
|
|
ULONG bufferSzRx,
|
|
ULONG logSz )
|
|
: cHDLCProtocolServer( ePROTOCOL_QDL_RX,
|
|
ePROTOCOL_QDL_TX,
|
|
bufferSzRx,
|
|
logSz )
|
|
{
|
|
// Nothing to do
|
|
}
|
|
|
|
/*===========================================================================
|
|
METHOD:
|
|
~cQDLProtocolServer (Public Method)
|
|
|
|
DESCRIPTION:
|
|
Destructor
|
|
|
|
SEQUENCING:
|
|
None (destroys sequencing objects)
|
|
|
|
RETURN VALUE:
|
|
None
|
|
===========================================================================*/
|
|
cQDLProtocolServer::~cQDLProtocolServer()
|
|
{
|
|
// Nothing to do
|
|
}
|
|
|
|
/*===========================================================================
|
|
METHOD:
|
|
EncodeTxData (Internal Method)
|
|
|
|
DESCRIPTION:
|
|
Encode data for transmission
|
|
|
|
PARAMETERS:
|
|
pBuffer [ I ] - Data to be encoded
|
|
bEncoded [ O ] - Do we even encoded data?
|
|
|
|
SEQUENCING:
|
|
None (must be called from protocol server thread)
|
|
|
|
RETURN VALUE:
|
|
sSharedBuffer * - Encoded data (0 upon error when encoding is indicated)
|
|
===========================================================================*/
|
|
sSharedBuffer * cQDLProtocolServer::EncodeTxData(
|
|
sSharedBuffer * pBuffer,
|
|
bool & bEncoded )
|
|
{
|
|
// We encoded data
|
|
bEncoded = true;
|
|
if (pBuffer != 0 && pBuffer->IsValid() == true)
|
|
{
|
|
const BYTE * pReqBuf = mpActiveRequest->mRequest.GetBuffer();
|
|
|
|
eQDLCommand reqCmd = (eQDLCommand)pReqBuf[0];
|
|
if (reqCmd == eQDL_CMD_WRITE_UNFRAMED_REQ)
|
|
{
|
|
// The write request is not HDLC encoded
|
|
bEncoded = false;
|
|
}
|
|
}
|
|
|
|
if (bEncoded == true)
|
|
{
|
|
// Base class can handle HDLC encoding
|
|
return cHDLCProtocolServer::EncodeTxData( pBuffer, bEncoded );
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
/*===========================================================================
|
|
METHOD:
|
|
IsResponse (Internal Method)
|
|
|
|
DESCRIPTION:
|
|
Is the passed in data a response to the current request?
|
|
|
|
PARAMETERS:
|
|
rsp [ I ] - Candidate response
|
|
|
|
SEQUENCING:
|
|
None (must be called from protocol server thread)
|
|
|
|
RETURN VALUE:
|
|
bool
|
|
===========================================================================*/
|
|
bool cQDLProtocolServer::IsResponse( const sProtocolBuffer & rsp )
|
|
{
|
|
// Assume not
|
|
bool bRC = false;
|
|
if ( (mpActiveRequest == 0)
|
|
|| (mpActiveRequest->mRequest.IsValid() == false)
|
|
|| (mpActiveRequest->mbWaitingForResponse == false)
|
|
|| (rsp.IsValid() == false) )
|
|
{
|
|
return bRC;
|
|
}
|
|
|
|
const BYTE * pReqBuf = mpActiveRequest->mRequest.GetBuffer();
|
|
const BYTE * pRspBuf = rsp.GetBuffer();
|
|
|
|
eQDLCommand reqCmd = (eQDLCommand)pReqBuf[0];
|
|
eQDLCommand rspCmd = (eQDLCommand)pRspBuf[0];
|
|
|
|
switch (reqCmd)
|
|
{
|
|
case eQDL_CMD_HELLO_REQ:
|
|
if ( (rspCmd == eQDL_CMD_HELLO_RSP)
|
|
|| (rspCmd == eQDL_CMD_ERROR) )
|
|
{
|
|
bRC = true;
|
|
}
|
|
break;
|
|
|
|
case eQDL_CMD_OPEN_UNFRAMED_REQ:
|
|
if ( (rspCmd == eQDL_CMD_OPEN_UNFRAMED_RSP)
|
|
|| (rspCmd == eQDL_CMD_ERROR) )
|
|
{
|
|
bRC = true;
|
|
}
|
|
break;
|
|
|
|
case eQDL_CMD_WRITE_UNFRAMED_REQ:
|
|
if ( (rspCmd == eQDL_CMD_WRITE_UNFRAMED_RSP)
|
|
|| (rspCmd == eQDL_CMD_ERROR) )
|
|
{
|
|
bRC = true;
|
|
}
|
|
break;
|
|
|
|
case eQDL_CMD_SESSION_DONE_REQ:
|
|
if ( (rspCmd == eQDL_CMD_SESSION_DONE_RSP)
|
|
|| (rspCmd == eQDL_CMD_ERROR) )
|
|
{
|
|
bRC = true;
|
|
}
|
|
break;
|
|
|
|
case eQDL_CMD_DOWNLOAD_REQ:
|
|
case eQDL_CMD_SESSION_CLOSE_REQ:
|
|
if (rspCmd == eQDL_CMD_ERROR)
|
|
{
|
|
bRC = true;
|
|
}
|
|
break;
|
|
|
|
case eQDL_CMD_GET_IMAGE_PREF_REQ:
|
|
if ( (rspCmd == eQDL_CMD_GET_IMAGE_PREF_RSP)
|
|
|| (rspCmd == eQDL_CMD_ERROR) )
|
|
{
|
|
bRC = true;
|
|
}
|
|
break;
|
|
}
|
|
|
|
return bRC;
|
|
}
|
|
|
|
/*===========================================================================
|
|
METHOD:
|
|
IsTxAbortResponse (Internal Method)
|
|
|
|
DESCRIPTION:
|
|
Is the passed in data a response that aborts the current request?
|
|
|
|
PARAMETERS:
|
|
rsp [ I ] - Candidate response
|
|
|
|
SEQUENCING:
|
|
None (must be called from protocol server thread)
|
|
|
|
RETURN VALUE:
|
|
bool
|
|
===========================================================================*/
|
|
bool cQDLProtocolServer::IsTxAbortResponse( const sProtocolBuffer & rsp )
|
|
{
|
|
// Assume not
|
|
bool bRC = false;
|
|
if ( (mpActiveRequest == 0)
|
|
|| (mpActiveRequest->mRequest.IsValid() == false)
|
|
|| (mpActiveRequest->mbWaitingForResponse == true)
|
|
|| (rsp.IsValid() == false) )
|
|
{
|
|
return bRC;
|
|
}
|
|
|
|
// If we are in the middle of a transmission an we receive an error
|
|
// packet then we abort
|
|
const BYTE * pRspBuf = rsp.GetBuffer();
|
|
eQDLCommand rspCmd = (eQDLCommand)pRspBuf[0];
|
|
if (rspCmd == eQDL_CMD_ERROR)
|
|
{
|
|
bRC = true;
|
|
}
|
|
|
|
return bRC;
|
|
}
|