/* * datapkt.h * * Copyright (c) 1997 by Microsoft Corporation, Redmond, WA * * Abstract: * This is the interface file for the MCS Data Packet class. Instances of this * class represent MCS Data Protocol Data Units (Data PDUs) as they flow through the * system. These instances allocate the memory required to hold both * encoded and decoded versions of the PDU, and make sure that no PDU * is ever encoded or decoded more than once. However, they differ from normal * packets, in that there is only one copy of the user data in the encoded * and decoded buffers. The use of lock counts * allows multiple objects in the system to reference and use the same * packet object at the same time. This class inherits from the SimplePacket * class, which is a pure virtual class. * * A data packet object can be created in two different ways. It can be created * with either decoded data or encoded data. During instantiation, the * new packet object will include the memory it will need to * hold both the encoded and decoded data * The DataPacket class, however, does not put any data into those buffers. * * When a Lock message is sent to the object, it will put encoded * data into the encode buffer. If the packet was created * with decoded data, then this will entail an encode operation. However, * if the packet was created with encoded data, then it is smart enough * to just COPY the encoded data into the internal buffer, thus avoiding * the overhead associated with the encode operation. * * When a Lock message is sent to the object, it will put decoded * data into the pre-allocated decode buffer. If the packet was created * with encoded data, then this will entail a decode operation. However, * if the packet was created with decoded data, then it is smart enough * to just COPY the decoded data into the internal buffer, thus avoiding * the overhead associated with the decode operation. * * When Unlock messages are received, the lock count is decremented. When a packet's * lock count is 0, the packet deletes itself (it commits * suicide). Note that for this reason, no other object should explicitly * delete a packet object. * * Caveats: * None. * * Authors: * Christos Tsollis */ #ifndef _DATAPACKET_ #define _DATAPACKET_ #include "mpdutype.h" /* * Definition of class DataPacket. */ class DataPacket; typedef DataPacket * PDataPacket; class DataPacket : public SimplePacket { public: static Void AllocateMemoryPool (long maximum_objects); static Void FreeMemoryPool (); PVoid operator new (size_t); Void operator delete (PVoid object); DataPacket (ASN1choice_t choice, PUChar data_ptr, ULong data_length, UINT channel_id, Priority priority, Segmentation segmentation, UINT initiator_id, SendDataFlags flags, PMemory memory, PPacketError packet_error); DataPacket( PTransportData pTransportData, BOOL fPacketDirectionUp); virtual ~DataPacket (); Void SetDirection (DBBoolean packet_direction_up); virtual PVoid GetDecodedData(void); virtual BOOL IsDataPacket (void); virtual int GetPDUType (void); BOOL Equivalent (PDataPacket); Priority GetPriority (void) { return ((Priority) m_DecodedPDU.u.send_data_request. data_priority); }; UserID GetInitiator (void) { return (m_DecodedPDU.u.send_data_request.initiator); }; ChannelID GetChannelID (void) { return (m_DecodedPDU.u.send_data_request.channel_id); }; Segmentation GetSegmentation (void) { return (m_DecodedPDU.u.send_data_request.segmentation); }; LPBYTE GetUserData (void) { return ((LPBYTE) m_DecodedPDU.u.send_data_request.user_data.value); }; UINT GetUserDataLength (void) { return (m_DecodedPDU.u.send_data_request.user_data.length); }; PMemory GetMemory (void) { return (m_Memory); }; BOOL IsEncodedDataBroken (void) { return (m_EncodedDataBroken); }; void SetMessageType(UINT nMsgType) { m_nMessageType = nMsgType; } UINT GetMessageType(void) { return m_nMessageType; } protected: static PVoid * Object_Array; static long Object_Count; BOOL fPreAlloc; DomainMCSPDU m_DecodedPDU; // The decoded data PDU (w/o the user data) PMemory m_Memory; // Memory object pointing to big buffer which contains the object's buffer. BOOL m_fIncoming; // Does this packet represent recv data? BOOL m_EncodedDataBroken; UINT m_nMessageType; // for retry in CUser::SendDataIndication }; /* * Void AllocateMemoryPool ( * long maximum_objects); * * Functional Description: * This is a static member function that should only be called during MCS * initialization (exactly once). It allocates a memory block that will * be used to hold all instances of this class during the operation of * the system. This allows us to VERY efficiently allocate and destroy * instances of this class. * * Formal Parameters: * maximum_objects * This is the maximum number of objects of this class that can exist * in the system at the same time. This is used to determine how much * memory to allocate to hold the objects. Once this number of * objects exist, all calls to "new" will return NULL. * * Return Value: * None. * * Side Effects: * None. * * Caveats: * None. */ /* * Void FreeMemoryPool (); * * Functional Description: * This is a static member function that should only be called during a * shutdown of MCS (exactly once). It frees up the memory pool allocated * to hold all instances of this class. Note that calling this function * will cause ALL existing instances of this class to be invalid (they * no longer exist, and should not be referenced). * * Formal Parameters: * None. * * Return Value: * None. * * Side Effects: * Any existing instances of this class are no longer valid and should not * be referenced. * * Caveats: * None. */ /* * PVoid operator new ( * size_t object_size); * * Functional Description: * This is an override of the "new" operator for this class. Since all * instances of this class come from a single memory pool allocated up * front, this function merely pops the first entry from the list of * available objects. * * Formal Parameters: * None. * * Return Value: * Pointer to an object of this class, or NULL if no memory is available. * * Side Effects: * None. * * Caveats: * None. */ /* * Void operator delete ( * PVoid object); * * Functional Description: * This function is used to free up a previously allocated object of this * class. Note that it is VERY important not to call this function with an * invalid address, because no error checking is performed. This decision * was made due to speed requirements. * * Formal Parameters: * None. * * Return Value: * None. * * Side Effects: * None. * * Caveats: * None. */ /* * DataPacket( PUChar pEncodedData, * ULong ulEncodedDataSize, * BOOL fPacketDirectionUp, * PPacketError pePktErr) * * Functional Description: * This version of the constructor is used to create a Data Packet object * for incomming PDUs when the packet is to be created from an encoded * data stream containing the PDU data to be decoded. * * Formal Parameters: * pEncodedData (i) * Pointer to the input encoded PDU. * ulEncodedDataSize (i) * The length in bytes of the input encoded PDU. * fPacketDirectionUp (i) * The packet_direction_up flag indicates the initial orientation of * the packet. Valid values are: * TRUE - The packet's direction is up. * FALSE - The packet's direction is down. * pePktErr (o) * When the constructor returns control to the calling function, this * variable will be set to one of the return values listed below. * * Return Value: * None. * * Side Effects: * None. * * Caveats: * None. */ /* * DataPacket (ASN1choice_t choice, * PUChar data_ptr, * ULong data_length, * UINT channel_id, * Priority priority, * Segmentation segmentation, * UINT initiator_id, * PPacketError packet_error) * * Functional Description: * This constructor is used for outgoing data packets. * It needs to copy the data into the encoded PDU buffer * that will be allocated by this constructor. * * Formal Parameters: * choice (i) * Either normal or uniform send data PDU * data_ptr (i) * Pointer to the user data for this data PDU. * data_length (i) * The length of the user data * channel_id (i) * The MCS channel on which the data will be xmitted. * priority (i) * Data priority * segmentation (i) * The segmentation bits for the packet * initiator_id (i) * MCS user id of the user (application) sending the data * packet_error (o) * Ptr to location for storing the success/failure code for the constructor. * * Return Value: * None. * * Side Effects: * None. * * Caveats: * None. */ /* * ~DataPacket () * * Functional Description: * Destructor for the DataPacket class. The destructor ensures that all * resources that have been allocated are freed. * * Formal Parameters: * None. * * Return Value: * None. * * Side Effects: * None. * * Caveats: * None. */ /* * GetDecodedData () * * Functional Description: * The GetDecodedData method returns a pointer to the decoded data * buffer. * * Formal Parameters: * None. * * Return Value: * A pointer to the decoded data. If an decoding error occurs, this * method will return NULL. * * Side Effects: * None. * * Caveats: * None. */ /* * GetEncodedDataLength () * * Functional Description: * This method returns the encoded data's length. * * Formal Parameters: * None. * * Return Value: * The number of bytes in the encoded data. * * Side Effects: * None. * * Caveats: * None. */ /* * GetDecodedDataLength () * * Functional Description: * This method returns the decoded data's length. * * Formal Parameters: * None. * * Return Value: * The number of bytes in the decoded data. * * Side Effects: * None. * * Caveats: * None. */ #endif