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; |
-} |