basepkt.h
上传用户:dangjiwu
上传日期:2013-07-19
资源大小:42019k
文件大小:12k
源码类别:

Symbian

开发平台:

Visual C++

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