chunkres.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. ///////////////////////////////////////////////////////////////
  36. // 
  37. // chunkres.h
  38. //
  39. // A Brief History:
  40. //
  41. // The previous implementation of the CHXHttp object basically 
  42. // allowed access to an entire resource as a single block of 
  43. // contiguous memory. This was not acceptable for large 
  44. // resources in 16bit version of the player, since FAR pointers
  45. // can only access 64KB of contiguous memory. Another downside 
  46. // to this implementation was that for very large HTTP 
  47. // resources (300K or more) the entire resource had to reside 
  48. // in memory at all times. Although the win 3.1 virtual memory 
  49. // manager handles this situation gracefully, it is of course
  50. // painful for low end machines.
  51. //
  52. // Another important "requirement" of this system is that 
  53. // relative to file storage the system should be relatively 
  54. // secure for intellectual property rights. In particualr, it 
  55. // should not be readily obvious (from the external file 
  56. // system) which file chunks are associate with a particular 
  57. // resource.
  58. //
  59. #ifndef _CHUNKRES_H_
  60. #define _CHUNKRES_H_
  61. #include "hxtypes.h"
  62. #include "hxresult.h"
  63. #include "carray.h"
  64. #include "hxmap.h"
  65. #include "hxslist.h"
  66. #include "chxdataf.h"
  67. #include "hxthread.h"
  68. class CHXSimpleList;
  69. class CChunkyResMgr;
  70. class CChunkyRes;
  71. class CChunkyResChunk;
  72. //////////////////////////////////////////////////////////////////
  73. // To prevent temp files from looking like hxfiles, 
  74. // we start temp file chunks at an arbitrary offset.
  75. #define DEF_START_CHUNK_OFFSET 1
  76. #define DEF_CHUNKYRES_DISK_THRESHOLD 0x00300000 //   3 MB
  77. //#define DEF_CHUNKYRES_MEM_THRESHOLD 0x00008000 //  32 KB
  78. //#define DEF_CHUNKYRES_MEM_THRESHOLD 0x00080000 // 512 KB
  79. #define DEF_CHUNKYRES_MEM_THRESHOLD 0x00040000 // 256 KB
  80. //#define DEF_CHUNKYRES_CHUNK_SIZE 0x00002000 //   8 KB
  81. #define DEF_CHUNKYRES_CHUNK_SIZE 0x00008000 //  32 KB
  82. ///////////////////////////////////////////////////////////////
  83. //
  84. // CChunkyResMgr has:
  85. // 
  86. //  * hashTable of "resource names" to CChunkyRes objects 
  87. //    for open resources
  88. //  * hashTable of "resource names" to CChunkyRes objects
  89. //    for closed resources
  90. //  * Manages discarding resources if disk usage is too high.
  91. //  * All resources are discarded when session is shut down,
  92. //    no cross-session cache.
  93. // 
  94. //  * Opens or creates a new resource
  95. // 
  96. //  HX_RESULT CChunkyResMgr::OpenResource
  97. //  (CChunkyRes** ppChunkyRes, const char* pResName);
  98. // 
  99. // 
  100. //  * Closes a resource (closed resources may be discarded)
  101. // 
  102. //  HX_RESULT CChunkyResMgr::CloseResource
  103. //  (CChunkyRes* pChunkyRes);
  104. //  -or-
  105. //  (const char* pResName);
  106. // 
  107. // 
  108. //  * Discards a resource (frees all disk and memory usage 
  109. //   for that resource)
  110. //
  111. //  HX_RESULT CChunkyResMgr::DiscardResource
  112. //  (const char* pResName);
  113. // 
  114. //  static void CChunkyResMgr::SetDiskUsageThreshold
  115. //  (ULONG32 diskUsage);
  116. //
  117. class CChunkyResMgr
  118. {
  119. private:
  120. CHXMapStringToOb m_OpenResources;
  121. CHXMapStringToOb m_ClosedResources;
  122. CHXStringList m_LRUResources;
  123. ULONG32 m_ulDiskUsage;
  124. void DiscardDiskData(void);
  125. void RemoveFromLRU(const char* pResName);
  126. public:
  127. HX_RESULT OpenResource(CChunkyRes** ppChunkyRes, const char* pResName);
  128. HX_RESULT CloseResource(CChunkyRes* pChunkyRes);
  129. HX_RESULT CloseResource(const char* pResName);
  130. HX_RESULT DiscardResource(const char* pResName);
  131. HX_RESULT FindResource(const char* pResName);
  132. void SetDiskUsageThreshold(ULONG32 diskUsage);
  133. CChunkyResMgr();
  134. ~CChunkyResMgr();
  135. }; 
  136. ///////////////////////////////////////////////////////////////
  137. // 
  138. // CChunkyRes has:
  139. // 
  140. //  * array of CChunkyResChunk's which store N-k chunks or the
  141. //    resource. It can simply map from offset request, to array element 
  142. //    by dividing offset by "chunking factor".
  143. // 
  144. //  ULONG32 CChunkyRes::GetDiskUsage() const;
  145. // 
  146. //  HX_RESULT CChunkyRes::GetData
  147. //  (ULONG32 offset, char* buf, 
  148. //  ULONG32 count, ULONG32* actual);
  149. //  HX_RESULT CChunkyRes::SetData
  150. //  (ULONG32 offset, const char* buf, 
  151. //  ULONG32 count);
  152. // 
  153. //  * Does not manage which chunks are in or out of memory,
  154. //    this is handled by the Chunk class.
  155. // 
  156. //  * When resource is deleted, chunks are deleted.
  157. // 
  158. class CChunkyRes
  159. {
  160. private:
  161. friend class CChunkyResChunk;
  162. CHXPtrArray m_Chunks;
  163. CHXString m_strTempFileName;
  164. ULONG32 m_ulNextTempFileChunk;
  165. BOOL m_bHasBeenOpened;
  166. BOOL m_bDisableDiskIO;
  167. BOOL m_bDiscardUsedData;
  168. UINT32 m_ulFirstChunkIdx;
  169. UINT32 m_ulUsedBytes;
  170. CHXSimpleList m_FreeDiskOffsets;
  171. HXMutex* m_pMutex;
  172. ULONG32 m_MemUsageThreshold;
  173. ULONG32 m_CurMemUsage;
  174. // Those chunks used recently enough to be in memory.
  175. CHXSimpleList* m_ChunksMemoryMRU; 
  176. // Those chunks not used recently enough, and therefor
  177. // spilled to disk.
  178. CHXSimpleList* m_ChunksDiskMRU;
  179. //  aka chunking factor
  180. ULONG32 m_ChunkSize;
  181. HX_RESULT DiscardDiskData();
  182. public:
  183. void DisableDiskIO () { m_bDisableDiskIO = TRUE; };
  184. void DiscardUsedData () { m_bDiscardUsedData = TRUE; };
  185. HX_RESULT DiscardRange( ULONG32 offset, ULONG32 count );
  186. ULONG32 GetDiskUsage() const;
  187. HX_RESULT GetData
  188. (
  189. ULONG32 offset, char* buf, 
  190. ULONG32 count, ULONG32* actual
  191. );
  192. HX_RESULT SetData
  193. (
  194. ULONG32 offset, const char* buf, 
  195. ULONG32 count
  196. );
  197. void Lock()
  198. {
  199.     HX_ASSERT(m_pMutex);
  200.     m_pMutex->Lock();
  201. }
  202. void Unlock()
  203. {
  204.     HX_ASSERT(m_pMutex);
  205.     m_pMutex->Unlock();
  206. }
  207. HX_RESULT GetContiguousDataPointer(ULONG32 offset, char*& buf, ULONG32 count);
  208. BOOL HasPartialData(ULONG32 length, ULONG32 offset = 0);
  209. ULONG32 GetContiguousLength(ULONG32 offset = 0);
  210. HX_RESULT GetTempFileChunk(CHXDataFile*& pFile,ULONG32& m_ulTempFileOffset);
  211. HX_RESULT GetTempFile(CHXDataFile*& pFile);
  212. void SetMemUsageThreshold(ULONG32 memUsage);
  213. void TrimDownMemoryMRU();
  214. CChunkyRes();
  215. ~CChunkyRes();
  216. }; 
  217. ///////////////////////////////////////////////////////////////
  218. // 
  219. // CChunkyResChunkGroup is:
  220. //
  221. // The CChunkyResChunkGroup is a class that represents chunks
  222. // in the chunk file. It is used to track whether the contents
  223. // of a chunk are valid on disc or not.
  224. //
  225. // 
  226. class CChunkyResChunkGroup
  227. {
  228. private:
  229. public:
  230. }; 
  231. ///////////////////////////////////////////////////////////////
  232. // 
  233. // CChunkyResChunk has:
  234. //
  235. //  * base offset for this chunk
  236. //  * length of this chunk (should be chunking factor for chunks 
  237. //    1 to (N-1) of the CChunkyRes
  238. //  * partial length (less than length in cases where chunks are
  239. //    still downloading).
  240. //  * file name of temporary file which stores chunk.
  241. //  * memory location of chunk (if in memory).
  242. // 
  243. //  HX_RESULT CChunkyResChunk::GetData
  244. //  (ULONG32 offset, char* buf, 
  245. //  ULONG32 count, ULONG32* actual);
  246. //  HX_RESULT CChunkyResChunk::SetData
  247. //  (ULONG32 offset, const char* buf, 
  248. //  ULONG32 count);
  249. //  HX_RESULT CChunkyResChunk::SpillToDisk();
  250. //  HX_RESULT CChunkyResChunk::LoadFromDisk();
  251. //  HX_RESULT CChunkyResChunk::DiscardDiskData();
  252. // 
  253. //  static void CChunkyResChunk::SetMemUsageThreshold
  254. //  (ULONG32 memUsage);
  255. // 
  256. //  * a static MRU of CChunkyResChunk's to keep memory usage low.
  257. // 
  258. //  * SpillToDisk() and LoadFromDisk() are only called from
  259. //    within this class. All memory management handled by
  260. //    this classes static MRU management.
  261. // 
  262. //  * When chunk is deleted, data is discarded from disk.
  263. // 
  264. class CChunkyResChunk
  265. {
  266. private:
  267. // CChunkyres needs access to chunk size.
  268. friend class CChunkyRes;
  269. private:
  270. //  * base offset for this chunk
  271. ULONG32 m_ChunkOffset;
  272. //  * memory location of chunk (if in memory).
  273. UCHAR* m_pChunkData;
  274. // * offset of this chunk into temp file...
  275. ULONG32 m_ulTempFileOffset;
  276. // * Flag indicating that we have previously spilled to disk
  277. BOOL m_bPreviouslySpilled;
  278. // * Flag indicating that we have been modified since last being spilled!
  279. BOOL m_bModified;
  280. // * This is the resource we belong to...
  281. CChunkyRes* m_pChunkRes;
  282. // * Flag indicating we should never spill to disk
  283. BOOL m_bDisableDiskIO;
  284. // * list to hold valid ranges for this chunk
  285. struct ValidRange
  286. {
  287. ULONG32 offset;
  288. ULONG32 length;
  289. };
  290. CHXSimpleList m_ValidRanges;
  291. HX_RESULT AddValidRange(ULONG32 offset, ULONG32 length, BOOL bValid = TRUE);
  292. HX_RESULT SpillToDisk();
  293. HX_RESULT LoadFromDisk();
  294. HX_RESULT DiscardDiskData();
  295. HX_RESULT MakeSureChunkIsInMemory();
  296. void Lock()
  297. {
  298.     HX_ASSERT(m_pChunkRes);
  299.     m_pChunkRes->Lock();
  300. }
  301. void Unlock()
  302. {
  303.     HX_ASSERT(m_pChunkRes);
  304.     m_pChunkRes->Unlock();
  305. }
  306. public:
  307. void DisableDiskIO() { m_bDisableDiskIO = TRUE; };
  308. ULONG32 GetValidLength(ULONG32 offset = 0) const;
  309. ULONG32 GetSize() const
  310. {
  311. return m_pChunkRes->m_ChunkSize;
  312. };
  313. ULONG32 GetTempFileOffset() const
  314. {
  315. return m_ulTempFileOffset;
  316. };
  317. HX_RESULT GetData
  318. (
  319. ULONG32 offset, char* buf, 
  320. ULONG32 count, ULONG32* actual
  321. );
  322. HX_RESULT SetData
  323. (
  324. ULONG32 offset, const char* buf, 
  325. ULONG32 count
  326. );
  327. HX_RESULT GetContiguousDataPointer(ULONG32 offset, char*& buf, ULONG32 count);
  328. CChunkyResChunk(CChunkyRes* pChunkyRes);
  329. ~CChunkyResChunk();
  330. }; 
  331. #endif // ndef _CHUNKRES_H_