basepkt.h
上传用户:zhongxx05
上传日期:2007-06-06
资源大小:33641k
文件大小:11k
源码类别:

Symbian

开发平台:

C/C++

  1. /* ***** BEGIN LICENSE BLOCK ***** 
  2.  * Version: RCSL 1.0/RPSL 1.0 
  3.  *  
  4.  * Portions Copyright (c) 1995-2002 RealNetworks, Inc. All Rights Reserved. 
  5.  *      
  6.  * The contents of this file, and the files included with this file, are 
  7.  * subject to the current version of the RealNetworks Public Source License 
  8.  * Version 1.0 (the "RPSL") available at 
  9.  * http://www.helixcommunity.org/content/rpsl unless you have licensed 
  10.  * the file under the RealNetworks Community Source License Version 1.0 
  11.  * (the "RCSL") available at http://www.helixcommunity.org/content/rcsl, 
  12.  * in which case the RCSL will apply. You may also obtain the license terms 
  13.  * directly from RealNetworks.  You may not use this file except in 
  14.  * compliance with the RPSL or, if you have a valid RCSL with RealNetworks 
  15.  * applicable to this file, the RCSL.  Please see the applicable RPSL or 
  16.  * RCSL for the rights, obligations and limitations governing use of the 
  17.  * contents of the file.  
  18.  *  
  19.  * This file is part of the Helix DNA Technology. RealNetworks is the 
  20.  * developer of the Original Code and owns the copyrights in the portions 
  21.  * it created. 
  22.  *  
  23.  * This file, and the files included with this file, is distributed and made 
  24.  * available on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER 
  25.  * EXPRESS OR IMPLIED, AND REALNETWORKS HEREBY DISCLAIMS ALL SUCH WARRANTIES, 
  26.  * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, FITNESS 
  27.  * FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. 
  28.  * 
  29.  * Technology Compatibility Kit Test Suite(s) Location: 
  30.  *    http://www.helixcommunity.org/content/tck 
  31.  * 
  32.  * Contributor(s): 
  33.  *  
  34.  * ***** END LICENSE BLOCK ***** */ 
  35. #ifndef _BASEPKT_H_
  36. #define _BASEPKT_H_
  37. #include "hxcom.h"
  38. #include "ihxpckts.h"
  39. #include "chxpckts.h"
  40. #include "hxtime.h"
  41. #include "timeval.h"
  42. #include "hxassert.h"
  43. #include "hxupgrd.h"
  44. class BasePacket : public IHXClientPacket
  45. {
  46. public:
  47.     BasePacket();
  48.     ~BasePacket();
  49.     STDMETHOD(QueryInterface)           (THIS_
  50.                                         REFIID riid,
  51.                                         void** ppvObj);
  52.     STDMETHOD_(ULONG32,AddRef) (THIS);
  53.     STDMETHOD_(ULONG32,Release) (THIS);
  54.     virtual void SetPacket(IHXPacket* pPacket);
  55.     virtual IHXPacket* GetPacket();
  56.     virtual IHXPacket* PeekPacket(); /* This function violates COM Reference Rules */
  57.     virtual UINT16 GetSequenceNumber();
  58.     virtual UINT16 GetReliableSeqNo();
  59.     STDMETHOD_(ULONG32,GetTime)         (THIS);
  60.     STDMETHOD_(UINT16,GetStreamNumber)  (THIS);
  61.     virtual UINT32 GetSize();
  62.     virtual BOOL IsReliable();
  63.     BOOL IsResendRequested();
  64.     void SetResendRequested();
  65.     /*
  66.      * Leave these public because it's just easier
  67.      */
  68.     UINT16 m_uSequenceNumber;
  69.     UINT16 m_uReliableSeqNo;
  70.     UINT32 m_uPriority;
  71.     BOOL m_bIsReliable;
  72.     BOOL m_bBackToBack;
  73.     BOOL m_bIsResendRequested;
  74. protected:
  75.     LONG32 m_lRefCount;
  76.     IHXPacket* m_pPacket;
  77. };
  78. inline
  79. BasePacket::BasePacket()
  80. {
  81.     m_lRefCount = 0;
  82.     m_pPacket = 0;
  83.     m_uSequenceNumber = 0;
  84.     m_uReliableSeqNo = 0;
  85.     m_uPriority = 0;
  86.     m_bIsReliable = FALSE;
  87.     m_bBackToBack = FALSE;
  88.     m_bIsResendRequested = FALSE;
  89. }
  90. inline
  91. BasePacket::~BasePacket()
  92. {
  93.     if (m_pPacket)
  94.     {
  95. m_pPacket->Release();
  96.     }
  97. }
  98. inline void
  99. BasePacket::SetPacket(IHXPacket* pPacket)
  100. {
  101.     m_pPacket = pPacket;
  102.     if (m_pPacket)
  103.     {
  104. m_pPacket->AddRef();
  105.     }
  106.    
  107. }
  108. inline IHXPacket*
  109. BasePacket::GetPacket()
  110. {
  111.     if (m_pPacket)
  112.     {
  113. m_pPacket->AddRef();
  114.     }
  115.     return m_pPacket;
  116. }
  117. inline IHXPacket*
  118. BasePacket::PeekPacket()
  119. {
  120.     /* This function violates COM Reference Rules */
  121.     return m_pPacket;
  122. }
  123. inline STDMETHODIMP
  124. BasePacket::QueryInterface(REFIID riid,
  125.                              void** ppvObj)
  126. {
  127. QInterfaceList qiList[] =
  128. {
  129. { GET_IIDHANDLE(IID_IUnknown), (IUnknown*) this },
  130. { GET_IIDHANDLE(IID_IHXClientPacket), (IHXClientPacket*) this },
  131. };
  132.     return QIFind(qiList, QILISTSIZE(qiList), riid, ppvObj); 
  133. }
  134. inline ULONG32
  135. BasePacket::AddRef()
  136. {
  137.     return InterlockedIncrement(&m_lRefCount);
  138. }
  139. inline ULONG32
  140. BasePacket::Release()
  141. {
  142.     if (InterlockedDecrement(&m_lRefCount) > 0)
  143.     {
  144. return m_lRefCount;
  145.     }
  146.     delete this;
  147.     return 0;
  148. }
  149. inline UINT16
  150. BasePacket::GetSequenceNumber()
  151. {
  152.     return m_uSequenceNumber;
  153. }
  154. inline UINT16
  155. BasePacket::GetReliableSeqNo()
  156. {
  157.     return m_uReliableSeqNo;
  158. }
  159. inline STDMETHODIMP_(UINT16)
  160. BasePacket::GetStreamNumber()
  161. {
  162.     return m_pPacket->GetStreamNumber();
  163. }
  164. inline STDMETHODIMP_(ULONG32)
  165. BasePacket::GetTime()
  166. {
  167.     return m_pPacket->GetTime();
  168. }
  169. inline UINT32
  170. BasePacket::GetSize()
  171. {
  172.     if (m_pPacket->IsLost())
  173.     {
  174. return 0;
  175.     }
  176.     UINT32 size;
  177.     IHXBuffer* pBuffer = m_pPacket->GetBuffer();
  178.     HX_ASSERT(pBuffer);
  179.     size = pBuffer->GetSize();
  180.     pBuffer->Release();
  181.     return size;
  182. }
  183. inline BOOL
  184. BasePacket::IsReliable()
  185. {
  186.     return m_bIsReliable;
  187. }
  188. inline BOOL
  189. BasePacket::IsResendRequested()
  190. {
  191.     return m_bIsResendRequested;
  192. }
  193. inline void
  194. BasePacket::SetResendRequested()
  195. {
  196.     m_bIsResendRequested = TRUE;
  197. }
  198. struct HXClientPacketInfo
  199. {
  200.     UINT8       reliable;
  201.     UINT8       sanitize;
  202.     UINT16      sequenceNumber;
  203.     UINT16 reliableSeqNo;
  204.     Timeval     startTime;
  205. };
  206. class ClientPacket : public BasePacket
  207. {
  208. public:
  209.     ClientPacket(UINT16      uSequenceNumber,
  210.                  UINT16      uReliableSeqNo,
  211.                  UINT32      uTimestamp,
  212.                  UINT32      uNumBytes,
  213.                  BOOL        bIsReliable,
  214.                  IHXPacket* pPacket,
  215.                  Timeval     StartTime,
  216.  BOOL        bSanitize,
  217.  BOOL        bDropped = FALSE);
  218.     STDMETHOD_(ULONG32,GetTime)         (THIS);
  219.     UINT32 GetByteCount();
  220.     BOOL IsLostPacket();
  221.     BOOL IsDroppedPacket();
  222.     BOOL IsSanitizePacket();
  223.     Timeval GetStartTime();
  224.     // serialization method
  225.     static void Pack (IHXClientPacket* pPacket, char* pData, UINT32& ulSize);
  226.     static void UnPack (IHXClientPacket*& pPacket, char* pData, UINT32 ulSize);
  227. private:
  228.     UINT32 m_uTimestamp;
  229.     UINT32 m_uByteCount;
  230.     Timeval m_StartTime;
  231.     BOOL m_bSanitize;
  232.     BOOL                        m_bDropped;
  233. };
  234. inline
  235. ClientPacket::ClientPacket
  236. (
  237.     UINT16      uSequenceNumber,
  238.     UINT16      uReliableSeqNo,
  239.     UINT32      uTimestamp,
  240.     UINT32      uByteCount,
  241.     BOOL        bIsReliable,
  242.     IHXPacket* pPacket,
  243.     Timeval     StartTime,
  244.     BOOL bSanitize,
  245.     BOOL        bDropped
  246. )
  247. {
  248.     m_uSequenceNumber = uSequenceNumber;
  249.     m_uReliableSeqNo = uReliableSeqNo;
  250.     m_uTimestamp = uTimestamp;
  251.     m_uByteCount = uByteCount;
  252.     m_bIsReliable = bIsReliable;
  253.     SetPacket(pPacket);
  254.     m_StartTime = StartTime;
  255.     m_bSanitize = bSanitize;
  256.     m_bDropped = bDropped;
  257. }
  258. inline STDMETHODIMP_(ULONG32)
  259. ClientPacket::GetTime()
  260. {
  261.     return m_uTimestamp;
  262. }
  263. inline UINT32
  264. ClientPacket::GetByteCount()
  265. {
  266.     return m_uByteCount;
  267. }
  268. inline BOOL
  269. ClientPacket::IsLostPacket()
  270. {
  271.     return (m_pPacket || IsDroppedPacket()) ? FALSE : TRUE;
  272. }
  273. inline BOOL
  274. ClientPacket::IsDroppedPacket()
  275. {
  276.     return m_bDropped;
  277. }
  278. inline BOOL
  279. ClientPacket::IsSanitizePacket()
  280. {
  281.     return m_bSanitize;
  282. }
  283. inline Timeval
  284. ClientPacket::GetStartTime()
  285. {
  286.     return m_StartTime;
  287. }
  288. // serialization method
  289. inline void
  290. ClientPacket::Pack(IHXClientPacket* pHXClientPacket, char* pData, UINT32& ulSize)
  291. {
  292.     UINT16     uValue = 0;
  293.     UINT32     ulValue = 0;
  294.     UINT32     ulPacketSize = 0;
  295.     Timeval     startTime = 0;
  296.     IHXPacket*     pPacket = NULL;
  297.     ClientPacket*   pClientPacket = NULL;
  298.     if (!pHXClientPacket)
  299.     {
  300. goto cleanup;
  301.     }
  302.     pClientPacket = (ClientPacket*)pHXClientPacket;
  303.     pPacket = pClientPacket->GetPacket();
  304.     if (pPacket)
  305.     {
  306. CHXPacket::Pack(pPacket, NULL, ulPacketSize);
  307.     }
  308.     // figure out the size 
  309.     if (!pData)
  310.     {
  311. ulSize = sizeof(HXClientPacketInfo) + ulPacketSize;
  312.     }
  313.     // pack the data
  314.     else
  315.     {
  316. pClientPacket = (ClientPacket*)pClientPacket;
  317. *pData++ = (BYTE)pClientPacket->IsReliable(); ulSize++;
  318. *pData++ = (BYTE)pClientPacket->IsSanitizePacket(); ulSize++;
  319. uValue = pClientPacket->GetSequenceNumber();
  320. *pData++ = (BYTE)uValue; *pData++ = (BYTE)(uValue >> 8);  ulSize += 2;
  321. uValue = pClientPacket->GetReliableSeqNo();
  322. *pData++ = (BYTE)uValue; *pData++ = (BYTE)(uValue >> 8);  ulSize += 2;
  323. startTime = pClientPacket->GetStartTime();
  324. ulValue = startTime.tv_sec;
  325. *pData++ = (BYTE)ulValue; *pData++ = (BYTE)(ulValue >> 8);
  326. *pData++ = (BYTE)(ulValue >> 16); *pData++ = (BYTE)(ulValue >> 24); ulSize += 4;
  327. ulValue = startTime.tv_usec;
  328. *pData++ = (BYTE)ulValue; *pData++ = (BYTE)(ulValue >> 8);
  329. *pData++ = (BYTE)(ulValue >> 16); *pData++ = (BYTE)(ulValue >> 24); ulSize += 4;
  330.     
  331. if (pPacket)
  332. {
  333.     CHXPacket::Pack(pPacket, pData, ulSize);
  334. }
  335.     }
  336.    
  337. cleanup:
  338.     HX_RELEASE(pPacket);
  339.     return;
  340. }   
  341. inline void
  342. ClientPacket::UnPack(IHXClientPacket*& pClientPacket, char* pData, UINT32 ulSize)
  343. {
  344.     UINT16 uValue = 0;
  345.     UINT32 ulValue = 0;
  346.     IHXPacket* pPacket = NULL;
  347.     IHXBuffer* pBuffer = NULL;
  348.     HXClientPacketInfo clientPacketInfo;
  349.     pClientPacket = NULL;
  350.     if (!pData || !ulSize)
  351.     {
  352. goto cleanup;
  353.     }
  354.     HX_ASSERT(ulSize >= sizeof(HXClientPacketInfo));
  355.     clientPacketInfo.reliable = (BYTE)*pData++;     ulSize--;
  356.     clientPacketInfo.sanitize = (BYTE)*pData++;     ulSize--;
  357.     
  358.     uValue = (BYTE)*pData++; uValue |= (((BYTE)*pData++) << 8);
  359.     clientPacketInfo.sequenceNumber = uValue;     ulSize -= 2;
  360.     uValue = (BYTE)*pData++; uValue |= (((BYTE)*pData++) << 8);
  361.     clientPacketInfo.reliableSeqNo = uValue;     ulSize -= 2;
  362.     ulValue = (BYTE)*pData++; ulValue |= (((BYTE)*pData++) << 8);
  363.     ulValue |= (((BYTE)*pData++) << 16); ulValue |= (((BYTE)*pData++) << 24);
  364.     clientPacketInfo.startTime.tv_sec = ulValue;    ulSize -= 4;
  365.     ulValue = (BYTE)*pData++; ulValue |= (((BYTE)*pData++) << 8);
  366.     ulValue |= (((BYTE)*pData++) << 16); ulValue |= (((BYTE)*pData++) << 24);
  367.     clientPacketInfo.startTime.tv_usec = ulValue;   ulSize -= 4;
  368.     if (ulSize)
  369.     {
  370. CHXPacket::UnPack(pPacket, pData, ulSize);
  371.     }
  372.     if (pPacket)
  373.     {
  374. pBuffer = pPacket->GetBuffer();
  375. pClientPacket = new ClientPacket(clientPacketInfo.sequenceNumber,
  376.  clientPacketInfo.reliableSeqNo,
  377.  pPacket->GetTime(),
  378.  pBuffer->GetSize(),
  379.  clientPacketInfo.reliable,
  380.  pPacket,
  381.  clientPacketInfo.startTime,
  382.  FALSE);
  383.     }
  384.     else
  385.     {
  386. pClientPacket = new ClientPacket(clientPacketInfo.sequenceNumber,
  387.  clientPacketInfo.reliableSeqNo,
  388.  0,
  389.  0,
  390.  0,
  391.  0,
  392.  clientPacketInfo.startTime,
  393.  FALSE);
  394.     }
  395.     pClientPacket->AddRef();
  396. cleanup:
  397.     HX_RELEASE(pBuffer);
  398.     HX_RELEASE(pPacket);
  399.    
  400.     return;
  401. }
  402. #endif