diff options
Diffstat (limited to 'core/src/fxcrt/extension.h')
-rw-r--r-- | core/src/fxcrt/extension.h | 825 |
1 files changed, 397 insertions, 428 deletions
diff --git a/core/src/fxcrt/extension.h b/core/src/fxcrt/extension.h index 09a4f67623..367816e140 100644 --- a/core/src/fxcrt/extension.h +++ b/core/src/fxcrt/extension.h @@ -10,465 +10,434 @@ #include "../../include/fxcrt/fx_basic.h" #include "../../include/fxcrt/fx_safe_types.h" -class IFXCRT_FileAccess -{ -public: - virtual ~IFXCRT_FileAccess() {} - virtual FX_BOOL Open(const CFX_ByteStringC& fileName, FX_DWORD dwMode) = 0; - virtual FX_BOOL Open(const CFX_WideStringC& fileName, FX_DWORD dwMode) = 0; - virtual void Close() = 0; - virtual void Release() = 0; - virtual FX_FILESIZE GetSize() const = 0; - virtual FX_FILESIZE GetPosition() const = 0; - virtual FX_FILESIZE SetPosition(FX_FILESIZE pos) = 0; - virtual size_t Read(void* pBuffer, size_t szBuffer) = 0; - virtual size_t Write(const void* pBuffer, size_t szBuffer) = 0; - virtual size_t ReadPos(void* pBuffer, size_t szBuffer, FX_FILESIZE pos) = 0; - virtual size_t WritePos(const void* pBuffer, size_t szBuffer, FX_FILESIZE pos) = 0; - virtual FX_BOOL Flush() = 0; - virtual FX_BOOL Truncate(FX_FILESIZE szFile) = 0; +class IFXCRT_FileAccess { + public: + virtual ~IFXCRT_FileAccess() {} + virtual FX_BOOL Open(const CFX_ByteStringC& fileName, FX_DWORD dwMode) = 0; + virtual FX_BOOL Open(const CFX_WideStringC& fileName, FX_DWORD dwMode) = 0; + virtual void Close() = 0; + virtual void Release() = 0; + virtual FX_FILESIZE GetSize() const = 0; + virtual FX_FILESIZE GetPosition() const = 0; + virtual FX_FILESIZE SetPosition(FX_FILESIZE pos) = 0; + virtual size_t Read(void* pBuffer, size_t szBuffer) = 0; + virtual size_t Write(const void* pBuffer, size_t szBuffer) = 0; + virtual size_t ReadPos(void* pBuffer, size_t szBuffer, FX_FILESIZE pos) = 0; + virtual size_t WritePos(const void* pBuffer, + size_t szBuffer, + FX_FILESIZE pos) = 0; + virtual FX_BOOL Flush() = 0; + virtual FX_BOOL Truncate(FX_FILESIZE szFile) = 0; }; -IFXCRT_FileAccess* FXCRT_FileAccess_Create(); -class CFX_CRTFileAccess : public IFX_FileAccess -{ -public: - CFX_CRTFileAccess() : m_RefCount(0) {} +IFXCRT_FileAccess* FXCRT_FileAccess_Create(); +class CFX_CRTFileAccess : public IFX_FileAccess { + public: + CFX_CRTFileAccess() : m_RefCount(0) {} - virtual void Release() - { - if (--m_RefCount == 0) - delete this; - } + virtual void Release() { + if (--m_RefCount == 0) + delete this; + } - IFX_FileAccess* Retain() - { - m_RefCount++; - return (IFX_FileAccess*)this; - } + IFX_FileAccess* Retain() { + m_RefCount++; + return (IFX_FileAccess*)this; + } - virtual FX_BOOL Init(const CFX_WideStringC& wsPath) - { - m_path = wsPath; - m_RefCount = 1; - return TRUE; - } + virtual FX_BOOL Init(const CFX_WideStringC& wsPath) { + m_path = wsPath; + m_RefCount = 1; + return TRUE; + } - virtual void GetPath(CFX_WideString& wsPath) - { - wsPath = m_path; - } + virtual void GetPath(CFX_WideString& wsPath) { wsPath = m_path; } - virtual IFX_FileStream* CreateFileStream(FX_DWORD dwModes) - { - return FX_CreateFileStream(m_path, dwModes); - } + virtual IFX_FileStream* CreateFileStream(FX_DWORD dwModes) { + return FX_CreateFileStream(m_path, dwModes); + } -protected: - CFX_WideString m_path; - FX_DWORD m_RefCount; + protected: + CFX_WideString m_path; + FX_DWORD m_RefCount; }; -class CFX_CRTFileStream final : public IFX_FileStream -{ -public: - CFX_CRTFileStream(IFXCRT_FileAccess* pFA) : m_pFile(pFA), m_dwCount(1), m_bUseRange(FALSE), m_nOffset(0), m_nSize(0) {} - ~CFX_CRTFileStream() - { - if (m_pFile) { - m_pFile->Release(); - } - } - virtual IFX_FileStream* Retain() override - { - m_dwCount ++; - return this; - } - virtual void Release() override - { - FX_DWORD nCount = -- m_dwCount; - if (!nCount) { - delete this; - } - } - virtual FX_FILESIZE GetSize() override - { - return m_bUseRange ? m_nSize : m_pFile->GetSize(); - } - virtual FX_BOOL IsEOF() override - { - return GetPosition() >= GetSize(); - } - virtual FX_FILESIZE GetPosition() override - { - FX_FILESIZE pos = m_pFile->GetPosition(); - if (m_bUseRange) { - pos -= m_nOffset; - } - return pos; +class CFX_CRTFileStream final : public IFX_FileStream { + public: + CFX_CRTFileStream(IFXCRT_FileAccess* pFA) + : m_pFile(pFA), + m_dwCount(1), + m_bUseRange(FALSE), + m_nOffset(0), + m_nSize(0) {} + ~CFX_CRTFileStream() { + if (m_pFile) { + m_pFile->Release(); + } + } + virtual IFX_FileStream* Retain() override { + m_dwCount++; + return this; + } + virtual void Release() override { + FX_DWORD nCount = --m_dwCount; + if (!nCount) { + delete this; + } + } + virtual FX_FILESIZE GetSize() override { + return m_bUseRange ? m_nSize : m_pFile->GetSize(); + } + virtual FX_BOOL IsEOF() override { return GetPosition() >= GetSize(); } + virtual FX_FILESIZE GetPosition() override { + FX_FILESIZE pos = m_pFile->GetPosition(); + if (m_bUseRange) { + pos -= m_nOffset; + } + return pos; + } + virtual FX_BOOL SetRange(FX_FILESIZE offset, FX_FILESIZE size) override { + if (offset < 0 || size < 0) { + return FALSE; } - virtual FX_BOOL SetRange(FX_FILESIZE offset, FX_FILESIZE size) override - { - if (offset < 0 || size < 0) { - return FALSE; - } - FX_SAFE_FILESIZE pos = size; - pos += offset; + FX_SAFE_FILESIZE pos = size; + pos += offset; - if (!pos.IsValid() || pos.ValueOrDie() > m_pFile->GetSize()) { - return FALSE; - } + if (!pos.IsValid() || pos.ValueOrDie() > m_pFile->GetSize()) { + return FALSE; + } - m_nOffset = offset, m_nSize = size; - m_bUseRange = TRUE; - m_pFile->SetPosition(m_nOffset); - return TRUE; - } - virtual void ClearRange() override - { - m_bUseRange = FALSE; - } - virtual FX_BOOL ReadBlock(void* buffer, FX_FILESIZE offset, size_t size) override - { - if (m_bUseRange && offset < 0) { - return FALSE; - } - FX_SAFE_FILESIZE pos = offset; + m_nOffset = offset, m_nSize = size; + m_bUseRange = TRUE; + m_pFile->SetPosition(m_nOffset); + return TRUE; + } + virtual void ClearRange() override { m_bUseRange = FALSE; } + virtual FX_BOOL ReadBlock(void* buffer, + FX_FILESIZE offset, + size_t size) override { + if (m_bUseRange && offset < 0) { + return FALSE; + } + FX_SAFE_FILESIZE pos = offset; - if (m_bUseRange) { - pos += m_nOffset; - if (!pos.IsValid() || pos.ValueOrDie() > (size_t)GetSize()) { - return FALSE; - } - } - return (FX_BOOL)m_pFile->ReadPos(buffer, size, pos.ValueOrDie()); - } - virtual size_t ReadBlock(void* buffer, size_t size) override - { - if (m_bUseRange) { - FX_FILESIZE availSize = m_nOffset + m_nSize - m_pFile->GetPosition(); - if ((size_t)availSize < size) { - size -= size - (size_t)availSize; - } - } - return m_pFile->Read(buffer, size); - } - virtual FX_BOOL WriteBlock(const void* buffer, FX_FILESIZE offset, size_t size) override - { - if (m_bUseRange) { - offset += m_nOffset; - } - return (FX_BOOL)m_pFile->WritePos(buffer, size, offset); - } - virtual FX_BOOL Flush() override - { - return m_pFile->Flush(); - } - IFXCRT_FileAccess* m_pFile; - FX_DWORD m_dwCount; - FX_BOOL m_bUseRange; - FX_FILESIZE m_nOffset; - FX_FILESIZE m_nSize; + if (m_bUseRange) { + pos += m_nOffset; + if (!pos.IsValid() || pos.ValueOrDie() > (size_t)GetSize()) { + return FALSE; + } + } + return (FX_BOOL)m_pFile->ReadPos(buffer, size, pos.ValueOrDie()); + } + virtual size_t ReadBlock(void* buffer, size_t size) override { + if (m_bUseRange) { + FX_FILESIZE availSize = m_nOffset + m_nSize - m_pFile->GetPosition(); + if ((size_t)availSize < size) { + size -= size - (size_t)availSize; + } + } + return m_pFile->Read(buffer, size); + } + virtual FX_BOOL WriteBlock(const void* buffer, + FX_FILESIZE offset, + size_t size) override { + if (m_bUseRange) { + offset += m_nOffset; + } + return (FX_BOOL)m_pFile->WritePos(buffer, size, offset); + } + virtual FX_BOOL Flush() override { return m_pFile->Flush(); } + IFXCRT_FileAccess* m_pFile; + FX_DWORD m_dwCount; + FX_BOOL m_bUseRange; + FX_FILESIZE m_nOffset; + FX_FILESIZE m_nSize; }; -#define FX_MEMSTREAM_BlockSize (64 * 1024) -#define FX_MEMSTREAM_Consecutive 0x01 -#define FX_MEMSTREAM_TakeOver 0x02 -class CFX_MemoryStream final : public IFX_MemoryStream -{ -public: - CFX_MemoryStream(FX_BOOL bConsecutive) - : m_dwCount(1) - , m_nTotalSize(0) - , m_nCurSize(0) - , m_nCurPos(0) - , m_nGrowSize(FX_MEMSTREAM_BlockSize) - , m_bUseRange(FALSE) - { - m_dwFlags = FX_MEMSTREAM_TakeOver | (bConsecutive ? FX_MEMSTREAM_Consecutive : 0); - } - CFX_MemoryStream(uint8_t* pBuffer, size_t nSize, FX_BOOL bTakeOver) - : m_dwCount(1) - , m_nTotalSize(nSize) - , m_nCurSize(nSize) - , m_nCurPos(0) - , m_nGrowSize(FX_MEMSTREAM_BlockSize) - , m_bUseRange(FALSE) - { - m_Blocks.Add(pBuffer); - m_dwFlags = FX_MEMSTREAM_Consecutive | (bTakeOver ? FX_MEMSTREAM_TakeOver : 0); - } - ~CFX_MemoryStream() - { - if (m_dwFlags & FX_MEMSTREAM_TakeOver) { - for (int32_t i = 0; i < m_Blocks.GetSize(); i++) { - FX_Free((uint8_t*)m_Blocks[i]); - } - } - m_Blocks.RemoveAll(); - } - virtual IFX_FileStream* Retain() override - { - m_dwCount ++; - return this; - } - virtual void Release() override - { - FX_DWORD nCount = -- m_dwCount; - if (nCount) { - return; - } - delete this; - } - virtual FX_FILESIZE GetSize() override - { - return m_bUseRange ? (FX_FILESIZE) m_nSize : (FX_FILESIZE)m_nCurSize; +#define FX_MEMSTREAM_BlockSize (64 * 1024) +#define FX_MEMSTREAM_Consecutive 0x01 +#define FX_MEMSTREAM_TakeOver 0x02 +class CFX_MemoryStream final : public IFX_MemoryStream { + public: + CFX_MemoryStream(FX_BOOL bConsecutive) + : m_dwCount(1), + m_nTotalSize(0), + m_nCurSize(0), + m_nCurPos(0), + m_nGrowSize(FX_MEMSTREAM_BlockSize), + m_bUseRange(FALSE) { + m_dwFlags = + FX_MEMSTREAM_TakeOver | (bConsecutive ? FX_MEMSTREAM_Consecutive : 0); + } + CFX_MemoryStream(uint8_t* pBuffer, size_t nSize, FX_BOOL bTakeOver) + : m_dwCount(1), + m_nTotalSize(nSize), + m_nCurSize(nSize), + m_nCurPos(0), + m_nGrowSize(FX_MEMSTREAM_BlockSize), + m_bUseRange(FALSE) { + m_Blocks.Add(pBuffer); + m_dwFlags = + FX_MEMSTREAM_Consecutive | (bTakeOver ? FX_MEMSTREAM_TakeOver : 0); + } + ~CFX_MemoryStream() { + if (m_dwFlags & FX_MEMSTREAM_TakeOver) { + for (int32_t i = 0; i < m_Blocks.GetSize(); i++) { + FX_Free((uint8_t*)m_Blocks[i]); + } + } + m_Blocks.RemoveAll(); + } + virtual IFX_FileStream* Retain() override { + m_dwCount++; + return this; + } + virtual void Release() override { + FX_DWORD nCount = --m_dwCount; + if (nCount) { + return; + } + delete this; + } + virtual FX_FILESIZE GetSize() override { + return m_bUseRange ? (FX_FILESIZE)m_nSize : (FX_FILESIZE)m_nCurSize; + } + virtual FX_BOOL IsEOF() override { return m_nCurPos >= (size_t)GetSize(); } + virtual FX_FILESIZE GetPosition() override { + FX_FILESIZE pos = (FX_FILESIZE)m_nCurPos; + if (m_bUseRange) { + pos -= (FX_FILESIZE)m_nOffset; + } + return pos; + } + virtual FX_BOOL SetRange(FX_FILESIZE offset, FX_FILESIZE size) override { + if (offset < 0 || size < 0) { + return FALSE; + } + FX_SAFE_FILESIZE range = size; + range += offset; + if (!range.IsValid() || range.ValueOrDie() > m_nCurSize) { + return FALSE; } - virtual FX_BOOL IsEOF() override - { - return m_nCurPos >= (size_t)GetSize(); - } - virtual FX_FILESIZE GetPosition() override - { - FX_FILESIZE pos = (FX_FILESIZE)m_nCurPos; - if (m_bUseRange) { - pos -= (FX_FILESIZE)m_nOffset; - } - return pos; + + m_nOffset = (size_t)offset, m_nSize = (size_t)size; + m_bUseRange = TRUE; + m_nCurPos = m_nOffset; + return TRUE; + } + virtual void ClearRange() override { m_bUseRange = FALSE; } + virtual FX_BOOL ReadBlock(void* buffer, + FX_FILESIZE offset, + size_t size) override { + if (!buffer || !size) { + return FALSE; } - virtual FX_BOOL SetRange(FX_FILESIZE offset, FX_FILESIZE size) override - { - if (offset < 0 || size < 0) { - return FALSE; - } - FX_SAFE_FILESIZE range = size; - range += offset; - if (!range.IsValid() || range.ValueOrDie() > m_nCurSize) { - return FALSE; - } - m_nOffset = (size_t)offset, m_nSize = (size_t)size; - m_bUseRange = TRUE; - m_nCurPos = m_nOffset; - return TRUE; - } - virtual void ClearRange() override - { - m_bUseRange = FALSE; - } - virtual FX_BOOL ReadBlock(void* buffer, FX_FILESIZE offset, size_t size) override - { - if (!buffer || !size) { - return FALSE; - } + FX_SAFE_FILESIZE safeOffset = offset; + if (m_bUseRange) { + safeOffset += m_nOffset; + } - FX_SAFE_FILESIZE safeOffset = offset; - if (m_bUseRange) { - safeOffset += m_nOffset; - } + if (!safeOffset.IsValid()) { + return FALSE; + } - if (!safeOffset.IsValid()) { - return FALSE; - } + offset = safeOffset.ValueOrDie(); - offset = safeOffset.ValueOrDie(); + FX_SAFE_SIZE_T newPos = size; + newPos += offset; + if (!newPos.IsValid() || newPos.ValueOrDefault(0) == 0 || + newPos.ValueOrDie() > m_nCurSize) { + return FALSE; + } - FX_SAFE_SIZE_T newPos = size; - newPos += offset; - if (!newPos.IsValid() || newPos.ValueOrDefault(0) == 0 || newPos.ValueOrDie() > m_nCurSize) { - return FALSE; - } + m_nCurPos = newPos.ValueOrDie(); + if (m_dwFlags & FX_MEMSTREAM_Consecutive) { + FXSYS_memcpy(buffer, (uint8_t*)m_Blocks[0] + (size_t)offset, size); + return TRUE; + } + size_t nStartBlock = (size_t)offset / m_nGrowSize; + offset -= (FX_FILESIZE)(nStartBlock * m_nGrowSize); + while (size) { + size_t nRead = m_nGrowSize - (size_t)offset; + if (nRead > size) { + nRead = size; + } + FXSYS_memcpy( + buffer, (uint8_t*)m_Blocks[(int)nStartBlock] + (size_t)offset, nRead); + buffer = ((uint8_t*)buffer) + nRead; + size -= nRead; + nStartBlock++; + offset = 0; + } + return TRUE; + } + virtual size_t ReadBlock(void* buffer, size_t size) override { + if (m_nCurPos >= m_nCurSize) { + return 0; + } + if (m_bUseRange) { + size_t availSize = m_nOffset + m_nSize - m_nCurPos; + if (availSize < size) { + size -= size - (size_t)availSize; + } + } + size_t nRead = FX_MIN(size, m_nCurSize - m_nCurPos); + if (!ReadBlock(buffer, (int32_t)m_nCurPos, nRead)) { + return 0; + } + return nRead; + } + virtual FX_BOOL WriteBlock(const void* buffer, + FX_FILESIZE offset, + size_t size) override { + if (!buffer || !size) { + return FALSE; + } + if (m_bUseRange) { + offset += (FX_FILESIZE)m_nOffset; + } + if (m_dwFlags & FX_MEMSTREAM_Consecutive) { + FX_SAFE_SIZE_T newPos = size; + newPos += offset; + if (!newPos.IsValid()) + return FALSE; - m_nCurPos = newPos.ValueOrDie(); - if (m_dwFlags & FX_MEMSTREAM_Consecutive) { - FXSYS_memcpy(buffer, (uint8_t*)m_Blocks[0] + (size_t)offset, size); - return TRUE; - } - size_t nStartBlock = (size_t)offset / m_nGrowSize; - offset -= (FX_FILESIZE)(nStartBlock * m_nGrowSize); - while (size) { - size_t nRead = m_nGrowSize - (size_t)offset; - if (nRead > size) { - nRead = size; - } - FXSYS_memcpy(buffer, (uint8_t*)m_Blocks[(int)nStartBlock] + (size_t)offset, nRead); - buffer = ((uint8_t*)buffer) + nRead; - size -= nRead; - nStartBlock ++; - offset = 0; - } - return TRUE; + m_nCurPos = newPos.ValueOrDie(); + if (m_nCurPos > m_nTotalSize) { + m_nTotalSize = + (m_nCurPos + m_nGrowSize - 1) / m_nGrowSize * m_nGrowSize; + if (m_Blocks.GetSize() < 1) { + void* block = FX_Alloc(uint8_t, m_nTotalSize); + m_Blocks.Add(block); + } else { + m_Blocks[0] = FX_Realloc(uint8_t, m_Blocks[0], m_nTotalSize); + } + if (!m_Blocks[0]) { + m_Blocks.RemoveAll(); + return FALSE; + } + } + FXSYS_memcpy((uint8_t*)m_Blocks[0] + (size_t)offset, buffer, size); + if (m_nCurSize < m_nCurPos) { + m_nCurSize = m_nCurPos; + } + return TRUE; } - virtual size_t ReadBlock(void* buffer, size_t size) override - { - if (m_nCurPos >= m_nCurSize) { - return 0; - } - if (m_bUseRange) { - size_t availSize = m_nOffset + m_nSize - m_nCurPos; - if (availSize < size) { - size -= size - (size_t)availSize; - } - } - size_t nRead = FX_MIN(size, m_nCurSize - m_nCurPos); - if (!ReadBlock(buffer, (int32_t)m_nCurPos, nRead)) { - return 0; - } - return nRead; - } - virtual FX_BOOL WriteBlock(const void* buffer, FX_FILESIZE offset, size_t size) override - { - if (!buffer || !size) { - return FALSE; - } - if (m_bUseRange) { - offset += (FX_FILESIZE)m_nOffset; - } - if (m_dwFlags & FX_MEMSTREAM_Consecutive) { - FX_SAFE_SIZE_T newPos = size; - newPos += offset; - if (!newPos.IsValid()) - return FALSE; - m_nCurPos = newPos.ValueOrDie(); - if (m_nCurPos > m_nTotalSize) { - m_nTotalSize = (m_nCurPos + m_nGrowSize - 1) / m_nGrowSize * m_nGrowSize; - if (m_Blocks.GetSize() < 1) { - void* block = FX_Alloc(uint8_t, m_nTotalSize); - m_Blocks.Add(block); - } else { - m_Blocks[0] = FX_Realloc(uint8_t, m_Blocks[0], m_nTotalSize); - } - if (!m_Blocks[0]) { - m_Blocks.RemoveAll(); - return FALSE; - } - } - FXSYS_memcpy((uint8_t*)m_Blocks[0] + (size_t)offset, buffer, size); - if (m_nCurSize < m_nCurPos) { - m_nCurSize = m_nCurPos; - } - return TRUE; - } + FX_SAFE_SIZE_T newPos = size; + newPos += offset; + if (!newPos.IsValid()) { + return FALSE; + } - FX_SAFE_SIZE_T newPos = size; - newPos += offset; - if (!newPos.IsValid()) { - return FALSE; - } + if (!ExpandBlocks(newPos.ValueOrDie())) { + return FALSE; + } + m_nCurPos = newPos.ValueOrDie(); + size_t nStartBlock = (size_t)offset / m_nGrowSize; + offset -= (FX_FILESIZE)(nStartBlock * m_nGrowSize); + while (size) { + size_t nWrite = m_nGrowSize - (size_t)offset; + if (nWrite > size) { + nWrite = size; + } + FXSYS_memcpy((uint8_t*)m_Blocks[(int)nStartBlock] + (size_t)offset, + buffer, nWrite); + buffer = ((uint8_t*)buffer) + nWrite; + size -= nWrite; + nStartBlock++; + offset = 0; + } + return TRUE; + } + virtual FX_BOOL Flush() override { return TRUE; } + virtual FX_BOOL IsConsecutive() const override { + return m_dwFlags & FX_MEMSTREAM_Consecutive; + } + virtual void EstimateSize(size_t nInitSize, size_t nGrowSize) override { + if (m_dwFlags & FX_MEMSTREAM_Consecutive) { + if (m_Blocks.GetSize() < 1) { + uint8_t* pBlock = FX_Alloc(uint8_t, FX_MAX(nInitSize, 4096)); + m_Blocks.Add(pBlock); + } + m_nGrowSize = FX_MAX(nGrowSize, 4096); + } else if (m_Blocks.GetSize() < 1) { + m_nGrowSize = FX_MAX(nGrowSize, 4096); + } + } + virtual uint8_t* GetBuffer() const override { + return m_Blocks.GetSize() ? (uint8_t*)m_Blocks[0] : NULL; + } + virtual void AttachBuffer(uint8_t* pBuffer, + size_t nSize, + FX_BOOL bTakeOver = FALSE) override { + if (!(m_dwFlags & FX_MEMSTREAM_Consecutive)) { + return; + } + m_Blocks.RemoveAll(); + m_Blocks.Add(pBuffer); + m_nTotalSize = m_nCurSize = nSize; + m_nCurPos = 0; + m_dwFlags = + FX_MEMSTREAM_Consecutive | (bTakeOver ? FX_MEMSTREAM_TakeOver : 0); + ClearRange(); + } + virtual void DetachBuffer() override { + if (!(m_dwFlags & FX_MEMSTREAM_Consecutive)) { + return; + } + m_Blocks.RemoveAll(); + m_nTotalSize = m_nCurSize = m_nCurPos = 0; + m_dwFlags = FX_MEMSTREAM_TakeOver; + ClearRange(); + } - if (!ExpandBlocks(newPos.ValueOrDie())) { - return FALSE; - } - m_nCurPos = newPos.ValueOrDie(); - size_t nStartBlock = (size_t)offset / m_nGrowSize; - offset -= (FX_FILESIZE)(nStartBlock * m_nGrowSize); - while (size) { - size_t nWrite = m_nGrowSize - (size_t)offset; - if (nWrite > size) { - nWrite = size; - } - FXSYS_memcpy((uint8_t*)m_Blocks[(int)nStartBlock] + (size_t)offset, buffer, nWrite); - buffer = ((uint8_t*)buffer) + nWrite; - size -= nWrite; - nStartBlock ++; - offset = 0; - } - return TRUE; - } - virtual FX_BOOL Flush() override - { - return TRUE; - } - virtual FX_BOOL IsConsecutive() const override - { - return m_dwFlags & FX_MEMSTREAM_Consecutive; - } - virtual void EstimateSize(size_t nInitSize, size_t nGrowSize) override - { - if (m_dwFlags & FX_MEMSTREAM_Consecutive) { - if (m_Blocks.GetSize() < 1) { - uint8_t* pBlock = FX_Alloc(uint8_t, FX_MAX(nInitSize, 4096)); - m_Blocks.Add(pBlock); - } - m_nGrowSize = FX_MAX(nGrowSize, 4096); - } else if (m_Blocks.GetSize() < 1) { - m_nGrowSize = FX_MAX(nGrowSize, 4096); - } - } - virtual uint8_t* GetBuffer() const override - { - return m_Blocks.GetSize() ? (uint8_t*)m_Blocks[0] : NULL; - } - virtual void AttachBuffer(uint8_t* pBuffer, size_t nSize, FX_BOOL bTakeOver = FALSE) override - { - if (!(m_dwFlags & FX_MEMSTREAM_Consecutive)) { - return; - } - m_Blocks.RemoveAll(); - m_Blocks.Add(pBuffer); - m_nTotalSize = m_nCurSize = nSize; - m_nCurPos = 0; - m_dwFlags = FX_MEMSTREAM_Consecutive | (bTakeOver ? FX_MEMSTREAM_TakeOver : 0); - ClearRange(); - } - virtual void DetachBuffer() override - { - if (!(m_dwFlags & FX_MEMSTREAM_Consecutive)) { - return; - } - m_Blocks.RemoveAll(); - m_nTotalSize = m_nCurSize = m_nCurPos = 0; - m_dwFlags = FX_MEMSTREAM_TakeOver; - ClearRange(); - } -protected: - CFX_PtrArray m_Blocks; - FX_DWORD m_dwCount; - size_t m_nTotalSize; - size_t m_nCurSize; - size_t m_nCurPos; - size_t m_nGrowSize; - FX_DWORD m_dwFlags; - FX_BOOL m_bUseRange; - size_t m_nOffset; - size_t m_nSize; - FX_BOOL ExpandBlocks(size_t size) - { - if (m_nCurSize < size) { - m_nCurSize = size; - } - if (size <= m_nTotalSize) { - return TRUE; - } - int32_t iCount = m_Blocks.GetSize(); - size = (size - m_nTotalSize + m_nGrowSize - 1) / m_nGrowSize; - m_Blocks.SetSize(m_Blocks.GetSize() + (int32_t)size); - while (size --) { - uint8_t* pBlock = FX_Alloc(uint8_t, m_nGrowSize); - m_Blocks.SetAt(iCount ++, pBlock); - m_nTotalSize += m_nGrowSize; - } - return TRUE; - } + protected: + CFX_PtrArray m_Blocks; + FX_DWORD m_dwCount; + size_t m_nTotalSize; + size_t m_nCurSize; + size_t m_nCurPos; + size_t m_nGrowSize; + FX_DWORD m_dwFlags; + FX_BOOL m_bUseRange; + size_t m_nOffset; + size_t m_nSize; + FX_BOOL ExpandBlocks(size_t size) { + if (m_nCurSize < size) { + m_nCurSize = size; + } + if (size <= m_nTotalSize) { + return TRUE; + } + int32_t iCount = m_Blocks.GetSize(); + size = (size - m_nTotalSize + m_nGrowSize - 1) / m_nGrowSize; + m_Blocks.SetSize(m_Blocks.GetSize() + (int32_t)size); + while (size--) { + uint8_t* pBlock = FX_Alloc(uint8_t, m_nGrowSize); + m_Blocks.SetAt(iCount++, pBlock); + m_nTotalSize += m_nGrowSize; + } + return TRUE; + } }; #ifdef __cplusplus extern "C" { #endif -#define MT_N 848 -#define MT_M 456 -#define MT_Matrix_A 0x9908b0df -#define MT_Upper_Mask 0x80000000 -#define MT_Lower_Mask 0x7fffffff +#define MT_N 848 +#define MT_M 456 +#define MT_Matrix_A 0x9908b0df +#define MT_Upper_Mask 0x80000000 +#define MT_Lower_Mask 0x7fffffff typedef struct _FX_MTRANDOMCONTEXT { - _FX_MTRANDOMCONTEXT() - { - mti = MT_N + 1; - bHaveSeed = FALSE; - } - FX_DWORD mti; - FX_BOOL bHaveSeed; - FX_DWORD mt[MT_N]; -} FX_MTRANDOMCONTEXT, * FX_LPMTRANDOMCONTEXT; -typedef FX_MTRANDOMCONTEXT const * FX_LPCMTRANDOMCONTEXT; + _FX_MTRANDOMCONTEXT() { + mti = MT_N + 1; + bHaveSeed = FALSE; + } + FX_DWORD mti; + FX_BOOL bHaveSeed; + FX_DWORD mt[MT_N]; +} FX_MTRANDOMCONTEXT, *FX_LPMTRANDOMCONTEXT; +typedef FX_MTRANDOMCONTEXT const* FX_LPCMTRANDOMCONTEXT; #if _FXM_PLATFORM_ == _FXM_PLATFORM_WINDOWS_ FX_BOOL FX_GenerateCryptoRandom(FX_DWORD* pBuffer, int32_t iCount); #endif |