Home | History | Annotate | Download | only in fpdfxfa
      1 // Copyright 2014 PDFium Authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style license that can be
      3 // found in the LICENSE file.
      4 
      5 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
      6 
      7 #include "fpdfsdk/include/fsdk_define.h"
      8 #include "fpdfsdk/include/fpdfxfa/fpdfxfa_doc.h"
      9 #include "fpdfsdk/include/fsdk_mgr.h"
     10 #include "fpdfsdk/include/fpdfxfa/fpdfxfa_app.h"
     11 #include "fpdfsdk/include/fpdfxfa/fpdfxfa_util.h"
     12 #include "fpdfsdk/include/fpdfxfa/fpdfxfa_page.h"
     13 #include "fpdfsdk/include/javascript/IJavaScript.h"
     14 #include "public/fpdf_formfill.h"
     15 
     16 #define IDS_XFA_Validate_Input                                          \
     17   "At least one required field was empty. Please fill in the required " \
     18   "fields\r\n(highlighted) before continuing."
     19 
     20 // submit
     21 #define FXFA_CONFIG 0x00000001
     22 #define FXFA_TEMPLATE 0x00000010
     23 #define FXFA_LOCALESET 0x00000100
     24 #define FXFA_DATASETS 0x00001000
     25 #define FXFA_XMPMETA 0x00010000
     26 #define FXFA_XFDF 0x00100000
     27 #define FXFA_FORM 0x01000000
     28 #define FXFA_PDF 0x10000000
     29 
     30 #ifndef _WIN32
     31 extern void SetLastError(int err);
     32 
     33 extern int GetLastError();
     34 #endif
     35 
     36 CPDFXFA_Document::CPDFXFA_Document(CPDF_Document* pPDFDoc,
     37                                    CPDFXFA_App* pProvider)
     38     : m_iDocType(DOCTYPE_PDF),
     39       m_pPDFDoc(pPDFDoc),
     40       m_pSDKDoc(nullptr),
     41       m_pXFADoc(nullptr),
     42       m_pXFADocView(nullptr),
     43       m_pApp(pProvider),
     44       m_pJSContext(nullptr) {
     45 }
     46 
     47 CPDFXFA_Document::~CPDFXFA_Document() {
     48   if (m_pJSContext && m_pSDKDoc && m_pSDKDoc->GetEnv())
     49     m_pSDKDoc->GetEnv()->GetJSRuntime()->ReleaseContext(m_pJSContext);
     50 
     51   delete m_pSDKDoc;
     52 
     53   if (m_pPDFDoc) {
     54     CPDF_Parser* pParser = m_pPDFDoc->GetParser();
     55     if (pParser)
     56       delete pParser;
     57     else
     58       delete m_pPDFDoc;
     59   }
     60   if (m_pXFADoc) {
     61     IXFA_App* pApp = m_pApp->GetXFAApp();
     62     if (pApp) {
     63       IXFA_DocHandler* pDocHandler = pApp->GetDocHandler();
     64       if (pDocHandler) {
     65         CloseXFADoc(pDocHandler);
     66       }
     67     }
     68     delete m_pXFADoc;
     69   }
     70 }
     71 
     72 FX_BOOL CPDFXFA_Document::LoadXFADoc() {
     73   if (!m_pPDFDoc)
     74     return FALSE;
     75 
     76   m_XFAPageList.RemoveAll();
     77 
     78   IXFA_App* pApp = m_pApp->GetXFAApp();
     79   if (!pApp)
     80     return FALSE;
     81 
     82   m_pXFADoc = pApp->CreateDoc(this, m_pPDFDoc);
     83   if (!m_pXFADoc) {
     84     SetLastError(FPDF_ERR_XFALOAD);
     85     return FALSE;
     86   }
     87 
     88   IXFA_DocHandler* pDocHandler = pApp->GetDocHandler();
     89   if (!pDocHandler) {
     90     SetLastError(FPDF_ERR_XFALOAD);
     91     return FALSE;
     92   }
     93 
     94   pDocHandler->StartLoad(m_pXFADoc);
     95   int iStatus = pDocHandler->DoLoad(m_pXFADoc, NULL);
     96   if (iStatus != XFA_PARSESTATUS_Done) {
     97     CloseXFADoc(pDocHandler);
     98     SetLastError(FPDF_ERR_XFALOAD);
     99     return FALSE;
    100   }
    101   pDocHandler->StopLoad(m_pXFADoc);
    102   pDocHandler->SetJSERuntime(m_pXFADoc, m_pApp->GetJSERuntime());
    103 
    104   if (pDocHandler->GetDocType(m_pXFADoc) == XFA_DOCTYPE_Dynamic)
    105     m_iDocType = DOCTYPE_DYNAMIC_XFA;
    106   else
    107     m_iDocType = DOCTYPE_STATIC_XFA;
    108 
    109   m_pXFADocView = pDocHandler->CreateDocView(m_pXFADoc, XFA_DOCVIEW_View);
    110   if (m_pXFADocView->StartLayout() < 0) {
    111     CloseXFADoc(pDocHandler);
    112     SetLastError(FPDF_ERR_XFALAYOUT);
    113     return FALSE;
    114   }
    115 
    116   m_pXFADocView->DoLayout(NULL);
    117   m_pXFADocView->StopLayout();
    118   return TRUE;
    119 }
    120 
    121 int CPDFXFA_Document::GetPageCount() {
    122   if (!m_pPDFDoc && !m_pXFADoc)
    123     return 0;
    124 
    125   switch (m_iDocType) {
    126     case DOCTYPE_PDF:
    127     case DOCTYPE_STATIC_XFA:
    128       if (m_pPDFDoc)
    129         return m_pPDFDoc->GetPageCount();
    130     case DOCTYPE_DYNAMIC_XFA:
    131       if (m_pXFADoc)
    132         return m_pXFADocView->CountPageViews();
    133     default:
    134       return 0;
    135   }
    136 
    137   return 0;
    138 }
    139 
    140 CPDFXFA_Page* CPDFXFA_Document::GetPage(int page_index) {
    141   if (!m_pPDFDoc && !m_pXFADoc)
    142     return NULL;
    143 
    144   CPDFXFA_Page* pPage = NULL;
    145   if (m_XFAPageList.GetSize()) {
    146     pPage = m_XFAPageList.GetAt(page_index);
    147     if (pPage)
    148       pPage->AddRef();
    149   } else {
    150     m_XFAPageList.SetSize(GetPageCount());
    151   }
    152 
    153   if (!pPage) {
    154     pPage = new CPDFXFA_Page(this, page_index);
    155     FX_BOOL bRet = pPage->LoadPage();
    156     if (!bRet) {
    157       delete pPage;
    158       return NULL;
    159     }
    160 
    161     m_XFAPageList.SetAt(page_index, pPage);
    162   }
    163 
    164   return pPage;
    165 }
    166 
    167 CPDFXFA_Page* CPDFXFA_Document::GetPage(IXFA_PageView* pPage) {
    168   if (!pPage)
    169     return NULL;
    170 
    171   if (!m_pXFADoc)
    172     return NULL;
    173 
    174   if (m_iDocType != DOCTYPE_DYNAMIC_XFA)
    175     return NULL;
    176 
    177   int nSize = m_XFAPageList.GetSize();
    178   for (int i = 0; i < nSize; i++) {
    179     CPDFXFA_Page* pTempPage = m_XFAPageList.GetAt(i);
    180     if (!pTempPage)
    181       continue;
    182     if (pTempPage->GetXFAPageView() && pTempPage->GetXFAPageView() == pPage)
    183       return pTempPage;
    184   }
    185 
    186   return NULL;
    187 }
    188 
    189 void CPDFXFA_Document::RemovePage(CPDFXFA_Page* page) {
    190   m_XFAPageList.SetAt(page->GetPageIndex(), NULL);
    191 }
    192 
    193 CPDFSDK_Document* CPDFXFA_Document::GetSDKDocument(
    194     CPDFDoc_Environment* pFormFillEnv) {
    195   if (!m_pSDKDoc && pFormFillEnv)
    196     m_pSDKDoc = new CPDFSDK_Document(this, pFormFillEnv);
    197   return m_pSDKDoc;
    198 }
    199 
    200 void CPDFXFA_Document::FXRect2PDFRect(const CFX_RectF& fxRectF,
    201                                       CPDF_Rect& pdfRect) {
    202   pdfRect.left = fxRectF.left;
    203   pdfRect.top = fxRectF.bottom();
    204   pdfRect.right = fxRectF.right();
    205   pdfRect.bottom = fxRectF.top;
    206 }
    207 
    208 void CPDFXFA_Document::SetChangeMark(IXFA_Doc* hDoc) {
    209   if (hDoc == m_pXFADoc && m_pSDKDoc) {
    210     m_pSDKDoc->SetChangeMark();
    211   }
    212 }
    213 
    214 FX_BOOL CPDFXFA_Document::GetChangeMark(IXFA_Doc* hDoc) {
    215   if (hDoc == m_pXFADoc && m_pSDKDoc)
    216     return m_pSDKDoc->GetChangeMark();
    217   return FALSE;
    218 }
    219 
    220 void CPDFXFA_Document::InvalidateRect(IXFA_PageView* pPageView,
    221                                       const CFX_RectF& rt,
    222                                       FX_DWORD dwFlags /* = 0 */) {
    223   if (!m_pXFADoc || !m_pSDKDoc)
    224     return;
    225 
    226   if (m_iDocType != DOCTYPE_DYNAMIC_XFA)
    227     return;
    228 
    229   CPDF_Rect rcPage;
    230   FXRect2PDFRect(rt, rcPage);
    231 
    232   CPDFXFA_Page* pPage = GetPage(pPageView);
    233 
    234   if (pPage == NULL)
    235     return;
    236 
    237   CPDFDoc_Environment* pEnv = m_pSDKDoc->GetEnv();
    238   if (!pEnv)
    239     return;
    240 
    241   pEnv->FFI_Invalidate((FPDF_PAGE)pPage, rcPage.left, rcPage.bottom,
    242                        rcPage.right, rcPage.top);
    243 }
    244 
    245 void CPDFXFA_Document::InvalidateRect(IXFA_Widget* hWidget,
    246                                       FX_DWORD dwFlags /* = 0 */) {
    247   if (!hWidget)
    248     return;
    249 
    250   if (!m_pXFADoc || !m_pSDKDoc || !m_pXFADocView)
    251     return;
    252 
    253   if (m_iDocType != DOCTYPE_DYNAMIC_XFA)
    254     return;
    255 
    256   IXFA_WidgetHandler* pWidgetHandler = m_pXFADocView->GetWidgetHandler();
    257   if (!pWidgetHandler)
    258     return;
    259 
    260   IXFA_PageView* pPageView = pWidgetHandler->GetPageView(hWidget);
    261   if (!pPageView)
    262     return;
    263 
    264   CFX_RectF rect;
    265   pWidgetHandler->GetRect(hWidget, rect);
    266   InvalidateRect(pPageView, rect, dwFlags);
    267 }
    268 
    269 void CPDFXFA_Document::DisplayCaret(IXFA_Widget* hWidget,
    270                                     FX_BOOL bVisible,
    271                                     const CFX_RectF* pRtAnchor) {
    272   if (!hWidget || pRtAnchor == NULL)
    273     return;
    274 
    275   if (!m_pXFADoc || !m_pSDKDoc || !m_pXFADocView)
    276     return;
    277 
    278   if (m_iDocType != DOCTYPE_DYNAMIC_XFA)
    279     return;
    280 
    281   IXFA_WidgetHandler* pWidgetHandler = m_pXFADocView->GetWidgetHandler();
    282   if (!pWidgetHandler)
    283     return;
    284 
    285   IXFA_PageView* pPageView = pWidgetHandler->GetPageView(hWidget);
    286   if (!pPageView)
    287     return;
    288 
    289   CPDFXFA_Page* pPage = GetPage(pPageView);
    290 
    291   if (pPage == NULL)
    292     return;
    293 
    294   CPDF_Rect rcCaret;
    295   FXRect2PDFRect(*pRtAnchor, rcCaret);
    296 
    297   CPDFDoc_Environment* pEnv = m_pSDKDoc->GetEnv();
    298   if (!pEnv)
    299     return;
    300 
    301   pEnv->FFI_DisplayCaret((FPDF_PAGE)pPage, bVisible, rcCaret.left, rcCaret.top,
    302                          rcCaret.right, rcCaret.bottom);
    303 }
    304 
    305 FX_BOOL CPDFXFA_Document::GetPopupPos(IXFA_Widget* hWidget,
    306                                       FX_FLOAT fMinPopup,
    307                                       FX_FLOAT fMaxPopup,
    308                                       const CFX_RectF& rtAnchor,
    309                                       CFX_RectF& rtPopup) {
    310   if (NULL == hWidget) {
    311     return FALSE;
    312   }
    313   IXFA_PageView* pXFAPageView =
    314       m_pXFADocView->GetWidgetHandler()->GetPageView(hWidget);
    315   if (NULL == pXFAPageView) {
    316     return FALSE;
    317   }
    318   CPDFXFA_Page* pPage = GetPage(pXFAPageView);
    319   if (pPage == NULL)
    320     return FALSE;
    321 
    322   CXFA_WidgetAcc* pWidgetAcc =
    323       m_pXFADocView->GetWidgetHandler()->GetDataAcc(hWidget);
    324 
    325   int nRotate = 0;
    326 #ifdef PDF_ENABLE_XFA
    327   nRotate = pWidgetAcc->GetRotate();
    328 #endif
    329 
    330   CPDFDoc_Environment* pEnv = m_pSDKDoc->GetEnv();
    331   if (pEnv == NULL)
    332     return FALSE;
    333   FS_RECTF pageViewRect;
    334   pEnv->FFI_GetPageViewRect(pPage, pageViewRect);
    335 
    336   CPDF_Rect rcAnchor;
    337 
    338   rcAnchor.left = rtAnchor.left;
    339   rcAnchor.top = rtAnchor.bottom();
    340   rcAnchor.right = rtAnchor.right();
    341   rcAnchor.bottom = rtAnchor.top;
    342 
    343   int t1, t2, t;
    344   FX_DWORD dwPos;
    345   FX_FLOAT fPoupHeight;
    346   switch (nRotate) {
    347     case 90: {
    348       t1 = (int)(pageViewRect.right - rcAnchor.right);
    349       t2 = (int)(rcAnchor.left - pageViewRect.left);
    350       if (rcAnchor.bottom < pageViewRect.bottom) {
    351         rtPopup.left += rcAnchor.bottom - pageViewRect.bottom;
    352       }
    353 
    354       break;
    355     }
    356 
    357     case 180: {
    358       t2 = (int)(pageViewRect.top - rcAnchor.top);
    359       t1 = (int)(rcAnchor.bottom - pageViewRect.bottom);
    360       if (rcAnchor.left < pageViewRect.left) {
    361         rtPopup.left += rcAnchor.left - pageViewRect.left;
    362       }
    363       break;
    364     }
    365     case 270: {
    366       t1 = (int)(rcAnchor.left - pageViewRect.left);
    367       t2 = (int)(pageViewRect.right - rcAnchor.right);
    368 
    369       if (rcAnchor.top > pageViewRect.top) {
    370         rtPopup.left -= rcAnchor.top - pageViewRect.top;
    371       }
    372       break;
    373     }
    374     case 0:
    375     default: {
    376       t1 = (int)(pageViewRect.top - rcAnchor.top);
    377       t2 = (int)(rcAnchor.bottom - pageViewRect.bottom);
    378       if (rcAnchor.right > pageViewRect.right) {
    379         rtPopup.left -= rcAnchor.right - pageViewRect.right;
    380       }
    381       break;
    382     }
    383   }
    384 
    385   if (t1 <= 0 && t2 <= 0) {
    386     return FALSE;
    387   }
    388   if (t1 <= 0) {
    389     t = t2;
    390     dwPos = 1;
    391   } else if (t2 <= 0) {
    392     t = t1;
    393     dwPos = 0;
    394   } else if (t1 > t2) {
    395     t = t1;
    396     dwPos = 0;
    397   } else {
    398     t = t2;
    399     dwPos = 1;
    400   }
    401   if (t < fMinPopup) {
    402     fPoupHeight = fMinPopup;
    403   } else if (t > fMaxPopup) {
    404     fPoupHeight = fMaxPopup;
    405   } else {
    406     fPoupHeight = (FX_FLOAT)t;
    407   }
    408 
    409   switch (nRotate) {
    410     case 0:
    411     case 180: {
    412       if (dwPos == 0) {
    413         rtPopup.top = rtAnchor.height;
    414         rtPopup.height = fPoupHeight;
    415       } else {
    416         rtPopup.top = -fPoupHeight;
    417         rtPopup.height = fPoupHeight;
    418       }
    419       break;
    420     }
    421     case 90:
    422     case 270: {
    423       if (dwPos == 0) {
    424         rtPopup.top = rtAnchor.width;
    425         rtPopup.height = fPoupHeight;
    426       } else {
    427         rtPopup.top = -fPoupHeight;
    428         rtPopup.height = fPoupHeight;
    429       }
    430       break;
    431     }
    432     default:
    433       break;
    434   }
    435 
    436   return TRUE;
    437 }
    438 
    439 FX_BOOL CPDFXFA_Document::PopupMenu(IXFA_Widget* hWidget,
    440                                     CFX_PointF ptPopup,
    441                                     const CFX_RectF* pRectExclude) {
    442   if (NULL == hWidget) {
    443     return FALSE;
    444   }
    445   IXFA_PageView* pXFAPageView =
    446       m_pXFADocView->GetWidgetHandler()->GetPageView(hWidget);
    447   if (pXFAPageView == NULL)
    448     return FALSE;
    449   CPDFXFA_Page* pPage = GetPage(pXFAPageView);
    450 
    451   if (pPage == NULL)
    452     return FALSE;
    453 
    454   int menuFlag = 0;
    455 
    456   IXFA_MenuHandler* pXFAMenuHander = m_pApp->GetXFAApp()->GetMenuHandler();
    457   if (pXFAMenuHander->CanUndo(hWidget))
    458     menuFlag |= FXFA_MEMU_UNDO;
    459   if (pXFAMenuHander->CanRedo(hWidget))
    460     menuFlag |= FXFA_MEMU_REDO;
    461   if (pXFAMenuHander->CanPaste(hWidget))
    462     menuFlag |= FXFA_MEMU_PASTE;
    463   if (pXFAMenuHander->CanCopy(hWidget))
    464     menuFlag |= FXFA_MEMU_COPY;
    465   if (pXFAMenuHander->CanCut(hWidget))
    466     menuFlag |= FXFA_MEMU_CUT;
    467   if (pXFAMenuHander->CanSelectAll(hWidget))
    468     menuFlag |= FXFA_MEMU_SELECTALL;
    469 
    470   CPDFDoc_Environment* pEnv = m_pSDKDoc->GetEnv();
    471   if (pEnv == NULL)
    472     return FALSE;
    473 
    474   return pEnv->FFI_PopupMenu(pPage, hWidget, menuFlag, ptPopup, NULL);
    475 }
    476 
    477 void CPDFXFA_Document::PageViewEvent(IXFA_PageView* pPageView,
    478                                      FX_DWORD dwFlags) {
    479 }
    480 
    481 void CPDFXFA_Document::WidgetEvent(IXFA_Widget* hWidget,
    482                                    CXFA_WidgetAcc* pWidgetData,
    483                                    FX_DWORD dwEvent,
    484                                    void* pParam,
    485                                    void* pAdditional) {
    486   if (m_iDocType != DOCTYPE_DYNAMIC_XFA || !hWidget)
    487     return;
    488 
    489   CPDFDoc_Environment* pEnv = m_pSDKDoc->GetEnv();
    490   if (!pEnv)
    491     return;
    492 
    493   IXFA_PageView* pPageView =
    494       m_pXFADocView->GetWidgetHandler()->GetPageView(hWidget);
    495   if (pPageView == NULL)
    496     return;
    497 
    498   CPDFXFA_Page* pXFAPage = GetPage(pPageView);
    499   if (pXFAPage == NULL)
    500     return;
    501 
    502   CPDFSDK_PageView* pSdkPageView = m_pSDKDoc->GetPageView(pXFAPage);
    503   if (dwEvent == XFA_WIDGETEVENT_PostAdded) {
    504     pSdkPageView->AddAnnot(hWidget);
    505 
    506   } else if (dwEvent == XFA_WIDGETEVENT_PreRemoved) {
    507     CPDFSDK_Annot* pAnnot = pSdkPageView->GetAnnotByXFAWidget(hWidget);
    508     if (pAnnot) {
    509       pSdkPageView->DeleteAnnot(pAnnot);
    510     }
    511   }
    512 }
    513 
    514 int32_t CPDFXFA_Document::CountPages(IXFA_Doc* hDoc) {
    515   if (hDoc == m_pXFADoc && m_pSDKDoc) {
    516     return GetPageCount();
    517   }
    518   return 0;
    519 }
    520 int32_t CPDFXFA_Document::GetCurrentPage(IXFA_Doc* hDoc) {
    521   if (hDoc != m_pXFADoc || !m_pSDKDoc)
    522     return -1;
    523   if (m_iDocType != DOCTYPE_DYNAMIC_XFA)
    524     return -1;
    525 
    526   CPDFDoc_Environment* pEnv = m_pSDKDoc->GetEnv();
    527   if (pEnv == NULL)
    528     return -1;
    529 
    530   return pEnv->FFI_GetCurrentPageIndex(this);
    531 }
    532 void CPDFXFA_Document::SetCurrentPage(IXFA_Doc* hDoc, int32_t iCurPage) {
    533   if (hDoc != m_pXFADoc || !m_pSDKDoc)
    534     return;
    535   if (m_iDocType != DOCTYPE_DYNAMIC_XFA)
    536     return;
    537 
    538   CPDFDoc_Environment* pEnv = m_pSDKDoc->GetEnv();
    539   if (pEnv == NULL)
    540     return;
    541 
    542   pEnv->FFI_SetCurrentPage(this, iCurPage);
    543 }
    544 FX_BOOL CPDFXFA_Document::IsCalculationsEnabled(IXFA_Doc* hDoc) {
    545   if (hDoc != m_pXFADoc || !m_pSDKDoc)
    546     return FALSE;
    547   if (m_pSDKDoc->GetInterForm())
    548     return m_pSDKDoc->GetInterForm()->IsXfaCalculateEnabled();
    549 
    550   return FALSE;
    551 }
    552 void CPDFXFA_Document::SetCalculationsEnabled(IXFA_Doc* hDoc,
    553                                               FX_BOOL bEnabled) {
    554   if (hDoc != m_pXFADoc || !m_pSDKDoc)
    555     return;
    556   if (m_pSDKDoc->GetInterForm())
    557     m_pSDKDoc->GetInterForm()->XfaEnableCalculate(bEnabled);
    558 }
    559 
    560 void CPDFXFA_Document::GetTitle(IXFA_Doc* hDoc, CFX_WideString& wsTitle) {
    561   if (hDoc != m_pXFADoc)
    562     return;
    563   if (m_pPDFDoc == NULL)
    564     return;
    565   CPDF_Dictionary* pInfoDict = m_pPDFDoc->GetInfo();
    566 
    567   if (pInfoDict == NULL)
    568     return;
    569 
    570   CFX_ByteString csTitle = pInfoDict->GetString("Title");
    571   wsTitle = wsTitle.FromLocal(csTitle.GetBuffer(csTitle.GetLength()));
    572   csTitle.ReleaseBuffer(csTitle.GetLength());
    573 }
    574 void CPDFXFA_Document::SetTitle(IXFA_Doc* hDoc,
    575                                 const CFX_WideStringC& wsTitle) {
    576   if (hDoc != m_pXFADoc)
    577     return;
    578   if (m_pPDFDoc == NULL)
    579     return;
    580   CPDF_Dictionary* pInfoDict = m_pPDFDoc->GetInfo();
    581 
    582   if (pInfoDict == NULL)
    583     return;
    584   pInfoDict->SetAt("Title", new CPDF_String(wsTitle));
    585 }
    586 void CPDFXFA_Document::ExportData(IXFA_Doc* hDoc,
    587                                   const CFX_WideStringC& wsFilePath,
    588                                   FX_BOOL bXDP) {
    589   if (hDoc != m_pXFADoc)
    590     return;
    591   if (m_iDocType != DOCTYPE_DYNAMIC_XFA && m_iDocType != DOCTYPE_STATIC_XFA)
    592     return;
    593   CPDFDoc_Environment* pEnv = m_pSDKDoc->GetEnv();
    594   if (pEnv == NULL)
    595     return;
    596   int fileType = bXDP ? FXFA_SAVEAS_XDP : FXFA_SAVEAS_XML;
    597   CFX_ByteString bs = CFX_WideString(wsFilePath).UTF16LE_Encode();
    598 
    599   if (wsFilePath.IsEmpty()) {
    600     if (!pEnv->GetFormFillInfo() ||
    601         pEnv->GetFormFillInfo()->m_pJsPlatform == NULL)
    602       return;
    603     CFX_WideString filepath = pEnv->JS_fieldBrowse();
    604     bs = filepath.UTF16LE_Encode();
    605   }
    606   int len = bs.GetLength() / sizeof(unsigned short);
    607   FPDF_FILEHANDLER* pFileHandler = pEnv->FFI_OpenFile(
    608       bXDP ? FXFA_SAVEAS_XDP : FXFA_SAVEAS_XML,
    609       (FPDF_WIDESTRING)bs.GetBuffer(len * sizeof(unsigned short)), "wb");
    610   bs.ReleaseBuffer(len * sizeof(unsigned short));
    611 
    612   if (pFileHandler == NULL)
    613     return;
    614 
    615   CFPDF_FileStream fileWrite(pFileHandler);
    616 
    617   IXFA_DocHandler* pXFADocHander = m_pApp->GetXFAApp()->GetDocHandler();
    618   CFX_ByteString content;
    619   if (fileType == FXFA_SAVEAS_XML) {
    620     content = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\r\n";
    621     fileWrite.WriteBlock((const FX_CHAR*)content, fileWrite.GetSize(),
    622                          content.GetLength());
    623     CFX_WideStringC data(L"data");
    624     if (pXFADocHander->SavePackage(m_pXFADocView->GetDoc(), data, &fileWrite)) {
    625       // TODO: Maybe report error.
    626     }
    627   } else if (fileType == FXFA_SAVEAS_XDP) {
    628     if (m_pPDFDoc == NULL)
    629       return;
    630     CPDF_Dictionary* pRoot = m_pPDFDoc->GetRoot();
    631     if (pRoot == NULL)
    632       return;
    633     CPDF_Dictionary* pAcroForm = pRoot->GetDict("AcroForm");
    634     if (NULL == pAcroForm)
    635       return;
    636     CPDF_Object* pXFA = pAcroForm->GetElement("XFA");
    637     if (pXFA == NULL)
    638       return;
    639     if (pXFA->GetType() != PDFOBJ_ARRAY)
    640       return;
    641     CPDF_Array* pArray = pXFA->GetArray();
    642     if (NULL == pArray)
    643       return;
    644     int size = pArray->GetCount();
    645     for (int i = 1; i < size; i += 2) {
    646       CPDF_Object* pPDFObj = pArray->GetElement(i);
    647       CPDF_Object* pPrePDFObj = pArray->GetElement(i - 1);
    648       if (pPrePDFObj->GetType() != PDFOBJ_STRING)
    649         continue;
    650       if (pPDFObj->GetType() != PDFOBJ_REFERENCE)
    651         continue;
    652       CPDF_Object* pDirectObj = pPDFObj->GetDirect();
    653       if (pDirectObj->GetType() != PDFOBJ_STREAM)
    654         continue;
    655       if (pPrePDFObj->GetString() == "form") {
    656         CFX_WideStringC form(L"form");
    657         pXFADocHander->SavePackage(m_pXFADocView->GetDoc(), form, &fileWrite);
    658       } else if (pPrePDFObj->GetString() == "datasets") {
    659         CFX_WideStringC datasets(L"datasets");
    660         pXFADocHander->SavePackage(m_pXFADocView->GetDoc(), datasets,
    661                                    &fileWrite);
    662       } else {
    663         if (i == size - 1) {
    664           CFX_WideString wPath = CFX_WideString::FromUTF16LE(
    665               (unsigned short*)(const FX_CHAR*)bs,
    666               bs.GetLength() / sizeof(unsigned short));
    667           CFX_ByteString bPath = wPath.UTF8Encode();
    668           CFX_ByteString szFormat =
    669               "\n<pdf href=\"%s\" xmlns=\"http://ns.adobe.com/xdp/pdf/\"/>";
    670           content.Format(szFormat, (char*)(const FX_CHAR*)bPath);
    671           fileWrite.WriteBlock((const FX_CHAR*)content, fileWrite.GetSize(),
    672                                content.GetLength());
    673         }
    674 
    675         CPDF_Stream* pStream = (CPDF_Stream*)pDirectObj;
    676         CPDF_StreamAcc* pAcc = new CPDF_StreamAcc;
    677         pAcc->LoadAllData(pStream);
    678         fileWrite.WriteBlock(pAcc->GetData(), fileWrite.GetSize(),
    679                              pAcc->GetSize());
    680         delete pAcc;
    681       }
    682     }
    683   }
    684   if (!fileWrite.Flush()) {
    685     // TODO: Report error.
    686   }
    687 }
    688 void CPDFXFA_Document::ImportData(IXFA_Doc* hDoc,
    689                                   const CFX_WideStringC& wsFilePath) {
    690   // TODO...
    691 }
    692 
    693 void CPDFXFA_Document::GotoURL(IXFA_Doc* hDoc,
    694                                const CFX_WideStringC& bsURL,
    695                                FX_BOOL bAppend) {
    696   if (hDoc != m_pXFADoc)
    697     return;
    698 
    699   if (m_iDocType != DOCTYPE_DYNAMIC_XFA)
    700     return;
    701 
    702   CPDFDoc_Environment* pEnv = m_pSDKDoc->GetEnv();
    703   if (pEnv == NULL)
    704     return;
    705 
    706   CFX_WideStringC str(bsURL.GetPtr());
    707 
    708   pEnv->FFI_GotoURL(this, str, bAppend);
    709 }
    710 
    711 FX_BOOL CPDFXFA_Document::IsValidationsEnabled(IXFA_Doc* hDoc) {
    712   if (hDoc != m_pXFADoc || !m_pSDKDoc)
    713     return FALSE;
    714   if (m_pSDKDoc->GetInterForm())
    715     return m_pSDKDoc->GetInterForm()->IsXfaValidationsEnabled();
    716 
    717   return TRUE;
    718 }
    719 void CPDFXFA_Document::SetValidationsEnabled(IXFA_Doc* hDoc, FX_BOOL bEnabled) {
    720   if (hDoc != m_pXFADoc || !m_pSDKDoc)
    721     return;
    722   if (m_pSDKDoc->GetInterForm())
    723     m_pSDKDoc->GetInterForm()->XfaSetValidationsEnabled(bEnabled);
    724 }
    725 void CPDFXFA_Document::SetFocusWidget(IXFA_Doc* hDoc, IXFA_Widget* hWidget) {
    726   if (hDoc != m_pXFADoc)
    727     return;
    728 
    729   if (NULL == hWidget) {
    730     m_pSDKDoc->SetFocusAnnot(NULL);
    731     return;
    732   }
    733 
    734   int pageViewCount = m_pSDKDoc->GetPageViewCount();
    735   for (int i = 0; i < pageViewCount; i++) {
    736     CPDFSDK_PageView* pPageView = m_pSDKDoc->GetPageView(i);
    737     if (pPageView == NULL)
    738       continue;
    739     CPDFSDK_Annot* pAnnot = pPageView->GetAnnotByXFAWidget(hWidget);
    740     if (pAnnot) {
    741       m_pSDKDoc->SetFocusAnnot(pAnnot);
    742       break;
    743     }
    744   }
    745 }
    746 void CPDFXFA_Document::Print(IXFA_Doc* hDoc,
    747                              int32_t nStartPage,
    748                              int32_t nEndPage,
    749                              FX_DWORD dwOptions) {
    750   if (hDoc != m_pXFADoc)
    751     return;
    752 
    753   CPDFDoc_Environment* pEnv = m_pSDKDoc->GetEnv();
    754   if (pEnv == NULL)
    755     return;
    756 
    757   if (!pEnv->GetFormFillInfo() ||
    758       pEnv->GetFormFillInfo()->m_pJsPlatform == NULL)
    759     return;
    760   if (pEnv->GetFormFillInfo()->m_pJsPlatform->Doc_print == NULL)
    761     return;
    762   pEnv->GetFormFillInfo()->m_pJsPlatform->Doc_print(
    763       pEnv->GetFormFillInfo()->m_pJsPlatform,
    764       dwOptions & XFA_PRINTOPT_ShowDialog, nStartPage, nEndPage,
    765       dwOptions & XFA_PRINTOPT_CanCancel, dwOptions & XFA_PRINTOPT_ShrinkPage,
    766       dwOptions & XFA_PRINTOPT_AsImage, dwOptions & XFA_PRINTOPT_ReverseOrder,
    767       dwOptions & XFA_PRINTOPT_PrintAnnot);
    768 }
    769 
    770 void CPDFXFA_Document::GetURL(IXFA_Doc* hDoc, CFX_WideString& wsDocURL) {
    771   if (hDoc != m_pXFADoc)
    772     return;
    773 
    774   CPDFDoc_Environment* pEnv = m_pSDKDoc->GetEnv();
    775   if (pEnv == NULL)
    776     return;
    777 
    778   pEnv->FFI_GetURL(this, wsDocURL);
    779 }
    780 
    781 FX_ARGB CPDFXFA_Document::GetHighlightColor(IXFA_Doc* hDoc) {
    782   if (hDoc != m_pXFADoc)
    783     return 0;
    784   if (m_pSDKDoc) {
    785     if (CPDFSDK_InterForm* pInterForm = m_pSDKDoc->GetInterForm()) {
    786       FX_COLORREF color = pInterForm->GetHighlightColor(FPDF_FORMFIELD_XFA);
    787       uint8_t alpha = pInterForm->GetHighlightAlpha();
    788       FX_ARGB argb = ArgbEncode((int)alpha, color);
    789       return argb;
    790     }
    791   }
    792   return 0;
    793 }
    794 
    795 void CPDFXFA_Document::AddDoRecord(IXFA_Widget* hWidget) {
    796   CPDFDoc_Environment* pEnv = m_pSDKDoc->GetEnv();
    797   if (pEnv == NULL)
    798     return;
    799   return;
    800   // pEnv->FFI_AddDoRecord(this, hWidget);
    801 }
    802 
    803 FX_BOOL CPDFXFA_Document::_NotifySubmit(FX_BOOL bPrevOrPost) {
    804   if (bPrevOrPost)
    805     return _OnBeforeNotifySumbit();
    806   else
    807     _OnAfterNotifySumbit();
    808   return TRUE;
    809 }
    810 
    811 FX_BOOL CPDFXFA_Document::_OnBeforeNotifySumbit() {
    812 #ifdef PDF_ENABLE_XFA
    813   if (m_iDocType != DOCTYPE_DYNAMIC_XFA && m_iDocType != DOCTYPE_STATIC_XFA)
    814     return TRUE;
    815   if (m_pXFADocView == NULL)
    816     return TRUE;
    817   IXFA_WidgetHandler* pWidgetHandler = m_pXFADocView->GetWidgetHandler();
    818   if (pWidgetHandler == NULL)
    819     return TRUE;
    820   IXFA_WidgetAccIterator* pWidgetAccIterator =
    821       m_pXFADocView->CreateWidgetAccIterator();
    822   if (pWidgetAccIterator) {
    823     CXFA_EventParam Param;
    824     Param.m_eType = XFA_EVENT_PreSubmit;
    825     CXFA_WidgetAcc* pWidgetAcc = pWidgetAccIterator->MoveToNext();
    826     while (pWidgetAcc) {
    827       pWidgetHandler->ProcessEvent(pWidgetAcc, &Param);
    828       pWidgetAcc = pWidgetAccIterator->MoveToNext();
    829     }
    830     pWidgetAccIterator->Release();
    831   }
    832   pWidgetAccIterator = m_pXFADocView->CreateWidgetAccIterator();
    833   if (pWidgetAccIterator) {
    834     CXFA_WidgetAcc* pWidgetAcc = pWidgetAccIterator->MoveToNext();
    835     pWidgetAcc = pWidgetAccIterator->MoveToNext();
    836     while (pWidgetAcc) {
    837       int fRet = pWidgetAcc->ProcessValidate(-1);
    838       if (fRet == XFA_EVENTERROR_Error) {
    839         CPDFDoc_Environment* pEnv = m_pSDKDoc->GetEnv();
    840         if (pEnv == NULL)
    841           return FALSE;
    842         CFX_WideString ws;
    843         ws.FromLocal(IDS_XFA_Validate_Input);
    844         CFX_ByteString bs = ws.UTF16LE_Encode();
    845         int len = bs.GetLength() / sizeof(unsigned short);
    846         pEnv->FFI_Alert(
    847             (FPDF_WIDESTRING)bs.GetBuffer(len * sizeof(unsigned short)),
    848             (FPDF_WIDESTRING)L"", 0, 1);
    849         bs.ReleaseBuffer(len * sizeof(unsigned short));
    850         pWidgetAccIterator->Release();
    851         return FALSE;
    852       }
    853       pWidgetAcc = pWidgetAccIterator->MoveToNext();
    854     }
    855     pWidgetAccIterator->Release();
    856     m_pXFADocView->UpdateDocView();
    857   }
    858 #endif
    859   return TRUE;
    860 }
    861 void CPDFXFA_Document::_OnAfterNotifySumbit() {
    862   if (m_iDocType != DOCTYPE_DYNAMIC_XFA && m_iDocType != DOCTYPE_STATIC_XFA)
    863     return;
    864   if (m_pXFADocView == NULL)
    865     return;
    866   IXFA_WidgetHandler* pWidgetHandler = m_pXFADocView->GetWidgetHandler();
    867   if (pWidgetHandler == NULL)
    868     return;
    869   IXFA_WidgetAccIterator* pWidgetAccIterator =
    870       m_pXFADocView->CreateWidgetAccIterator();
    871   if (pWidgetAccIterator == NULL)
    872     return;
    873   CXFA_EventParam Param;
    874   Param.m_eType = XFA_EVENT_PostSubmit;
    875 
    876   CXFA_WidgetAcc* pWidgetAcc = pWidgetAccIterator->MoveToNext();
    877   while (pWidgetAcc) {
    878     pWidgetHandler->ProcessEvent(pWidgetAcc, &Param);
    879     pWidgetAcc = pWidgetAccIterator->MoveToNext();
    880   }
    881   pWidgetAccIterator->Release();
    882   m_pXFADocView->UpdateDocView();
    883 }
    884 
    885 FX_BOOL CPDFXFA_Document::SubmitData(IXFA_Doc* hDoc, CXFA_Submit submit) {
    886   if (!_NotifySubmit(TRUE))
    887     return FALSE;
    888   if (NULL == m_pXFADocView)
    889     return FALSE;
    890   m_pXFADocView->UpdateDocView();
    891 
    892   FX_BOOL ret = _SubmitData(hDoc, submit);
    893   _NotifySubmit(FALSE);
    894   return ret;
    895 }
    896 
    897 IFX_FileRead* CPDFXFA_Document::OpenLinkedFile(IXFA_Doc* hDoc,
    898                                                const CFX_WideString& wsLink) {
    899   CPDFDoc_Environment* pEnv = m_pSDKDoc->GetEnv();
    900   if (pEnv == NULL)
    901     return FALSE;
    902   CFX_ByteString bs = wsLink.UTF16LE_Encode();
    903   int len = bs.GetLength() / sizeof(unsigned short);
    904   FPDF_FILEHANDLER* pFileHandler = pEnv->FFI_OpenFile(
    905       0, (FPDF_WIDESTRING)bs.GetBuffer(len * sizeof(unsigned short)), "rb");
    906   bs.ReleaseBuffer(len * sizeof(unsigned short));
    907 
    908   if (pFileHandler == NULL)
    909     return NULL;
    910   return new CFPDF_FileStream(pFileHandler);
    911 }
    912 FX_BOOL CPDFXFA_Document::_ExportSubmitFile(FPDF_FILEHANDLER* pFileHandler,
    913                                             int fileType,
    914                                             FPDF_DWORD encodeType,
    915                                             FPDF_DWORD flag) {
    916   if (NULL == m_pXFADocView)
    917     return FALSE;
    918   IXFA_DocHandler* pDocHandler = m_pApp->GetXFAApp()->GetDocHandler();
    919   CFX_ByteString content;
    920 
    921   CPDFDoc_Environment* pEnv = m_pSDKDoc->GetEnv();
    922   if (pEnv == NULL)
    923     return FALSE;
    924 
    925   CFPDF_FileStream fileStream(pFileHandler);
    926 
    927   if (fileType == FXFA_SAVEAS_XML) {
    928     CFX_WideString ws;
    929     ws.FromLocal("data");
    930     CFX_ByteString content = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\r\n";
    931     fileStream.WriteBlock((const FX_CHAR*)content, 0, content.GetLength());
    932     pDocHandler->SavePackage(m_pXFADoc, ws, &fileStream);
    933   } else if (fileType == FXFA_SAVEAS_XDP) {
    934     if (flag == 0)
    935       flag = FXFA_CONFIG | FXFA_TEMPLATE | FXFA_LOCALESET | FXFA_DATASETS |
    936              FXFA_XMPMETA | FXFA_XFDF | FXFA_FORM;
    937     if (m_pPDFDoc == NULL) {
    938       fileStream.Flush();
    939       return FALSE;
    940     }
    941     CPDF_Dictionary* pRoot = m_pPDFDoc->GetRoot();
    942     if (pRoot == NULL) {
    943       fileStream.Flush();
    944       return FALSE;
    945     }
    946     CPDF_Dictionary* pAcroForm = pRoot->GetDict("AcroForm");
    947     if (NULL == pAcroForm) {
    948       fileStream.Flush();
    949       return FALSE;
    950     }
    951     CPDF_Object* pXFA = pAcroForm->GetElement("XFA");
    952     if (pXFA == NULL) {
    953       fileStream.Flush();
    954       return FALSE;
    955     }
    956     if (pXFA->GetType() != PDFOBJ_ARRAY) {
    957       fileStream.Flush();
    958       return FALSE;
    959     }
    960     CPDF_Array* pArray = pXFA->GetArray();
    961     if (NULL == pArray) {
    962       fileStream.Flush();
    963       return FALSE;
    964     }
    965     int size = pArray->GetCount();
    966     for (int i = 1; i < size; i += 2) {
    967       CPDF_Object* pPDFObj = pArray->GetElement(i);
    968       CPDF_Object* pPrePDFObj = pArray->GetElement(i - 1);
    969       if (pPrePDFObj->GetType() != PDFOBJ_STRING)
    970         continue;
    971       if (pPDFObj->GetType() != PDFOBJ_REFERENCE)
    972         continue;
    973       CPDF_Object* pDirectObj = pPDFObj->GetDirect();
    974       if (pDirectObj->GetType() != PDFOBJ_STREAM)
    975         continue;
    976       if (pPrePDFObj->GetString() == "config" && !(flag & FXFA_CONFIG))
    977         continue;
    978       if (pPrePDFObj->GetString() == "template" && !(flag & FXFA_TEMPLATE))
    979         continue;
    980       if (pPrePDFObj->GetString() == "localeSet" && !(flag & FXFA_LOCALESET))
    981         continue;
    982       if (pPrePDFObj->GetString() == "datasets" && !(flag & FXFA_DATASETS))
    983         continue;
    984       if (pPrePDFObj->GetString() == "xmpmeta" && !(flag & FXFA_XMPMETA))
    985         continue;
    986       if (pPrePDFObj->GetString() == "xfdf" && !(flag & FXFA_XFDF))
    987         continue;
    988       if (pPrePDFObj->GetString() == "form" && !(flag & FXFA_FORM))
    989         continue;
    990       if (pPrePDFObj->GetString() == "form") {
    991         CFX_WideString ws;
    992         ws.FromLocal("form");
    993         pDocHandler->SavePackage(m_pXFADoc, ws, &fileStream);
    994       } else if (pPrePDFObj->GetString() == "datasets") {
    995         CFX_WideString ws;
    996         ws.FromLocal("datasets");
    997         pDocHandler->SavePackage(m_pXFADoc, ws, &fileStream);
    998       } else {
    999         // PDF,creator.
   1000         // TODO:
   1001       }
   1002     }
   1003   }
   1004   return TRUE;
   1005 }
   1006 
   1007 void CPDFXFA_Document::_ClearChangeMark() {
   1008   if (m_pSDKDoc)
   1009     m_pSDKDoc->ClearChangeMark();
   1010 }
   1011 
   1012 void CPDFXFA_Document::_ToXFAContentFlags(CFX_WideString csSrcContent,
   1013                                           FPDF_DWORD& flag) {
   1014   if (csSrcContent.Find(L" config ", 0) != -1)
   1015     flag |= FXFA_CONFIG;
   1016   if (csSrcContent.Find(L" template ", 0) != -1)
   1017     flag |= FXFA_TEMPLATE;
   1018   if (csSrcContent.Find(L" localeSet ", 0) != -1)
   1019     flag |= FXFA_LOCALESET;
   1020   if (csSrcContent.Find(L" datasets ", 0) != -1)
   1021     flag |= FXFA_DATASETS;
   1022   if (csSrcContent.Find(L" xmpmeta ", 0) != -1)
   1023     flag |= FXFA_XMPMETA;
   1024   if (csSrcContent.Find(L" xfdf ", 0) != -1)
   1025     flag |= FXFA_XFDF;
   1026   if (csSrcContent.Find(L" form ", 0) != -1)
   1027     flag |= FXFA_FORM;
   1028   if (flag == 0)
   1029     flag = FXFA_CONFIG | FXFA_TEMPLATE | FXFA_LOCALESET | FXFA_DATASETS |
   1030            FXFA_XMPMETA | FXFA_XFDF | FXFA_FORM;
   1031 }
   1032 FX_BOOL CPDFXFA_Document::_MailToInfo(CFX_WideString& csURL,
   1033                                       CFX_WideString& csToAddress,
   1034                                       CFX_WideString& csCCAddress,
   1035                                       CFX_WideString& csBCCAddress,
   1036                                       CFX_WideString& csSubject,
   1037                                       CFX_WideString& csMsg) {
   1038   CFX_WideString srcURL = csURL;
   1039   srcURL.TrimLeft();
   1040   if (0 != srcURL.Left(7).CompareNoCase(L"mailto:"))
   1041     return FALSE;
   1042   int pos = srcURL.Find(L'?', 0);
   1043   CFX_WideString tmp;
   1044   if (pos == -1) {
   1045     pos = srcURL.Find(L'@', 0);
   1046     if (pos == -1)
   1047       return FALSE;
   1048     else {
   1049       tmp = srcURL.Right(csURL.GetLength() - 7);
   1050       tmp.TrimLeft();
   1051       tmp.TrimRight();
   1052     }
   1053   } else {
   1054     tmp = srcURL.Left(pos);
   1055     tmp = tmp.Right(tmp.GetLength() - 7);
   1056     tmp.TrimLeft();
   1057     tmp.TrimRight();
   1058   }
   1059 
   1060   csToAddress = tmp;
   1061 
   1062   srcURL = srcURL.Right(srcURL.GetLength() - (pos + 1));
   1063   while (!srcURL.IsEmpty()) {
   1064     srcURL.TrimLeft();
   1065     srcURL.TrimRight();
   1066     pos = srcURL.Find(L'&', 0);
   1067     if (pos == -1)
   1068       tmp = srcURL;
   1069     else
   1070       tmp = srcURL.Left(pos);
   1071 
   1072     tmp.TrimLeft();
   1073     tmp.TrimRight();
   1074     if (tmp.GetLength() >= 3 && 0 == tmp.Left(3).CompareNoCase(L"cc=")) {
   1075       tmp = tmp.Right(tmp.GetLength() - 3);
   1076       if (!csCCAddress.IsEmpty())
   1077         csCCAddress += L';';
   1078       csCCAddress += tmp;
   1079 
   1080     } else if (tmp.GetLength() >= 4 &&
   1081                0 == tmp.Left(4).CompareNoCase(L"bcc=")) {
   1082       tmp = tmp.Right(tmp.GetLength() - 4);
   1083       if (!csBCCAddress.IsEmpty())
   1084         csBCCAddress += L';';
   1085       csBCCAddress += tmp;
   1086     } else if (tmp.GetLength() >= 8 &&
   1087                0 == tmp.Left(8).CompareNoCase(L"subject=")) {
   1088       tmp = tmp.Right(tmp.GetLength() - 8);
   1089       csSubject += tmp;
   1090     } else if (tmp.GetLength() >= 5 &&
   1091                0 == tmp.Left(5).CompareNoCase(L"body=")) {
   1092       tmp = tmp.Right(tmp.GetLength() - 5);
   1093       csMsg += tmp;
   1094     }
   1095     if (pos == -1)
   1096       srcURL = L"";
   1097     else
   1098       srcURL = srcURL.Right(csURL.GetLength() - (pos + 1));
   1099   }
   1100   csToAddress.Replace(L",", L";");
   1101   csCCAddress.Replace(L",", L";");
   1102   csBCCAddress.Replace(L",", L";");
   1103   return TRUE;
   1104 }
   1105 
   1106 FX_BOOL CPDFXFA_Document::_SubmitData(IXFA_Doc* hDoc, CXFA_Submit submit) {
   1107 #ifdef PDF_ENABLE_XFA
   1108   CFX_WideStringC csURLC;
   1109   submit.GetSubmitTarget(csURLC);
   1110   CFX_WideString csURL = csURLC;
   1111   CPDFDoc_Environment* pEnv = m_pSDKDoc->GetEnv();
   1112   if (pEnv == NULL)
   1113     return FALSE;
   1114   if (csURL.IsEmpty()) {
   1115     CFX_WideString ws;
   1116     ws.FromLocal("Submit cancelled.");
   1117     CFX_ByteString bs = ws.UTF16LE_Encode();
   1118     int len = bs.GetLength() / sizeof(unsigned short);
   1119     pEnv->FFI_Alert((FPDF_WIDESTRING)bs.GetBuffer(len * sizeof(unsigned short)),
   1120                     (FPDF_WIDESTRING)L"", 0, 4);
   1121     bs.ReleaseBuffer(len * sizeof(unsigned short));
   1122     return FALSE;
   1123   }
   1124 
   1125   FPDF_BOOL bRet = TRUE;
   1126   FPDF_FILEHANDLER* pFileHandler = NULL;
   1127   int fileFlag = -1;
   1128 
   1129   if (submit.GetSubmitFormat() == XFA_ATTRIBUTEENUM_Xdp) {
   1130     CFX_WideStringC csContentC;
   1131     submit.GetSubmitXDPContent(csContentC);
   1132     CFX_WideString csContent;
   1133     csContent = csContentC.GetPtr();
   1134     csContent.TrimLeft();
   1135     csContent.TrimRight();
   1136     CFX_WideString space;
   1137     space.FromLocal(" ");
   1138     csContent = space + csContent + space;
   1139     FPDF_DWORD flag = 0;
   1140     if (submit.IsSubmitEmbedPDF())
   1141       flag |= FXFA_PDF;
   1142     _ToXFAContentFlags(csContent, flag);
   1143     pFileHandler = pEnv->FFI_OpenFile(FXFA_SAVEAS_XDP, NULL, "wb");
   1144     fileFlag = FXFA_SAVEAS_XDP;
   1145     _ExportSubmitFile(pFileHandler, FXFA_SAVEAS_XDP, 0, flag);
   1146   } else if (submit.GetSubmitFormat() == XFA_ATTRIBUTEENUM_Xml) {
   1147     pFileHandler = pEnv->FFI_OpenFile(FXFA_SAVEAS_XML, NULL, "wb");
   1148     fileFlag = FXFA_SAVEAS_XML;
   1149     _ExportSubmitFile(pFileHandler, FXFA_SAVEAS_XML, 0);
   1150   } else if (submit.GetSubmitFormat() == XFA_ATTRIBUTEENUM_Pdf) {
   1151     // csfilename = csDocName;
   1152   } else if (submit.GetSubmitFormat() == XFA_ATTRIBUTEENUM_Formdata) {
   1153     return FALSE;
   1154   } else if (submit.GetSubmitFormat() == XFA_ATTRIBUTEENUM_Urlencoded) {
   1155     pFileHandler = pEnv->FFI_OpenFile(FXFA_SAVEAS_XML, NULL, "wb");
   1156     fileFlag = FXFA_SAVEAS_XML;
   1157     _ExportSubmitFile(pFileHandler, FXFA_SAVEAS_XML, 0);
   1158   } else if (submit.GetSubmitFormat() == XFA_ATTRIBUTEENUM_Xfd) {
   1159     return FALSE;
   1160   } else {
   1161     return FALSE;
   1162   }
   1163   if (pFileHandler == NULL)
   1164     return FALSE;
   1165   if (0 == csURL.Left(7).CompareNoCase(L"mailto:")) {
   1166     CFX_WideString csToAddress;
   1167     CFX_WideString csCCAddress;
   1168     CFX_WideString csBCCAddress;
   1169     CFX_WideString csSubject;
   1170     CFX_WideString csMsg;
   1171 
   1172     bRet = _MailToInfo(csURL, csToAddress, csCCAddress, csBCCAddress, csSubject,
   1173                        csMsg);
   1174     if (FALSE == bRet)
   1175       return FALSE;
   1176 
   1177     CFX_ByteString bsTo = CFX_WideString(csToAddress).UTF16LE_Encode();
   1178     CFX_ByteString bsCC = CFX_WideString(csCCAddress).UTF16LE_Encode();
   1179     CFX_ByteString bsBcc = CFX_WideString(csBCCAddress).UTF16LE_Encode();
   1180     CFX_ByteString bsSubject = CFX_WideString(csSubject).UTF16LE_Encode();
   1181     CFX_ByteString bsMsg = CFX_WideString(csMsg).UTF16LE_Encode();
   1182 
   1183     FPDF_WIDESTRING pTo = (FPDF_WIDESTRING)bsTo.GetBuffer(bsTo.GetLength());
   1184     FPDF_WIDESTRING pCC = (FPDF_WIDESTRING)bsCC.GetBuffer(bsCC.GetLength());
   1185     FPDF_WIDESTRING pBcc = (FPDF_WIDESTRING)bsBcc.GetBuffer(bsBcc.GetLength());
   1186     FPDF_WIDESTRING pSubject =
   1187         (FPDF_WIDESTRING)bsSubject.GetBuffer(bsSubject.GetLength());
   1188     FPDF_WIDESTRING pMsg = (FPDF_WIDESTRING)bsMsg.GetBuffer(bsMsg.GetLength());
   1189 
   1190     pEnv->FFI_EmailTo(pFileHandler, pTo, pSubject, pCC, pBcc, pMsg);
   1191     bsTo.ReleaseBuffer();
   1192     bsCC.ReleaseBuffer();
   1193     bsBcc.ReleaseBuffer();
   1194     bsSubject.ReleaseBuffer();
   1195     bsMsg.ReleaseBuffer();
   1196   } else {
   1197     // httpftp
   1198     CFX_WideString ws;
   1199     CFX_ByteString bs = csURL.UTF16LE_Encode();
   1200     int len = bs.GetLength() / sizeof(unsigned short);
   1201     pEnv->FFI_UploadTo(
   1202         pFileHandler, fileFlag,
   1203         (FPDF_WIDESTRING)bs.GetBuffer(len * sizeof(unsigned short)));
   1204     bs.ReleaseBuffer(len * sizeof(unsigned short));
   1205   }
   1206 
   1207   return bRet;
   1208 #else
   1209   return TRUE;
   1210 #endif
   1211 }
   1212 
   1213 FX_BOOL CPDFXFA_Document::SetGlobalProperty(IXFA_Doc* hDoc,
   1214                                             const CFX_ByteStringC& szPropName,
   1215                                             FXJSE_HVALUE hValue) {
   1216   if (hDoc != m_pXFADoc)
   1217     return FALSE;
   1218 
   1219   if (m_pSDKDoc && m_pSDKDoc->GetEnv()->GetJSRuntime())
   1220     return m_pSDKDoc->GetEnv()->GetJSRuntime()->SetHValueByName(szPropName,
   1221                                                                 hValue);
   1222   return FALSE;
   1223 }
   1224 FX_BOOL CPDFXFA_Document::GetPDFScriptObject(IXFA_Doc* hDoc,
   1225                                              const CFX_ByteStringC& utf8Name,
   1226                                              FXJSE_HVALUE hValue) {
   1227   if (hDoc != m_pXFADoc)
   1228     return FALSE;
   1229 
   1230   if (!m_pSDKDoc || !m_pSDKDoc->GetEnv()->GetJSRuntime())
   1231     return FALSE;
   1232 
   1233   if (!m_pJSContext) {
   1234     m_pSDKDoc->GetEnv()->GetJSRuntime()->SetReaderDocument(m_pSDKDoc);
   1235     m_pJSContext = m_pSDKDoc->GetEnv()->GetJSRuntime()->NewContext();
   1236   }
   1237 
   1238   return _GetHValueByName(utf8Name, hValue,
   1239                           m_pSDKDoc->GetEnv()->GetJSRuntime());
   1240 }
   1241 FX_BOOL CPDFXFA_Document::GetGlobalProperty(IXFA_Doc* hDoc,
   1242                                             const CFX_ByteStringC& szPropName,
   1243                                             FXJSE_HVALUE hValue) {
   1244   if (hDoc != m_pXFADoc)
   1245     return FALSE;
   1246   if (!m_pSDKDoc || !m_pSDKDoc->GetEnv()->GetJSRuntime())
   1247     return FALSE;
   1248 
   1249   if (!m_pJSContext) {
   1250     m_pSDKDoc->GetEnv()->GetJSRuntime()->SetReaderDocument(m_pSDKDoc);
   1251     m_pJSContext = m_pSDKDoc->GetEnv()->GetJSRuntime()->NewContext();
   1252   }
   1253 
   1254   return _GetHValueByName(szPropName, hValue,
   1255                           m_pSDKDoc->GetEnv()->GetJSRuntime());
   1256 }
   1257 FX_BOOL CPDFXFA_Document::_GetHValueByName(const CFX_ByteStringC& utf8Name,
   1258                                            FXJSE_HVALUE hValue,
   1259                                            IJS_Runtime* runTime) {
   1260   return runTime->GetHValueByName(utf8Name, hValue);
   1261 }
   1262