| Index: xfa/fgas/crt/fgas_stream.cpp
 | 
| diff --git a/xfa/fgas/crt/fgas_stream.cpp b/xfa/fgas/crt/fgas_stream.cpp
 | 
| index 73e5a02aa03a13c9015ce6b50468ff45e59d90e8..59eb99bcf0bf24a487def64b14504b6e1e8e4dc1 100644
 | 
| --- a/xfa/fgas/crt/fgas_stream.cpp
 | 
| +++ b/xfa/fgas/crt/fgas_stream.cpp
 | 
| @@ -6,6 +6,11 @@
 | 
|  
 | 
|  #include "xfa/fgas/crt/fgas_stream.h"
 | 
|  
 | 
| +#if _FX_OS_ == _FX_WIN32_DESKTOP_ || _FX_OS_ == _FX_WIN32_MOBILE_ || \
 | 
| +    _FX_OS_ == _FX_WIN64_
 | 
| +#include <io.h>
 | 
| +#endif
 | 
| +
 | 
|  #include <algorithm>
 | 
|  #include <memory>
 | 
|  
 | 
| @@ -299,38 +304,34 @@ class CFGAS_FileRead : public IFX_FileRead {
 | 
|    IFX_Stream* m_pStream;
 | 
|  };
 | 
|  
 | 
| -class CFX_BufferAccImp : public IFX_FileRead {
 | 
| - public:
 | 
| -  CFX_BufferAccImp(IFX_BufferRead* pBufferRead,
 | 
| -                   FX_FILESIZE iFileSize,
 | 
| -                   FX_BOOL bReleaseStream);
 | 
| -  virtual ~CFX_BufferAccImp();
 | 
| -  virtual void Release() { delete this; }
 | 
| -  virtual FX_FILESIZE GetSize();
 | 
| -  virtual FX_BOOL ReadBlock(void* buffer, FX_FILESIZE offset, size_t size);
 | 
| -
 | 
| - protected:
 | 
| -  IFX_BufferRead* m_pBufferRead;
 | 
| -  FX_BOOL m_bReleaseStream;
 | 
| -  FX_FILESIZE m_iBufSize;
 | 
| -};
 | 
| -
 | 
| -class CFGAS_FileWrite : public IFX_FileWrite {
 | 
| - public:
 | 
| -  CFGAS_FileWrite(IFX_Stream* pStream, FX_BOOL bReleaseStream);
 | 
| -  virtual ~CFGAS_FileWrite();
 | 
| -  virtual void Release() { delete this; }
 | 
| -  virtual FX_FILESIZE GetSize();
 | 
| -  virtual FX_BOOL Flush();
 | 
| -  virtual FX_BOOL WriteBlock(const void* pData, size_t size);
 | 
| -  virtual FX_BOOL WriteBlock(const void* pData,
 | 
| -                             FX_FILESIZE offset,
 | 
| -                             size_t size);
 | 
| +int32_t FileLength(FXSYS_FILE* file) {
 | 
| +  ASSERT(file != NULL);
 | 
| +#if _FX_OS_ == _FX_WIN32_DESKTOP_ || _FX_OS_ == _FX_WIN64_
 | 
| +  return _filelength(_fileno(file));
 | 
| +#else
 | 
| +  int32_t iPos = FXSYS_ftell(file);
 | 
| +  FXSYS_fseek(file, 0, FXSYS_SEEK_END);
 | 
| +  int32_t iLen = FXSYS_ftell(file);
 | 
| +  FXSYS_fseek(file, iPos, FXSYS_SEEK_SET);
 | 
| +  return iLen;
 | 
| +#endif
 | 
| +}
 | 
|  
 | 
| - protected:
 | 
| -  IFX_Stream* m_pStream;
 | 
| -  FX_BOOL m_bReleaseStream;
 | 
| -};
 | 
| +FX_BOOL FileSetSize(FXSYS_FILE* file, int32_t size) {
 | 
| +  ASSERT(file != NULL);
 | 
| +#if _FX_OS_ == _FX_WIN32_DESKTOP_ || _FX_OS_ == _FX_WIN64_
 | 
| +  return _chsize(_fileno(file), size) == 0;
 | 
| +#elif _FX_OS_ == _FX_WIN32_MOBILE_
 | 
| +  HANDLE hFile = _fileno(file);
 | 
| +  uint32_t dwPos = ::SetFilePointer(hFile, 0, 0, FILE_CURRENT);
 | 
| +  ::SetFilePointer(hFile, size, 0, FILE_BEGIN);
 | 
| +  FX_BOOL bRet = ::SetEndOfFile(hFile);
 | 
| +  ::SetFilePointer(hFile, (int32_t)dwPos, 0, FILE_BEGIN);
 | 
| +  return bRet;
 | 
| +#else
 | 
| +  return FALSE;
 | 
| +#endif
 | 
| +}
 | 
|  
 | 
|  }  // namespace
 | 
|  
 | 
