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
31extern void SetLastError(int err);
32
33extern int GetLastError();
34#endif
35
36CPDFXFA_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
47CPDFXFA_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
72FX_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
121int 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
140CPDFXFA_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
167CPDFXFA_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
189void CPDFXFA_Document::RemovePage(CPDFXFA_Page* page) {
190  m_XFAPageList.SetAt(page->GetPageIndex(), NULL);
191}
192
193CPDFSDK_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
200void 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
208void CPDFXFA_Document::SetChangeMark(IXFA_Doc* hDoc) {
209  if (hDoc == m_pXFADoc && m_pSDKDoc) {
210    m_pSDKDoc->SetChangeMark();
211  }
212}
213
214FX_BOOL CPDFXFA_Document::GetChangeMark(IXFA_Doc* hDoc) {
215  if (hDoc == m_pXFADoc && m_pSDKDoc)
216    return m_pSDKDoc->GetChangeMark();
217  return FALSE;
218}
219
220void 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
245void 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
269void 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
305FX_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
439FX_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
477void CPDFXFA_Document::PageViewEvent(IXFA_PageView* pPageView,
478                                     FX_DWORD dwFlags) {
479}
480
481void 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
514int32_t CPDFXFA_Document::CountPages(IXFA_Doc* hDoc) {
515  if (hDoc == m_pXFADoc && m_pSDKDoc) {
516    return GetPageCount();
517  }
518  return 0;
519}
520int32_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}
532void 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}
544FX_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}
552void 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
560void 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}
574void 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}
586void 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}
688void CPDFXFA_Document::ImportData(IXFA_Doc* hDoc,
689                                  const CFX_WideStringC& wsFilePath) {
690  // TODO...
691}
692
693void 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
711FX_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}
719void 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}
725void 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}
746void 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
770void 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
781FX_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
795void 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
803FX_BOOL CPDFXFA_Document::_NotifySubmit(FX_BOOL bPrevOrPost) {
804  if (bPrevOrPost)
805    return _OnBeforeNotifySumbit();
806  else
807    _OnAfterNotifySumbit();
808  return TRUE;
809}
810
811FX_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}
861void 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
885FX_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
897IFX_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}
912FX_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
1007void CPDFXFA_Document::_ClearChangeMark() {
1008  if (m_pSDKDoc)
1009    m_pSDKDoc->ClearChangeMark();
1010}
1011
1012void 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}
1032FX_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
1106FX_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    // http��ftp
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
1213FX_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}
1224FX_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}
1241FX_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}
1257FX_BOOL CPDFXFA_Document::_GetHValueByName(const CFX_ByteStringC& utf8Name,
1258                                           FXJSE_HVALUE hValue,
1259                                           IJS_Runtime* runTime) {
1260  return runTime->GetHValueByName(utf8Name, hValue);
1261}
1262