www.pudn.com > mischat.rar > NDKMessage.h


//////////////////////////////////////////////////////////////////////////////// 
//                                                                            // 
// NDK 2.0 - Network Development Kit                                          // 
//                                                                            // 
// Authors: Sebastien Lachance                                                // 
//                                                                            // 
// E-mail:  netblitz@rocler.qc.ca                                             // 
//                                                                            // 
// -------------------------------------------------------------------------- // 
//                                                                            // 
// Permission to use, copy, modify, and distribute this software for any      // 
// purpose and without fee is hereby granted. This is no guarantee about the  // 
// use of this software. For any comments, bugs or thanks, please email us.   // 
//                                                                            // 
// -------------------------------------------------------------------------- // 
//                                                                            // 
// Targeted Platform: Any Windows version                                     // 
//                                                                            // 
// Last modification: January 2002                                            // 
//                                                                            // 
// History:                                                                   // 
//                                                                            // 
// 1- First release of this file.                                             // 
// 2- The class is renamed and some optimizations are applied. Hungarian      // 
//    notation is used. Adds method are added.                                // 
//                                                                            // 
//////////////////////////////////////////////////////////////////////////////// 
 
//////////////////////////////////////////////////////////////////////////////// 
// Includes                                                                   // 
//////////////////////////////////////////////////////////////////////////////// 
#pragma once 
#include  
#include "NDKMessageData.h" 
 
//////////////////////////////////////////////////////////////////////////////// 
// Defines                                                                    // 
//////////////////////////////////////////////////////////////////////////////// 
typedef CArray CElements; 
 
 
//////////////////////////////////////////////////////////////////////////////// 
//                                                                            // 
// CNDKMessage (concrete class)                                               // 
//                                                                            // 
// -------------------------------------------------------------------------- // 
//                                                                            // 
// This class is the primitive object that can be sent through the            // 
// client/server architecture. It can be seen as an array of elements of      // 
// different type. These types are all the C++ basic types as well as         // 
// CString. It also supports an arbitrary length buffer of untyped data       // 
// (LPVOID). The array grows automatically as needed. Elements within the     // 
// array are zero-indexed.                                                    // 
//                                                                            // 
// Each message type is identified with a unique Id (long).                   // 
//                                                                            // 
//////////////////////////////////////////////////////////////////////////////// 
 
class CNDKMessage : public CObject 
{ 
public: 
	//////////////////////////////////////////////////////////////////////////// 
	// Constructors / Destructor                                              // 
	//////////////////////////////////////////////////////////////////////////// 
 
	// Constructor. 
	CNDKMessage(); 
 
	// Constructor with a unique Id. 
	CNDKMessage(long lId); 
 
	// Copy-Constructor. 
	CNDKMessage(const CNDKMessage& message); 
	 
	// Destructor. 
	virtual ~CNDKMessage(); 
 
	//////////////////////////////////////////////////////////////////////////// 
	// Attributes                                                             // 
	//////////////////////////////////////////////////////////////////////////// 
  
	// Sets a unique identifier to each message. 
	void SetId(long lId); 
 
	// Gets the identifier of this message. 
	long GetId() const; 
 
	// Gets the number of elements in the array of this message. 
	int GetNbElements() const; 
 
	void Clear(); 
 
	//////////////////////////////////////////////////////////////////////////// 
	// Operations                                                             // 
	//////////////////////////////////////////////////////////////////////////// 
 
	// The following methods are used to add at the end an element in the  
	// internal array of the CNDKMessage to any value. 
	void Add(UCHAR ucData); 
	void Add(char cData); 
	void Add(USHORT usData); 
	void Add(short sData); 
	void Add(UINT unData); 
	void Add(int nData); 
	void Add(ULONG ulData); 
	void Add(long lData); 
	void Add(float fData); 
	void Add(double dData); 
	void Add(const CString& strData); 
	void Add(LPVOID pData, UINT unLength); 
 