| @@ -439,7 +440,7 @@ FX_BOOL CFX_FileStreamImp::LoadFile(const FX_WCHAR* pszSrcFileName,
 | 
|            return FALSE;
 | 
|  
 | 
|          if (dwAccess & FX_STREAMACCESS_Truncate)
 | 
| -          FX_fsetsize(m_hFile, 0);
 | 
| +          FileSetSize(m_hFile, 0);
 | 
|        }
 | 
|      } else {
 | 
|        return FALSE;
 | 
| @@ -469,7 +470,7 @@ FX_BOOL CFX_FileStreamImp::LoadFile(const FX_WCHAR* pszSrcFileName,
 | 
|            return FALSE;
 | 
|          }
 | 
|          if (dwAccess & FX_STREAMACCESS_Truncate) {
 | 
| -          FX_fsetsize(m_hFile, 0);
 | 
| +          FileSetSize(m_hFile, 0);
 | 
|          }
 | 
|        }
 | 
|      } else {
 | 
| @@ -482,7 +483,7 @@ FX_BOOL CFX_FileStreamImp::LoadFile(const FX_WCHAR* pszSrcFileName,
 | 
|        (FX_STREAMACCESS_Write | FX_STREAMACCESS_Truncate)) {
 | 
|      m_iLength = 0;
 | 
|    } else {
 | 
| -    m_iLength = FX_filelength(m_hFile);
 | 
| +    m_iLength = FileLength(m_hFile);
 | 
|    }
 | 
|    return TRUE;
 | 
|  }
 | 
| @@ -564,8 +565,8 @@ void CFX_FileStreamImp::Flush() {
 | 
|  }
 | 
|  FX_BOOL CFX_FileStreamImp::SetLength(int32_t iLength) {
 | 
|    ASSERT(m_hFile && (GetAccessModes() & FX_STREAMACCESS_Write) != 0);
 | 
| -  FX_BOOL bRet = FX_fsetsize(m_hFile, iLength);
 | 
| -  m_iLength = FX_filelength(m_hFile);
 | 
| +  FX_BOOL bRet = FileSetSize(m_hFile, iLength);
 | 
| +  m_iLength = FileLength(m_hFile);
 | 
|    return bRet;
 | 
|  }
 | 
|  CFX_FileReadStreamImp::CFX_FileReadStreamImp()
 | 
| @@ -1509,131 +1510,3 @@ FX_BOOL CFGAS_FileRead::ReadBlock(void* buffer,
 | 
|    int32_t iLen = m_pStream->ReadData((uint8_t*)buffer, (int32_t)size);
 | 
|    return iLen == (int32_t)size;
 | 
|  }
 | 
| -
 | 
| -IFX_FileRead* FX_CreateFileRead(IFX_BufferRead* pBufferRead,
 | 
| -                                FX_FILESIZE iFileSize,
 | 
| -                                FX_BOOL bReleaseStream) {
 | 
| -  if (!pBufferRead) {
 | 
| -    return NULL;
 | 
| -  }
 | 
| -  return new CFX_BufferAccImp(pBufferRead, iFileSize, bReleaseStream);
 | 
| -}
 | 
| -CFX_BufferAccImp::CFX_BufferAccImp(IFX_BufferRead* pBufferRead,
 | 
| -                                   FX_FILESIZE iFileSize,
 | 
| -                                   FX_BOOL bReleaseStream)
 | 
| -    : m_pBufferRead(pBufferRead),
 | 
| -      m_bReleaseStream(bReleaseStream),
 | 
| -      m_iBufSize(iFileSize) {
 | 
| -  ASSERT(m_pBufferRead);
 | 
| -}
 | 
| -CFX_BufferAccImp::~CFX_BufferAccImp() {
 | 
| -  if (m_bReleaseStream && m_pBufferRead) {
 | 
| -    m_pBufferRead->Release();
 | 
| -  }
 | 
| -}
 | 
| -FX_FILESIZE CFX_BufferAccImp::GetSize() {
 | 
| -  if (!m_pBufferRead) {
 | 
| -    return 0;
 | 
| -  }
 | 
| -  if (m_iBufSize >= 0) {
 | 
| -    return m_iBufSize;
 | 
| -  }
 | 
| -  if (!m_pBufferRead->ReadNextBlock(TRUE)) {
 | 
| -    return 0;
 | 
| -  }
 | 
| -  m_iBufSize = (FX_FILESIZE)m_pBufferRead->GetBlockSize();
 | 
| -  while (!m_pBufferRead->IsEOF()) {
 | 
| -    m_pBufferRead->ReadNextBlock(FALSE);
 | 
| -    m_iBufSize += (FX_FILESIZE)m_pBufferRead->GetBlockSize();
 | 
| -  }
 | 
| -  return m_iBufSize;
 | 
| -}
 | 
