1ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann// Copyright 2014 PDFium Authors. All rights reserved. 2ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann// Use of this source code is governed by a BSD-style license that can be 3ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann// found in the LICENSE file. 4ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 5ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com 6ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 7ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#include <algorithm> 8ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 9ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#include "xfa/src/fgas/src/fgas_base.h" 10ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#include "fx_stream.h" 11ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannIFX_Stream* IFX_Stream::CreateStream(IFX_BufferRead* pBufferRead, 12ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FX_DWORD dwAccess, 13ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann int32_t iFileSize, 14ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FX_BOOL bReleaseBufferRead) { 15ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CFX_Stream* pSR = new CFX_Stream; 16ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (!pSR->LoadBufferRead(pBufferRead, iFileSize, dwAccess, 17ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann bReleaseBufferRead)) { 18ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann pSR->Release(); 19ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return NULL; 20ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 21ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (dwAccess & FX_STREAMACCESS_Text) { 22ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return new CFX_TextStream(pSR, TRUE); 23ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 24ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return pSR; 25ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann} 26ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannIFX_Stream* IFX_Stream::CreateStream(IFX_FileRead* pFileRead, 27ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FX_DWORD dwAccess) { 28ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CFX_Stream* pSR = new CFX_Stream; 29ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (!pSR->LoadFileRead(pFileRead, dwAccess)) { 30ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann pSR->Release(); 31ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return NULL; 32ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 33ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (dwAccess & FX_STREAMACCESS_Text) { 34ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return new CFX_TextStream(pSR, TRUE); 35ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 36ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return pSR; 37ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann} 38ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannIFX_Stream* IFX_Stream::CreateStream(IFX_FileWrite* pFileWrite, 39ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FX_DWORD dwAccess) { 40ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CFX_Stream* pSR = new CFX_Stream; 41ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (!pSR->LoadFileWrite(pFileWrite, dwAccess)) { 42ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann pSR->Release(); 43ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return NULL; 44ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 45ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (dwAccess & FX_STREAMACCESS_Text) { 46ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return new CFX_TextStream(pSR, TRUE); 47ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 48ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return pSR; 49ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann} 50ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannIFX_Stream* IFX_Stream::CreateStream(const FX_WCHAR* pszFileName, 51ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FX_DWORD dwAccess) { 52ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CFX_Stream* pSR = new CFX_Stream; 53ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (!pSR->LoadFile(pszFileName, dwAccess)) { 54ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann pSR->Release(); 55ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return NULL; 56ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 57ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (dwAccess & FX_STREAMACCESS_Text) { 58ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return new CFX_TextStream(pSR, TRUE); 59ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 60ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return pSR; 61ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann} 62ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannIFX_Stream* IFX_Stream::CreateStream(uint8_t* pData, 63ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann int32_t length, 64ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FX_DWORD dwAccess) { 65ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CFX_Stream* pSR = new CFX_Stream; 66ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (!pSR->LoadBuffer(pData, length, dwAccess)) { 67ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann pSR->Release(); 68ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return NULL; 69ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 70ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (dwAccess & FX_STREAMACCESS_Text) { 71ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return new CFX_TextStream(pSR, TRUE); 72ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 73ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return pSR; 74ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann} 75ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannCFX_StreamImp::CFX_StreamImp() : CFX_ThreadLock(), m_dwAccess(0) {} 76ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannCFX_FileStreamImp::CFX_FileStreamImp() 77ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann : CFX_StreamImp(), m_hFile(NULL), m_iLength(0) {} 78ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannCFX_FileStreamImp::~CFX_FileStreamImp() { 79ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (m_hFile != NULL) { 80ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FXSYS_fclose(m_hFile); 81ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 82ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann} 83ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannFX_BOOL CFX_FileStreamImp::LoadFile(const FX_WCHAR* pszSrcFileName, 84ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FX_DWORD dwAccess) { 85ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FXSYS_assert(m_hFile == NULL); 86ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FXSYS_assert(pszSrcFileName != NULL && FXSYS_wcslen(pszSrcFileName) > 0); 87ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#if _FX_OS_ == _FX_WIN32_DESKTOP_ || _FX_OS_ == _FX_WIN32_MOBILE_ || \ 88ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann _FX_OS_ == _FX_WIN64_ 89ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CFX_WideString wsMode; 90ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (dwAccess & FX_STREAMACCESS_Write) { 91ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (dwAccess & FX_STREAMACCESS_Append) { 92ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann wsMode = L"a+b"; 93ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } else if (dwAccess & FX_STREAMACCESS_Truncate) { 94ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann wsMode = L"w+b"; 95ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } else { 96ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann wsMode = L"r+b"; 97ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 98ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } else { 99ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann wsMode = L"rb"; 100ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 101ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#ifdef _FX_WINAPI_PARTITION_APP_ 102ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CFX_WideString wsSrcFileName(pszSrcFileName); 103ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann _wfopen_s(&m_hFile, wsSrcFileName, wsMode); 104ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#else 105ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_hFile = FXSYS_wfopen(pszSrcFileName, wsMode); 106ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#endif 107ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (m_hFile == NULL) { 108ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (dwAccess & FX_STREAMACCESS_Write) { 109ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (dwAccess & FX_STREAMACCESS_Create) { 110ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#ifdef _FX_WINAPI_PARTITION_APP_ 111ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CFX_WideString wsSrcFileName(pszSrcFileName); 112ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann _wfopen_s(&m_hFile, wsSrcFileName, L"w+b"); 113ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#else 114ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_hFile = FXSYS_wfopen(pszSrcFileName, L"w+b"); 115ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#endif 116ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 117ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (m_hFile == NULL) { 118ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#ifdef _FX_WINAPI_PARTITION_APP_ 119ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CFX_WideString wsSrcFileName(pszSrcFileName); 120ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann _wfopen_s(&m_hFile, wsSrcFileName, L"r+b"); 121ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#else 122ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_hFile = FXSYS_wfopen(pszSrcFileName, L"r+b"); 123ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#endif 124ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (m_hFile == NULL) { 125ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return FALSE; 126ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 127ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (dwAccess & FX_STREAMACCESS_Truncate) { 128ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FX_fsetsize(m_hFile, 0); 129ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 130ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 131ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } else { 132ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return FALSE; 133ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 134ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 135ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#else 136ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CFX_ByteString wsMode; 137ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (dwAccess & FX_STREAMACCESS_Write) { 138ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (dwAccess & FX_STREAMACCESS_Append) { 139ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann wsMode = "a+b"; 140ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } else if (dwAccess & FX_STREAMACCESS_Truncate) { 141ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann wsMode = "w+b"; 142ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } else { 143ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann wsMode = "r+b"; 144ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 145ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } else { 146ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann wsMode = "rb"; 147ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 148ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CFX_ByteString szFileName = CFX_ByteString::FromUnicode(pszSrcFileName); 149ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_hFile = FXSYS_fopen(szFileName, wsMode); 150ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (m_hFile == NULL) { 151ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (dwAccess & FX_STREAMACCESS_Write) { 152ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (dwAccess & FX_STREAMACCESS_Create) { 153ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_hFile = FXSYS_fopen(szFileName, "w+b"); 154ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 155ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (m_hFile == NULL) { 156ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_hFile = FXSYS_fopen(szFileName, "r+b"); 157ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (m_hFile == NULL) { 158ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return FALSE; 159ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 160ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (dwAccess & FX_STREAMACCESS_Truncate) { 161ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FX_fsetsize(m_hFile, 0); 162ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 163ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 164ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } else { 165ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return FALSE; 166ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 167ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 168ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#endif 169ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_dwAccess = dwAccess; 170ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if ((dwAccess & (FX_STREAMACCESS_Write | FX_STREAMACCESS_Truncate)) == 171ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann (FX_STREAMACCESS_Write | FX_STREAMACCESS_Truncate)) { 172ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_iLength = 0; 173ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } else { 174ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_iLength = FX_filelength(m_hFile); 175ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 176ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return TRUE; 177ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann} 178ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannint32_t CFX_FileStreamImp::GetLength() const { 179ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FXSYS_assert(m_hFile != NULL); 180ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return m_iLength; 181ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann} 182ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannint32_t CFX_FileStreamImp::Seek(FX_STREAMSEEK eSeek, int32_t iOffset) { 183ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FXSYS_assert(m_hFile != NULL); 184ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FXSYS_fseek(m_hFile, iOffset, eSeek); 185ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return FXSYS_ftell(m_hFile); 186ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann} 187ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannint32_t CFX_FileStreamImp::GetPosition() { 188ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FXSYS_assert(m_hFile != NULL); 189ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return FXSYS_ftell(m_hFile); 190ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann} 191ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannFX_BOOL CFX_FileStreamImp::IsEOF() const { 192ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FXSYS_assert(m_hFile != NULL); 193ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return FXSYS_ftell(m_hFile) >= m_iLength; 194ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann} 195ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannint32_t CFX_FileStreamImp::ReadData(uint8_t* pBuffer, int32_t iBufferSize) { 196ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FXSYS_assert(m_hFile != NULL); 197ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FXSYS_assert(pBuffer != NULL && iBufferSize > 0); 198ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return FXSYS_fread(pBuffer, 1, iBufferSize, m_hFile); 199ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann} 200ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannint32_t CFX_FileStreamImp::ReadString(FX_WCHAR* pStr, 201ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann int32_t iMaxLength, 202ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FX_BOOL& bEOS) { 203ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FXSYS_assert(m_hFile != NULL); 204ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FXSYS_assert(pStr != NULL && iMaxLength > 0); 205ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (m_iLength <= 0) { 206ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return 0; 207ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 208ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann int32_t iPosition = FXSYS_ftell(m_hFile); 209ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann int32_t iLen = std::min((m_iLength - iPosition) / 2, iMaxLength); 210ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (iLen <= 0) { 211ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return 0; 212ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 213ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann iLen = FXSYS_fread(pStr, 2, iLen, m_hFile); 214ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann int32_t iCount = 0; 215ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann while (*pStr != L'\0' && iCount < iLen) { 216ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann pStr++, iCount++; 217ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 218ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann iPosition += iCount * 2; 219ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (FXSYS_ftell(m_hFile) != iPosition) { 220ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FXSYS_fseek(m_hFile, iPosition, 0); 221ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 222ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann bEOS = (iPosition >= m_iLength); 223ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return iCount; 224ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann} 225ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannint32_t CFX_FileStreamImp::WriteData(const uint8_t* pBuffer, 226ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann int32_t iBufferSize) { 227ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FXSYS_assert(m_hFile != NULL && (m_dwAccess & FX_STREAMACCESS_Write) != 0); 228ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FXSYS_assert(pBuffer != NULL && iBufferSize > 0); 229ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann int32_t iRet = FXSYS_fwrite(pBuffer, 1, iBufferSize, m_hFile); 230ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (iRet != 0) { 231ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann int32_t iPos = FXSYS_ftell(m_hFile); 232ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (iPos > m_iLength) { 233ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_iLength = iPos; 234ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 235ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 236ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return iRet; 237ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann} 238ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannint32_t CFX_FileStreamImp::WriteString(const FX_WCHAR* pStr, int32_t iLength) { 239ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FXSYS_assert(m_hFile != NULL && (m_dwAccess & FX_STREAMACCESS_Write) != 0); 240ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FXSYS_assert(pStr != NULL && iLength > 0); 241ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann int32_t iRet = FXSYS_fwrite(pStr, 2, iLength, m_hFile); 242ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (iRet != 0) { 243ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann int32_t iPos = FXSYS_ftell(m_hFile); 244ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (iPos > m_iLength) { 245ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_iLength = iPos; 246ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 247ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 248ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return iRet; 249ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann} 250ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannvoid CFX_FileStreamImp::Flush() { 251ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FXSYS_assert(m_hFile != NULL && (m_dwAccess & FX_STREAMACCESS_Write) != 0); 252ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FXSYS_fflush(m_hFile); 253ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann} 254ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannFX_BOOL CFX_FileStreamImp::SetLength(int32_t iLength) { 255ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FXSYS_assert(m_hFile != NULL && (m_dwAccess & FX_STREAMACCESS_Write) != 0); 256ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FX_BOOL bRet = FX_fsetsize(m_hFile, iLength); 257ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_iLength = FX_filelength(m_hFile); 258ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return bRet; 259ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann} 260ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannCFX_FileReadStreamImp::CFX_FileReadStreamImp() 261ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann : m_pFileRead(NULL), m_iPosition(0), m_iLength(0) {} 262ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannFX_BOOL CFX_FileReadStreamImp::LoadFileRead(IFX_FileRead* pFileRead, 263ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FX_DWORD dwAccess) { 264ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FXSYS_assert(m_pFileRead == NULL && pFileRead != NULL); 265ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (dwAccess & FX_STREAMACCESS_Write) { 266ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return FALSE; 267ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 268ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_pFileRead = pFileRead; 269ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_iLength = m_pFileRead->GetSize(); 270ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return TRUE; 271ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann} 272ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannint32_t CFX_FileReadStreamImp::GetLength() const { 273ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return m_iLength; 274ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann} 275ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannint32_t CFX_FileReadStreamImp::Seek(FX_STREAMSEEK eSeek, int32_t iOffset) { 276ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann switch (eSeek) { 277ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann case FX_STREAMSEEK_Begin: 278ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_iPosition = iOffset; 279ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann break; 280ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann case FX_STREAMSEEK_Current: 281ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_iPosition += iOffset; 282ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann break; 283ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann case FX_STREAMSEEK_End: 284ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_iPosition = m_iLength + iOffset; 285ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann break; 286ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 287ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (m_iPosition < 0) { 288ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_iPosition = 0; 289ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } else if (m_iPosition >= m_iLength) { 290ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_iPosition = m_iLength; 291ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 292ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return m_iPosition; 293ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann} 294ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannFX_BOOL CFX_FileReadStreamImp::IsEOF() const { 295ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return m_iPosition >= m_iLength; 296ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann} 297ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannint32_t CFX_FileReadStreamImp::ReadData(uint8_t* pBuffer, int32_t iBufferSize) { 298ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FXSYS_assert(m_pFileRead != NULL); 299ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FXSYS_assert(pBuffer != NULL && iBufferSize > 0); 300ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (iBufferSize > m_iLength - m_iPosition) { 301ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann iBufferSize = m_iLength - m_iPosition; 302ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 303ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (m_pFileRead->ReadBlock(pBuffer, m_iPosition, iBufferSize)) { 304ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_iPosition += iBufferSize; 305ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return iBufferSize; 306ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 307ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return 0; 308ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann} 309ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannint32_t CFX_FileReadStreamImp::ReadString(FX_WCHAR* pStr, 310ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann int32_t iMaxLength, 311ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FX_BOOL& bEOS) { 312ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FXSYS_assert(m_pFileRead != NULL); 313ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FXSYS_assert(pStr != NULL && iMaxLength > 0); 314ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann iMaxLength = ReadData((uint8_t*)pStr, iMaxLength * 2) / 2; 315ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (iMaxLength <= 0) { 316ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return 0; 317ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 318ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann int32_t i = 0; 319ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann while (i < iMaxLength && pStr[i] != L'\0') { 320ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann ++i; 321ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 322ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann bEOS = (m_iPosition >= m_iLength) || pStr[i] == L'\0'; 323ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return i; 324ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann} 325ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannCFX_BufferReadStreamImp::CFX_BufferReadStreamImp() 326ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann : m_pBufferRead(NULL), 327ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_bReleaseBufferRead(FALSE), 328ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_iPosition(0), 329ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_iBufferSize(0) {} 330ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannCFX_BufferReadStreamImp::~CFX_BufferReadStreamImp() { 331ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (m_bReleaseBufferRead && m_pBufferRead != NULL) { 332ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_pBufferRead->Release(); 333ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 334ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann} 335ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannFX_BOOL CFX_BufferReadStreamImp::LoadBufferRead(IFX_BufferRead* pBufferRead, 336ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann int32_t iFileSize, 337ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FX_DWORD dwAccess, 338ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FX_BOOL bReleaseBufferRead) { 339ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FXSYS_assert(m_pBufferRead == NULL && pBufferRead != NULL); 340ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (dwAccess & FX_STREAMACCESS_Write) { 341ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return FALSE; 342ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 343ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_bReleaseBufferRead = bReleaseBufferRead; 344ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_pBufferRead = pBufferRead; 345ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_iBufferSize = iFileSize; 346ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (m_iBufferSize >= 0) { 347ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return TRUE; 348ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 349ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (!m_pBufferRead->ReadNextBlock(TRUE)) { 350ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return FALSE; 351ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 352ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_iBufferSize = m_pBufferRead->GetBlockSize(); 353ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann while (!m_pBufferRead->IsEOF()) { 354ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_pBufferRead->ReadNextBlock(FALSE); 355ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_iBufferSize += m_pBufferRead->GetBlockSize(); 356ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 357ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return TRUE; 358ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann} 359ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannint32_t CFX_BufferReadStreamImp::GetLength() const { 360ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return m_iBufferSize; 361ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann} 362ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannint32_t CFX_BufferReadStreamImp::Seek(FX_STREAMSEEK eSeek, int32_t iOffset) { 363ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann int32_t iLength = GetLength(); 364ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann switch (eSeek) { 365ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann case FX_STREAMSEEK_Begin: 366ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_iPosition = iOffset; 367ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann break; 368ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann case FX_STREAMSEEK_Current: 369ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_iPosition += iOffset; 370ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann break; 371ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann case FX_STREAMSEEK_End: 372ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_iPosition = iLength + iOffset; 373ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann break; 374ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 375ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (m_iPosition < 0) { 376ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_iPosition = 0; 377ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } else if (m_iPosition >= iLength) { 378ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_iPosition = iLength; 379ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 380ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return m_iPosition; 381ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann} 382ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannFX_BOOL CFX_BufferReadStreamImp::IsEOF() const { 383ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return m_pBufferRead ? m_pBufferRead->IsEOF() : TRUE; 384ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann} 385ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannint32_t CFX_BufferReadStreamImp::ReadData(uint8_t* pBuffer, 386ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann int32_t iBufferSize) { 387ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FXSYS_assert(m_pBufferRead != NULL); 388ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FXSYS_assert(pBuffer != NULL && iBufferSize > 0); 389ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann int32_t iLength = GetLength(); 390ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (m_iPosition >= iLength) { 391ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return 0; 392ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 393ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (iBufferSize > iLength - m_iPosition) { 394ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann iBufferSize = iLength - m_iPosition; 395ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 396ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FX_DWORD dwBlockOffset = m_pBufferRead->GetBlockOffset(); 397ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FX_DWORD dwBlockSize = m_pBufferRead->GetBlockSize(); 398ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (m_iPosition < (int32_t)dwBlockOffset) { 399ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (!m_pBufferRead->ReadNextBlock(TRUE)) { 400ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return 0; 401ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 402ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann dwBlockOffset = m_pBufferRead->GetBlockOffset(); 403ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann dwBlockSize = m_pBufferRead->GetBlockSize(); 404ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 405ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann while (m_iPosition < (int32_t)dwBlockOffset || 406ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_iPosition >= (int32_t)(dwBlockOffset + dwBlockSize)) { 407ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (m_pBufferRead->IsEOF() || !m_pBufferRead->ReadNextBlock(FALSE)) { 408ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann break; 409ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 410ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann dwBlockOffset = m_pBufferRead->GetBlockOffset(); 411ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann dwBlockSize = m_pBufferRead->GetBlockSize(); 412ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 413ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (m_iPosition < (int32_t)dwBlockOffset || 414ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_iPosition >= (int32_t)(dwBlockOffset + dwBlockSize)) { 415ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return 0; 416ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 417ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann const uint8_t* pBufferTmp = m_pBufferRead->GetBlockBuffer(); 418ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FX_DWORD dwOffsetTmp = m_iPosition - dwBlockOffset; 419ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FX_DWORD dwCopySize = 420ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann std::min(iBufferSize, (int32_t)(dwBlockSize - dwOffsetTmp)); 421ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FXSYS_memcpy(pBuffer, pBufferTmp + dwOffsetTmp, dwCopySize); 422ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann dwOffsetTmp = dwCopySize; 423ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann iBufferSize -= dwCopySize; 424ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann while (iBufferSize > 0) { 425ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (!m_pBufferRead->ReadNextBlock(FALSE)) { 426ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann break; 427ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 428ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann dwBlockOffset = m_pBufferRead->GetBlockOffset(); 429ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann dwBlockSize = m_pBufferRead->GetBlockSize(); 430ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann pBufferTmp = m_pBufferRead->GetBlockBuffer(); 431ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann dwCopySize = std::min((FX_DWORD)iBufferSize, dwBlockSize); 432ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FXSYS_memcpy(pBuffer + dwOffsetTmp, pBufferTmp, dwCopySize); 433ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann dwOffsetTmp += dwCopySize; 434ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann iBufferSize -= dwCopySize; 435ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 436ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_iPosition += dwOffsetTmp; 437ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return dwOffsetTmp; 438ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann} 439ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannint32_t CFX_BufferReadStreamImp::ReadString(FX_WCHAR* pStr, 440ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann int32_t iMaxLength, 441ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FX_BOOL& bEOS) { 442ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FXSYS_assert(m_pBufferRead != NULL); 443ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FXSYS_assert(pStr != NULL && iMaxLength > 0); 444ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann iMaxLength = ReadData((uint8_t*)pStr, iMaxLength * 2) / 2; 445ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (iMaxLength <= 0) { 446ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return 0; 447ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 448ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann int32_t i = 0; 449ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann while (i < iMaxLength && pStr[i] != L'\0') { 450ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann ++i; 451ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 452ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann bEOS = (m_iPosition >= GetLength()) || pStr[i] == L'\0'; 453ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return i; 454ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann} 455ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannCFX_FileWriteStreamImp::CFX_FileWriteStreamImp() 456ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann : m_pFileWrite(NULL), m_iPosition(0) {} 457ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannFX_BOOL CFX_FileWriteStreamImp::LoadFileWrite(IFX_FileWrite* pFileWrite, 458ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FX_DWORD dwAccess) { 459ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FXSYS_assert(m_pFileWrite == NULL && pFileWrite != NULL); 460ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (dwAccess & FX_STREAMACCESS_Read) { 461ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return FALSE; 462ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 463ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (dwAccess & FX_STREAMACCESS_Append) { 464ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_iPosition = pFileWrite->GetSize(); 465ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 466ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_pFileWrite = pFileWrite; 467ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return TRUE; 468ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann} 469ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannint32_t CFX_FileWriteStreamImp::GetLength() const { 470ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (!m_pFileWrite) { 471ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return 0; 472ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 473ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return (int32_t)m_pFileWrite->GetSize(); 474ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann} 475ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannint32_t CFX_FileWriteStreamImp::Seek(FX_STREAMSEEK eSeek, int32_t iOffset) { 476ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann int32_t iLength = GetLength(); 477ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann switch (eSeek) { 478ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann case FX_STREAMSEEK_Begin: 479ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_iPosition = iOffset; 480ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann break; 481ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann case FX_STREAMSEEK_Current: 482ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_iPosition += iOffset; 483ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann break; 484ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann case FX_STREAMSEEK_End: 485ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_iPosition = iLength + iOffset; 486ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann break; 487ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 488ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (m_iPosition < 0) { 489ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_iPosition = 0; 490ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } else if (m_iPosition >= iLength) { 491ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_iPosition = iLength; 492ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 493ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return m_iPosition; 494ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann} 495ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannFX_BOOL CFX_FileWriteStreamImp::IsEOF() const { 496ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return m_iPosition >= GetLength(); 497ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann} 498ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannint32_t CFX_FileWriteStreamImp::WriteData(const uint8_t* pBuffer, 499ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann int32_t iBufferSize) { 500ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (!m_pFileWrite) { 501ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return 0; 502ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 503ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (m_pFileWrite->WriteBlock(pBuffer, m_iPosition, iBufferSize)) { 504ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_iPosition += iBufferSize; 505ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 506ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return iBufferSize; 507ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann} 508ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannint32_t CFX_FileWriteStreamImp::WriteString(const FX_WCHAR* pStr, 509ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann int32_t iLength) { 510ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return WriteData((const uint8_t*)pStr, iLength * sizeof(FX_WCHAR)); 511ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann} 512ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannvoid CFX_FileWriteStreamImp::Flush() { 513ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (m_pFileWrite) { 514ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_pFileWrite->Flush(); 515ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 516ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann} 517ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannCFX_BufferStreamImp::CFX_BufferStreamImp() 518ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann : CFX_StreamImp(), 519ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_pData(NULL), 520ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_iTotalSize(0), 521ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_iPosition(0), 522ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_iLength(0) {} 523ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannFX_BOOL CFX_BufferStreamImp::LoadBuffer(uint8_t* pData, 524ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann int32_t iTotalSize, 525ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FX_DWORD dwAccess) { 526ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FXSYS_assert(m_pData == NULL); 527ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FXSYS_assert(pData != NULL && iTotalSize > 0); 528ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_dwAccess = dwAccess; 529ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_pData = pData; 530ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_iTotalSize = iTotalSize; 531ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_iPosition = 0; 532ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_iLength = (dwAccess & FX_STREAMACCESS_Write) != 0 ? 0 : iTotalSize; 533ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return TRUE; 534ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann} 535ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannint32_t CFX_BufferStreamImp::GetLength() const { 536ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FXSYS_assert(m_pData != NULL); 537ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return m_iLength; 538ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann} 539ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannint32_t CFX_BufferStreamImp::Seek(FX_STREAMSEEK eSeek, int32_t iOffset) { 540ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FXSYS_assert(m_pData != NULL); 541ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (eSeek == FX_STREAMSEEK_Begin) { 542ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_iPosition = iOffset; 543ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } else if (eSeek == FX_STREAMSEEK_Current) { 544ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_iPosition += iOffset; 545ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } else if (eSeek == FX_STREAMSEEK_End) { 546ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_iPosition = m_iLength + iOffset; 547ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 548ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (m_iPosition > m_iLength) { 549ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_iPosition = m_iLength; 550ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 551ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (m_iPosition < 0) { 552ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_iPosition = 0; 553ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 554ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return m_iPosition; 555ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann} 556ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannint32_t CFX_BufferStreamImp::GetPosition() { 557ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FXSYS_assert(m_pData != NULL); 558ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return m_iPosition; 559ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann} 560ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannFX_BOOL CFX_BufferStreamImp::IsEOF() const { 561ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FXSYS_assert(m_pData != NULL); 562ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return m_iPosition >= m_iLength; 563ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann} 564ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannint32_t CFX_BufferStreamImp::ReadData(uint8_t* pBuffer, int32_t iBufferSize) { 565ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FXSYS_assert(m_pData != NULL); 566ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FXSYS_assert(pBuffer != NULL && iBufferSize > 0); 567ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann int32_t iLen = std::min(m_iLength - m_iPosition, iBufferSize); 568ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (iLen <= 0) { 569ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return 0; 570ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 571ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FXSYS_memcpy(pBuffer, m_pData + m_iPosition, iLen); 572ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_iPosition += iLen; 573ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return iLen; 574ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann} 575ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannint32_t CFX_BufferStreamImp::ReadString(FX_WCHAR* pStr, 576ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann int32_t iMaxLength, 577ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FX_BOOL& bEOS) { 578ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FXSYS_assert(m_pData != NULL); 579ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FXSYS_assert(pStr != NULL && iMaxLength > 0); 580ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann int32_t iLen = std::min((m_iLength - m_iPosition) / 2, iMaxLength); 581ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (iLen <= 0) { 582ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return 0; 583ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 584ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann const FX_WCHAR* pSrc = (const FX_WCHAR*)(FX_CHAR*)(m_pData + m_iPosition); 585ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann int32_t iCount = 0; 586ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann while (*pSrc != L'\0' && iCount < iLen) { 587ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann *pStr++ = *pSrc++, iCount++; 588ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 589ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_iPosition += iCount * 2; 590ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann bEOS = (*pSrc == L'\0') || (m_iPosition >= m_iLength); 591ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return iCount; 592ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann} 593ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannint32_t CFX_BufferStreamImp::WriteData(const uint8_t* pBuffer, 594ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann int32_t iBufferSize) { 595ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FXSYS_assert(m_pData != NULL && (m_dwAccess & FX_STREAMACCESS_Write) != 0); 596ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FXSYS_assert(pBuffer != NULL && iBufferSize > 0); 597ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann int32_t iLen = std::min(m_iTotalSize - m_iPosition, iBufferSize); 598ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (iLen <= 0) { 599ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return 0; 600ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 601ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FXSYS_memcpy(m_pData + m_iPosition, pBuffer, iLen); 602ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_iPosition += iLen; 603ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (m_iPosition > m_iLength) { 604ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_iLength = m_iPosition; 605ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 606ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return iLen; 607ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann} 608ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannint32_t CFX_BufferStreamImp::WriteString(const FX_WCHAR* pStr, 609ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann int32_t iLength) { 610ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FXSYS_assert(m_pData != NULL && (m_dwAccess & FX_STREAMACCESS_Write) != 0); 611ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FXSYS_assert(pStr != NULL && iLength > 0); 612ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann int32_t iLen = std::min((m_iTotalSize - m_iPosition) / 2, iLength); 613ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (iLen <= 0) { 614ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return 0; 615ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 616ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FXSYS_memcpy(m_pData + m_iPosition, pStr, iLen * 2); 617ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_iPosition += iLen * 2; 618ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (m_iPosition > m_iLength) { 619ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_iLength = m_iPosition; 620ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 621ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return iLen; 622ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann} 623ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannIFX_Stream* IFX_Stream::CreateTextStream(IFX_Stream* pBaseStream, 624ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FX_BOOL bDeleteOnRelease) { 625ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FXSYS_assert(pBaseStream != NULL); 626ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return new CFX_TextStream(pBaseStream, bDeleteOnRelease); 627ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann} 628ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannCFX_TextStream::CFX_TextStream(IFX_Stream* pStream, FX_BOOL bDelStream) 629ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann : m_wCodePage(FX_CODEPAGE_DefANSI), 630ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_wBOMLength(0), 631ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_dwBOM(0), 632ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_pBuf(NULL), 633ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_iBufSize(0), 634ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_bDelStream(bDelStream), 635ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_pStreamImp(pStream), 636ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_iRefCount(1) { 637ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FXSYS_assert(m_pStreamImp != NULL); 638ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_pStreamImp->Retain(); 639ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann InitStream(); 640ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann} 641ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannCFX_TextStream::~CFX_TextStream() { 642ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_pStreamImp->Release(); 643ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (m_bDelStream) { 644ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_pStreamImp->Release(); 645ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 646ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (m_pBuf != NULL) { 647ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FX_Free(m_pBuf); 648ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 649ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann} 650ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannvoid CFX_TextStream::InitStream() { 651ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann int32_t iPosition = m_pStreamImp->GetPosition(); 652ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_pStreamImp->Seek(FX_STREAMSEEK_Begin, 0); 653ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_pStreamImp->ReadData((uint8_t*)&m_dwBOM, 3); 654ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#if _FX_ENDIAN_ == _FX_LITTLE_ENDIAN_ 655ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_dwBOM &= 0x00FFFFFF; 656ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (m_dwBOM == 0x00BFBBEF) { 657ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_wBOMLength = 3; 658ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_wCodePage = FX_CODEPAGE_UTF8; 659ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } else { 660ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_dwBOM &= 0x0000FFFF; 661ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (m_dwBOM == 0x0000FFFE) { 662ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_wBOMLength = 2; 663ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_wCodePage = FX_CODEPAGE_UTF16BE; 664ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } else if (m_dwBOM == 0x0000FEFF) { 665ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_wBOMLength = 2; 666ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_wCodePage = FX_CODEPAGE_UTF16LE; 667ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } else { 668ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_wBOMLength = 0; 669ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_dwBOM = 0; 670ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_wCodePage = FXSYS_GetACP(); 671ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 672ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 673ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#else 674ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_dwBOM &= 0xFFFFFF00; 675ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (m_dwBOM == 0xEFBBBF00) { 676ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_wBOMLength = 3; 677ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_wCodePage = FX_CODEPAGE_UTF8; 678ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } else { 679ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_dwBOM &= 0xFFFF0000; 680ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (m_dwBOM == 0xFEFF0000) { 681ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_wBOMLength = 2; 682ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_wCodePage = FX_CODEPAGE_UTF16BE; 683ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } else if (m_dwBOM == 0xFFFE0000) { 684ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_wBOMLength = 2; 685ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_wCodePage = FX_CODEPAGE_UTF16LE; 686ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } else { 687ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_wBOMLength = 0; 688ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_dwBOM = 0; 689ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_wCodePage = FXSYS_GetACP(); 690ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 691ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 692ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#endif 693ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_pStreamImp->Seek(FX_STREAMSEEK_Begin, std::max(m_wBOMLength, iPosition)); 694ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann} 695ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannvoid CFX_TextStream::Release() { 696ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (--m_iRefCount < 1) { 697ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann delete this; 698ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 699ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann} 700ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannIFX_Stream* CFX_TextStream::Retain() { 701ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_iRefCount++; 702ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return this; 703ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann} 704ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannFX_DWORD CFX_TextStream::GetAccessModes() const { 705ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return m_pStreamImp->GetAccessModes() | FX_STREAMACCESS_Text; 706ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann} 707ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannint32_t CFX_TextStream::GetLength() const { 708ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return m_pStreamImp->GetLength(); 709ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann} 710ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannint32_t CFX_TextStream::Seek(FX_STREAMSEEK eSeek, int32_t iOffset) { 711ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return m_pStreamImp->Seek(eSeek, iOffset); 712ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann} 713ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannint32_t CFX_TextStream::GetPosition() { 714ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return m_pStreamImp->GetPosition(); 715ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann} 716ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannFX_BOOL CFX_TextStream::IsEOF() const { 717ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return m_pStreamImp->IsEOF(); 718ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann} 719ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannint32_t CFX_TextStream::ReadData(uint8_t* pBuffer, int32_t iBufferSize) { 720ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return m_pStreamImp->ReadData(pBuffer, iBufferSize); 721ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann} 722ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannint32_t CFX_TextStream::WriteData(const uint8_t* pBuffer, int32_t iBufferSize) { 723ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return m_pStreamImp->WriteData(pBuffer, iBufferSize); 724ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann} 725ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannvoid CFX_TextStream::Flush() { 726ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_pStreamImp->Flush(); 727ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann} 728ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannFX_BOOL CFX_TextStream::SetLength(int32_t iLength) { 729ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return m_pStreamImp->SetLength(iLength); 730ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann} 731ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannFX_WORD CFX_TextStream::GetCodePage() const { 732ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return m_wCodePage; 733ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann} 734ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannIFX_Stream* CFX_TextStream::CreateSharedStream(FX_DWORD dwAccess, 735ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann int32_t iOffset, 736ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann int32_t iLength) { 737ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann IFX_Stream* pSR = 738ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_pStreamImp->CreateSharedStream(dwAccess, iOffset, iLength); 739ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (pSR == NULL) { 740ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return NULL; 741ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 742ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (dwAccess & FX_STREAMACCESS_Text) { 743ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return new CFX_TextStream(pSR, TRUE); 744ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 745ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return pSR; 746ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann} 747ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannint32_t CFX_TextStream::GetBOM(uint8_t bom[4]) const { 748ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (m_wBOMLength < 1) { 749ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return 0; 750ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 751ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann *(FX_DWORD*)bom = m_dwBOM; 752ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return m_wBOMLength; 753ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann} 754ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannFX_WORD CFX_TextStream::SetCodePage(FX_WORD wCodePage) { 755ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (m_wBOMLength > 0) { 756ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return m_wCodePage; 757ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 758ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FX_WORD v = m_wCodePage; 759ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_wCodePage = wCodePage; 760ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return v; 761ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann} 762ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannint32_t CFX_TextStream::ReadString(FX_WCHAR* pStr, 763ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann int32_t iMaxLength, 764ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FX_BOOL& bEOS, 765ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann int32_t const* pByteSize) { 766ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FXSYS_assert(pStr != NULL && iMaxLength > 0); 767ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (m_pStreamImp == NULL) { 768ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return -1; 769ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 770ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann int32_t iLen; 771ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (m_wCodePage == FX_CODEPAGE_UTF16LE || 772ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_wCodePage == FX_CODEPAGE_UTF16BE) { 773ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann int32_t iBytes = pByteSize == NULL ? iMaxLength * 2 : *pByteSize; 774ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_pStreamImp->Lock(); 775ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann iLen = m_pStreamImp->ReadData((uint8_t*)pStr, iBytes); 776ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_pStreamImp->Unlock(); 777ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann iMaxLength = iLen / 2; 778ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (sizeof(FX_WCHAR) > 2) { 779ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FX_UTF16ToWChar(pStr, iMaxLength); 780ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 781ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#if _FX_ENDIAN_ == _FX_BIG_ENDIAN_ 782ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (m_wCodePage == FX_CODEPAGE_UTF16LE) { 783ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FX_SwapByteOrder(pStr, iMaxLength); 784ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 785ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#else 786ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (m_wCodePage == FX_CODEPAGE_UTF16BE) { 787ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FX_SwapByteOrder(pStr, iMaxLength); 788ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 789ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#endif 790ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } else { 791ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann int32_t pos = m_pStreamImp->GetPosition(); 792ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann int32_t iBytes = pByteSize == NULL ? iMaxLength : *pByteSize; 793ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann iBytes = std::min(iBytes, m_pStreamImp->GetLength() - pos); 794ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (iBytes > 0) { 795ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (m_pBuf == NULL) { 796ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_pBuf = FX_Alloc(uint8_t, iBytes); 797ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_iBufSize = iBytes; 798ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } else if (iBytes > m_iBufSize) { 799ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_pBuf = FX_Realloc(uint8_t, m_pBuf, iBytes); 800ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_iBufSize = iBytes; 801ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 802ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_pStreamImp->Lock(); 803ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann iLen = m_pStreamImp->ReadData(m_pBuf, iBytes); 804ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann int32_t iSrc = iLen; 805ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann int32_t iDecode = FX_DecodeString(m_wCodePage, (const FX_CHAR*)m_pBuf, 806ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann &iSrc, pStr, &iMaxLength, TRUE); 807ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_pStreamImp->Seek(FX_STREAMSEEK_Current, iSrc - iLen); 808ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_pStreamImp->Unlock(); 809ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (iDecode < 1) { 810ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return -1; 811ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 812ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } else { 813ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann iMaxLength = 0; 814ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 815ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 816ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann bEOS = m_pStreamImp->IsEOF(); 817ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return iMaxLength; 818ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann} 819ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannint32_t CFX_TextStream::WriteString(const FX_WCHAR* pStr, int32_t iLength) { 820ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FXSYS_assert(pStr != NULL && iLength > 0); 821ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if ((m_pStreamImp->GetAccessModes() & FX_STREAMACCESS_Write) == 0) { 822ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return -1; 823ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 824ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (m_wCodePage == FX_CODEPAGE_UTF8) { 825ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann int32_t len = iLength; 826ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CFX_UTF8Encoder encoder; 827ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann while (len-- > 0) { 828ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann encoder.Input(*pStr++); 829ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 830ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CFX_ByteStringC bsResult = encoder.GetResult(); 831ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_pStreamImp->Lock(); 832ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_pStreamImp->WriteData((const uint8_t*)bsResult.GetCStr(), 833ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann bsResult.GetLength()); 834ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_pStreamImp->Unlock(); 835ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 836ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return iLength; 837ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann} 838ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannCFX_Stream::CFX_Stream() 839ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann : m_eStreamType(FX_SREAMTYPE_Unknown), 840ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_pStreamImp(NULL), 841ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_dwAccess(0), 842ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_iTotalSize(0), 843ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_iPosition(0), 844ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_iStart(0), 845ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_iLength(0), 846ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_iRefCount(1) {} 847ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannCFX_Stream::~CFX_Stream() { 848ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (m_eStreamType != FX_STREAMTYPE_Stream && m_pStreamImp != NULL) { 849ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_pStreamImp->Release(); 850ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 851ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann} 852ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannFX_BOOL CFX_Stream::LoadFile(const FX_WCHAR* pszSrcFileName, 853ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FX_DWORD dwAccess) { 854ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (m_eStreamType != FX_SREAMTYPE_Unknown || m_pStreamImp != NULL) { 855ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return FALSE; 856ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 857ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (pszSrcFileName == NULL || FXSYS_wcslen(pszSrcFileName) < 1) { 858ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return FALSE; 859ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 860ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_pStreamImp = new CFX_FileStreamImp(); 861ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FX_BOOL bRet = 862ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann ((CFX_FileStreamImp*)m_pStreamImp)->LoadFile(pszSrcFileName, dwAccess); 863ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (!bRet) { 864ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_pStreamImp->Release(); 865ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_pStreamImp = NULL; 866ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } else { 867ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_eStreamType = FX_STREAMTYPE_File; 868ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_dwAccess = dwAccess; 869ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_iLength = m_pStreamImp->GetLength(); 870ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 871ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return bRet; 872ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann} 873ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannFX_BOOL CFX_Stream::LoadFileRead(IFX_FileRead* pFileRead, FX_DWORD dwAccess) { 874ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (m_eStreamType != FX_SREAMTYPE_Unknown || m_pStreamImp != NULL) { 875ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return FALSE; 876ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 877ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (pFileRead == NULL) { 878ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return FALSE; 879ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 880ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_pStreamImp = new CFX_FileReadStreamImp(); 881ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FX_BOOL bRet = 882ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann ((CFX_FileReadStreamImp*)m_pStreamImp)->LoadFileRead(pFileRead, dwAccess); 883ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (!bRet) { 884ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_pStreamImp->Release(); 885ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_pStreamImp = NULL; 886ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } else { 887ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_eStreamType = FX_STREAMTYPE_File; 888ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_dwAccess = dwAccess; 889ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_iLength = m_pStreamImp->GetLength(); 890ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 891ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return bRet; 892ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann} 893ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannFX_BOOL CFX_Stream::LoadFileWrite(IFX_FileWrite* pFileWrite, 894ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FX_DWORD dwAccess) { 895ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (m_eStreamType != FX_SREAMTYPE_Unknown || m_pStreamImp != NULL) { 896ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return FALSE; 897ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 898ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (pFileWrite == NULL) { 899ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return FALSE; 900ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 901ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_pStreamImp = new CFX_FileWriteStreamImp(); 902ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FX_BOOL bRet = ((CFX_FileWriteStreamImp*)m_pStreamImp) 903ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann ->LoadFileWrite(pFileWrite, dwAccess); 904ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (!bRet) { 905ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_pStreamImp->Release(); 906ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_pStreamImp = NULL; 907ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } else { 908ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_eStreamType = FX_STREAMTYPE_File; 909ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_dwAccess = dwAccess; 910ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_iLength = m_pStreamImp->GetLength(); 911ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 912ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return bRet; 913ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann} 914ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannFX_BOOL CFX_Stream::LoadBuffer(uint8_t* pData, 915ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann int32_t iTotalSize, 916ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FX_DWORD dwAccess) { 917ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (m_eStreamType != FX_SREAMTYPE_Unknown || m_pStreamImp != NULL) { 918ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return FALSE; 919ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 920ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (pData == NULL || iTotalSize < 1) { 921ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return FALSE; 922ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 923ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_pStreamImp = new CFX_BufferStreamImp(); 924ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FX_BOOL bRet = ((CFX_BufferStreamImp*)m_pStreamImp) 925ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann ->LoadBuffer(pData, iTotalSize, dwAccess); 926ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (!bRet) { 927ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_pStreamImp->Release(); 928ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_pStreamImp = NULL; 929ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } else { 930ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_eStreamType = FX_STREAMTYPE_Buffer; 931ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_dwAccess = dwAccess; 932ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_iLength = m_pStreamImp->GetLength(); 933ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 934ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return bRet; 935ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann} 936ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannFX_BOOL CFX_Stream::LoadBufferRead(IFX_BufferRead* pBufferRead, 937ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann int32_t iFileSize, 938ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FX_DWORD dwAccess, 939ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FX_BOOL bReleaseBufferRead) { 940ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (m_eStreamType != FX_SREAMTYPE_Unknown || m_pStreamImp != NULL) { 941ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return FALSE; 942ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 943ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (!pBufferRead) { 944ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return FALSE; 945ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 946ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_pStreamImp = new CFX_BufferReadStreamImp; 947ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FX_BOOL bRet = ((CFX_BufferReadStreamImp*)m_pStreamImp) 948ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann ->LoadBufferRead(pBufferRead, iFileSize, dwAccess, 949ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann bReleaseBufferRead); 950ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (!bRet) { 951ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_pStreamImp->Release(); 952ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_pStreamImp = NULL; 953ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } else { 954ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_eStreamType = FX_STREAMTYPE_BufferRead; 955ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_dwAccess = dwAccess; 956ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_iLength = m_pStreamImp->GetLength(); 957ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 958ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return bRet; 959ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann} 960ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannvoid CFX_Stream::Release() { 961ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (--m_iRefCount < 1) { 962ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann delete this; 963ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 964ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann} 965ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannIFX_Stream* CFX_Stream::Retain() { 966ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_iRefCount++; 967ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return this; 968ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann} 969ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannint32_t CFX_Stream::GetLength() const { 970ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (m_pStreamImp == NULL) { 971ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return -1; 972ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 973ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (m_eStreamType == FX_STREAMTYPE_File || 974ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_eStreamType == FX_STREAMTYPE_Buffer) { 975ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return m_pStreamImp->GetLength(); 976ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 977ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return m_iLength; 978ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann} 979ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannint32_t CFX_Stream::Seek(FX_STREAMSEEK eSeek, int32_t iOffset) { 980ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (m_pStreamImp == NULL) { 981ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return -1; 982ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 983ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (m_eStreamType == FX_STREAMTYPE_File || 984ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_eStreamType == FX_STREAMTYPE_Buffer) { 985ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return m_iPosition = m_pStreamImp->Seek(eSeek, iOffset); 986ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 987ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann int32_t iEnd = m_iStart + m_iLength; 988ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann int32_t iPosition = m_iStart + iOffset; 989ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (eSeek == FX_STREAMSEEK_Begin) { 990ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_iPosition = iPosition; 991ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } else if (eSeek == FX_STREAMSEEK_Current) { 992ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_iPosition += iOffset; 993ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } else if (eSeek == FX_STREAMSEEK_End) { 994ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_iPosition = iEnd + iOffset; 995ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 996ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (m_iPosition > iEnd) { 997ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_iPosition = iEnd; 998ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 999ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (m_iPosition < m_iStart) { 1000ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_iPosition = m_iStart; 1001ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 1002ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return m_iPosition - m_iStart; 1003ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann} 1004ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannint32_t CFX_Stream::GetPosition() { 1005ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (m_pStreamImp == NULL) { 1006ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return -1; 1007ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 1008ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (m_eStreamType == FX_STREAMTYPE_File || 1009ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_eStreamType == FX_STREAMTYPE_Buffer) { 1010ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return m_iPosition = m_pStreamImp->GetPosition(); 1011ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 1012ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return m_iPosition - m_iStart; 1013ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann} 1014ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannFX_BOOL CFX_Stream::IsEOF() const { 1015ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (m_pStreamImp == NULL) { 1016ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return TRUE; 1017ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 1018ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (m_eStreamType == FX_STREAMTYPE_File || 1019ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_eStreamType == FX_STREAMTYPE_Buffer) { 1020ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return m_pStreamImp->IsEOF(); 1021ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 1022ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return m_iPosition >= m_iStart + m_iLength; 1023ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann} 1024ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannint32_t CFX_Stream::ReadData(uint8_t* pBuffer, int32_t iBufferSize) { 1025ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FXSYS_assert(pBuffer != NULL && iBufferSize > 0); 1026ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (m_pStreamImp == NULL) { 1027ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return -1; 1028ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 1029ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann int32_t iLen = std::min(m_iStart + m_iLength - m_iPosition, iBufferSize); 1030ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (iLen <= 0) { 1031ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return 0; 1032ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 1033ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_pStreamImp->Lock(); 1034ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (m_pStreamImp->GetPosition() != m_iPosition) { 1035ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_pStreamImp->Seek(FX_STREAMSEEK_Begin, m_iPosition); 1036ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 1037ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann iLen = m_pStreamImp->ReadData(pBuffer, iLen); 1038ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_iPosition = m_pStreamImp->GetPosition(); 1039ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_pStreamImp->Unlock(); 1040ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return iLen; 1041ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann} 1042ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannint32_t CFX_Stream::ReadString(FX_WCHAR* pStr, 1043ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann int32_t iMaxLength, 1044ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FX_BOOL& bEOS, 1045ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann int32_t const* pByteSize) { 1046ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FXSYS_assert(pStr != NULL && iMaxLength > 0); 1047ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (m_pStreamImp == NULL) { 1048ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return -1; 1049ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 1050ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann int32_t iEnd = m_iStart + m_iLength; 1051ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann int32_t iLen = iEnd - m_iPosition; 1052ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (pByteSize != NULL) { 1053ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann iLen = std::min(iLen, *pByteSize); 1054ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 1055ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann iLen = std::min(iEnd / 2, iMaxLength); 1056ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (iLen <= 0) { 1057ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return 0; 1058ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 1059ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_pStreamImp->Lock(); 1060ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (m_pStreamImp->GetPosition() != m_iPosition) { 1061ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_pStreamImp->Seek(FX_STREAMSEEK_Begin, m_iPosition); 1062ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 1063ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann iLen = m_pStreamImp->ReadString(pStr, iLen, bEOS); 1064ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_iPosition = m_pStreamImp->GetPosition(); 1065ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (iLen > 0 && m_iPosition >= iEnd) { 1066ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann bEOS = TRUE; 1067ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 1068ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_pStreamImp->Unlock(); 1069ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return iLen; 1070ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann} 1071ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannint32_t CFX_Stream::WriteData(const uint8_t* pBuffer, int32_t iBufferSize) { 1072ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FXSYS_assert(pBuffer != NULL && iBufferSize > 0); 1073ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (m_pStreamImp == NULL) { 1074ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return -1; 1075ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 1076ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if ((m_dwAccess & FX_STREAMACCESS_Write) == 0) { 1077ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return -1; 1078ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 1079ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann int32_t iLen = iBufferSize; 1080ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (m_eStreamType == FX_STREAMTYPE_Stream) { 1081ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann iLen = std::min(m_iStart + m_iTotalSize - m_iPosition, iBufferSize); 1082ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (iLen <= 0) { 1083ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return 0; 1084ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 1085ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 1086ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_pStreamImp->Lock(); 1087ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann int32_t iEnd = m_iStart + m_iLength; 1088ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (m_pStreamImp->GetPosition() != m_iPosition) { 1089ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_pStreamImp->Seek(FX_STREAMSEEK_Begin, m_iPosition); 1090ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 1091ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann iLen = m_pStreamImp->WriteData(pBuffer, iLen); 1092ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_iPosition = m_pStreamImp->GetPosition(); 1093ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (m_iPosition > iEnd) { 1094ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_iLength = m_iPosition - m_iStart; 1095ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 1096ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_pStreamImp->Unlock(); 1097ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return iLen; 1098ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann} 1099ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannint32_t CFX_Stream::WriteString(const FX_WCHAR* pStr, int32_t iLength) { 1100ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FXSYS_assert(pStr != NULL && iLength > 0); 1101ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (m_pStreamImp == NULL) { 1102ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return -1; 1103ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 1104ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if ((m_dwAccess & FX_STREAMACCESS_Write) == 0) { 1105ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return -1; 1106ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 1107ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann int32_t iLen = iLength; 1108ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (m_eStreamType == FX_STREAMTYPE_Stream) { 1109ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann iLen = std::min((m_iStart + m_iTotalSize - m_iPosition) / 2, iLength); 1110ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (iLen <= 0) { 1111ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return 0; 1112ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 1113ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 1114ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_pStreamImp->Lock(); 1115ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann int32_t iEnd = m_iStart + m_iLength; 1116ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (m_pStreamImp->GetPosition() != m_iPosition) { 1117ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_pStreamImp->Seek(FX_STREAMSEEK_Begin, m_iPosition); 1118ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 1119ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann iLen = m_pStreamImp->WriteString(pStr, iLen); 1120ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_iPosition = m_pStreamImp->GetPosition(); 1121ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (m_iPosition > iEnd) { 1122ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_iLength = m_iPosition - m_iStart; 1123ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 1124ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_pStreamImp->Unlock(); 1125ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return iLen; 1126ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann} 1127ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannvoid CFX_Stream::Flush() { 1128ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (m_pStreamImp == NULL) { 1129ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return; 1130ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 1131ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if ((m_dwAccess & FX_STREAMACCESS_Write) == 0) { 1132ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return; 1133ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 1134ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_pStreamImp->Flush(); 1135ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann} 1136ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannFX_BOOL CFX_Stream::SetLength(int32_t iLength) { 1137ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (m_pStreamImp == NULL) { 1138ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return FALSE; 1139ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 1140ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if ((m_dwAccess & FX_STREAMACCESS_Write) == 0) { 1141ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return FALSE; 1142ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 1143ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return m_pStreamImp->SetLength(iLength); 1144ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann} 1145ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannint32_t CFX_Stream::GetBOM(uint8_t bom[4]) const { 1146ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (m_pStreamImp == NULL) { 1147ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return -1; 1148ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 1149ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return 0; 1150ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann} 1151ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannFX_WORD CFX_Stream::GetCodePage() const { 1152ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#if _FX_ENDIAN_ == _FX_LITTLE_ENDIAN_ 1153ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return FX_CODEPAGE_UTF16LE; 1154ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#else 1155ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return FX_CODEPAGE_UTF16BE; 1156ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#endif 1157ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann} 1158ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannFX_WORD CFX_Stream::SetCodePage(FX_WORD wCodePage) { 1159ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#if _FX_ENDIAN_ == _FX_LITTLE_ENDIAN_ 1160ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return FX_CODEPAGE_UTF16LE; 1161ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#else 1162ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return FX_CODEPAGE_UTF16BE; 1163ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#endif 1164ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann} 1165ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannIFX_Stream* CFX_Stream::CreateSharedStream(FX_DWORD dwAccess, 1166ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann int32_t iOffset, 1167ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann int32_t iLength) { 1168ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FXSYS_assert(iLength > 0); 1169ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (m_pStreamImp == NULL) { 1170ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return NULL; 1171ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 1172ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if ((m_dwAccess & FX_STREAMACCESS_Text) != 0 && 1173ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann (dwAccess & FX_STREAMACCESS_Text) == 0) { 1174ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return NULL; 1175ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 1176ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if ((m_dwAccess & FX_STREAMACCESS_Write) == 0 && 1177ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann (dwAccess & FX_STREAMACCESS_Write) != 0) { 1178ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return NULL; 1179ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 1180ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann int32_t iStart = m_iStart + iOffset; 1181ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann int32_t iTotal = m_iStart + m_iLength; 1182ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (iStart < m_iStart || iStart >= iTotal) { 1183ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return NULL; 1184ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 1185ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann int32_t iEnd = iStart + iLength; 1186ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (iEnd < iStart || iEnd > iTotal) { 1187ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return NULL; 1188ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 1189ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CFX_Stream* pShared = new CFX_Stream; 1190ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann pShared->m_eStreamType = FX_STREAMTYPE_Stream; 1191ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann pShared->m_pStreamImp = m_pStreamImp; 1192ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann pShared->m_dwAccess = dwAccess; 1193ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann pShared->m_iTotalSize = iLength; 1194ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann pShared->m_iPosition = iStart; 1195ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann pShared->m_iStart = iStart; 1196ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann pShared->m_iLength = (dwAccess & FX_STREAMACCESS_Write) != 0 ? 0 : iLength; 1197ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (dwAccess & FX_STREAMACCESS_Text) { 1198ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return IFX_Stream::CreateTextStream(pShared, TRUE); 1199ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 1200ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return pShared; 1201ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann} 1202ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannIFX_FileRead* FX_CreateFileRead(IFX_Stream* pBaseStream, 1203ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FX_BOOL bReleaseStream) { 1204ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FXSYS_assert(pBaseStream != NULL); 1205ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return new CFGAS_FileRead(pBaseStream, bReleaseStream); 1206ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann} 1207ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannCFGAS_FileRead::CFGAS_FileRead(IFX_Stream* pStream, FX_BOOL bReleaseStream) 1208ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann : m_bReleaseStream(bReleaseStream), m_pStream(pStream) { 1209ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FXSYS_assert(m_pStream != NULL); 1210ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann} 1211ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannCFGAS_FileRead::~CFGAS_FileRead() { 1212ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (m_bReleaseStream) { 1213ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_pStream->Release(); 1214ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 1215ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann} 1216ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannFX_FILESIZE CFGAS_FileRead::GetSize() { 1217ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return (FX_FILESIZE)m_pStream->GetLength(); 1218ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann} 1219ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannFX_BOOL CFGAS_FileRead::ReadBlock(void* buffer, 1220ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FX_FILESIZE offset, 1221ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann size_t size) { 1222ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_pStream->Lock(); 1223ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_pStream->Seek(FX_STREAMSEEK_Begin, (int32_t)offset); 1224ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann int32_t iLen = m_pStream->ReadData((uint8_t*)buffer, (int32_t)size); 1225ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_pStream->Unlock(); 1226ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return iLen == (int32_t)size; 1227ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann} 1228ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 1229ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannIFX_FileRead* FX_CreateFileRead(IFX_BufferRead* pBufferRead, 1230ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FX_FILESIZE iFileSize, 1231ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FX_BOOL bReleaseStream) { 1232ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (!pBufferRead) { 1233ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return NULL; 1234ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 1235ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return new CFX_BufferAccImp(pBufferRead, iFileSize, bReleaseStream); 1236ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann} 1237ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannCFX_BufferAccImp::CFX_BufferAccImp(IFX_BufferRead* pBufferRead, 1238ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FX_FILESIZE iFileSize, 1239ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FX_BOOL bReleaseStream) 1240ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann : m_pBufferRead(pBufferRead), 1241ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_bReleaseStream(bReleaseStream), 1242ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_iBufSize(iFileSize) { 1243ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FXSYS_assert(m_pBufferRead); 1244ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann} 1245ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannCFX_BufferAccImp::~CFX_BufferAccImp() { 1246ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (m_bReleaseStream && m_pBufferRead) { 1247ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_pBufferRead->Release(); 1248ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 1249ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann} 1250ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannFX_FILESIZE CFX_BufferAccImp::GetSize() { 1251ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (!m_pBufferRead) { 1252ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return 0; 1253ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 1254ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (m_iBufSize >= 0) { 1255ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return m_iBufSize; 1256ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 1257ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (!m_pBufferRead->ReadNextBlock(TRUE)) { 1258ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return 0; 1259ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 1260ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_iBufSize = (FX_FILESIZE)m_pBufferRead->GetBlockSize(); 1261ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann while (!m_pBufferRead->IsEOF()) { 1262ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_pBufferRead->ReadNextBlock(FALSE); 1263ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_iBufSize += (FX_FILESIZE)m_pBufferRead->GetBlockSize(); 1264ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 1265ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return m_iBufSize; 1266ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann} 1267ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannFX_BOOL CFX_BufferAccImp::ReadBlock(void* buffer, 1268ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FX_FILESIZE offset, 1269ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann size_t size) { 1270ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (!m_pBufferRead) { 1271ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return FALSE; 1272ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 1273ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (!buffer || !size) { 1274ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return TRUE; 1275ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 1276ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FX_FILESIZE dwBufSize = GetSize(); 1277ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (offset >= dwBufSize) { 1278ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return FALSE; 1279ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 1280ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann size_t dwBlockSize = m_pBufferRead->GetBlockSize(); 1281ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FX_FILESIZE dwBlockOffset = m_pBufferRead->GetBlockOffset(); 1282ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (offset < dwBlockOffset) { 1283ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (!m_pBufferRead->ReadNextBlock(TRUE)) { 1284ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return FALSE; 1285ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 1286ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann dwBlockSize = m_pBufferRead->GetBlockSize(); 1287ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann dwBlockOffset = m_pBufferRead->GetBlockOffset(); 1288ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 1289ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann while (offset < dwBlockOffset || 1290ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann offset >= (FX_FILESIZE)(dwBlockOffset + dwBlockSize)) { 1291ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (m_pBufferRead->IsEOF() || !m_pBufferRead->ReadNextBlock(FALSE)) { 1292ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann break; 1293ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 1294ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann dwBlockSize = m_pBufferRead->GetBlockSize(); 1295ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann dwBlockOffset = m_pBufferRead->GetBlockOffset(); 1296ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 1297ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (offset < dwBlockOffset || 1298ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann offset >= (FX_FILESIZE)(dwBlockOffset + dwBlockSize)) { 1299ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return FALSE; 1300ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 1301ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann const uint8_t* pBuffer = m_pBufferRead->GetBlockBuffer(); 1302ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann const FX_FILESIZE dwOffset = offset - dwBlockOffset; 1303ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann size_t dwCopySize = 1304ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann std::min(size, static_cast<size_t>(dwBlockSize - dwOffset)); 1305ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FXSYS_memcpy(buffer, pBuffer + dwOffset, dwCopySize); 1306ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann offset = dwCopySize; 1307ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann size -= dwCopySize; 1308ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann while (size) { 1309ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (!m_pBufferRead->ReadNextBlock(FALSE)) { 1310ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann break; 1311ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 1312ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann dwBlockOffset = m_pBufferRead->GetBlockOffset(); 1313ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann dwBlockSize = m_pBufferRead->GetBlockSize(); 1314ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann pBuffer = m_pBufferRead->GetBlockBuffer(); 1315ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann dwCopySize = std::min(size, dwBlockSize); 1316ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FXSYS_memcpy(((uint8_t*)buffer) + offset, pBuffer, dwCopySize); 1317ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann offset += dwCopySize; 1318ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann size -= dwCopySize; 1319ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 1320ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return TRUE; 1321ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann} 1322ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 1323ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannIFX_FileWrite* FX_CreateFileWrite(IFX_Stream* pBaseStream, 1324ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FX_BOOL bReleaseStream) { 1325ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FXSYS_assert(pBaseStream != NULL); 1326ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return new CFGAS_FileWrite(pBaseStream, bReleaseStream); 1327ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann} 1328ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 1329ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannCFGAS_FileWrite::CFGAS_FileWrite(IFX_Stream* pStream, FX_BOOL bReleaseStream) 1330ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann : m_pStream(pStream), m_bReleaseStream(bReleaseStream) { 1331ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FXSYS_assert(m_pStream != NULL); 1332ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann} 1333ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannCFGAS_FileWrite::~CFGAS_FileWrite() { 1334ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (m_bReleaseStream) { 1335ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_pStream->Release(); 1336ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 1337ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann} 1338ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannFX_FILESIZE CFGAS_FileWrite::GetSize() { 1339ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return m_pStream->GetLength(); 1340ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann} 1341ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannFX_BOOL CFGAS_FileWrite::Flush() { 1342ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_pStream->Flush(); 1343ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return TRUE; 1344ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann} 1345ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannFX_BOOL CFGAS_FileWrite::WriteBlock(const void* pData, size_t size) { 1346ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return m_pStream->WriteData((const uint8_t*)pData, (int32_t)size) == 1347ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann (int32_t)size; 1348ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann} 1349ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannFX_BOOL CFGAS_FileWrite::WriteBlock(const void* pData, 1350ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FX_FILESIZE offset, 1351ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann size_t size) { 1352ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_pStream->Lock(); 1353ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_pStream->Seek(FX_STREAMSEEK_Begin, offset); 1354ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann int32_t iLen = m_pStream->WriteData((uint8_t*)pData, (int32_t)size); 1355ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_pStream->Unlock(); 1356ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return iLen == (int32_t)size; 1357ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann} 1358