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/fpdf_formfill.h" | 7 #include "../../../public/fpdf_formfill.h" |
8 #include "../../include/fsdk_define.h" | 8 #include "../../include/fsdk_define.h" |
9 #include "../../include/fpdfxfa/fpdfxfa_doc.h" | 9 #include "../../include/fpdfxfa/fpdfxfa_doc.h" |
10 #include "../../include/fsdk_mgr.h" | 10 #include "../../include/fsdk_mgr.h" |
(...skipping 17 matching lines...) Expand all Loading... |
28 #define FXFA_PDF 0x10000000 | 28 #define FXFA_PDF 0x10000000 |
29 | 29 |
30 #ifndef _WIN32 | 30 #ifndef _WIN32 |
31 extern void SetLastError(int err); | 31 extern void SetLastError(int err); |
32 | 32 |
33 extern int GetLastError(); | 33 extern int GetLastError(); |
34 #endif | 34 #endif |
35 | 35 |
36 CPDFXFA_Document::CPDFXFA_Document(CPDF_Document* pPDFDoc, | 36 CPDFXFA_Document::CPDFXFA_Document(CPDF_Document* pPDFDoc, |
37 CPDFXFA_App* pProvider) | 37 CPDFXFA_App* pProvider) |
38 : m_pPDFDoc(pPDFDoc), | 38 : m_iDocType(DOCTYPE_PDF), |
| 39 m_pPDFDoc(pPDFDoc), |
| 40 m_pSDKDoc(nullptr), |
| 41 m_pXFADoc(nullptr), |
| 42 m_pXFADocView(nullptr), |
39 m_pApp(pProvider), | 43 m_pApp(pProvider), |
40 m_pXFADoc(NULL), | 44 m_pJSContext(nullptr) { |
41 m_pXFADocView(NULL), | |
42 m_iDocType(DOCTYPE_PDF), | |
43 m_pJSContext(NULL), | |
44 m_pSDKDoc(NULL) { | |
45 m_XFAPageList.RemoveAll(); | |
46 } | 45 } |
47 | 46 |
48 CPDFXFA_Document::~CPDFXFA_Document() { | 47 CPDFXFA_Document::~CPDFXFA_Document() { |
49 if (m_pPDFDoc) { | 48 if (m_pPDFDoc) { |
50 CPDF_Parser* pParser = (CPDF_Parser*)m_pPDFDoc->GetParser(); | 49 CPDF_Parser* pParser = (CPDF_Parser*)m_pPDFDoc->GetParser(); |
51 if (pParser == NULL) { | 50 if (pParser == NULL) { |
52 delete m_pPDFDoc; | 51 delete m_pPDFDoc; |
53 } else { | 52 } else { |
54 delete pParser; | 53 delete pParser; |
55 } | 54 } |
(...skipping 429 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
485 | 484 |
486 CPDFDoc_Environment* pEnv = m_pSDKDoc->GetEnv(); | 485 CPDFDoc_Environment* pEnv = m_pSDKDoc->GetEnv(); |
487 if (pEnv == NULL) | 486 if (pEnv == NULL) |
488 return FALSE; | 487 return FALSE; |
489 | 488 |
490 return pEnv->FFI_PopupMenu(pPage, hWidget, menuFlag, ptPopup, NULL); | 489 return pEnv->FFI_PopupMenu(pPage, hWidget, menuFlag, ptPopup, NULL); |
491 } | 490 } |
492 | 491 |
493 void CPDFXFA_Document::PageViewEvent(IXFA_PageView* pPageView, | 492 void CPDFXFA_Document::PageViewEvent(IXFA_PageView* pPageView, |
494 FX_DWORD dwFlags) { | 493 FX_DWORD dwFlags) { |
495 if (m_iDocType != DOCTYPE_DYNIMIC_XFA) | |
496 return; | |
497 | |
498 CPDFDoc_Environment* pEnv = m_pSDKDoc->GetEnv(); | |
499 if (pEnv == NULL) | |
500 return; | |
501 | |
502 CPDFXFA_Page* pPage = GetPage(pPageView); | |
503 if (pPage == NULL) | |
504 return; | |
505 | |
506 if (dwFlags == FXFA_PAGEVIEWEVENT_POSTADDED) { | |
507 // pEnv->FFI_PageEvent(pPage, FXFA_PAGEVIEWEVENT_POSTADDED); | |
508 } else if (dwFlags == FXFA_PAGEVIEWEVENT_POSTREMOVED) { | |
509 // pEnv->FFI_PageEvent(pPage, FXFA_PAGEVIEWEVENT_POSTREMOVED); | |
510 // RemovePage(pPage); | |
511 // delete pPage; | |
512 } | |
513 } | 494 } |
514 | 495 |
515 void CPDFXFA_Document::WidgetEvent(IXFA_Widget* hWidget, | 496 void CPDFXFA_Document::WidgetEvent(IXFA_Widget* hWidget, |
516 CXFA_WidgetAcc* pWidgetData, | 497 CXFA_WidgetAcc* pWidgetData, |
517 FX_DWORD dwEvent, | 498 FX_DWORD dwEvent, |
518 void* pParam, | 499 void* pParam, |
519 void* pAdditional) { | 500 void* pAdditional) { |
520 if (m_iDocType != DOCTYPE_DYNIMIC_XFA || NULL == hWidget) | 501 if (m_iDocType != DOCTYPE_DYNIMIC_XFA || !hWidget) |
521 return; | 502 return; |
522 | 503 |
523 CPDFDoc_Environment* pEnv = m_pSDKDoc->GetEnv(); | 504 CPDFDoc_Environment* pEnv = m_pSDKDoc->GetEnv(); |
524 if (pEnv == NULL) | 505 if (!pEnv) |
525 return; | |
526 | |
527 if (NULL == hWidget) | |
528 return; | 506 return; |
529 | 507 |
530 IXFA_PageView* pPageView = | 508 IXFA_PageView* pPageView = |
531 m_pXFADocView->GetWidgetHandler()->GetPageView(hWidget); | 509 m_pXFADocView->GetWidgetHandler()->GetPageView(hWidget); |
532 | |
533 if (pPageView == NULL) | 510 if (pPageView == NULL) |
534 return; | 511 return; |
| 512 |
535 CPDFXFA_Page* pXFAPage = GetPage(pPageView); | 513 CPDFXFA_Page* pXFAPage = GetPage(pPageView); |
536 if (pXFAPage == NULL) | 514 if (pXFAPage == NULL) |
537 return; | 515 return; |
538 | 516 |
539 CPDFSDK_PageView* pSdkPageView = m_pSDKDoc->GetPageView(pXFAPage); | 517 CPDFSDK_PageView* pSdkPageView = m_pSDKDoc->GetPageView(pXFAPage); |
540 | |
541 CPDFSDK_AnnotHandlerMgr* pAnnotHandlerMgr = pEnv->GetAnnotHandlerMgr(); | |
542 | |
543 if (dwEvent == XFA_WIDGETEVENT_PostAdded) { | 518 if (dwEvent == XFA_WIDGETEVENT_PostAdded) { |
544 // CPDFSDK_Annot* pAnnot = | |
545 // pAnnotHandlerMgr->NewAnnot(hWidget, | |
546 // pSdkPageView); | |
547 // pAnnotHandlerMgr->Annot_OnLoad(pAnnot); | |
548 | |
549 // pEnv->FFI_WidgetEvent(hWidget, XFA_WIDGETEVENT_PostAdded); | |
550 // IXFA_PageView* pOldPageView = (IXFA_PageView*)pAdditional; | |
551 // if (pOldPageView) | |
552 // { | |
553 // CPDFXFA_Page* pDestPage = | |
554 // m_pSDKDoc->GetPageView((IXFA_PageView*)pOldPageView); | |
555 // ASSERT(pDestPage); | |
556 // CPDFSDK_Annot* pAnnot = | |
557 // pDestPage->GetAnnotByXFAWidget(hWidget); | |
558 // if (pAnnot) | |
559 // { | |
560 // if (m_pSDKDoc->GetFocusAnnot() == pAnnot) | |
561 // { | |
562 // m_pSDKDoc->SetFocusAnnot(NULL); | |
563 // } | |
564 // pDestPage->DeleteAnnot(pAnnot); | |
565 // } | |
566 // } | |
567 pSdkPageView->AddAnnot(hWidget); | 519 pSdkPageView->AddAnnot(hWidget); |
568 | 520 |
569 } else if (dwEvent == XFA_WIDGETEVENT_PreRemoved) { | 521 } else if (dwEvent == XFA_WIDGETEVENT_PreRemoved) { |
570 CPDFSDK_Annot* pAnnot = pSdkPageView->GetAnnotByXFAWidget(hWidget); | 522 CPDFSDK_Annot* pAnnot = pSdkPageView->GetAnnotByXFAWidget(hWidget); |
571 if (pAnnot) { | 523 if (pAnnot) { |
572 pSdkPageView->DeleteAnnot(pAnnot); | 524 pSdkPageView->DeleteAnnot(pAnnot); |
573 // pEnv->FFI_WidgetEvent(hWidget, XFA_WIDGETEVENT_PreRemoved); | |
574 } | 525 } |
575 } | 526 } |
576 } | 527 } |
577 | 528 |
578 int32_t CPDFXFA_Document::CountPages(IXFA_Doc* hDoc) { | 529 int32_t CPDFXFA_Document::CountPages(IXFA_Doc* hDoc) { |
579 if (hDoc == m_pXFADoc && m_pSDKDoc) { | 530 if (hDoc == m_pXFADoc && m_pSDKDoc) { |
580 return GetPageCount(); | 531 return GetPageCount(); |
581 } | 532 } |
582 return 0; | 533 return 0; |
583 } | 534 } |
(...skipping 95 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
679 CFPDF_FileStream fileWrite(pFileHandler); | 630 CFPDF_FileStream fileWrite(pFileHandler); |
680 | 631 |
681 IXFA_DocHandler* pXFADocHander = m_pApp->GetXFAApp()->GetDocHandler(); | 632 IXFA_DocHandler* pXFADocHander = m_pApp->GetXFAApp()->GetDocHandler(); |
682 CFX_ByteString content; | 633 CFX_ByteString content; |
683 if (fileType == FXFA_SAVEAS_XML) { | 634 if (fileType == FXFA_SAVEAS_XML) { |
684 content = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\r\n"; | 635 content = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\r\n"; |
685 fileWrite.WriteBlock((const FX_CHAR*)content, fileWrite.GetSize(), | 636 fileWrite.WriteBlock((const FX_CHAR*)content, fileWrite.GetSize(), |
686 content.GetLength()); | 637 content.GetLength()); |
687 CFX_WideStringC data(L"data"); | 638 CFX_WideStringC data(L"data"); |
688 if (pXFADocHander->SavePackage(m_pXFADocView->GetDoc(), data, &fileWrite)) { | 639 if (pXFADocHander->SavePackage(m_pXFADocView->GetDoc(), data, &fileWrite)) { |
689 NULL; | 640 // TODO: Maybe report error. |
690 } | 641 } |
691 } | 642 } else if (fileType == FXFA_SAVEAS_XDP) { |
692 /*else if (fileType == FXFA_FILE_STATIC_XDP) | |
693 { | |
694 content = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\r\n"; | |
695 fileWrite.WriteBlock((const FX_CHAR*)content, fileWrite.GetSize(), | |
696 content.GetLength()); | |
697 CFX_WideStringC data(L"data"); | |
698 if( pXFADocHander->SavePackage(m_pXFADocView->GetDoc(), data, | |
699 &fileWrite)) | |
700 { | |
701 NULL; | |
702 } | |
703 CFX_WideString wPath = pEnv->FFI_GetFilePath(pFileHandler); | |
704 // » » CFX_WideString wPath; | |
705 // » » wPath.FromUTF16LE(filePath); | |
706 CFX_ByteString bPath = wPath.UTF8Encode(); | |
707 CFX_ByteString szFormat = "\n<pdf href=\"%s\" | |
708 xmlns=\"http://ns.adobe.com/xdp/pdf/\"/>"; | |
709 content.Format(szFormat,(char*)(const FX_CHAR*)bPath); | |
710 fileWrite.WriteBlock((const FX_CHAR*)content,fileWrite.GetSize(), | |
711 content.GetLength()); | |
712 } | |
713 */ | |
714 else if (fileType == FXFA_SAVEAS_XDP) { | |
715 if (m_pPDFDoc == NULL) | 643 if (m_pPDFDoc == NULL) |
716 return; | 644 return; |
717 CPDF_Dictionary* pRoot = m_pPDFDoc->GetRoot(); | 645 CPDF_Dictionary* pRoot = m_pPDFDoc->GetRoot(); |
718 if (pRoot == NULL) | 646 if (pRoot == NULL) |
719 return; | 647 return; |
720 CPDF_Dictionary* pAcroForm = pRoot->GetDict("AcroForm"); | 648 CPDF_Dictionary* pAcroForm = pRoot->GetDict("AcroForm"); |
721 if (NULL == pAcroForm) | 649 if (NULL == pAcroForm) |
722 return; | 650 return; |
723 CPDF_Object* pXFA = pAcroForm->GetElement("XFA"); | 651 CPDF_Object* pXFA = pAcroForm->GetElement("XFA"); |
724 if (pXFA == NULL) | 652 if (pXFA == NULL) |
725 return; | 653 return; |
726 if (pXFA->GetType() != PDFOBJ_ARRAY) | 654 if (pXFA->GetType() != PDFOBJ_ARRAY) |
727 return; | 655 return; |
728 CPDF_Array* pArray = pXFA->GetArray(); | 656 CPDF_Array* pArray = pXFA->GetArray(); |
729 if (NULL == pArray) | 657 if (NULL == pArray) |
730 return; | 658 return; |
731 int size = pArray->GetCount(); | 659 int size = pArray->GetCount(); |
732 int iFormIndex = -1; | |
733 int iDataSetsIndex = -1; | |
734 for (int i = 1; i < size; i += 2) { | 660 for (int i = 1; i < size; i += 2) { |
735 CPDF_Object* pPDFObj = pArray->GetElement(i); | 661 CPDF_Object* pPDFObj = pArray->GetElement(i); |
736 CPDF_Object* pPrePDFObj = pArray->GetElement(i - 1); | 662 CPDF_Object* pPrePDFObj = pArray->GetElement(i - 1); |
737 if (pPrePDFObj->GetType() != PDFOBJ_STRING) | 663 if (pPrePDFObj->GetType() != PDFOBJ_STRING) |
738 continue; | 664 continue; |
739 if (pPDFObj->GetType() != PDFOBJ_REFERENCE) | 665 if (pPDFObj->GetType() != PDFOBJ_REFERENCE) |
740 continue; | 666 continue; |
741 CPDF_Object* pDirectObj = pPDFObj->GetDirect(); | 667 CPDF_Object* pDirectObj = pPDFObj->GetDirect(); |
742 if (pDirectObj->GetType() != PDFOBJ_STREAM) | 668 if (pDirectObj->GetType() != PDFOBJ_STREAM) |
743 continue; | 669 continue; |
744 if (pPrePDFObj->GetString() == "form") { | 670 if (pPrePDFObj->GetString() == "form") { |
745 CFX_WideStringC form(L"form"); | 671 CFX_WideStringC form(L"form"); |
746 pXFADocHander->SavePackage(m_pXFADocView->GetDoc(), form, &fileWrite); | 672 pXFADocHander->SavePackage(m_pXFADocView->GetDoc(), form, &fileWrite); |
747 } else if (pPrePDFObj->GetString() == "datasets") { | 673 } else if (pPrePDFObj->GetString() == "datasets") { |
748 CFX_WideStringC datasets(L"datasets"); | 674 CFX_WideStringC datasets(L"datasets"); |
749 pXFADocHander->SavePackage(m_pXFADocView->GetDoc(), datasets, | 675 pXFADocHander->SavePackage(m_pXFADocView->GetDoc(), datasets, |
750 &fileWrite); | 676 &fileWrite); |
751 } else { | 677 } else { |
752 if (i == size - 1) { | 678 if (i == size - 1) { |
753 // CFX_WideString wPath = pEnv->FFI_GetFilePath(pFileHandler); | |
754 CFX_WideString wPath = CFX_WideString::FromUTF16LE( | 679 CFX_WideString wPath = CFX_WideString::FromUTF16LE( |
755 (unsigned short*)(const FX_CHAR*)bs, | 680 (unsigned short*)(const FX_CHAR*)bs, |
756 bs.GetLength() / sizeof(unsigned short)); | 681 bs.GetLength() / sizeof(unsigned short)); |
757 CFX_ByteString bPath = wPath.UTF8Encode(); | 682 CFX_ByteString bPath = wPath.UTF8Encode(); |
758 CFX_ByteString szFormat = | 683 CFX_ByteString szFormat = |
759 "\n<pdf href=\"%s\" xmlns=\"http://ns.adobe.com/xdp/pdf/\"/>"; | 684 "\n<pdf href=\"%s\" xmlns=\"http://ns.adobe.com/xdp/pdf/\"/>"; |
760 content.Format(szFormat, (char*)(const FX_CHAR*)bPath); | 685 content.Format(szFormat, (char*)(const FX_CHAR*)bPath); |
761 fileWrite.WriteBlock((const FX_CHAR*)content, fileWrite.GetSize(), | 686 fileWrite.WriteBlock((const FX_CHAR*)content, fileWrite.GetSize(), |
762 content.GetLength()); | 687 content.GetLength()); |
763 } | 688 } |
764 | 689 |
765 CPDF_Stream* pStream = (CPDF_Stream*)pDirectObj; | 690 CPDF_Stream* pStream = (CPDF_Stream*)pDirectObj; |
766 CPDF_StreamAcc* pAcc = new CPDF_StreamAcc; | 691 CPDF_StreamAcc* pAcc = new CPDF_StreamAcc; |
767 pAcc->LoadAllData(pStream); | 692 pAcc->LoadAllData(pStream); |
768 fileWrite.WriteBlock(pAcc->GetData(), fileWrite.GetSize(), | 693 fileWrite.WriteBlock(pAcc->GetData(), fileWrite.GetSize(), |
769 pAcc->GetSize()); | 694 pAcc->GetSize()); |
770 delete pAcc; | 695 delete pAcc; |
771 } | 696 } |
772 } | 697 } |
773 } | 698 } |
774 FX_BOOL bError = fileWrite.Flush(); | 699 if (!fileWrite.Flush()) { |
| 700 // TODO: Report error. |
| 701 } |
775 } | 702 } |
776 void CPDFXFA_Document::ImportData(IXFA_Doc* hDoc, | 703 void CPDFXFA_Document::ImportData(IXFA_Doc* hDoc, |
777 const CFX_WideStringC& wsFilePath) { | 704 const CFX_WideStringC& wsFilePath) { |
778 // TODO... | 705 // TODO... |
779 } | 706 } |
780 | 707 |
781 void CPDFXFA_Document::GotoURL(IXFA_Doc* hDoc, | 708 void CPDFXFA_Document::GotoURL(IXFA_Doc* hDoc, |
782 const CFX_WideStringC& bsURL, | 709 const CFX_WideStringC& bsURL, |
783 FX_BOOL bAppend) { | 710 FX_BOOL bAppend) { |
784 if (hDoc != m_pXFADoc) | 711 if (hDoc != m_pXFADoc) |
(...skipping 259 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1044 if (pXFA->GetType() != PDFOBJ_ARRAY) { | 971 if (pXFA->GetType() != PDFOBJ_ARRAY) { |
1045 fileStream.Flush(); | 972 fileStream.Flush(); |
1046 return FALSE; | 973 return FALSE; |
1047 } | 974 } |
1048 CPDF_Array* pArray = pXFA->GetArray(); | 975 CPDF_Array* pArray = pXFA->GetArray(); |
1049 if (NULL == pArray) { | 976 if (NULL == pArray) { |
1050 fileStream.Flush(); | 977 fileStream.Flush(); |
1051 return FALSE; | 978 return FALSE; |
1052 } | 979 } |
1053 int size = pArray->GetCount(); | 980 int size = pArray->GetCount(); |
1054 int iFormIndex = -1; | |
1055 int iDataSetsIndex = -1; | |
1056 for (int i = 1; i < size; i += 2) { | 981 for (int i = 1; i < size; i += 2) { |
1057 CPDF_Object* pPDFObj = pArray->GetElement(i); | 982 CPDF_Object* pPDFObj = pArray->GetElement(i); |
1058 CPDF_Object* pPrePDFObj = pArray->GetElement(i - 1); | 983 CPDF_Object* pPrePDFObj = pArray->GetElement(i - 1); |
1059 if (pPrePDFObj->GetType() != PDFOBJ_STRING) | 984 if (pPrePDFObj->GetType() != PDFOBJ_STRING) |
1060 continue; | 985 continue; |
1061 if (pPDFObj->GetType() != PDFOBJ_REFERENCE) | 986 if (pPDFObj->GetType() != PDFOBJ_REFERENCE) |
1062 continue; | 987 continue; |
1063 CPDF_Object* pDirectObj = pPDFObj->GetDirect(); | 988 CPDF_Object* pDirectObj = pPDFObj->GetDirect(); |
1064 if (pDirectObj->GetType() != PDFOBJ_STREAM) | 989 if (pDirectObj->GetType() != PDFOBJ_STREAM) |
1065 continue; | 990 continue; |
(...skipping 276 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1342 } | 1267 } |
1343 | 1268 |
1344 return _GetHValueByName(szPropName, hValue, | 1269 return _GetHValueByName(szPropName, hValue, |
1345 m_pSDKDoc->GetEnv()->GetJSRuntime()); | 1270 m_pSDKDoc->GetEnv()->GetJSRuntime()); |
1346 } | 1271 } |
1347 FX_BOOL CPDFXFA_Document::_GetHValueByName(const CFX_ByteStringC& utf8Name, | 1272 FX_BOOL CPDFXFA_Document::_GetHValueByName(const CFX_ByteStringC& utf8Name, |
1348 FXJSE_HVALUE hValue, | 1273 FXJSE_HVALUE hValue, |
1349 IJS_Runtime* runTime) { | 1274 IJS_Runtime* runTime) { |
1350 return runTime->GetHValueByName(utf8Name, hValue); | 1275 return runTime->GetHValueByName(utf8Name, hValue); |
1351 } | 1276 } |
OLD | NEW |