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

Symbian

开发平台:

Visual C++

  1. /* ***** BEGIN LICENSE BLOCK *****
  2.  * Source last modified: $Id: mmfile.cpp,v 1.2.36.3 2004/07/09 01:44:27 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. #include "chxdataf.h"
  50. #include "platform/win/mmfile.h"
  51. #include "hlxclib/windows.h"
  52. #include "hxheap.h"
  53. #ifdef _DEBUG
  54. #undef HX_THIS_FILE
  55. static const char HX_THIS_FILE[] = __FILE__;
  56. #endif
  57. BEGIN_INTERFACE_LIST(_CBufferWinMemMapped)
  58.     INTERFACE_LIST_ENTRY(IID_IHXBuffer,  IHXBuffer)
  59. END_INTERFACE_LIST
  60. UINT32 
  61. _CBufferWinMemMapped::_AllocGran()
  62. {
  63.     static UINT32 m_ulAllocGran = 0;
  64.     if (!m_ulAllocGran)
  65.     {
  66. SYSTEM_INFO sysinfCurrent;
  67. GetSystemInfo(&sysinfCurrent);
  68. m_ulAllocGran = sysinfCurrent.dwAllocationGranularity;
  69.     }
  70.     
  71.     return m_ulAllocGran;
  72. }
  73. void 
  74. _CBufferWinMemMapped::_UnMap()
  75. {
  76.     if (m_pData)
  77.     {
  78. UnmapViewOfFile(m_pData);
  79. m_ulLength = 0;
  80.     }
  81. }
  82. HX_RESULT 
  83. _CBufferWinMemMapped::_SetMapping
  84. (
  85.     HANDLE hfmoFile, 
  86.     UINT32 ulOffsetHigh, 
  87.     UINT32 ulOffsetLow , 
  88.     UINT32 ulLength
  89. )
  90. {
  91.     _UnMap();
  92.     
  93.     if(!ulLength || !hfmoFile)
  94.     {
  95. return HXR_INVALID_PARAMETER;
  96.     }
  97.     m_ulOffset = ulOffsetLow%_AllocGran();
  98.     if (m_ulOffset < ulOffsetLow)
  99.     {
  100. ulOffsetLow -= m_ulOffset;
  101.     }
  102.     else
  103.     {
  104. m_ulOffset = ulOffsetLow;
  105. ulOffsetLow = 0;
  106.     }
  107.     m_pData = (UCHAR*)MapViewOfFile
  108.     (
  109. hfmoFile, 
  110. FILE_MAP_READ,
  111. ulOffsetHigh, 
  112. ulOffsetLow, 
  113. ulLength+m_ulOffset
  114.     );
  115.     if(m_pData)
  116.     {
  117. m_ulLength = ulLength;
  118.     }
  119.     else
  120.     {
  121. return HRESULT_FROM_WIN32(::GetLastError());
  122.     }
  123.     
  124.     return HXR_OK;
  125. }
  126. /*  Create creates a file using the specified mode */
  127. HX_RESULT CWin32MMFile::Create
  128. (
  129.     const char *filename, 
  130.     UINT16 mode, 
  131.     BOOL textflag
  132. )
  133. {
  134.     return Open(filename, mode, textflag);
  135. }
  136. /*  Open will open a file with the specified permissions */
  137. HX_RESULT CWin32MMFile::Open
  138. (
  139.     const char *filename, 
  140.     UINT16 mode, 
  141.     BOOL textflag
  142. )
  143. {
  144.     // _O_APPEND Repositions the file pointer to the end of the file 
  145.     // before every write operation.
  146.     // _O_CREAT Creates and opens a new file for writing; this has 
  147.     // no effect if the file specified by filename exists.
  148.     // _O_EXCL Returns an error value if the file specified by 
  149.     // filename exists. Only applies when used with 
  150.     // _O_CREAT.
  151.     // _O_RDONLY Opens file for reading only; if this flag is given, 
  152.     // neither _O_RDWR nor _O_WRONLY can be given.
  153.     // _O_RDWR Opens file for both reading and writing; if this 
  154.     // flag is given, neither _O_RDONLY nor _O_WRONLY can 
  155.     // be given.
  156.     // _O_TRUNC Opens and truncates an existing file to zero 
  157.     // length; the file must have write permission. 
  158.     // The contents of the file are destroyed. If this 
  159.     // flag is given, you cannot specify _O_RDONLY.
  160.     // _O_WRONLY Opens file for writing only; if this flag is given, 
  161.     // neither _O_RDONLY nor _O_RDWR can be given.
  162.     if(mode&_O_APPEND)// || textflag)
  163.     {
  164. return HXR_INVALID_PARAMETER;
  165.     }
  166.     Close();
  167.     //CreateFile Parameters
  168.     //
  169.     LPSECURITY_ATTRIBUTES lpSecurityAttributes = NULL;
  170.     DWORD dwCreationDistribution = 0;
  171.     DWORD dwFlagsAndAttributes = 0;
  172.     DWORD dwDesiredAccess = 0;
  173.     DWORD dwShareMode = FILE_SHARE_READ | FILE_SHARE_WRITE;
  174.     //CreateFileMapping Parameters
  175.     //
  176.     DWORD flProtect = SEC_COMMIT | SEC_NOCACHE;
  177.     DWORD dwMaximumSizeHigh=0;
  178.     DWORD dwMaximumSizeLow=0;
  179.     if(mode&_O_RDWR || mode&_O_WRONLY)
  180.     {
  181. dwDesiredAccess = GENERIC_READ | GENERIC_WRITE;
  182. flProtect |= PAGE_READWRITE;
  183.     }
  184.     else
  185.     {
  186. dwDesiredAccess = GENERIC_READ;
  187. flProtect |= PAGE_READONLY;
  188.     }
  189.     
  190.     if(mode&_O_EXCL && mode&_O_CREAT)
  191.     {
  192. dwCreationDistribution |= CREATE_NEW;
  193.     }
  194.     else if(mode&_O_CREAT)
  195.     {
  196. dwCreationDistribution |= OPEN_ALWAYS;
  197.     }
  198.     else if(mode&_O_TRUNC)
  199.     {
  200. dwCreationDistribution |= TRUNCATE_EXISTING;
  201.     }
  202.     else
  203.     {
  204. dwCreationDistribution |= OPEN_EXISTING;
  205.     }
  206.     m_hFile = CreateFile
  207.     (
  208. OS_STRING(filename), 
  209. dwDesiredAccess, 
  210. dwShareMode, 
  211. lpSecurityAttributes, 
  212. dwCreationDistribution, 
  213. dwFlagsAndAttributes, 
  214. NULL
  215.     );
  216.     
  217.     if(m_hFile == INVALID_HANDLE_VALUE)
  218.     {
  219. return HRESULT_FROM_WIN32(::GetLastError());
  220.     }
  221.     m_ulSizeLow = GetFileSize(m_hFile, &m_ulSizeHigh);
  222.     
  223.     m_hfmoFile = CreateFileMapping
  224.     (
  225. m_hFile, 
  226. NULL, 
  227. flProtect, 
  228. dwMaximumSizeHigh, 
  229. dwMaximumSizeLow, 
  230. NULL
  231.     );
  232.     if(!m_hfmoFile)
  233.     {
  234. return HRESULT_FROM_WIN32(::GetLastError());
  235.     }
  236.     return HXR_OK;
  237. }
  238. /*  Close closes a file */
  239. HX_RESULT CWin32MMFile::Close (void)
  240. {
  241.     if(m_hfmoFile)
  242.     {
  243. CloseHandle(m_hfmoFile);
  244. m_hfmoFile = NULL;
  245.     }
  246.     if(m_hFile != INVALID_HANDLE_VALUE)
  247.     {
  248. CloseHandle(m_hFile);
  249. m_hFile = INVALID_HANDLE_VALUE;
  250.     }
  251.     m_ulPositionHigh = 0;
  252.     m_ulPositionLow = 0;
  253.     m_ulSizeHigh = 0;
  254.     m_ulSizeLow = 0;
  255.     return HXR_OK;
  256. }
  257. /*  Seek moves the current file position to the offset from the fromWhere 
  258. specifier */
  259. HX_RESULT CWin32MMFile::Seek
  260. (
  261.     ULONG32 offset, 
  262.     UINT16 fromWhere
  263. )
  264. {
  265.     if(!m_hfmoFile)
  266.     {
  267. return HXR_FAIL;
  268.     }
  269.     switch(fromWhere)
  270.     {
  271.     case SEEK_SET:
  272. {
  273.     m_ulPositionHigh = 0;
  274.     m_ulPositionLow = offset;
  275. }
  276. break;
  277.     case SEEK_END:
  278. {
  279.     // Set to End..
  280.     m_ulPositionHigh = m_ulSizeHigh;
  281.     m_ulPositionLow = m_ulSizeLow;
  282. }
  283. // Then do the offset..
  284.     case SEEK_CUR:
  285. {
  286.     m_ulPositionLow += offset;
  287.     // Handle overflow
  288.     //
  289.     if (m_ulPositionLow < offset && offset>1)
  290. ++m_ulPositionHigh;
  291.     else if (m_ulPositionLow > offset && offset<1)
  292. --m_ulPositionHigh;
  293. }
  294. break;
  295.     };
  296.     
  297.     return HXR_OK;
  298. }
  299. /*  Tell returns the current file position in the ra file */
  300. ULONG32 CWin32MMFile::Tell (void)
  301. {
  302.     if (!m_hfmoFile || m_ulPositionHigh)
  303.     {
  304. return UINT32(-1);
  305.     }
  306.     return m_ulPositionLow;
  307. }
  308. /*  Read reads up to count bytes of data into buf.
  309. returns the number of bytes read, EOF, or -1 if the read failed */
  310. ULONG32 CWin32MMFile::Read
  311. (
  312.     char* buf, 
  313.     ULONG32 count
  314. )
  315. {
  316.     return (ULONG)-1;
  317. }
  318. /*  Read reads up to ulCount bytes of data into ppbufOut.
  319. returns a result code */
  320. HX_RESULT CWin32MMFile::ReadToBuffer
  321. (
  322.     ULONG32 ulCount, 
  323.     IHXBuffer** ppbufOut
  324. )
  325. {
  326.     if(!m_hfmoFile)
  327.     {
  328. return HXR_FAIL;
  329.     }
  330.     
  331.     UINT32 ulActualCount = ulCount;
  332.     if (m_ulPositionHigh >= m_ulSizeHigh)
  333.     {
  334. if(m_ulPositionLow >= m_ulSizeLow)
  335. {
  336.     return HXR_FAIL;
  337. }
  338. if(m_ulPositionLow+ulCount > m_ulSizeLow)
  339. {
  340.     ulActualCount = m_ulSizeLow - m_ulPositionLow;
  341. }
  342.     }
  343.     HX_RESULT pnrRes;
  344.     IHXFragmentedBuffer* pfbufOut;
  345.     IHXBuffer* pbufOut;
  346.     _CBufferWinMemMapped* pmmbufOut;
  347.     IUnknown* punk;
  348.     pmmbufOut = _CBufferWinMemMapped::CreateObject();
  349.     pmmbufOut->AddRef();
  350.     pnrRes = pmmbufOut->_SetMapping
  351.     (
  352. m_hfmoFile, 
  353. m_ulPositionHigh, 
  354. m_ulPositionLow, 
  355. ulCount
  356.     );
  357.     if (SUCCEEDED(pnrRes))
  358.     {
  359. pmmbufOut->QueryInterface(IID_IHXBuffer, (void**)&pbufOut);
  360. CHXFragmentedBuffer::CreateInstance(&punk);
  361. punk->QueryInterface(IID_IHXFragmentedBuffer, (void**)&pfbufOut);
  362. pfbufOut->Append(pbufOut, 0, ulCount);
  363. punk->QueryInterface(IID_IHXBuffer, (void**)ppbufOut);
  364. Seek(ulCount, SEEK_CUR);
  365. HX_RELEASE(pfbufOut);
  366. HX_RELEASE(punk);
  367. HX_RELEASE(pbufOut);
  368.     }
  369.     HX_RELEASE(pmmbufOut);
  370.     return pnrRes;
  371. }
  372. /*  Write writes up to count bytes of data from buf.
  373. returns the number of bytes written, or -1 if the write failed */
  374. ULONG32 CWin32MMFile::Write
  375. (
  376.     const char *buf, 
  377.     ULONG32 count
  378. )
  379. {
  380.     return (ULONG)-1;
  381. }
  382. /*  Rewinds the file to the start of the file */
  383. HX_RESULT CWin32MMFile::Rewind (void)
  384. {
  385.     return Seek(0, SEEK_SET);
  386. }
  387. /*  Return the file descriptor                      */
  388. INT16 CWin32MMFile::GetFd (void)
  389. {
  390.     return 0;
  391. }
  392. /*  Delete deletes a file */
  393. HX_RESULT CWin32MMFile::Delete
  394. (
  395.     const char *filename
  396. )
  397. {
  398.     return E_NOTIMPL;
  399. }