| OLD | NEW |
| 1 // Copyright 2016 PDFium Authors. All rights reserved. | 1 // Copyright 2016 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 "fpdfsdk/fpdfxfa/cpdfxfa_docenvironment.h" | 7 #include "fpdfsdk/fpdfxfa/cpdfxfa_docenvironment.h" |
| 8 | 8 |
| 9 #include <memory> | 9 #include <memory> |
| 10 | 10 |
| (...skipping 419 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 430 bs = filepath.UTF16LE_Encode(); | 430 bs = filepath.UTF16LE_Encode(); |
| 431 } | 431 } |
| 432 int len = bs.GetLength(); | 432 int len = bs.GetLength(); |
| 433 FPDF_FILEHANDLER* pFileHandler = | 433 FPDF_FILEHANDLER* pFileHandler = |
| 434 pFormFillEnv->OpenFile(bXDP ? FXFA_SAVEAS_XDP : FXFA_SAVEAS_XML, | 434 pFormFillEnv->OpenFile(bXDP ? FXFA_SAVEAS_XDP : FXFA_SAVEAS_XML, |
| 435 (FPDF_WIDESTRING)bs.GetBuffer(len), "wb"); | 435 (FPDF_WIDESTRING)bs.GetBuffer(len), "wb"); |
| 436 bs.ReleaseBuffer(len); | 436 bs.ReleaseBuffer(len); |
| 437 if (!pFileHandler) | 437 if (!pFileHandler) |
| 438 return; | 438 return; |
| 439 | 439 |
| 440 CFPDF_FileStream fileWrite(pFileHandler); | 440 std::unique_ptr<IFX_SeekableStream, ReleaseDeleter<IFX_SeekableStream>> |
| 441 fileWrite(MakeSeekableStream(pFileHandler)); |
| 441 CFX_ByteString content; | 442 CFX_ByteString content; |
| 442 if (fileType == FXFA_SAVEAS_XML) { | 443 if (fileType == FXFA_SAVEAS_XML) { |
| 443 content = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\r\n"; | 444 content = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\r\n"; |
| 444 fileWrite.WriteBlock(content.c_str(), fileWrite.GetSize(), | 445 fileWrite->WriteBlock(content.c_str(), fileWrite->GetSize(), |
| 445 content.GetLength()); | 446 content.GetLength()); |
| 446 m_pContext->GetXFADocView()->GetDoc()->SavePackage(XFA_HASHCODE_Data, | 447 m_pContext->GetXFADocView()->GetDoc()->SavePackage( |
| 447 &fileWrite, nullptr); | 448 XFA_HASHCODE_Data, fileWrite.get(), nullptr); |
| 448 } else if (fileType == FXFA_SAVEAS_XDP) { | 449 } else if (fileType == FXFA_SAVEAS_XDP) { |
| 449 if (!m_pContext->GetPDFDoc()) | 450 if (!m_pContext->GetPDFDoc()) |
| 450 return; | 451 return; |
| 451 | 452 |
| 452 CPDF_Dictionary* pRoot = m_pContext->GetPDFDoc()->GetRoot(); | 453 CPDF_Dictionary* pRoot = m_pContext->GetPDFDoc()->GetRoot(); |
| 453 if (!pRoot) | 454 if (!pRoot) |
| 454 return; | 455 return; |
| 455 | 456 |
| 456 CPDF_Dictionary* pAcroForm = pRoot->GetDictFor("AcroForm"); | 457 CPDF_Dictionary* pAcroForm = pRoot->GetDictFor("AcroForm"); |
| 457 if (!pAcroForm) | 458 if (!pAcroForm) |
| 458 return; | 459 return; |
| 459 | 460 |
| 460 CPDF_Array* pArray = ToArray(pAcroForm->GetObjectFor("XFA")); | 461 CPDF_Array* pArray = ToArray(pAcroForm->GetObjectFor("XFA")); |
| 461 if (!pArray) | 462 if (!pArray) |
| 462 return; | 463 return; |
| 463 | 464 |
| 464 int size = pArray->GetCount(); | 465 int size = pArray->GetCount(); |
| 465 for (int i = 1; i < size; i += 2) { | 466 for (int i = 1; i < size; i += 2) { |
| 466 CPDF_Object* pPDFObj = pArray->GetObjectAt(i); | 467 CPDF_Object* pPDFObj = pArray->GetObjectAt(i); |
| 467 CPDF_Object* pPrePDFObj = pArray->GetObjectAt(i - 1); | 468 CPDF_Object* pPrePDFObj = pArray->GetObjectAt(i - 1); |
| 468 if (!pPrePDFObj->IsString()) | 469 if (!pPrePDFObj->IsString()) |
| 469 continue; | 470 continue; |
| 470 if (!pPDFObj->IsReference()) | 471 if (!pPDFObj->IsReference()) |
| 471 continue; | 472 continue; |
| 472 | 473 |
| 473 CPDF_Stream* pStream = ToStream(pPDFObj->GetDirect()); | 474 CPDF_Stream* pStream = ToStream(pPDFObj->GetDirect()); |
| 474 if (!pStream) | 475 if (!pStream) |
| 475 continue; | 476 continue; |
| 476 if (pPrePDFObj->GetString() == "form") { | 477 if (pPrePDFObj->GetString() == "form") { |
| 477 m_pContext->GetXFADocView()->GetDoc()->SavePackage(XFA_HASHCODE_Form, | 478 m_pContext->GetXFADocView()->GetDoc()->SavePackage( |
| 478 &fileWrite, nullptr); | 479 XFA_HASHCODE_Form, fileWrite.get(), nullptr); |
| 479 continue; | 480 continue; |
| 480 } | 481 } |
| 481 if (pPrePDFObj->GetString() == "datasets") { | 482 if (pPrePDFObj->GetString() == "datasets") { |
| 482 m_pContext->GetXFADocView()->GetDoc()->SavePackage( | 483 m_pContext->GetXFADocView()->GetDoc()->SavePackage( |
| 483 XFA_HASHCODE_Datasets, &fileWrite, nullptr); | 484 XFA_HASHCODE_Datasets, fileWrite.get(), nullptr); |
| 484 continue; | 485 continue; |
| 485 } | 486 } |
| 486 if (i == size - 1) { | 487 if (i == size - 1) { |
| 487 CFX_WideString wPath = CFX_WideString::FromUTF16LE( | 488 CFX_WideString wPath = CFX_WideString::FromUTF16LE( |
| 488 reinterpret_cast<const unsigned short*>(bs.c_str()), | 489 reinterpret_cast<const unsigned short*>(bs.c_str()), |
| 489 bs.GetLength() / sizeof(unsigned short)); | 490 bs.GetLength() / sizeof(unsigned short)); |
| 490 CFX_ByteString bPath = wPath.UTF8Encode(); | 491 CFX_ByteString bPath = wPath.UTF8Encode(); |
| 491 const char* szFormat = | 492 const char* szFormat = |
| 492 "\n<pdf href=\"%s\" xmlns=\"http://ns.adobe.com/xdp/pdf/\"/>"; | 493 "\n<pdf href=\"%s\" xmlns=\"http://ns.adobe.com/xdp/pdf/\"/>"; |
| 493 content.Format(szFormat, bPath.c_str()); | 494 content.Format(szFormat, bPath.c_str()); |
| 494 fileWrite.WriteBlock(content.c_str(), fileWrite.GetSize(), | 495 fileWrite->WriteBlock(content.c_str(), fileWrite->GetSize(), |
| 495 content.GetLength()); | 496 content.GetLength()); |
| 496 } | 497 } |
| 497 std::unique_ptr<CPDF_StreamAcc> pAcc(new CPDF_StreamAcc); | 498 std::unique_ptr<CPDF_StreamAcc> pAcc(new CPDF_StreamAcc); |
| 498 pAcc->LoadAllData(pStream); | 499 pAcc->LoadAllData(pStream); |
| 499 fileWrite.WriteBlock(pAcc->GetData(), fileWrite.GetSize(), | 500 fileWrite->WriteBlock(pAcc->GetData(), fileWrite->GetSize(), |
| 500 pAcc->GetSize()); | 501 pAcc->GetSize()); |
| 501 } | 502 } |
| 502 } | 503 } |
| 503 if (!fileWrite.Flush()) { | 504 fileWrite->Flush(); |
| 504 // Ignoring flush error. | |
| 505 } | |
| 506 } | 505 } |
| 507 | 506 |
| 508 void CPDFXFA_DocEnvironment::GotoURL(CXFA_FFDoc* hDoc, | 507 void CPDFXFA_DocEnvironment::GotoURL(CXFA_FFDoc* hDoc, |
| 509 const CFX_WideString& bsURL) { | 508 const CFX_WideString& bsURL) { |
| 510 if (hDoc != m_pContext->GetXFADoc()) | 509 if (hDoc != m_pContext->GetXFADoc()) |
| 511 return; | 510 return; |
| 512 | 511 |
| 513 if (m_pContext->GetDocType() != DOCTYPE_DYNAMIC_XFA) | 512 if (m_pContext->GetDocType() != DOCTYPE_DYNAMIC_XFA) |
| 514 return; | 513 return; |
| 515 | 514 |
| (...skipping 192 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 708 return nullptr; | 707 return nullptr; |
| 709 | 708 |
| 710 CFX_ByteString bs = wsLink.UTF16LE_Encode(); | 709 CFX_ByteString bs = wsLink.UTF16LE_Encode(); |
| 711 int len = bs.GetLength(); | 710 int len = bs.GetLength(); |
| 712 FPDF_FILEHANDLER* pFileHandler = | 711 FPDF_FILEHANDLER* pFileHandler = |
| 713 pFormFillEnv->OpenFile(0, (FPDF_WIDESTRING)bs.GetBuffer(len), "rb"); | 712 pFormFillEnv->OpenFile(0, (FPDF_WIDESTRING)bs.GetBuffer(len), "rb"); |
| 714 bs.ReleaseBuffer(len); | 713 bs.ReleaseBuffer(len); |
| 715 if (!pFileHandler) | 714 if (!pFileHandler) |
| 716 return nullptr; | 715 return nullptr; |
| 717 | 716 |
| 718 return new CFPDF_FileStream(pFileHandler); | 717 return MakeSeekableStream(pFileHandler); |
| 719 } | 718 } |
| 720 | 719 |
| 721 bool CPDFXFA_DocEnvironment::ExportSubmitFile(FPDF_FILEHANDLER* pFileHandler, | 720 bool CPDFXFA_DocEnvironment::ExportSubmitFile(FPDF_FILEHANDLER* pFileHandler, |
| 722 int fileType, | 721 int fileType, |
| 723 FPDF_DWORD encodeType, | 722 FPDF_DWORD encodeType, |
| 724 FPDF_DWORD flag) { | 723 FPDF_DWORD flag) { |
| 725 if (!m_pContext->GetXFADocView()) | 724 if (!m_pContext->GetXFADocView()) |
| 726 return false; | 725 return false; |
| 727 | 726 |
| 728 CFX_ByteString content; | 727 CFX_ByteString content; |
| 729 CPDFSDK_FormFillEnvironment* pFormFillEnv = m_pContext->GetFormFillEnv(); | 728 CPDFSDK_FormFillEnvironment* pFormFillEnv = m_pContext->GetFormFillEnv(); |
| 730 if (!pFormFillEnv) | 729 if (!pFormFillEnv) |
| 731 return false; | 730 return false; |
| 732 | 731 |
| 733 CFPDF_FileStream fileStream(pFileHandler); | 732 std::unique_ptr<IFX_SeekableStream, ReleaseDeleter<IFX_SeekableStream>> |
| 733 fileStream(MakeSeekableStream(pFileHandler)); |
| 734 |
| 734 if (fileType == FXFA_SAVEAS_XML) { | 735 if (fileType == FXFA_SAVEAS_XML) { |
| 735 const char kContent[] = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\r\n"; | 736 const char kContent[] = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\r\n"; |
| 736 fileStream.WriteBlock(kContent, 0, strlen(kContent)); | 737 fileStream->WriteBlock(kContent, 0, strlen(kContent)); |
| 737 m_pContext->GetXFADoc()->SavePackage(XFA_HASHCODE_Data, &fileStream, | 738 m_pContext->GetXFADoc()->SavePackage(XFA_HASHCODE_Data, fileStream.get(), |
| 738 nullptr); | 739 nullptr); |
| 739 return true; | 740 return true; |
| 740 } | 741 } |
| 741 | 742 |
| 742 if (fileType != FXFA_SAVEAS_XDP) | 743 if (fileType != FXFA_SAVEAS_XDP) |
| 743 return true; | 744 return true; |
| 744 | 745 |
| 745 if (!flag) { | 746 if (!flag) { |
| 746 flag = FXFA_CONFIG | FXFA_TEMPLATE | FXFA_LOCALESET | FXFA_DATASETS | | 747 flag = FXFA_CONFIG | FXFA_TEMPLATE | FXFA_LOCALESET | FXFA_DATASETS | |
| 747 FXFA_XMPMETA | FXFA_XFDF | FXFA_FORM; | 748 FXFA_XMPMETA | FXFA_XFDF | FXFA_FORM; |
| 748 } | 749 } |
| 749 if (!m_pContext->GetPDFDoc()) { | 750 if (!m_pContext->GetPDFDoc()) { |
| 750 fileStream.Flush(); | 751 fileStream->Flush(); |
| 751 return false; | 752 return false; |
| 752 } | 753 } |
| 753 | 754 |
| 754 CPDF_Dictionary* pRoot = m_pContext->GetPDFDoc()->GetRoot(); | 755 CPDF_Dictionary* pRoot = m_pContext->GetPDFDoc()->GetRoot(); |
| 755 if (!pRoot) { | 756 if (!pRoot) { |
| 756 fileStream.Flush(); | 757 fileStream->Flush(); |
| 757 return false; | 758 return false; |
| 758 } | 759 } |
| 759 | 760 |
| 760 CPDF_Dictionary* pAcroForm = pRoot->GetDictFor("AcroForm"); | 761 CPDF_Dictionary* pAcroForm = pRoot->GetDictFor("AcroForm"); |
| 761 if (!pAcroForm) { | 762 if (!pAcroForm) { |
| 762 fileStream.Flush(); | 763 fileStream->Flush(); |
| 763 return false; | 764 return false; |
| 764 } | 765 } |
| 765 | 766 |
| 766 CPDF_Array* pArray = ToArray(pAcroForm->GetObjectFor("XFA")); | 767 CPDF_Array* pArray = ToArray(pAcroForm->GetObjectFor("XFA")); |
| 767 if (!pArray) { | 768 if (!pArray) { |
| 768 fileStream.Flush(); | 769 fileStream->Flush(); |
| 769 return false; | 770 return false; |
| 770 } | 771 } |
| 771 | 772 |
| 772 int size = pArray->GetCount(); | 773 int size = pArray->GetCount(); |
| 773 for (int i = 1; i < size; i += 2) { | 774 for (int i = 1; i < size; i += 2) { |
| 774 CPDF_Object* pPDFObj = pArray->GetObjectAt(i); | 775 CPDF_Object* pPDFObj = pArray->GetObjectAt(i); |
| 775 CPDF_Object* pPrePDFObj = pArray->GetObjectAt(i - 1); | 776 CPDF_Object* pPrePDFObj = pArray->GetObjectAt(i - 1); |
| 776 if (!pPrePDFObj->IsString()) | 777 if (!pPrePDFObj->IsString()) |
| 777 continue; | 778 continue; |
| 778 if (!pPDFObj->IsReference()) | 779 if (!pPDFObj->IsReference()) |
| (...skipping 10 matching lines...) Expand all Loading... |
| 789 continue; | 790 continue; |
| 790 if (pPrePDFObj->GetString() == "datasets" && !(flag & FXFA_DATASETS)) | 791 if (pPrePDFObj->GetString() == "datasets" && !(flag & FXFA_DATASETS)) |
| 791 continue; | 792 continue; |
| 792 if (pPrePDFObj->GetString() == "xmpmeta" && !(flag & FXFA_XMPMETA)) | 793 if (pPrePDFObj->GetString() == "xmpmeta" && !(flag & FXFA_XMPMETA)) |
| 793 continue; | 794 continue; |
| 794 if (pPrePDFObj->GetString() == "xfdf" && !(flag & FXFA_XFDF)) | 795 if (pPrePDFObj->GetString() == "xfdf" && !(flag & FXFA_XFDF)) |
| 795 continue; | 796 continue; |
| 796 if (pPrePDFObj->GetString() == "form" && !(flag & FXFA_FORM)) | 797 if (pPrePDFObj->GetString() == "form" && !(flag & FXFA_FORM)) |
| 797 continue; | 798 continue; |
| 798 if (pPrePDFObj->GetString() == "form") { | 799 if (pPrePDFObj->GetString() == "form") { |
| 799 m_pContext->GetXFADoc()->SavePackage(XFA_HASHCODE_Form, &fileStream, | 800 m_pContext->GetXFADoc()->SavePackage(XFA_HASHCODE_Form, fileStream.get(), |
| 800 nullptr); | 801 nullptr); |
| 801 } else if (pPrePDFObj->GetString() == "datasets") { | 802 } else if (pPrePDFObj->GetString() == "datasets") { |
| 802 m_pContext->GetXFADoc()->SavePackage(XFA_HASHCODE_Datasets, &fileStream, | 803 m_pContext->GetXFADoc()->SavePackage(XFA_HASHCODE_Datasets, |
| 803 nullptr); | 804 fileStream.get(), nullptr); |
| 804 } else { | 805 } else { |
| 805 // PDF,creator. | 806 // PDF,creator. |
| 806 } | 807 } |
| 807 } | 808 } |
| 808 return true; | 809 return true; |
| 809 } | 810 } |
| 810 | 811 |
| 811 void CPDFXFA_DocEnvironment::ToXFAContentFlags(CFX_WideString csSrcContent, | 812 void CPDFXFA_DocEnvironment::ToXFAContentFlags(CFX_WideString csSrcContent, |
| 812 FPDF_DWORD& flag) { | 813 FPDF_DWORD& flag) { |
| 813 if (csSrcContent.Find(L" config ", 0) != -1) | 814 if (csSrcContent.Find(L" config ", 0) != -1) |
| (...skipping 205 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1019 !m_pContext->GetFormFillEnv()->GetJSRuntime()) { | 1020 !m_pContext->GetFormFillEnv()->GetJSRuntime()) { |
| 1020 return false; | 1021 return false; |
| 1021 } | 1022 } |
| 1022 | 1023 |
| 1023 CPDFSDK_FormFillEnvironment* pFormFillEnv = m_pContext->GetFormFillEnv(); | 1024 CPDFSDK_FormFillEnvironment* pFormFillEnv = m_pContext->GetFormFillEnv(); |
| 1024 if (!m_pJSContext) | 1025 if (!m_pJSContext) |
| 1025 m_pJSContext = pFormFillEnv->GetJSRuntime()->NewContext(); | 1026 m_pJSContext = pFormFillEnv->GetJSRuntime()->NewContext(); |
| 1026 | 1027 |
| 1027 return pFormFillEnv->GetJSRuntime()->GetValueByName(szPropName, pValue); | 1028 return pFormFillEnv->GetJSRuntime()->GetValueByName(szPropName, pValue); |
| 1028 } | 1029 } |
| OLD | NEW |