Source code of Windows XP (NT5)
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

232 lines
5.9 KiB

#include "precomp.h"
DEBUG_FILEZONE(ZONE_T120_MCSNC | ZONE_T120_GCCNC);
/*
* packet.cpp
*
* Copyright (c) 1993 - 1995 by DataBeam Corporation, Lexington, KY
*
* Abstract:
* This is the implementation file for the MCS packet class. The packet
* class is responsible for encoding and decoding the PDUs, as well as
* maintaining the necessary pointers to the encoded and decoded data.
* Instances of this class will be created both by User and Connection
* objects as PDUs flow through MCS.
*
* Private Instance Variables:
* Packet_Coder
* A pointer to the packet coder object.
* Encoded_Lock_Count
* A counter indicating the number of locks currently existing on the
* encoded data.
* Decoded_Lock_Count
* A counter indicating the number of locks currently existing on the
* decoded data.
* Free_State
* A boolean value indicating whether the object can be freed when all
* lock counts fall to zero.
* m_EncodedPDU
* This is a pointer to the encoded PDU contained in the internal
* buffer. Note that the reason for keeping this separate is that
* the encoded PDU may not start at the beginning of the encoded data
* memory block identified above. Some encoders actually encode the
* PDUs backward, or back justified.
* Encoded_Data_Length
* Indicates the length of the encoded data. If zero, the packet coder
* must be consulted to obtain the length which is subsequently saved.
* Decoded_Data_Length
* Indicates the length of the decoded data. If zero, the packet coder
* must be consulted to obtain the length which is subsequently saved.
* PDU_Type
* Indicates the type of PDU contained in the packet. Valid values
* are DOMAIN_MCS_PDU or CONNECT_MCS_PDU.
* Packet_Direction_Up
* A boolean indicating whether the direction of travel for the PDU
* is upward.
*
* Private Member Functions:
* PacketSuicideCheck
* This function is called by Unlock() as well as any Unlock call
* (ie. UnlockUncoded()) when it's associated lock count falls to
* zero.
*
* Caveats:
* None.
*
* Author:
* James J. Johnstone IV
*/
/*
* Packet ()
*
* Public
*
* Functional Description:
* This version of the constructor is used to create a Packet object
* for outgoing PDUs when the packet is to be created from a structure
* containing the PDU data to be encoded.
*/
// outgoing packets
Packet::Packet(PPacketCoder pPacketCoder,
UINT nEncodingRules,
LPVOID pInputPduStructure,
int nPduType,
BOOL fPacketDirectionUp,
PPacketError pePktErr,
BOOL fLockEncodedData)
:
SimplePacket(fPacketDirectionUp),
Packet_Coder(pPacketCoder),
PDU_Type(nPduType),
m_Decoded_Data (NULL),
Decoded_Data_Length (0)
{
/*
* Encode the PDU using the externally provided decoded data. The encoded
* buffer will be allocated by the encoder. The buffer needs to be freed later.
*/
if (Packet_Coder->Encode (pInputPduStructure, PDU_Type, nEncodingRules,
&m_EncodedPDU, &Encoded_Data_Length))
{
ASSERT (m_EncodedPDU);
/*
* Encoding was successful.
*/
*pePktErr = PACKET_NO_ERROR;
// should we lock encoded data?
if (fLockEncodedData)
lLock = 2;
}
else
{
/*
* Encoding failed.
*/
m_EncodedPDU = NULL;
ERROR_OUT(("Packet::Packet: encoding failed"));
*pePktErr = PACKET_MALLOC_FAILURE;
}
}
/*
* Packet ()
*
* Public
*
* Functional Description:
* This version of the constructor is used to create a Packet object
* for incomming PDUs when the packet is to be created from an encoded
* data stream containing the PDU data to be decoded.
*/
// incoming packets
Packet::Packet(PPacketCoder pPacketCoder,
UINT nEncodingRules,
LPBYTE pEncodedData,
UINT cbEncodedDataSize,
int nPduType,
BOOL fPacketDirectionUp,
PPacketError pePktErr)
:
SimplePacket(fPacketDirectionUp),
Packet_Coder(pPacketCoder),
PDU_Type(nPduType)
{
//PacketCoderError coder_error;
m_EncodedPDU = NULL;
/*
* Decode the provided encoded buffer. Note that the decoder will
* allocate the space needed. The buffer needs to be freed later.
*/
if (Packet_Coder->Decode (pEncodedData, cbEncodedDataSize, PDU_Type,
nEncodingRules, &m_Decoded_Data,
&Decoded_Data_Length) == FALSE)
{
ERROR_OUT(("Packet::Packet: Decode call failed."));
m_Decoded_Data = NULL;
*pePktErr = PACKET_INCOMPATIBLE_PROTOCOL;
}
else
{
ASSERT (m_Decoded_Data != NULL);
/*
* The decode was successful.
*/
*pePktErr = PACKET_NO_ERROR;
}
}
/*
* ~Packet ()
*
* Public
*
* Functional Description:
* Destructor for the Packet class. The destructor ensures that all
* resources that have been allocated are freed.
*/
Packet::~Packet(void)
{
/*
* If there is memory allocated for encoded data, then free it.
*/
if (m_EncodedPDU != NULL) {
// the encoded memory was allocated by the ASN.1 coder.
Packet_Coder->FreeEncoded (m_EncodedPDU);
}
/*
* If there is memory allocated for decoded data, then free it.
*/
if (m_Decoded_Data != NULL) {
// the decoded memory was allocated by the ASN.1 decoder
Packet_Coder->FreeDecoded (PDU_Type, m_Decoded_Data);
}
}
/*
* IsDataPacket ()
*
* Public
*
* Functional Description:
* This function returns whether this is a data packet (it's not).
*/
BOOL Packet::IsDataPacket(void)
{
return (FALSE);
}
/*
* GetDecodedData ()
*
* Public
*
* Functional Description:
* The GetDecodedData method returns a pointer to the decoded data
* buffer. If the packet does not have decoded data the Decode method is
* called. If decode is unable to provide decoded data then NULL is
* returned.
*/
PVoid Packet::GetDecodedData ()
{
ASSERT (m_Decoded_Data != NULL);
return (m_Decoded_Data);
}
/*
* GetPDUType ()
*
* Public
*
* Functional Description:
* The GetPDUType method returns the PDU type for the packet.
*/
int Packet::GetPDUType ()
{
return (PDU_Type);
}