| OLD | NEW |
| 1 // Copyright 2014 PDFium Authors. All rights reserved. | 1 // Copyright 2014 PDFium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com | 5 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com |
| 6 | 6 |
| 7 #include "public/fpdfview.h" | 7 #include "public/fpdfview.h" |
| 8 | 8 |
| 9 #include <memory> | 9 #include <memory> |
| 10 #include <utility> | 10 #include <utility> |
| (...skipping 101 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 112 pContext->m_pRenderer = pdfium::MakeUnique<CPDF_ProgressiveRenderer>( | 112 pContext->m_pRenderer = pdfium::MakeUnique<CPDF_ProgressiveRenderer>( |
| 113 pContext->m_pContext.get(), pContext->m_pDevice.get(), | 113 pContext->m_pContext.get(), pContext->m_pDevice.get(), |
| 114 pContext->m_pOptions.get()); | 114 pContext->m_pOptions.get()); |
| 115 pContext->m_pRenderer->Start(pause); | 115 pContext->m_pRenderer->Start(pause); |
| 116 if (bNeedToRestore) | 116 if (bNeedToRestore) |
| 117 pContext->m_pDevice->RestoreState(false); | 117 pContext->m_pDevice->RestoreState(false); |
| 118 } | 118 } |
| 119 | 119 |
| 120 class CPDF_CustomAccess final : public IFX_SeekableReadStream { | 120 class CPDF_CustomAccess final : public IFX_SeekableReadStream { |
| 121 public: | 121 public: |
| 122 explicit CPDF_CustomAccess(FPDF_FILEACCESS* pFileAccess); | 122 static CFX_RetainPtr<CPDF_CustomAccess> Create(FPDF_FILEACCESS* pFileAccess) { |
| 123 ~CPDF_CustomAccess() override {} | 123 return CFX_RetainPtr<CPDF_CustomAccess>(new CPDF_CustomAccess(pFileAccess)); |
| 124 } |
| 124 | 125 |
| 125 // IFX_SeekableReadStream | 126 // IFX_SeekableReadStream |
| 126 FX_FILESIZE GetSize() override; | 127 FX_FILESIZE GetSize() override; |
| 127 void Release() override; | |
| 128 bool ReadBlock(void* buffer, FX_FILESIZE offset, size_t size) override; | 128 bool ReadBlock(void* buffer, FX_FILESIZE offset, size_t size) override; |
| 129 | 129 |
| 130 private: | 130 private: |
| 131 explicit CPDF_CustomAccess(FPDF_FILEACCESS* pFileAccess); |
| 132 |
| 131 FPDF_FILEACCESS m_FileAccess; | 133 FPDF_FILEACCESS m_FileAccess; |
| 132 }; | 134 }; |
| 133 | 135 |
| 134 CPDF_CustomAccess::CPDF_CustomAccess(FPDF_FILEACCESS* pFileAccess) | 136 CPDF_CustomAccess::CPDF_CustomAccess(FPDF_FILEACCESS* pFileAccess) |
| 135 : m_FileAccess(*pFileAccess) {} | 137 : m_FileAccess(*pFileAccess) {} |
| 136 | 138 |
| 137 FX_FILESIZE CPDF_CustomAccess::GetSize() { | 139 FX_FILESIZE CPDF_CustomAccess::GetSize() { |
| 138 return m_FileAccess.m_FileLen; | 140 return m_FileAccess.m_FileLen; |
| 139 } | 141 } |
| 140 | 142 |
| 141 void CPDF_CustomAccess::Release() { | |
| 142 delete this; | |
| 143 } | |
| 144 | |
| 145 bool CPDF_CustomAccess::ReadBlock(void* buffer, | 143 bool CPDF_CustomAccess::ReadBlock(void* buffer, |
| 146 FX_FILESIZE offset, | 144 FX_FILESIZE offset, |
| 147 size_t size) { | 145 size_t size) { |
| 148 if (offset < 0) | 146 if (offset < 0) |
| 149 return false; | 147 return false; |
| 150 | 148 |
| 151 FX_SAFE_FILESIZE newPos = pdfium::base::checked_cast<FX_FILESIZE>(size); | 149 FX_SAFE_FILESIZE newPos = pdfium::base::checked_cast<FX_FILESIZE>(size); |
| 152 newPos += offset; | 150 newPos += offset; |
| 153 if (!newPos.IsValid() || | 151 if (!newPos.IsValid() || |
| 154 newPos.ValueOrDie() > static_cast<FX_FILESIZE>(m_FileAccess.m_FileLen)) { | 152 newPos.ValueOrDie() > static_cast<FX_FILESIZE>(m_FileAccess.m_FileLen)) { |
| 155 return false; | 153 return false; |
| 156 } | 154 } |
| 157 return !!m_FileAccess.m_GetBlock(m_FileAccess.m_Param, offset, | 155 return !!m_FileAccess.m_GetBlock(m_FileAccess.m_Param, offset, |
| 158 reinterpret_cast<uint8_t*>(buffer), size); | 156 reinterpret_cast<uint8_t*>(buffer), size); |
| 159 } | 157 } |
| 160 | 158 |
| 161 #ifdef PDF_ENABLE_XFA | 159 #ifdef PDF_ENABLE_XFA |
| 162 class CFPDF_FileStream : public IFX_SeekableStream { | 160 class CFPDF_FileStream : public IFX_SeekableStream { |
| 163 public: | 161 public: |
| 164 explicit CFPDF_FileStream(FPDF_FILEHANDLER* pFS); | 162 static CFX_RetainPtr<CFPDF_FileStream> Create(FPDF_FILEHANDLER* pFS) { |
| 165 ~CFPDF_FileStream() override {} | 163 return CFX_RetainPtr<CFPDF_FileStream>(new CFPDF_FileStream(pFS)); |
| 164 } |
| 165 ~CFPDF_FileStream() override; |
| 166 | 166 |
| 167 // IFX_SeekableStream: | 167 // IFX_SeekableStream: |
| 168 IFX_SeekableStream* Retain() override; | |
| 169 void Release() override; | |
| 170 FX_FILESIZE GetSize() override; | 168 FX_FILESIZE GetSize() override; |
| 171 bool IsEOF() override; | 169 bool IsEOF() override; |
| 172 FX_FILESIZE GetPosition() override; | 170 FX_FILESIZE GetPosition() override; |
| 173 bool ReadBlock(void* buffer, FX_FILESIZE offset, size_t size) override; | 171 bool ReadBlock(void* buffer, FX_FILESIZE offset, size_t size) override; |
| 174 size_t ReadBlock(void* buffer, size_t size) override; | 172 size_t ReadBlock(void* buffer, size_t size) override; |
| 175 bool WriteBlock(const void* buffer, FX_FILESIZE offset, size_t size) override; | 173 bool WriteBlock(const void* buffer, FX_FILESIZE offset, size_t size) override; |
| 176 bool Flush() override; | 174 bool Flush() override; |
| 177 | 175 |
| 178 void SetPosition(FX_FILESIZE pos) { m_nCurPos = pos; } | 176 void SetPosition(FX_FILESIZE pos) { m_nCurPos = pos; } |
| 179 | 177 |
| 180 protected: | 178 protected: |
| 179 explicit CFPDF_FileStream(FPDF_FILEHANDLER* pFS); |
| 180 |
| 181 FPDF_FILEHANDLER* m_pFS; | 181 FPDF_FILEHANDLER* m_pFS; |
| 182 FX_FILESIZE m_nCurPos; | 182 FX_FILESIZE m_nCurPos; |
| 183 }; | 183 }; |
| 184 | 184 |
| 185 CFPDF_FileStream::CFPDF_FileStream(FPDF_FILEHANDLER* pFS) { | 185 CFPDF_FileStream::CFPDF_FileStream(FPDF_FILEHANDLER* pFS) { |
| 186 m_pFS = pFS; | 186 m_pFS = pFS; |
| 187 m_nCurPos = 0; | 187 m_nCurPos = 0; |
| 188 } | 188 } |
| 189 | 189 |
| 190 IFX_SeekableStream* CFPDF_FileStream::Retain() { | 190 CFPDF_FileStream::~CFPDF_FileStream() { |
| 191 return this; | |
| 192 } | |
| 193 | |
| 194 void CFPDF_FileStream::Release() { | |
| 195 if (m_pFS && m_pFS->Release) | 191 if (m_pFS && m_pFS->Release) |
| 196 m_pFS->Release(m_pFS->clientData); | 192 m_pFS->Release(m_pFS->clientData); |
| 197 delete this; | |
| 198 } | 193 } |
| 199 | 194 |
| 200 FX_FILESIZE CFPDF_FileStream::GetSize() { | 195 FX_FILESIZE CFPDF_FileStream::GetSize() { |
| 201 if (m_pFS && m_pFS->GetSize) | 196 if (m_pFS && m_pFS->GetSize) |
| 202 return (FX_FILESIZE)m_pFS->GetSize(m_pFS->clientData); | 197 return (FX_FILESIZE)m_pFS->GetSize(m_pFS->clientData); |
| 203 return 0; | 198 return 0; |
| 204 } | 199 } |
| 205 | 200 |
| 206 bool CFPDF_FileStream::IsEOF() { | 201 bool CFPDF_FileStream::IsEOF() { |
| 207 return m_nCurPos >= GetSize(); | 202 return m_nCurPos >= GetSize(); |
| (...skipping 95 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 303 return page ? UnderlyingFromFPDFPage(page)->GetPDFPage() : nullptr; | 298 return page ? UnderlyingFromFPDFPage(page)->GetPDFPage() : nullptr; |
| 304 #else // PDF_ENABLE_XFA | 299 #else // PDF_ENABLE_XFA |
| 305 return UnderlyingFromFPDFPage(page); | 300 return UnderlyingFromFPDFPage(page); |
| 306 #endif // PDF_ENABLE_XFA | 301 #endif // PDF_ENABLE_XFA |
| 307 } | 302 } |
| 308 | 303 |
| 309 CFX_DIBitmap* CFXBitmapFromFPDFBitmap(FPDF_BITMAP bitmap) { | 304 CFX_DIBitmap* CFXBitmapFromFPDFBitmap(FPDF_BITMAP bitmap) { |
| 310 return static_cast<CFX_DIBitmap*>(bitmap); | 305 return static_cast<CFX_DIBitmap*>(bitmap); |
| 311 } | 306 } |
| 312 | 307 |
| 313 IFX_SeekableReadStream* MakeSeekableReadStream(FPDF_FILEACCESS* pFileAccess) { | 308 CFX_RetainPtr<IFX_SeekableReadStream> MakeSeekableReadStream( |
| 314 return new CPDF_CustomAccess(pFileAccess); | 309 FPDF_FILEACCESS* pFileAccess) { |
| 310 return CPDF_CustomAccess::Create(pFileAccess); |
| 315 } | 311 } |
| 316 | 312 |
| 317 #ifdef PDF_ENABLE_XFA | 313 #ifdef PDF_ENABLE_XFA |
| 318 IFX_SeekableStream* MakeSeekableStream(FPDF_FILEHANDLER* pFilehandler) { | 314 CFX_RetainPtr<IFX_SeekableStream> MakeSeekableStream( |
| 319 return new CFPDF_FileStream(pFilehandler); | 315 FPDF_FILEHANDLER* pFilehandler) { |
| 316 return CFPDF_FileStream::Create(pFilehandler); |
| 320 } | 317 } |
| 321 #endif // PDF_ENABLE_XFA | 318 #endif // PDF_ENABLE_XFA |
| 322 | 319 |
| 323 // 0 bit: FPDF_POLICY_MACHINETIME_ACCESS | 320 // 0 bit: FPDF_POLICY_MACHINETIME_ACCESS |
| 324 static uint32_t foxit_sandbox_policy = 0xFFFFFFFF; | 321 static uint32_t foxit_sandbox_policy = 0xFFFFFFFF; |
| 325 | 322 |
| 326 void FSDK_SetSandBoxPolicy(FPDF_DWORD policy, FPDF_BOOL enable) { | 323 void FSDK_SetSandBoxPolicy(FPDF_DWORD policy, FPDF_BOOL enable) { |
| 327 switch (policy) { | 324 switch (policy) { |
| 328 case FPDF_POLICY_MACHINETIME_ACCESS: { | 325 case FPDF_POLICY_MACHINETIME_ACCESS: { |
| 329 if (enable) | 326 if (enable) |
| (...skipping 110 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 440 | 437 |
| 441 DLLEXPORT void STDCALL FPDF_SetPrintTextWithGDI(FPDF_BOOL use_gdi) { | 438 DLLEXPORT void STDCALL FPDF_SetPrintTextWithGDI(FPDF_BOOL use_gdi) { |
| 442 g_pdfium_print_text_with_gdi = !!use_gdi; | 439 g_pdfium_print_text_with_gdi = !!use_gdi; |
| 443 } | 440 } |
| 444 #endif | 441 #endif |
| 445 | 442 |
| 446 DLLEXPORT FPDF_DOCUMENT STDCALL FPDF_LoadDocument(FPDF_STRING file_path, | 443 DLLEXPORT FPDF_DOCUMENT STDCALL FPDF_LoadDocument(FPDF_STRING file_path, |
| 447 FPDF_BYTESTRING password) { | 444 FPDF_BYTESTRING password) { |
| 448 // NOTE: the creation of the file needs to be by the embedder on the | 445 // NOTE: the creation of the file needs to be by the embedder on the |
| 449 // other side of this API. | 446 // other side of this API. |
| 450 IFX_SeekableReadStream* pFileAccess = | 447 CFX_RetainPtr<IFX_SeekableReadStream> pFileAccess = |
| 451 IFX_SeekableReadStream::CreateFromFilename((const FX_CHAR*)file_path); | 448 IFX_SeekableReadStream::CreateFromFilename((const FX_CHAR*)file_path); |
| 452 if (!pFileAccess) | 449 if (!pFileAccess) |
| 453 return nullptr; | 450 return nullptr; |
| 454 | 451 |
| 455 auto pParser = pdfium::MakeUnique<CPDF_Parser>(); | 452 auto pParser = pdfium::MakeUnique<CPDF_Parser>(); |
| 456 pParser->SetPassword(password); | 453 pParser->SetPassword(password); |
| 457 | 454 |
| 458 auto pDocument = pdfium::MakeUnique<CPDF_Document>(std::move(pParser)); | 455 auto pDocument = pdfium::MakeUnique<CPDF_Document>(std::move(pParser)); |
| 459 CPDF_Parser::Error error = | 456 CPDF_Parser::Error error = |
| 460 pDocument->GetParser()->StartParse(pFileAccess, pDocument.get()); | 457 pDocument->GetParser()->StartParse(pFileAccess, pDocument.get()); |
| (...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 493 return true; | 490 return true; |
| 494 } | 491 } |
| 495 | 492 |
| 496 DLLEXPORT FPDF_BOOL STDCALL FPDF_LoadXFA(FPDF_DOCUMENT document) { | 493 DLLEXPORT FPDF_BOOL STDCALL FPDF_LoadXFA(FPDF_DOCUMENT document) { |
| 497 return document && (static_cast<CPDFXFA_Context*>(document))->LoadXFADoc(); | 494 return document && (static_cast<CPDFXFA_Context*>(document))->LoadXFADoc(); |
| 498 } | 495 } |
| 499 #endif // PDF_ENABLE_XFA | 496 #endif // PDF_ENABLE_XFA |
| 500 | 497 |
| 501 class CMemFile final : public IFX_SeekableReadStream { | 498 class CMemFile final : public IFX_SeekableReadStream { |
| 502 public: | 499 public: |
| 503 CMemFile(uint8_t* pBuf, FX_FILESIZE size) : m_pBuf(pBuf), m_size(size) {} | 500 static CFX_RetainPtr<CMemFile> Create(uint8_t* pBuf, FX_FILESIZE size) { |
| 501 return CFX_RetainPtr<CMemFile>(new CMemFile(pBuf, size)); |
| 502 } |
| 504 | 503 |
| 505 void Release() override { delete this; } | |
| 506 FX_FILESIZE GetSize() override { return m_size; } | 504 FX_FILESIZE GetSize() override { return m_size; } |
| 507 bool ReadBlock(void* buffer, FX_FILESIZE offset, size_t size) override { | 505 bool ReadBlock(void* buffer, FX_FILESIZE offset, size_t size) override { |
| 508 if (offset < 0) { | 506 if (offset < 0) |
| 509 return false; | 507 return false; |
| 510 } | 508 |
| 511 FX_SAFE_FILESIZE newPos = pdfium::base::checked_cast<FX_FILESIZE>(size); | 509 FX_SAFE_FILESIZE newPos = pdfium::base::checked_cast<FX_FILESIZE>(size); |
| 512 newPos += offset; | 510 newPos += offset; |
| 513 if (!newPos.IsValid() || newPos.ValueOrDie() > m_size) { | 511 if (!newPos.IsValid() || newPos.ValueOrDie() > m_size) |
| 514 return false; | 512 return false; |
| 515 } | 513 |
| 516 FXSYS_memcpy(buffer, m_pBuf + offset, size); | 514 FXSYS_memcpy(buffer, m_pBuf + offset, size); |
| 517 return true; | 515 return true; |
| 518 } | 516 } |
| 519 | 517 |
| 520 private: | 518 private: |
| 521 ~CMemFile() override {} | 519 CMemFile(uint8_t* pBuf, FX_FILESIZE size) : m_pBuf(pBuf), m_size(size) {} |
| 522 | 520 |
| 523 uint8_t* const m_pBuf; | 521 uint8_t* const m_pBuf; |
| 524 const FX_FILESIZE m_size; | 522 const FX_FILESIZE m_size; |
| 525 }; | 523 }; |
| 526 | 524 |
| 527 DLLEXPORT FPDF_DOCUMENT STDCALL FPDF_LoadMemDocument(const void* data_buf, | 525 DLLEXPORT FPDF_DOCUMENT STDCALL FPDF_LoadMemDocument(const void* data_buf, |
| 528 int size, | 526 int size, |
| 529 FPDF_BYTESTRING password) { | 527 FPDF_BYTESTRING password) { |
| 530 CMemFile* pMemFile = new CMemFile((uint8_t*)data_buf, size); | 528 CFX_RetainPtr<CMemFile> pMemFile = CMemFile::Create((uint8_t*)data_buf, size); |
| 531 std::unique_ptr<CPDF_Parser> pParser(new CPDF_Parser); | 529 auto pParser = pdfium::MakeUnique<CPDF_Parser>(); |
| 532 pParser->SetPassword(password); | 530 pParser->SetPassword(password); |
| 533 | 531 |
| 534 std::unique_ptr<CPDF_Document> pDocument( | 532 auto pDocument = pdfium::MakeUnique<CPDF_Document>(std::move(pParser)); |
| 535 new CPDF_Document(std::move(pParser))); | |
| 536 CPDF_Parser::Error error = | 533 CPDF_Parser::Error error = |
| 537 pDocument->GetParser()->StartParse(pMemFile, pDocument.get()); | 534 pDocument->GetParser()->StartParse(pMemFile, pDocument.get()); |
| 538 if (error != CPDF_Parser::SUCCESS) { | 535 if (error != CPDF_Parser::SUCCESS) { |
| 539 ProcessParseError(error); | 536 ProcessParseError(error); |
| 540 return nullptr; | 537 return nullptr; |
| 541 } | 538 } |
| 542 CheckUnSupportError(pDocument.get(), error); | 539 CheckUnSupportError(pDocument.get(), error); |
| 543 return FPDFDocumentFromCPDFDocument(pDocument.release()); | 540 return FPDFDocumentFromCPDFDocument(pDocument.release()); |
| 544 } | 541 } |
| 545 | 542 |
| 546 DLLEXPORT FPDF_DOCUMENT STDCALL | 543 DLLEXPORT FPDF_DOCUMENT STDCALL |
| 547 FPDF_LoadCustomDocument(FPDF_FILEACCESS* pFileAccess, | 544 FPDF_LoadCustomDocument(FPDF_FILEACCESS* pFileAccess, |
| 548 FPDF_BYTESTRING password) { | 545 FPDF_BYTESTRING password) { |
| 549 CPDF_CustomAccess* pFile = new CPDF_CustomAccess(pFileAccess); | 546 CFX_RetainPtr<CPDF_CustomAccess> pFile = |
| 550 std::unique_ptr<CPDF_Parser> pParser(new CPDF_Parser); | 547 CPDF_CustomAccess::Create(pFileAccess); |
| 548 auto pParser = pdfium::MakeUnique<CPDF_Parser>(); |
| 551 pParser->SetPassword(password); | 549 pParser->SetPassword(password); |
| 552 | 550 |
| 553 std::unique_ptr<CPDF_Document> pDocument( | 551 auto pDocument = pdfium::MakeUnique<CPDF_Document>(std::move(pParser)); |
| 554 new CPDF_Document(std::move(pParser))); | |
| 555 CPDF_Parser::Error error = | 552 CPDF_Parser::Error error = |
| 556 pDocument->GetParser()->StartParse(pFile, pDocument.get()); | 553 pDocument->GetParser()->StartParse(pFile, pDocument.get()); |
| 557 if (error != CPDF_Parser::SUCCESS) { | 554 if (error != CPDF_Parser::SUCCESS) { |
| 558 ProcessParseError(error); | 555 ProcessParseError(error); |
| 559 return nullptr; | 556 return nullptr; |
| 560 } | 557 } |
| 561 CheckUnSupportError(pDocument.get(), error); | 558 CheckUnSupportError(pDocument.get(), error); |
| 562 return FPDFDocumentFromCPDFDocument(pDocument.release()); | 559 return FPDFDocumentFromCPDFDocument(pDocument.release()); |
| 563 } | 560 } |
| 564 | 561 |
| (...skipping 659 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1224 if (!buffer) { | 1221 if (!buffer) { |
| 1225 *buflen = len; | 1222 *buflen = len; |
| 1226 } else if (len <= *buflen) { | 1223 } else if (len <= *buflen) { |
| 1227 memcpy(buffer, utf16Name.c_str(), len); | 1224 memcpy(buffer, utf16Name.c_str(), len); |
| 1228 *buflen = len; | 1225 *buflen = len; |
| 1229 } else { | 1226 } else { |
| 1230 *buflen = -1; | 1227 *buflen = -1; |
| 1231 } | 1228 } |
| 1232 return (FPDF_DEST)pDestObj; | 1229 return (FPDF_DEST)pDestObj; |
| 1233 } | 1230 } |
| OLD | NEW |