	// The following methods are used to set an element at the specified index 
	// in the internal array of the CNDKMessage to any value. Index is  
	// zero-indexed. 
	void SetAt(long lIndex, UCHAR ucData); 
	void SetAt(long lIndex, char cData); 
	void SetAt(long lIndex, USHORT usData); 
	void SetAt(long lIndex, short sData); 
	void SetAt(long lIndex, UINT unData); 
	void SetAt(long lIndex, int nData); 
	void SetAt(long lIndex, ULONG ulData); 
	void SetAt(long lIndex, long lData); 
	void SetAt(long lIndex, float fData); 
	void SetAt(long lIndex, double dData); 
	void SetAt(long lIndex, const CString& strData); 
	void SetAt(long lIndex, LPVOID pData, UINT unLength); 
 
	// Gets the data type at the specified index. 
	NDKDataType GetDataTypeAt(long lIndex) const; 
 
	// The following methods are used to get an element at the specified index 
	// in the internal array of the CNDKMessage. The parameter passed by  
	// reference will be filled with the appropriate data. The type of data  
	// extracted must match the type of data set with a previous call to  
	// SetAt or Add. Index is zero-indexed. 
	void GetAt(long lIndex, UCHAR& ucData) const; 
	void GetAt(long lIndex, char& cData) const; 
	void GetAt(long lIndex, USHORT& usData) const; 
	void GetAt(long lIndex, short& sData) const; 
	void GetAt(long lIndex, UINT& unData) const; 
	void GetAt(long lIndex, int& nData) const; 
	void GetAt(long lIndex, ULONG& ulData) const; 
	void GetAt(long lIndex, long& lData) const; 
	void GetAt(long lIndex, float& fData) const; 
	void GetAt(long lIndex, double& dData) const; 
	void GetAt(long lIndex, CString& strData) const; 
	void GetAt(long lIndex, LPVOID pData, UINT unLength) const; 
 
	// Resets the current index. The current index is used by GetNext method. 
	void ResetCurrentIndex(); 
 
	// Gets the current index. 
	long GetCurrentIndex() const; 
 
	// Returns if the current index is the last. 
	BOOL IsLastCurrentIndex(); 
 
	// The following methods are used to get an element in the internal array of  
	// the CNDKMessage using the current index. The parameter passed by  
	// reference will be filled with the appropriate data. The type of data  
	// extracted must match the type of data set with a previous call to  
	// SetAt or Add.  
	void GetNext(UCHAR& ucData); 
	void GetNext(char& cData); 
	void GetNext(USHORT& usData); 
	void GetNext(short& sData); 
	void GetNext(UINT& unData); 
	void GetNext(int& nData); 
	void GetNext(ULONG& ulData); 
	void GetNext(long& lData); 
	void GetNext(float& fData); 
	void GetNext(double& dData); 
	void GetNext(CString& strData); 
	void GetNext(LPVOID pData, UINT unLength); 
 
	// Serializes a CNDKMessage object to a CArchive 
	void Serialize(CArchive& archive); 
 
	DECLARE_SERIAL(CNDKMessage) 
 
	//////////////////////////////////////////////////////////////////////////// 
	// Operators                                                              // 
	//////////////////////////////////////////////////////////////////////////// 
 
	// Assignment operator. 
	const CNDKMessage& operator=(const CNDKMessage& message); 
 
private: 
	//////////////////////////////////////////////////////////////////////////// 
	// Private Attributes                                                     // 
	//////////////////////////////////////////////////////////////////////////// 
 
	// Returns if the index is valid for the array of elements when setting a 
	// value. 
	BOOL IsValidSetIndex(long lIndex) const; 
 
	// Returns if the index is valid for the array of elements when getting a 
	// value. 
	BOOL IsValidGetIndex(long lIndex) const; 
 
private: 
	long      m_lId; 
	long	  m_lCurrentIndex; 
	CElements m_elements; 
};