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

Symbian

开发平台:

Visual C++

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