| -FX_BOOL CFX_BufferAccImp::ReadBlock(void* buffer,
 | 
| -                                    FX_FILESIZE offset,
 | 
| -                                    size_t size) {
 | 
| -  if (!m_pBufferRead) {
 | 
| -    return FALSE;
 | 
| -  }
 | 
| -  if (!buffer || !size) {
 | 
| -    return TRUE;
 | 
| -  }
 | 
| -  FX_FILESIZE dwBufSize = GetSize();
 | 
| -  if (offset >= dwBufSize) {
 | 
| -    return FALSE;
 | 
| -  }
 | 
| -  size_t dwBlockSize = m_pBufferRead->GetBlockSize();
 | 
| -  FX_FILESIZE dwBlockOffset = m_pBufferRead->GetBlockOffset();
 | 
| -  if (offset < dwBlockOffset) {
 | 
| -    if (!m_pBufferRead->ReadNextBlock(TRUE)) {
 | 
| -      return FALSE;
 | 
| -    }
 | 
| -    dwBlockSize = m_pBufferRead->GetBlockSize();
 | 
| -    dwBlockOffset = m_pBufferRead->GetBlockOffset();
 | 
| -  }
 | 
| -  while (offset < dwBlockOffset ||
 | 
| -         offset >= (FX_FILESIZE)(dwBlockOffset + dwBlockSize)) {
 | 
| -    if (m_pBufferRead->IsEOF() || !m_pBufferRead->ReadNextBlock(FALSE)) {
 | 
| -      break;
 | 
| -    }
 | 
| -    dwBlockSize = m_pBufferRead->GetBlockSize();
 | 
| -    dwBlockOffset = m_pBufferRead->GetBlockOffset();
 | 
| -  }
 | 
| -  if (offset < dwBlockOffset ||
 | 
| -      offset >= (FX_FILESIZE)(dwBlockOffset + dwBlockSize)) {
 | 
| -    return FALSE;
 | 
| -  }
 | 
| -  const uint8_t* pBuffer = m_pBufferRead->GetBlockBuffer();
 | 
| -  const FX_FILESIZE dwOffset = offset - dwBlockOffset;
 | 
| -  size_t dwCopySize =
 | 
| -      std::min(size, static_cast<size_t>(dwBlockSize - dwOffset));
 | 
| -  FXSYS_memcpy(buffer, pBuffer + dwOffset, dwCopySize);
 | 
| -  offset = dwCopySize;
 | 
| -  size -= dwCopySize;
 | 
| -  while (size) {
 | 
| -    if (!m_pBufferRead->ReadNextBlock(FALSE)) {
 | 
| -      break;
 | 
| -    }
 | 
| -    dwBlockOffset = m_pBufferRead->GetBlockOffset();
 | 
| -    dwBlockSize = m_pBufferRead->GetBlockSize();
 | 
| -    pBuffer = m_pBufferRead->GetBlockBuffer();
 | 
| -    dwCopySize = std::min(size, dwBlockSize);
 | 
| -    FXSYS_memcpy(((uint8_t*)buffer) + offset, pBuffer, dwCopySize);
 | 
| -    offset += dwCopySize;
 | 
| -    size -= dwCopySize;
 | 
| -  }
 | 
| -  return TRUE;
 | 
| -}
 | 
| -
 | 
| -IFX_FileWrite* FX_CreateFileWrite(IFX_Stream* pBaseStream,
 | 
| -                                  FX_BOOL bReleaseStream) {
 | 
| -  ASSERT(pBaseStream != NULL);
 | 
| -  return new CFGAS_FileWrite(pBaseStream, bReleaseStream);
 | 
| -}
 | 
| -
 | 
| -CFGAS_FileWrite::CFGAS_FileWrite(IFX_Stream* pStream, FX_BOOL bReleaseStream)
 | 
| -    : m_pStream(pStream), m_bReleaseStream(bReleaseStream) {
 | 
| -  ASSERT(m_pStream != NULL);
 | 
| -}
 | 
| -CFGAS_FileWrite::~CFGAS_FileWrite() {
 | 
| -  if (m_bReleaseStream) {
 | 
| -    m_pStream->Release();
 | 
| -  }
 | 
| -}
 | 
| -FX_FILESIZE CFGAS_FileWrite::GetSize() {
 | 
| -  return m_pStream->GetLength();
 | 
| -}
 | 
| -FX_BOOL CFGAS_FileWrite::Flush() {
 | 
| -  m_pStream->Flush();
 | 
| -  return TRUE;
 | 
| -}
 | 
| -FX_BOOL CFGAS_FileWrite::WriteBlock(const void* pData, size_t size) {
 | 
| -  return m_pStream->WriteData((const uint8_t*)pData, (int32_t)size) ==
 | 
| -         (int32_t)size;
 | 
| -}
 | 
| -FX_BOOL CFGAS_FileWrite::WriteBlock(const void* pData,
 | 
| -                                    FX_FILESIZE offset,
 | 
| -                                    size_t size) {
 | 
| -  m_pStream->Seek(FX_STREAMSEEK_Begin, offset);
 | 
| -  int32_t iLen = m_pStream->WriteData((uint8_t*)pData, (int32_t)size);
 | 
| -  return iLen == (int32_t)size;
 | 
| -}
 | 
| 
 |