summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--core/include/fxcrt/fx_basic.h38
-rw-r--r--core/src/fpdfapi/fpdf_edit/fpdf_edit_create.cpp7
-rw-r--r--core/src/fxcrt/fx_basic_buffer.cpp87
3 files changed, 45 insertions, 87 deletions
diff --git a/core/include/fxcrt/fx_basic.h b/core/include/fxcrt/fx_basic.h
index 3e30b1d1a1..018a91462e 100644
--- a/core/include/fxcrt/fx_basic.h
+++ b/core/include/fxcrt/fx_basic.h
@@ -179,46 +179,26 @@ class CFX_ArchiveLoader {
};
#endif // PDF_ENABLE_XFA
-class IFX_BufferArchive {
+class CFX_FileBufferArchive {
public:
- IFX_BufferArchive(FX_STRSIZE size);
- virtual ~IFX_BufferArchive() {}
-
- virtual void Clear();
-
- FX_BOOL Flush();
+ CFX_FileBufferArchive();
+ void Clear();
+ bool Flush();
int32_t AppendBlock(const void* pBuf, size_t size);
-
int32_t AppendByte(uint8_t byte);
-
int32_t AppendDWord(FX_DWORD i);
-
int32_t AppendString(const CFX_ByteStringC& lpsz);
- protected:
- virtual FX_BOOL DoWork(const void* pBuf, size_t size) = 0;
-
- FX_STRSIZE m_BufSize;
-
- uint8_t* m_pBuffer;
-
- FX_STRSIZE m_Length;
-};
-
-class CFX_FileBufferArchive : public IFX_BufferArchive {
- public:
- CFX_FileBufferArchive(FX_STRSIZE size = 32768);
- ~CFX_FileBufferArchive() override;
-
- void Clear() override;
- FX_BOOL AttachFile(IFX_StreamWrite* pFile, FX_BOOL bTakeover = FALSE);
+ // |pFile| must outlive the CFX_FileBufferArchive.
+ void AttachFile(IFX_StreamWrite* pFile);
private:
- FX_BOOL DoWork(const void* pBuf, size_t size) override;
+ static const size_t kBufSize = 32768;
+ size_t m_Length;
+ std::unique_ptr<uint8_t, FxFreeDeleter> m_pBuffer;
IFX_StreamWrite* m_pFile;
- FX_BOOL m_bTakeover;
};
class CFX_CharMap {
diff --git a/core/src/fpdfapi/fpdf_edit/fpdf_edit_create.cpp b/core/src/fpdfapi/fpdf_edit/fpdf_edit_create.cpp
index 7d294c4c52..f103786350 100644
--- a/core/src/fpdfapi/fpdf_edit/fpdf_edit_create.cpp
+++ b/core/src/fpdfapi/fpdf_edit/fpdf_edit_create.cpp
@@ -1945,12 +1945,7 @@ void CPDF_Creator::Clear() {
}
}
FX_BOOL CPDF_Creator::Create(IFX_StreamWrite* pFile, FX_DWORD flags) {
- if (!pFile) {
- return FALSE;
- }
- if (!m_File.AttachFile(pFile, FALSE)) {
- return FALSE;
- }
+ m_File.AttachFile(pFile);
return Create(flags);
}
FX_BOOL CPDF_Creator::Create(FX_DWORD flags) {
diff --git a/core/src/fxcrt/fx_basic_buffer.cpp b/core/src/fxcrt/fx_basic_buffer.cpp
index 835d43f785..9578653019 100644
--- a/core/src/fxcrt/fx_basic_buffer.cpp
+++ b/core/src/fxcrt/fx_basic_buffer.cpp
@@ -9,6 +9,7 @@
#include "core/include/fxcrt/fx_basic.h"
#include "core/include/fxcrt/fx_safe_types.h"
+#include "third_party/base/numerics/safe_conversions.h"
CFX_BinaryBuf::CFX_BinaryBuf()
: m_AllocStep(0), m_AllocSize(0), m_DataSize(0) {}
@@ -359,32 +360,40 @@ FX_DWORD CFX_BitStream::GetBits(FX_DWORD nBits) {
m_BitPos += nBits;
return result;
}
-IFX_BufferArchive::IFX_BufferArchive(FX_STRSIZE size)
- : m_BufSize(size), m_pBuffer(NULL), m_Length(0) {}
-void IFX_BufferArchive::Clear() {
+
+CFX_FileBufferArchive::CFX_FileBufferArchive()
+ : m_Length(0), m_pFile(nullptr) {}
+
+void CFX_FileBufferArchive::Clear() {
m_Length = 0;
- FX_Free(m_pBuffer);
- m_pBuffer = NULL;
+ m_pBuffer.reset();
+ m_pFile = nullptr;
}
-FX_BOOL IFX_BufferArchive::Flush() {
- FX_BOOL bRet = DoWork(m_pBuffer, m_Length);
+
+bool CFX_FileBufferArchive::Flush() {
+ size_t nRemaining = m_Length;
m_Length = 0;
- return bRet;
+ if (!m_pFile)
+ return false;
+ if (!m_pBuffer || !nRemaining)
+ return true;
+ return m_pFile->WriteBlock(m_pBuffer.get(), nRemaining);
}
-int32_t IFX_BufferArchive::AppendBlock(const void* pBuf, size_t size) {
+
+int32_t CFX_FileBufferArchive::AppendBlock(const void* pBuf, size_t size) {
if (!pBuf || size < 1) {
return 0;
}
if (!m_pBuffer) {
- m_pBuffer = FX_Alloc(uint8_t, m_BufSize);
+ m_pBuffer.reset(FX_Alloc(uint8_t, kBufSize));
}
- uint8_t* buffer = (uint8_t*)pBuf;
- FX_STRSIZE temp_size = (FX_STRSIZE)size;
- while (temp_size > 0) {
- FX_STRSIZE buf_size = std::min(m_BufSize - m_Length, (FX_STRSIZE)temp_size);
- FXSYS_memcpy(m_pBuffer + m_Length, buffer, buf_size);
+ const uint8_t* buffer = reinterpret_cast<const uint8_t*>(pBuf);
+ size_t temp_size = size;
+ while (temp_size) {
+ size_t buf_size = std::min(kBufSize - m_Length, temp_size);
+ FXSYS_memcpy(m_pBuffer.get() + m_Length, buffer, buf_size);
m_Length += buf_size;
- if (m_Length == m_BufSize) {
+ if (m_Length == kBufSize) {
if (!Flush()) {
return -1;
}
@@ -392,50 +401,24 @@ int32_t IFX_BufferArchive::AppendBlock(const void* pBuf, size_t size) {
temp_size -= buf_size;
buffer += buf_size;
}
- return (int32_t)size;
+ return pdfium::base::checked_cast<int32_t>(size);
}
-int32_t IFX_BufferArchive::AppendByte(uint8_t byte) {
+
+int32_t CFX_FileBufferArchive::AppendByte(uint8_t byte) {
return AppendBlock(&byte, 1);
}
-int32_t IFX_BufferArchive::AppendDWord(FX_DWORD i) {
+
+int32_t CFX_FileBufferArchive::AppendDWord(FX_DWORD i) {
char buf[32];
FXSYS_itoa(i, buf, 10);
return AppendBlock(buf, (size_t)FXSYS_strlen(buf));
}
-int32_t IFX_BufferArchive::AppendString(const CFX_ByteStringC& lpsz) {
+
+int32_t CFX_FileBufferArchive::AppendString(const CFX_ByteStringC& lpsz) {
return AppendBlock(lpsz.GetPtr(), lpsz.GetLength());
}
-CFX_FileBufferArchive::CFX_FileBufferArchive(FX_STRSIZE size)
- : IFX_BufferArchive(size), m_pFile(NULL), m_bTakeover(FALSE) {}
-CFX_FileBufferArchive::~CFX_FileBufferArchive() {
- Clear();
-}
-void CFX_FileBufferArchive::Clear() {
- if (m_pFile && m_bTakeover) {
- m_pFile->Release();
- }
- m_pFile = NULL;
- m_bTakeover = FALSE;
- IFX_BufferArchive::Clear();
-}
-FX_BOOL CFX_FileBufferArchive::AttachFile(IFX_StreamWrite* pFile,
- FX_BOOL bTakeover) {
- if (!pFile) {
- return FALSE;
- }
- if (m_pFile && m_bTakeover) {
- m_pFile->Release();
- }
+
+void CFX_FileBufferArchive::AttachFile(IFX_StreamWrite* pFile) {
+ FXSYS_assert(pFile);
m_pFile = pFile;
- m_bTakeover = bTakeover;
- return TRUE;
-}
-FX_BOOL CFX_FileBufferArchive::DoWork(const void* pBuf, size_t size) {
- if (!m_pFile) {
- return FALSE;
- }
- if (!pBuf || size < 1) {
- return TRUE;
- }
- return m_pFile->WriteBlock(pBuf, size);
}