XFA: Fix DOS newlines, final round.

TBR=tsepez@chromium.org

Review URL: https://codereview.chromium.org/1641963002 .
diff --git a/fpdfsdk/src/fpdfxfa/fpdfxfa_app.cpp b/fpdfsdk/src/fpdfxfa/fpdfxfa_app.cpp
index 853eb30..44e9c72 100644
--- a/fpdfsdk/src/fpdfxfa/fpdfxfa_app.cpp
+++ b/fpdfsdk/src/fpdfxfa/fpdfxfa_app.cpp
@@ -1,537 +1,537 @@
-// Copyright 2014 PDFium Authors. All rights reserved.

-// Use of this source code is governed by a BSD-style license that can be

-// found in the LICENSE file.

-

-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com

-

-#include "fpdfsdk/include/fsdk_define.h"

-#include "fpdfsdk/include/fsdk_mgr.h"

-#include "fpdfsdk/include/fpdfxfa/fpdfxfa_doc.h"

-#include "fpdfsdk/include/fpdfxfa/fpdfxfa_util.h"

-#include "fpdfsdk/include/javascript/IJavaScript.h"

-#include "fpdfsdk/include/fpdfxfa/fpdfxfa_app.h"

-#include "public/fpdf_formfill.h"

-

-CPDFXFA_App* CPDFXFA_App::g_pApp = NULL;

-

-CPDFXFA_App* CPDFXFA_App::GetInstance() {

-  if (!g_pApp) {

-    g_pApp = new CPDFXFA_App();

-  }

-  return g_pApp;

-}

-

-void CPDFXFA_App::ReleaseInstance() {

-  delete g_pApp;

-  g_pApp = NULL;

-}

-

-CPDFXFA_App::CPDFXFA_App()

-    : m_bJavaScriptInitialized(FALSE),

-      m_pXFAApp(NULL),

-      m_pFontMgr(NULL),

-      m_hJSERuntime(NULL),

-      m_csAppType(JS_STR_VIEWERTYPE_STANDARD) {

-  m_pEnvList.RemoveAll();

-}

-

-CPDFXFA_App::~CPDFXFA_App() {

-  delete m_pFontMgr;

-  m_pFontMgr = NULL;

-

-  delete m_pXFAApp;

-  m_pXFAApp = NULL;

-

-#ifdef PDF_ENABLE_XFA

-  FXJSE_Runtime_Release(m_hJSERuntime);

-  m_hJSERuntime = NULL;

-

-  FXJSE_Finalize();

-  BC_Library_Destory();

-#endif

-}

-

-FX_BOOL CPDFXFA_App::Initialize() {

-#ifdef PDF_ENABLE_XFA

-  BC_Library_Init();

-  FXJSE_Initialize();

-

-  m_hJSERuntime = FXJSE_Runtime_Create();

-  if (!m_hJSERuntime)

-    return FALSE;

-

-  m_pXFAApp = IXFA_App::Create(this);

-  if (!m_pXFAApp)

-    return FALSE;

-

-  m_pFontMgr = IXFA_FontMgr::CreateDefault();

-  if (!m_pFontMgr)

-    return FALSE;

-

-  m_pXFAApp->SetDefaultFontMgr(m_pFontMgr);

-#endif

-  return TRUE;

-}

-

-FX_BOOL CPDFXFA_App::AddFormFillEnv(CPDFDoc_Environment* pEnv) {

-  if (!pEnv)

-    return FALSE;

-

-  m_pEnvList.Add(pEnv);

-  return TRUE;

-}

-

-FX_BOOL CPDFXFA_App::RemoveFormFillEnv(CPDFDoc_Environment* pEnv) {

-  if (!pEnv)

-    return FALSE;

-

-  int nFind = m_pEnvList.Find(pEnv);

-  if (nFind != -1) {

-    m_pEnvList.RemoveAt(nFind);

-    return TRUE;

-  }

-

-  return FALSE;

-}

-

-void CPDFXFA_App::GetAppType(CFX_WideString& wsAppType) {

-  wsAppType = m_csAppType;

-}

-

-void CPDFXFA_App::GetAppName(CFX_WideString& wsName) {

-  CPDFDoc_Environment* pEnv = m_pEnvList.GetAt(0);

-  if (pEnv) {

-    wsName = pEnv->FFI_GetAppName();

-  }

-}

-

-void CPDFXFA_App::SetAppType(const CFX_WideStringC& wsAppType) {

-  m_csAppType = wsAppType;

-}

-

-void CPDFXFA_App::GetLanguage(CFX_WideString& wsLanguage) {

-  CPDFDoc_Environment* pEnv = m_pEnvList.GetAt(0);

-  if (pEnv) {

-    wsLanguage = pEnv->FFI_GetLanguage();

-  }

-}

-

-void CPDFXFA_App::GetPlatform(CFX_WideString& wsPlatform) {

-  CPDFDoc_Environment* pEnv = m_pEnvList.GetAt(0);

-  if (pEnv) {

-    wsPlatform = pEnv->FFI_GetPlatform();

-  }

-}

-

-void CPDFXFA_App::GetVariation(CFX_WideString& wsVariation) {

-  wsVariation = JS_STR_VIEWERVARIATION;

-}

-

-void CPDFXFA_App::GetVersion(CFX_WideString& wsVersion) {

-  wsVersion = JS_STR_VIEWERVERSION_XFA;

-}

-

-void CPDFXFA_App::Beep(FX_DWORD dwType) {

-  CPDFDoc_Environment* pEnv = m_pEnvList.GetAt(0);

-  if (pEnv) {

-    pEnv->JS_appBeep(dwType);

-  }

-}

-

-int32_t CPDFXFA_App::MsgBox(const CFX_WideStringC& wsMessage,

-                            const CFX_WideStringC& wsTitle,

-                            FX_DWORD dwIconType,

-                            FX_DWORD dwButtonType) {

-  CPDFDoc_Environment* pEnv = m_pEnvList.GetAt(0);

-  if (!pEnv)

-    return -1;

-

-  FX_DWORD iconType = 0;

-  int iButtonType = 0;

-  switch (dwIconType) {

-    case XFA_MBICON_Error:

-      iconType |= 0;

-      break;

-    case XFA_MBICON_Warning:

-      iconType |= 1;

-      break;

-    case XFA_MBICON_Question:

-      iconType |= 2;

-      break;

-    case XFA_MBICON_Status:

-      iconType |= 3;

-      break;

-  }

-  switch (dwButtonType) {

-    case XFA_MB_OK:

-      iButtonType |= 0;

-      break;

-    case XFA_MB_OKCancel:

-      iButtonType |= 1;

-      break;

-    case XFA_MB_YesNo:

-      iButtonType |= 2;

-      break;

-    case XFA_MB_YesNoCancel:

-      iButtonType |= 3;

-      break;

-  }

-  int32_t iRet = pEnv->JS_appAlert(wsMessage.GetPtr(), wsTitle.GetPtr(),

-                                   iButtonType, iconType);

-  switch (iRet) {

-    case 1:

-      return XFA_IDOK;

-    case 2:

-      return XFA_IDCancel;

-    case 3:

-      return XFA_IDNo;

-    case 4:

-      return XFA_IDYes;

-  }

-  return XFA_IDYes;

-}

-

-void CPDFXFA_App::Response(CFX_WideString& wsAnswer,

-                           const CFX_WideStringC& wsQuestion,

-                           const CFX_WideStringC& wsTitle,

-                           const CFX_WideStringC& wsDefaultAnswer,

-                           FX_BOOL bMark) {

-  CPDFDoc_Environment* pEnv = m_pEnvList.GetAt(0);

-  if (pEnv) {

-    int nLength = 2048;

-    char* pBuff = new char[nLength];

-    nLength = pEnv->JS_appResponse(wsQuestion.GetPtr(), wsTitle.GetPtr(),

-                                   wsDefaultAnswer.GetPtr(), NULL, bMark, pBuff,

-                                   nLength);

-    if (nLength > 0) {

-      nLength = nLength > 2046 ? 2046 : nLength;

-      pBuff[nLength] = 0;

-      pBuff[nLength + 1] = 0;

-      wsAnswer = CFX_WideString::FromUTF16LE(

-          reinterpret_cast<const unsigned short*>(pBuff),

-          nLength / sizeof(unsigned short));

-    }

-    delete[] pBuff;

-  }

-}

-

-int32_t CPDFXFA_App::GetCurDocumentInBatch() {

-  CPDFDoc_Environment* pEnv = m_pEnvList.GetAt(0);

-  if (pEnv) {

-    return pEnv->FFI_GetCurDocument();

-  }

-  return 0;

-}

-

-int32_t CPDFXFA_App::GetDocumentCountInBatch() {

-  CPDFDoc_Environment* pEnv = m_pEnvList.GetAt(0);

-  if (pEnv) {

-    return pEnv->FFI_GetDocumentCount();

-  }

-

-  return 0;

-}

-

-IFX_FileRead* CPDFXFA_App::DownloadURL(const CFX_WideStringC& wsURL) {

-  CPDFDoc_Environment* pEnv = m_pEnvList.GetAt(0);

-  if (pEnv) {

-    return pEnv->FFI_DownloadFromURL(wsURL.GetPtr());

-  }

-  return NULL;

-}

-

-FX_BOOL CPDFXFA_App::PostRequestURL(const CFX_WideStringC& wsURL,

-                                    const CFX_WideStringC& wsData,

-                                    const CFX_WideStringC& wsContentType,

-                                    const CFX_WideStringC& wsEncode,

-                                    const CFX_WideStringC& wsHeader,

-                                    CFX_WideString& wsResponse) {

-  CPDFDoc_Environment* pEnv = m_pEnvList.GetAt(0);

-  if (pEnv) {

-    wsResponse = pEnv->FFI_PostRequestURL(wsURL.GetPtr(), wsData.GetPtr(),

-                                          wsContentType.GetPtr(),

-                                          wsEncode.GetPtr(), wsHeader.GetPtr());

-    return TRUE;

-  }

-  return FALSE;

-}

-

-FX_BOOL CPDFXFA_App::PutRequestURL(const CFX_WideStringC& wsURL,

-                                   const CFX_WideStringC& wsData,

-                                   const CFX_WideStringC& wsEncode) {

-  CPDFDoc_Environment* pEnv = m_pEnvList.GetAt(0);

-  if (pEnv) {

-    return pEnv->FFI_PutRequestURL(wsURL.GetPtr(), wsData.GetPtr(),

-                                   wsEncode.GetPtr());

-  }

-  return FALSE;

-}

-

-void CPDFXFA_App::LoadString(int32_t iStringID, CFX_WideString& wsString) {

-  switch (iStringID) {

-    case XFA_IDS_ValidateFailed:

-      wsString = L"%s validate failed";

-      return;

-    case XFA_IDS_CalcOverride:

-      wsString = L"Calculate Override";

-      return;

-    case XFA_IDS_ModifyField:

-      wsString = L"Are you sure you want to modify this field?";

-      return;

-    case XFA_IDS_NotModifyField:

-      wsString = L"You are not allowed to modify this field.";

-      return;

-    case XFA_IDS_AppName:

-      wsString = L"Foxit";

-      return;

-    case XFA_IDS_ImageFilter:

-      wsString =

-          L"Image "

-          L"Files(*.bmp;*.jpg;*.png;*.gif;*.tif)|*.bmp;*.jpg;*.png;*.gif;*.tif|"

-          L"All Files(*.*)|*.*||";

-      return;

-    case XFA_IDS_UNKNOW_CATCHED:

-      wsString = L"unknown error is catched!";

-      return;

-    case XFA_IDS_Unable_TO_SET:

-      wsString = L"Unable to set ";

-      return;

-    case XFA_IDS_VALUE_EXCALMATORY:

-      wsString = L" value!";

-      return;

-    case XFA_IDS_INVALID_ENUM_VALUE:

-      wsString = L"Invalid enumerated value: ";

-      return;

-    case XFA_IDS_UNSUPPORT_METHOD:

-      wsString = L"unsupport %s method.";

-      return;

-    case XFA_IDS_UNSUPPORT_PROP:

-      wsString = L"unsupport %s property.";

-      return;

-    case XFA_IDS_INVAlID_PROP_SET:

-      wsString = L"Invalid property set operation;";

-      return;

-    case XFA_IDS_NOT_DEFAUL_VALUE:

-      wsString = L" doesn't have a default property";

-      return;

-    case XFA_IDS_UNABLE_SET_LANGUAGE:

-      wsString = L"Unable to set language value!";

-      return;

-    case XFA_IDS_UNABLE_SET_NUMPAGES:

-      wsString = L"Unable to set numPages value!";

-      return;

-    case XFA_IDS_UNABLE_SET_PLATFORM:

-      wsString = L"Unable to set platform value!";

-      return;

-    case XFA_IDS_UNABLE_SET_VALIDATIONENABLE:

-      wsString = L"Unable to set validationsEnabled value!";

-      return;

-    case XFA_IDS_UNABLE_SET_VARIATION:

-      wsString = L"Unable to set variation value!";

-      return;

-    case XFA_IDS_UNABLE_SET_VERSION:

-      wsString = L"Unable to set version value!";

-      return;

-    case XFA_IDS_UNABLE_SET_READY:

-      wsString = L"Unable to set ready value!";

-      return;

-    case XFA_IDS_NUMBER_OF_OCCUR:

-      wsString =

-          L"The element [%s] has violated its allowable number of occurrences";

-      return;

-    case XFA_IDS_UNABLE_SET_CLASS_NAME:

-      wsString = L"Unable to set className value!";

-      return;

-    case XFA_IDS_UNABLE_SET_LENGTH_VALUE:

-      wsString = L"Unable to set length value!";

-      return;

-    case XFA_IDS_UNSUPPORT_CHAR:

-      wsString = L"unsupported char '%c'";

-      return;

-    case XFA_IDS_BAD_SUFFIX:

-      wsString = L"bad suffix on number";

-      return;

-    case XFA_IDS_EXPECTED_IDENT:

-      wsString = L"expected identifier instead of '%s'";

-      return;

-    case XFA_IDS_EXPECTED_STRING:

-      wsString = L"expected '%s' instead of '%s'";

-      return;

-    case XFA_IDS_INVALIDATE_CHAR:

-      wsString = L"invalidate char '%c'";

-      return;

-    case XFA_IDS_REDEFINITION:

-      wsString = L"'%s' redefinition ";

-      return;

-    case XFA_IDS_INVALIDATE_TOKEN:

-      wsString = L"invalidate token '%s'";

-      return;

-    case XFA_IDS_INVALIDATE_EXPRESSION:

-      wsString = L"invalidate expression '%s'";

-      return;

-    case XFA_IDS_UNDEFINE_IDENTIFIER:

-      wsString = L"undefined identifier '%s'";

-      return;

-    case XFA_IDS_INVALIDATE_LEFTVALUE:

-      wsString = L"invalidate left-value '%s'";

-      return;

-    case XFA_IDS_COMPILER_ERROR:

-      wsString = L"compiler error";

-      return;

-    case XFA_IDS_CANNOT_MODIFY_VALUE:

-      wsString = L"can't modify the '%s' value";

-      return;

-    case XFA_IDS_ERROR_PARAMETERS:

-      wsString = L"function '%s' has not %d parameters";

-      return;

-    case XFA_IDS_EXPECT_ENDIF:

-      wsString = L"expected 'endif' instead of '%s'";

-      return;

-    case XFA_IDS_UNEXPECTED_EXPRESSION:

-      wsString = L"unexpected expression '%s'";

-      return;

-    case XFA_IDS_CONDITION_IS_NULL:

-      wsString = L"condition is null";

-      return;

-    case XFA_IDS_ILLEGALBREAK:

-      wsString = L"illegal break";

-      return;

-    case XFA_IDS_ILLEGALCONTINUE:

-      wsString = L"illegal continue";

-      return;

-    case XFA_IDS_EXPECTED_OPERATOR:

-      wsString = L"expected operator '%s' instead of '%s'";

-      return;

-    case XFA_IDS_DIVIDE_ZERO:

-      wsString = L"divide by zero";

-      return;

-    case XFA_IDS_CANNOT_COVERT_OBJECT:

-      wsString = L"%s.%s can not covert to object";

-      return;

-    case XFA_IDS_NOT_FOUND_CONTAINER:

-      wsString = L"can not found container '%s'";

-      return;

-    case XFA_IDS_NOT_FOUND_PROPERTY:

-      wsString = L"can not found property '%s'";

-      return;

-    case XFA_IDS_NOT_FOUND_METHOD:

-      wsString = L"can not found method '%s'";

-      return;

-    case XFA_IDS_NOT_FOUND_CONST:

-      wsString = L"can not found const '%s'";

-      return;

-    case XFA_IDS_NOT_ASSIGN_OBJECT:

-      wsString = L"can not direct assign value to object";

-      return;

-    case XFA_IDS_IVALIDATE_INSTRUCTION:

-      wsString = L"invalidate instruction";

-      return;

-    case XFA_IDS_EXPECT_NUMBER:

-      wsString = L"expected number instead of '%s'";

-      return;

-    case XFA_IDS_VALIDATE_OUT_ARRAY:

-      wsString = L"validate access index '%s' out of array";

-      return;

-    case XFA_IDS_CANNOT_ASSIGN_IDENT:

-      wsString = L"can not assign to %s";

-      return;

-    case XFA_IDS_NOT_FOUNT_FUNCTION:

-      wsString = L"can not found '%s' function";

-      return;

-    case XFA_IDS_NOT_ARRAY:

-      wsString = L"'%s' doesn't an array";

-      return;

-    case XFA_IDS_OUT_ARRAY:

-      wsString = L"out of range of '%s' array";

-      return;

-    case XFA_IDS_NOT_SUPPORT_CALC:

-      wsString = L"'%s' operator can not support array calculate";

-      return;

-    case XFA_IDS_ARGUMENT_NOT_ARRAY:

-      wsString = L"'%s' function's %d argument can not be array";

-      return;

-    case XFA_IDS_ARGUMENT_EXPECT_CONTAINER:

-      wsString = L"'%s' argument expected a container";

-      return;

-    case XFA_IDS_ACCESS_PROPERTY_IN_NOT_OBJECT:

-      wsString =

-          L"an attempt was made to reference property '%s' of a non-object in "

-          L"SOM expression %s";

-      return;

-    case XFA_IDS_FUNCTION_IS_BUILDIN:

-      wsString = L"function '%s' is buildin";

-      return;

-    case XFA_IDS_ERROR_MSG:

-      wsString = L"%s : %s";

-      return;

-    case XFA_IDS_INDEX_OUT_OF_BOUNDS:

-      wsString = L"Index value is out of bounds";

-      return;

-    case XFA_IDS_INCORRECT_NUMBER_OF_METHOD:

-      wsString = L"Incorrect number of parameters calling method '%s'";

-      return;

-    case XFA_IDS_ARGUMENT_MISMATCH:

-      wsString = L"Argument mismatch in property or function argument";

-      return;

-    case XFA_IDS_INVALID_ENUMERATE:

-      wsString = L"Invalid enumerated value: %s";

-      return;

-    case XFA_IDS_INVALID_APPEND:

-      wsString =

-          L"Invalid append operation: %s cannot have a child element of %s";

-      return;

-    case XFA_IDS_SOM_EXPECTED_LIST:

-      wsString =

-          L"SOM expression returned list when single result was expected";

-      return;

-    case XFA_IDS_NOT_HAVE_PROPERTY:

-      wsString = L"'%s' doesn't have property '%s'";

-      return;

-    case XFA_IDS_INVALID_NODE_TYPE:

-      wsString = L"Invalid node type : '%s'";

-      return;

-    case XFA_IDS_VIOLATE_BOUNDARY:

-      wsString =

-          L"The element [%s] has violated its allowable number of occurrences";

-      return;

-    case XFA_IDS_SERVER_DENY:

-      wsString = L"Server does not permit";

-      return;

-    case XFA_IDS_ValidateLimit:

-      wsString = FX_WSTRC(

-          L"Message limit exceeded. Remaining %d validation errors not "

-          L"reported.");

-      return;

-    case XFA_IDS_ValidateNullWarning:

-      wsString = FX_WSTRC(

-          L"%s cannot be left blank. To ignore validations for %s, click "

-          L"Ignore.");

-      return;

-    case XFA_IDS_ValidateNullError:

-      wsString = FX_WSTRC(L"%s cannot be left blank.");

-      return;

-    case XFA_IDS_ValidateWarning:

-      wsString = FX_WSTRC(

-          L"The value you entered for %s is invalid. To ignore validations for "

-          L"%s, click Ignore.");

-      return;

-    case XFA_IDS_ValidateError:

-      wsString = FX_WSTRC(L"The value you entered for %s is invalid.");

-      return;

-  }

-}

-

-FX_BOOL CPDFXFA_App::ShowFileDialog(const CFX_WideStringC& wsTitle,

-                                    const CFX_WideStringC& wsFilter,

-                                    CFX_WideStringArray& wsPathArr,

-                                    FX_BOOL bOpen) {

-  return FALSE;

-}

-

-IFWL_AdapterTimerMgr* CPDFXFA_App::GetTimerMgr() {

-  CXFA_FWLAdapterTimerMgr* pAdapter = NULL;

-  CPDFDoc_Environment* pEnv = m_pEnvList.GetAt(0);

-  if (pEnv)

-    pAdapter = new CXFA_FWLAdapterTimerMgr(pEnv);

-  return pAdapter;

-}

+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "fpdfsdk/include/fsdk_define.h"
+#include "fpdfsdk/include/fsdk_mgr.h"
+#include "fpdfsdk/include/fpdfxfa/fpdfxfa_doc.h"
+#include "fpdfsdk/include/fpdfxfa/fpdfxfa_util.h"
+#include "fpdfsdk/include/javascript/IJavaScript.h"
+#include "fpdfsdk/include/fpdfxfa/fpdfxfa_app.h"
+#include "public/fpdf_formfill.h"
+
+CPDFXFA_App* CPDFXFA_App::g_pApp = NULL;
+
+CPDFXFA_App* CPDFXFA_App::GetInstance() {
+  if (!g_pApp) {
+    g_pApp = new CPDFXFA_App();
+  }
+  return g_pApp;
+}
+
+void CPDFXFA_App::ReleaseInstance() {
+  delete g_pApp;
+  g_pApp = NULL;
+}
+
+CPDFXFA_App::CPDFXFA_App()
+    : m_bJavaScriptInitialized(FALSE),
+      m_pXFAApp(NULL),
+      m_pFontMgr(NULL),
+      m_hJSERuntime(NULL),
+      m_csAppType(JS_STR_VIEWERTYPE_STANDARD) {
+  m_pEnvList.RemoveAll();
+}
+
+CPDFXFA_App::~CPDFXFA_App() {
+  delete m_pFontMgr;
+  m_pFontMgr = NULL;
+
+  delete m_pXFAApp;
+  m_pXFAApp = NULL;
+
+#ifdef PDF_ENABLE_XFA
+  FXJSE_Runtime_Release(m_hJSERuntime);
+  m_hJSERuntime = NULL;
+
+  FXJSE_Finalize();
+  BC_Library_Destory();
+#endif
+}
+
+FX_BOOL CPDFXFA_App::Initialize() {
+#ifdef PDF_ENABLE_XFA
+  BC_Library_Init();
+  FXJSE_Initialize();
+
+  m_hJSERuntime = FXJSE_Runtime_Create();
+  if (!m_hJSERuntime)
+    return FALSE;
+
+  m_pXFAApp = IXFA_App::Create(this);
+  if (!m_pXFAApp)
+    return FALSE;
+
+  m_pFontMgr = IXFA_FontMgr::CreateDefault();
+  if (!m_pFontMgr)
+    return FALSE;
+
+  m_pXFAApp->SetDefaultFontMgr(m_pFontMgr);
+#endif
+  return TRUE;
+}
+
+FX_BOOL CPDFXFA_App::AddFormFillEnv(CPDFDoc_Environment* pEnv) {
+  if (!pEnv)
+    return FALSE;
+
+  m_pEnvList.Add(pEnv);
+  return TRUE;
+}
+
+FX_BOOL CPDFXFA_App::RemoveFormFillEnv(CPDFDoc_Environment* pEnv) {
+  if (!pEnv)
+    return FALSE;
+
+  int nFind = m_pEnvList.Find(pEnv);
+  if (nFind != -1) {
+    m_pEnvList.RemoveAt(nFind);
+    return TRUE;
+  }
+
+  return FALSE;
+}
+
+void CPDFXFA_App::GetAppType(CFX_WideString& wsAppType) {
+  wsAppType = m_csAppType;
+}
+
+void CPDFXFA_App::GetAppName(CFX_WideString& wsName) {
+  CPDFDoc_Environment* pEnv = m_pEnvList.GetAt(0);
+  if (pEnv) {
+    wsName = pEnv->FFI_GetAppName();
+  }
+}
+
+void CPDFXFA_App::SetAppType(const CFX_WideStringC& wsAppType) {
+  m_csAppType = wsAppType;
+}
+
+void CPDFXFA_App::GetLanguage(CFX_WideString& wsLanguage) {
+  CPDFDoc_Environment* pEnv = m_pEnvList.GetAt(0);
+  if (pEnv) {
+    wsLanguage = pEnv->FFI_GetLanguage();
+  }
+}
+
+void CPDFXFA_App::GetPlatform(CFX_WideString& wsPlatform) {
+  CPDFDoc_Environment* pEnv = m_pEnvList.GetAt(0);
+  if (pEnv) {
+    wsPlatform = pEnv->FFI_GetPlatform();
+  }
+}
+
+void CPDFXFA_App::GetVariation(CFX_WideString& wsVariation) {
+  wsVariation = JS_STR_VIEWERVARIATION;
+}
+
+void CPDFXFA_App::GetVersion(CFX_WideString& wsVersion) {
+  wsVersion = JS_STR_VIEWERVERSION_XFA;
+}
+
+void CPDFXFA_App::Beep(FX_DWORD dwType) {
+  CPDFDoc_Environment* pEnv = m_pEnvList.GetAt(0);
+  if (pEnv) {
+    pEnv->JS_appBeep(dwType);
+  }
+}
+
+int32_t CPDFXFA_App::MsgBox(const CFX_WideStringC& wsMessage,
+                            const CFX_WideStringC& wsTitle,
+                            FX_DWORD dwIconType,
+                            FX_DWORD dwButtonType) {
+  CPDFDoc_Environment* pEnv = m_pEnvList.GetAt(0);
+  if (!pEnv)
+    return -1;
+
+  FX_DWORD iconType = 0;
+  int iButtonType = 0;
+  switch (dwIconType) {
+    case XFA_MBICON_Error:
+      iconType |= 0;
+      break;
+    case XFA_MBICON_Warning:
+      iconType |= 1;
+      break;
+    case XFA_MBICON_Question:
+      iconType |= 2;
+      break;
+    case XFA_MBICON_Status:
+      iconType |= 3;
+      break;
+  }
+  switch (dwButtonType) {
+    case XFA_MB_OK:
+      iButtonType |= 0;
+      break;
+    case XFA_MB_OKCancel:
+      iButtonType |= 1;
+      break;
+    case XFA_MB_YesNo:
+      iButtonType |= 2;
+      break;
+    case XFA_MB_YesNoCancel:
+      iButtonType |= 3;
+      break;
+  }
+  int32_t iRet = pEnv->JS_appAlert(wsMessage.GetPtr(), wsTitle.GetPtr(),
+                                   iButtonType, iconType);
+  switch (iRet) {
+    case 1:
+      return XFA_IDOK;
+    case 2:
+      return XFA_IDCancel;
+    case 3:
+      return XFA_IDNo;
+    case 4:
+      return XFA_IDYes;
+  }
+  return XFA_IDYes;
+}
+
+void CPDFXFA_App::Response(CFX_WideString& wsAnswer,
+                           const CFX_WideStringC& wsQuestion,
+                           const CFX_WideStringC& wsTitle,
+                           const CFX_WideStringC& wsDefaultAnswer,
+                           FX_BOOL bMark) {
+  CPDFDoc_Environment* pEnv = m_pEnvList.GetAt(0);
+  if (pEnv) {
+    int nLength = 2048;
+    char* pBuff = new char[nLength];
+    nLength = pEnv->JS_appResponse(wsQuestion.GetPtr(), wsTitle.GetPtr(),
+                                   wsDefaultAnswer.GetPtr(), NULL, bMark, pBuff,
+                                   nLength);
+    if (nLength > 0) {
+      nLength = nLength > 2046 ? 2046 : nLength;
+      pBuff[nLength] = 0;
+      pBuff[nLength + 1] = 0;
+      wsAnswer = CFX_WideString::FromUTF16LE(
+          reinterpret_cast<const unsigned short*>(pBuff),
+          nLength / sizeof(unsigned short));
+    }
+    delete[] pBuff;
+  }
+}
+
+int32_t CPDFXFA_App::GetCurDocumentInBatch() {
+  CPDFDoc_Environment* pEnv = m_pEnvList.GetAt(0);
+  if (pEnv) {
+    return pEnv->FFI_GetCurDocument();
+  }
+  return 0;
+}
+
+int32_t CPDFXFA_App::GetDocumentCountInBatch() {
+  CPDFDoc_Environment* pEnv = m_pEnvList.GetAt(0);
+  if (pEnv) {
+    return pEnv->FFI_GetDocumentCount();
+  }
+
+  return 0;
+}
+
+IFX_FileRead* CPDFXFA_App::DownloadURL(const CFX_WideStringC& wsURL) {
+  CPDFDoc_Environment* pEnv = m_pEnvList.GetAt(0);
+  if (pEnv) {
+    return pEnv->FFI_DownloadFromURL(wsURL.GetPtr());
+  }
+  return NULL;
+}
+
+FX_BOOL CPDFXFA_App::PostRequestURL(const CFX_WideStringC& wsURL,
+                                    const CFX_WideStringC& wsData,
+                                    const CFX_WideStringC& wsContentType,
+                                    const CFX_WideStringC& wsEncode,
+                                    const CFX_WideStringC& wsHeader,
+                                    CFX_WideString& wsResponse) {
+  CPDFDoc_Environment* pEnv = m_pEnvList.GetAt(0);
+  if (pEnv) {
+    wsResponse = pEnv->FFI_PostRequestURL(wsURL.GetPtr(), wsData.GetPtr(),
+                                          wsContentType.GetPtr(),
+                                          wsEncode.GetPtr(), wsHeader.GetPtr());
+    return TRUE;
+  }
+  return FALSE;
+}
+
+FX_BOOL CPDFXFA_App::PutRequestURL(const CFX_WideStringC& wsURL,
+                                   const CFX_WideStringC& wsData,
+                                   const CFX_WideStringC& wsEncode) {
+  CPDFDoc_Environment* pEnv = m_pEnvList.GetAt(0);
+  if (pEnv) {
+    return pEnv->FFI_PutRequestURL(wsURL.GetPtr(), wsData.GetPtr(),
+                                   wsEncode.GetPtr());
+  }
+  return FALSE;
+}
+
+void CPDFXFA_App::LoadString(int32_t iStringID, CFX_WideString& wsString) {
+  switch (iStringID) {
+    case XFA_IDS_ValidateFailed:
+      wsString = L"%s validate failed";
+      return;
+    case XFA_IDS_CalcOverride:
+      wsString = L"Calculate Override";
+      return;
+    case XFA_IDS_ModifyField:
+      wsString = L"Are you sure you want to modify this field?";
+      return;
+    case XFA_IDS_NotModifyField:
+      wsString = L"You are not allowed to modify this field.";
+      return;
+    case XFA_IDS_AppName:
+      wsString = L"Foxit";
+      return;
+    case XFA_IDS_ImageFilter:
+      wsString =
+          L"Image "
+          L"Files(*.bmp;*.jpg;*.png;*.gif;*.tif)|*.bmp;*.jpg;*.png;*.gif;*.tif|"
+          L"All Files(*.*)|*.*||";
+      return;
+    case XFA_IDS_UNKNOW_CATCHED:
+      wsString = L"unknown error is catched!";
+      return;
+    case XFA_IDS_Unable_TO_SET:
+      wsString = L"Unable to set ";
+      return;
+    case XFA_IDS_VALUE_EXCALMATORY:
+      wsString = L" value!";
+      return;
+    case XFA_IDS_INVALID_ENUM_VALUE:
+      wsString = L"Invalid enumerated value: ";
+      return;
+    case XFA_IDS_UNSUPPORT_METHOD:
+      wsString = L"unsupport %s method.";
+      return;
+    case XFA_IDS_UNSUPPORT_PROP:
+      wsString = L"unsupport %s property.";
+      return;
+    case XFA_IDS_INVAlID_PROP_SET:
+      wsString = L"Invalid property set operation;";
+      return;
+    case XFA_IDS_NOT_DEFAUL_VALUE:
+      wsString = L" doesn't have a default property";
+      return;
+    case XFA_IDS_UNABLE_SET_LANGUAGE:
+      wsString = L"Unable to set language value!";
+      return;
+    case XFA_IDS_UNABLE_SET_NUMPAGES:
+      wsString = L"Unable to set numPages value!";
+      return;
+    case XFA_IDS_UNABLE_SET_PLATFORM:
+      wsString = L"Unable to set platform value!";
+      return;
+    case XFA_IDS_UNABLE_SET_VALIDATIONENABLE:
+      wsString = L"Unable to set validationsEnabled value!";
+      return;
+    case XFA_IDS_UNABLE_SET_VARIATION:
+      wsString = L"Unable to set variation value!";
+      return;
+    case XFA_IDS_UNABLE_SET_VERSION:
+      wsString = L"Unable to set version value!";
+      return;
+    case XFA_IDS_UNABLE_SET_READY:
+      wsString = L"Unable to set ready value!";
+      return;
+    case XFA_IDS_NUMBER_OF_OCCUR:
+      wsString =
+          L"The element [%s] has violated its allowable number of occurrences";
+      return;
+    case XFA_IDS_UNABLE_SET_CLASS_NAME:
+      wsString = L"Unable to set className value!";
+      return;
+    case XFA_IDS_UNABLE_SET_LENGTH_VALUE:
+      wsString = L"Unable to set length value!";
+      return;
+    case XFA_IDS_UNSUPPORT_CHAR:
+      wsString = L"unsupported char '%c'";
+      return;
+    case XFA_IDS_BAD_SUFFIX:
+      wsString = L"bad suffix on number";
+      return;
+    case XFA_IDS_EXPECTED_IDENT:
+      wsString = L"expected identifier instead of '%s'";
+      return;
+    case XFA_IDS_EXPECTED_STRING:
+      wsString = L"expected '%s' instead of '%s'";
+      return;
+    case XFA_IDS_INVALIDATE_CHAR:
+      wsString = L"invalidate char '%c'";
+      return;
+    case XFA_IDS_REDEFINITION:
+      wsString = L"'%s' redefinition ";
+      return;
+    case XFA_IDS_INVALIDATE_TOKEN:
+      wsString = L"invalidate token '%s'";
+      return;
+    case XFA_IDS_INVALIDATE_EXPRESSION:
+      wsString = L"invalidate expression '%s'";
+      return;
+    case XFA_IDS_UNDEFINE_IDENTIFIER:
+      wsString = L"undefined identifier '%s'";
+      return;
+    case XFA_IDS_INVALIDATE_LEFTVALUE:
+      wsString = L"invalidate left-value '%s'";
+      return;
+    case XFA_IDS_COMPILER_ERROR:
+      wsString = L"compiler error";
+      return;
+    case XFA_IDS_CANNOT_MODIFY_VALUE:
+      wsString = L"can't modify the '%s' value";
+      return;
+    case XFA_IDS_ERROR_PARAMETERS:
+      wsString = L"function '%s' has not %d parameters";
+      return;
+    case XFA_IDS_EXPECT_ENDIF:
+      wsString = L"expected 'endif' instead of '%s'";
+      return;
+    case XFA_IDS_UNEXPECTED_EXPRESSION:
+      wsString = L"unexpected expression '%s'";
+      return;
+    case XFA_IDS_CONDITION_IS_NULL:
+      wsString = L"condition is null";
+      return;
+    case XFA_IDS_ILLEGALBREAK:
+      wsString = L"illegal break";
+      return;
+    case XFA_IDS_ILLEGALCONTINUE:
+      wsString = L"illegal continue";
+      return;
+    case XFA_IDS_EXPECTED_OPERATOR:
+      wsString = L"expected operator '%s' instead of '%s'";
+      return;
+    case XFA_IDS_DIVIDE_ZERO:
+      wsString = L"divide by zero";
+      return;
+    case XFA_IDS_CANNOT_COVERT_OBJECT:
+      wsString = L"%s.%s can not covert to object";
+      return;
+    case XFA_IDS_NOT_FOUND_CONTAINER:
+      wsString = L"can not found container '%s'";
+      return;
+    case XFA_IDS_NOT_FOUND_PROPERTY:
+      wsString = L"can not found property '%s'";
+      return;
+    case XFA_IDS_NOT_FOUND_METHOD:
+      wsString = L"can not found method '%s'";
+      return;
+    case XFA_IDS_NOT_FOUND_CONST:
+      wsString = L"can not found const '%s'";
+      return;
+    case XFA_IDS_NOT_ASSIGN_OBJECT:
+      wsString = L"can not direct assign value to object";
+      return;
+    case XFA_IDS_IVALIDATE_INSTRUCTION:
+      wsString = L"invalidate instruction";
+      return;
+    case XFA_IDS_EXPECT_NUMBER:
+      wsString = L"expected number instead of '%s'";
+      return;
+    case XFA_IDS_VALIDATE_OUT_ARRAY:
+      wsString = L"validate access index '%s' out of array";
+      return;
+    case XFA_IDS_CANNOT_ASSIGN_IDENT:
+      wsString = L"can not assign to %s";
+      return;
+    case XFA_IDS_NOT_FOUNT_FUNCTION:
+      wsString = L"can not found '%s' function";
+      return;
+    case XFA_IDS_NOT_ARRAY:
+      wsString = L"'%s' doesn't an array";
+      return;
+    case XFA_IDS_OUT_ARRAY:
+      wsString = L"out of range of '%s' array";
+      return;
+    case XFA_IDS_NOT_SUPPORT_CALC:
+      wsString = L"'%s' operator can not support array calculate";
+      return;
+    case XFA_IDS_ARGUMENT_NOT_ARRAY:
+      wsString = L"'%s' function's %d argument can not be array";
+      return;
+    case XFA_IDS_ARGUMENT_EXPECT_CONTAINER:
+      wsString = L"'%s' argument expected a container";
+      return;
+    case XFA_IDS_ACCESS_PROPERTY_IN_NOT_OBJECT:
+      wsString =
+          L"an attempt was made to reference property '%s' of a non-object in "
+          L"SOM expression %s";
+      return;
+    case XFA_IDS_FUNCTION_IS_BUILDIN:
+      wsString = L"function '%s' is buildin";
+      return;
+    case XFA_IDS_ERROR_MSG:
+      wsString = L"%s : %s";
+      return;
+    case XFA_IDS_INDEX_OUT_OF_BOUNDS:
+      wsString = L"Index value is out of bounds";
+      return;
+    case XFA_IDS_INCORRECT_NUMBER_OF_METHOD:
+      wsString = L"Incorrect number of parameters calling method '%s'";
+      return;
+    case XFA_IDS_ARGUMENT_MISMATCH:
+      wsString = L"Argument mismatch in property or function argument";
+      return;
+    case XFA_IDS_INVALID_ENUMERATE:
+      wsString = L"Invalid enumerated value: %s";
+      return;
+    case XFA_IDS_INVALID_APPEND:
+      wsString =
+          L"Invalid append operation: %s cannot have a child element of %s";
+      return;
+    case XFA_IDS_SOM_EXPECTED_LIST:
+      wsString =
+          L"SOM expression returned list when single result was expected";
+      return;
+    case XFA_IDS_NOT_HAVE_PROPERTY:
+      wsString = L"'%s' doesn't have property '%s'";
+      return;
+    case XFA_IDS_INVALID_NODE_TYPE:
+      wsString = L"Invalid node type : '%s'";
+      return;
+    case XFA_IDS_VIOLATE_BOUNDARY:
+      wsString =
+          L"The element [%s] has violated its allowable number of occurrences";
+      return;
+    case XFA_IDS_SERVER_DENY:
+      wsString = L"Server does not permit";
+      return;
+    case XFA_IDS_ValidateLimit:
+      wsString = FX_WSTRC(
+          L"Message limit exceeded. Remaining %d validation errors not "
+          L"reported.");
+      return;
+    case XFA_IDS_ValidateNullWarning:
+      wsString = FX_WSTRC(
+          L"%s cannot be left blank. To ignore validations for %s, click "
+          L"Ignore.");
+      return;
+    case XFA_IDS_ValidateNullError:
+      wsString = FX_WSTRC(L"%s cannot be left blank.");
+      return;
+    case XFA_IDS_ValidateWarning:
+      wsString = FX_WSTRC(
+          L"The value you entered for %s is invalid. To ignore validations for "
+          L"%s, click Ignore.");
+      return;
+    case XFA_IDS_ValidateError:
+      wsString = FX_WSTRC(L"The value you entered for %s is invalid.");
+      return;
+  }
+}
+
+FX_BOOL CPDFXFA_App::ShowFileDialog(const CFX_WideStringC& wsTitle,
+                                    const CFX_WideStringC& wsFilter,
+                                    CFX_WideStringArray& wsPathArr,
+                                    FX_BOOL bOpen) {
+  return FALSE;
+}
+
+IFWL_AdapterTimerMgr* CPDFXFA_App::GetTimerMgr() {
+  CXFA_FWLAdapterTimerMgr* pAdapter = NULL;
+  CPDFDoc_Environment* pEnv = m_pEnvList.GetAt(0);
+  if (pEnv)
+    pAdapter = new CXFA_FWLAdapterTimerMgr(pEnv);
+  return pAdapter;
+}
diff --git a/fpdfsdk/src/fpdfxfa/fpdfxfa_doc.cpp b/fpdfsdk/src/fpdfxfa/fpdfxfa_doc.cpp
index 09c444e..254dc7d 100644
--- a/fpdfsdk/src/fpdfxfa/fpdfxfa_doc.cpp
+++ b/fpdfsdk/src/fpdfxfa/fpdfxfa_doc.cpp
@@ -1,1265 +1,1265 @@
-// Copyright 2014 PDFium Authors. All rights reserved.

-// Use of this source code is governed by a BSD-style license that can be

-// found in the LICENSE file.

-

-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com

-

-#include "fpdfsdk/include/fsdk_define.h"

-#include "fpdfsdk/include/fpdfxfa/fpdfxfa_doc.h"

-#include "fpdfsdk/include/fsdk_mgr.h"

-#include "fpdfsdk/include/fpdfxfa/fpdfxfa_app.h"

-#include "fpdfsdk/include/fpdfxfa/fpdfxfa_util.h"

-#include "fpdfsdk/include/fpdfxfa/fpdfxfa_page.h"

-#include "fpdfsdk/include/javascript/IJavaScript.h"

-#include "public/fpdf_formfill.h"

-

-#define IDS_XFA_Validate_Input                                          \

-  "At least one required field was empty. Please fill in the required " \

-  "fields\r\n(highlighted) before continuing."

-

-// submit

-#define FXFA_CONFIG 0x00000001

-#define FXFA_TEMPLATE 0x00000010

-#define FXFA_LOCALESET 0x00000100

-#define FXFA_DATASETS 0x00001000

-#define FXFA_XMPMETA 0x00010000

-#define FXFA_XFDF 0x00100000

-#define FXFA_FORM 0x01000000

-#define FXFA_PDF 0x10000000

-

-#ifndef _WIN32

-extern void SetLastError(int err);

-

-extern int GetLastError();

-#endif

-

-CPDFXFA_Document::CPDFXFA_Document(CPDF_Document* pPDFDoc,

-                                   CPDFXFA_App* pProvider)

-    : m_iDocType(DOCTYPE_PDF),

-      m_pPDFDoc(pPDFDoc),

-      m_pSDKDoc(nullptr),

-      m_pXFADoc(nullptr),

-      m_pXFADocView(nullptr),

-      m_pApp(pProvider),

-      m_pJSContext(nullptr) {

-}

-

-CPDFXFA_Document::~CPDFXFA_Document() {

-  if (m_pJSContext && m_pSDKDoc && m_pSDKDoc->GetEnv())

-    m_pSDKDoc->GetEnv()->GetJSRuntime()->ReleaseContext(m_pJSContext);

-

-  delete m_pSDKDoc;

-

-  if (m_pPDFDoc) {

-    CPDF_Parser* pParser = m_pPDFDoc->GetParser();

-    if (pParser)

-      delete pParser;

-    else

-      delete m_pPDFDoc;

-  }

-  if (m_pXFADoc) {

-    IXFA_App* pApp = m_pApp->GetXFAApp();

-    if (pApp) {

-      IXFA_DocHandler* pDocHandler = pApp->GetDocHandler();

-      if (pDocHandler) {

-        CloseXFADoc(pDocHandler);

-      }

-    }

-    delete m_pXFADoc;

-  }

-}

-

-FX_BOOL CPDFXFA_Document::LoadXFADoc() {

-  if (!m_pPDFDoc)

-    return FALSE;

-

-  m_XFAPageList.RemoveAll();

-

-  IXFA_App* pApp = m_pApp->GetXFAApp();

-  if (!pApp)

-    return FALSE;

-

-  m_pXFADoc = pApp->CreateDoc(this, m_pPDFDoc);

-  if (!m_pXFADoc) {

-    SetLastError(FPDF_ERR_XFALOAD);

-    return FALSE;

-  }

-

-  IXFA_DocHandler* pDocHandler = pApp->GetDocHandler();

-  if (!pDocHandler) {

-    SetLastError(FPDF_ERR_XFALOAD);

-    return FALSE;

-  }

-

-  pDocHandler->StartLoad(m_pXFADoc);

-  int iStatus = pDocHandler->DoLoad(m_pXFADoc, NULL);

-  if (iStatus != XFA_PARSESTATUS_Done) {

-    CloseXFADoc(pDocHandler);

-    SetLastError(FPDF_ERR_XFALOAD);

-    return FALSE;

-  }

-  pDocHandler->StopLoad(m_pXFADoc);

-  pDocHandler->SetJSERuntime(m_pXFADoc, m_pApp->GetJSERuntime());

-

-  if (pDocHandler->GetDocType(m_pXFADoc) == XFA_DOCTYPE_Dynamic)

-    m_iDocType = DOCTYPE_DYNAMIC_XFA;

-  else

-    m_iDocType = DOCTYPE_STATIC_XFA;

-

-  m_pXFADocView = pDocHandler->CreateDocView(m_pXFADoc, XFA_DOCVIEW_View);

-  if (m_pXFADocView->StartLayout() < 0) {

-    CloseXFADoc(pDocHandler);

-    SetLastError(FPDF_ERR_XFALAYOUT);

-    return FALSE;

-  }

-

-  m_pXFADocView->DoLayout(NULL);

-  m_pXFADocView->StopLayout();

-  return TRUE;

-}

-

-int CPDFXFA_Document::GetPageCount() {

-  if (!m_pPDFDoc && !m_pXFADoc)

-    return 0;

-

-  switch (m_iDocType) {

-    case DOCTYPE_PDF:

-    case DOCTYPE_STATIC_XFA:

-      if (m_pPDFDoc)

-        return m_pPDFDoc->GetPageCount();

-    case DOCTYPE_DYNAMIC_XFA:

-      if (m_pXFADoc)

-        return m_pXFADocView->CountPageViews();

-    default:

-      return 0;

-  }

-

-  return 0;

-}

-

-CPDFXFA_Page* CPDFXFA_Document::GetPage(int page_index) {

-  if (page_index < 0)

-    return nullptr;

-  CPDFXFA_Page* pPage = nullptr;

-  int nCount = m_XFAPageList.GetSize();

-  if (nCount > 0 && page_index < nCount) {

-    pPage = m_XFAPageList.GetAt(page_index);

-    if (pPage)

-      pPage->AddRef();

-  } else {

-    m_XFAPageList.SetSize(GetPageCount());

-  }

-  if (pPage)

-    return pPage;

-  pPage = new CPDFXFA_Page(this, page_index);

-  if (!pPage->LoadPage()) {

-    delete pPage;

-    return nullptr;

-  }

-  m_XFAPageList.SetAt(page_index, pPage);

-  return pPage;

-}

-

-CPDFXFA_Page* CPDFXFA_Document::GetPage(IXFA_PageView* pPage) {

-  if (!pPage)

-    return NULL;

-

-  if (!m_pXFADoc)

-    return NULL;

-

-  if (m_iDocType != DOCTYPE_DYNAMIC_XFA)

-    return NULL;

-

-  int nSize = m_XFAPageList.GetSize();

-  for (int i = 0; i < nSize; i++) {

-    CPDFXFA_Page* pTempPage = m_XFAPageList.GetAt(i);

-    if (!pTempPage)

-      continue;

-    if (pTempPage->GetXFAPageView() && pTempPage->GetXFAPageView() == pPage)

-      return pTempPage;

-  }

-

-  return NULL;

-}

-

-void CPDFXFA_Document::RemovePage(CPDFXFA_Page* page) {

-  m_XFAPageList.SetAt(page->GetPageIndex(), NULL);

-}

-

-CPDFSDK_Document* CPDFXFA_Document::GetSDKDocument(

-    CPDFDoc_Environment* pFormFillEnv) {

-  if (!m_pSDKDoc && pFormFillEnv)

-    m_pSDKDoc = new CPDFSDK_Document(this, pFormFillEnv);

-  return m_pSDKDoc;

-}

-

-void CPDFXFA_Document::FXRect2PDFRect(const CFX_RectF& fxRectF,

-                                      CPDF_Rect& pdfRect) {

-  pdfRect.left = fxRectF.left;

-  pdfRect.top = fxRectF.bottom();

-  pdfRect.right = fxRectF.right();

-  pdfRect.bottom = fxRectF.top;

-}

-

-void CPDFXFA_Document::SetChangeMark(IXFA_Doc* hDoc) {

-  if (hDoc == m_pXFADoc && m_pSDKDoc) {

-    m_pSDKDoc->SetChangeMark();

-  }

-}

-

-FX_BOOL CPDFXFA_Document::GetChangeMark(IXFA_Doc* hDoc) {

-  if (hDoc == m_pXFADoc && m_pSDKDoc)

-    return m_pSDKDoc->GetChangeMark();

-  return FALSE;

-}

-

-void CPDFXFA_Document::InvalidateRect(IXFA_PageView* pPageView,

-                                      const CFX_RectF& rt,

-                                      FX_DWORD dwFlags /* = 0 */) {

-  if (!m_pXFADoc || !m_pSDKDoc)

-    return;

-

-  if (m_iDocType != DOCTYPE_DYNAMIC_XFA)

-    return;

-

-  CPDF_Rect rcPage;

-  FXRect2PDFRect(rt, rcPage);

-

-  CPDFXFA_Page* pPage = GetPage(pPageView);

-

-  if (pPage == NULL)

-    return;

-

-  CPDFDoc_Environment* pEnv = m_pSDKDoc->GetEnv();

-  if (!pEnv)

-    return;

-

-  pEnv->FFI_Invalidate((FPDF_PAGE)pPage, rcPage.left, rcPage.bottom,

-                       rcPage.right, rcPage.top);

-}

-

-void CPDFXFA_Document::InvalidateRect(IXFA_Widget* hWidget,

-                                      FX_DWORD dwFlags /* = 0 */) {

-  if (!hWidget)

-    return;

-

-  if (!m_pXFADoc || !m_pSDKDoc || !m_pXFADocView)

-    return;

-

-  if (m_iDocType != DOCTYPE_DYNAMIC_XFA)

-    return;

-

-  IXFA_WidgetHandler* pWidgetHandler = m_pXFADocView->GetWidgetHandler();

-  if (!pWidgetHandler)

-    return;

-

-  IXFA_PageView* pPageView = pWidgetHandler->GetPageView(hWidget);

-  if (!pPageView)

-    return;

-

-  CFX_RectF rect;

-  pWidgetHandler->GetRect(hWidget, rect);

-  InvalidateRect(pPageView, rect, dwFlags);

-}

-

-void CPDFXFA_Document::DisplayCaret(IXFA_Widget* hWidget,

-                                    FX_BOOL bVisible,

-                                    const CFX_RectF* pRtAnchor) {

-  if (!hWidget || pRtAnchor == NULL)

-    return;

-

-  if (!m_pXFADoc || !m_pSDKDoc || !m_pXFADocView)

-    return;

-

-  if (m_iDocType != DOCTYPE_DYNAMIC_XFA)

-    return;

-

-  IXFA_WidgetHandler* pWidgetHandler = m_pXFADocView->GetWidgetHandler();

-  if (!pWidgetHandler)

-    return;

-

-  IXFA_PageView* pPageView = pWidgetHandler->GetPageView(hWidget);

-  if (!pPageView)

-    return;

-

-  CPDFXFA_Page* pPage = GetPage(pPageView);

-

-  if (pPage == NULL)

-    return;

-

-  CPDF_Rect rcCaret;

-  FXRect2PDFRect(*pRtAnchor, rcCaret);

-

-  CPDFDoc_Environment* pEnv = m_pSDKDoc->GetEnv();

-  if (!pEnv)

-    return;

-

-  pEnv->FFI_DisplayCaret((FPDF_PAGE)pPage, bVisible, rcCaret.left, rcCaret.top,

-                         rcCaret.right, rcCaret.bottom);

-}

-

-FX_BOOL CPDFXFA_Document::GetPopupPos(IXFA_Widget* hWidget,

-                                      FX_FLOAT fMinPopup,

-                                      FX_FLOAT fMaxPopup,

-                                      const CFX_RectF& rtAnchor,

-                                      CFX_RectF& rtPopup) {

-  if (NULL == hWidget) {

-    return FALSE;

-  }

-  IXFA_PageView* pXFAPageView =

-      m_pXFADocView->GetWidgetHandler()->GetPageView(hWidget);

-  if (NULL == pXFAPageView) {

-    return FALSE;

-  }

-  CPDFXFA_Page* pPage = GetPage(pXFAPageView);

-  if (pPage == NULL)

-    return FALSE;

-

-  CXFA_WidgetAcc* pWidgetAcc =

-      m_pXFADocView->GetWidgetHandler()->GetDataAcc(hWidget);

-

-  int nRotate = 0;

-#ifdef PDF_ENABLE_XFA

-  nRotate = pWidgetAcc->GetRotate();

-#endif

-

-  CPDFDoc_Environment* pEnv = m_pSDKDoc->GetEnv();

-  if (pEnv == NULL)

-    return FALSE;

-  FS_RECTF pageViewRect;

-  pEnv->FFI_GetPageViewRect(pPage, pageViewRect);

-

-  CPDF_Rect rcAnchor;

-

-  rcAnchor.left = rtAnchor.left;

-  rcAnchor.top = rtAnchor.bottom();

-  rcAnchor.right = rtAnchor.right();

-  rcAnchor.bottom = rtAnchor.top;

-

-  int t1, t2, t;

-  FX_DWORD dwPos;

-  FX_FLOAT fPoupHeight;

-  switch (nRotate) {

-    case 90: {

-      t1 = (int)(pageViewRect.right - rcAnchor.right);

-      t2 = (int)(rcAnchor.left - pageViewRect.left);

-      if (rcAnchor.bottom < pageViewRect.bottom) {

-        rtPopup.left += rcAnchor.bottom - pageViewRect.bottom;

-      }

-

-      break;

-    }

-

-    case 180: {

-      t2 = (int)(pageViewRect.top - rcAnchor.top);

-      t1 = (int)(rcAnchor.bottom - pageViewRect.bottom);

-      if (rcAnchor.left < pageViewRect.left) {

-        rtPopup.left += rcAnchor.left - pageViewRect.left;

-      }

-      break;

-    }

-    case 270: {

-      t1 = (int)(rcAnchor.left - pageViewRect.left);

-      t2 = (int)(pageViewRect.right - rcAnchor.right);

-

-      if (rcAnchor.top > pageViewRect.top) {

-        rtPopup.left -= rcAnchor.top - pageViewRect.top;

-      }

-      break;

-    }

-    case 0:

-    default: {

-      t1 = (int)(pageViewRect.top - rcAnchor.top);

-      t2 = (int)(rcAnchor.bottom - pageViewRect.bottom);

-      if (rcAnchor.right > pageViewRect.right) {

-        rtPopup.left -= rcAnchor.right - pageViewRect.right;

-      }

-      break;

-    }

-  }

-

-  if (t1 <= 0 && t2 <= 0) {

-    return FALSE;

-  }

-  if (t1 <= 0) {

-    t = t2;

-    dwPos = 1;

-  } else if (t2 <= 0) {

-    t = t1;

-    dwPos = 0;

-  } else if (t1 > t2) {

-    t = t1;

-    dwPos = 0;

-  } else {

-    t = t2;

-    dwPos = 1;

-  }

-  if (t < fMinPopup) {

-    fPoupHeight = fMinPopup;

-  } else if (t > fMaxPopup) {

-    fPoupHeight = fMaxPopup;

-  } else {

-    fPoupHeight = (FX_FLOAT)t;

-  }

-

-  switch (nRotate) {

-    case 0:

-    case 180: {

-      if (dwPos == 0) {

-        rtPopup.top = rtAnchor.height;

-        rtPopup.height = fPoupHeight;

-      } else {

-        rtPopup.top = -fPoupHeight;

-        rtPopup.height = fPoupHeight;

-      }

-      break;

-    }

-    case 90:

-    case 270: {

-      if (dwPos == 0) {

-        rtPopup.top = rtAnchor.width;

-        rtPopup.height = fPoupHeight;

-      } else {

-        rtPopup.top = -fPoupHeight;

-        rtPopup.height = fPoupHeight;

-      }

-      break;

-    }

-    default:

-      break;

-  }

-

-  return TRUE;

-}

-

-FX_BOOL CPDFXFA_Document::PopupMenu(IXFA_Widget* hWidget,

-                                    CFX_PointF ptPopup,

-                                    const CFX_RectF* pRectExclude) {

-  if (NULL == hWidget) {

-    return FALSE;

-  }

-  IXFA_PageView* pXFAPageView =

-      m_pXFADocView->GetWidgetHandler()->GetPageView(hWidget);

-  if (pXFAPageView == NULL)

-    return FALSE;

-  CPDFXFA_Page* pPage = GetPage(pXFAPageView);

-

-  if (pPage == NULL)

-    return FALSE;

-

-  int menuFlag = 0;

-

-  IXFA_MenuHandler* pXFAMenuHander = m_pApp->GetXFAApp()->GetMenuHandler();

-  if (pXFAMenuHander->CanUndo(hWidget))

-    menuFlag |= FXFA_MEMU_UNDO;

-  if (pXFAMenuHander->CanRedo(hWidget))

-    menuFlag |= FXFA_MEMU_REDO;

-  if (pXFAMenuHander->CanPaste(hWidget))

-    menuFlag |= FXFA_MEMU_PASTE;

-  if (pXFAMenuHander->CanCopy(hWidget))

-    menuFlag |= FXFA_MEMU_COPY;

-  if (pXFAMenuHander->CanCut(hWidget))

-    menuFlag |= FXFA_MEMU_CUT;

-  if (pXFAMenuHander->CanSelectAll(hWidget))

-    menuFlag |= FXFA_MEMU_SELECTALL;

-

-  CPDFDoc_Environment* pEnv = m_pSDKDoc->GetEnv();

-  if (pEnv == NULL)

-    return FALSE;

-

-  return pEnv->FFI_PopupMenu(pPage, hWidget, menuFlag, ptPopup, NULL);

-}

-

-void CPDFXFA_Document::PageViewEvent(IXFA_PageView* pPageView,

-                                     FX_DWORD dwFlags) {

-  if (!pPageView || (dwFlags != XFA_PAGEVIEWEVENT_PostAdded &&

-                     dwFlags != XFA_PAGEVIEWEVENT_PostRemoved)) {

-    return;

-  }

-  CPDFXFA_Page* pPage = nullptr;

-  if (dwFlags == XFA_PAGEVIEWEVENT_PostAdded) {

-    pPage = GetPage(pPageView->GetPageViewIndex());

-    if (pPage)

-      pPage->SetXFAPageView(pPageView);

-    return;

-  }

-  pPage = GetPage(pPageView);

-  if (!pPage)

-    return;

-  pPage->SetXFAPageView(nullptr);

-  m_pSDKDoc->GetPageView(pPage)->ClearFXAnnots();

-}

-

-void CPDFXFA_Document::WidgetEvent(IXFA_Widget* hWidget,

-                                   CXFA_WidgetAcc* pWidgetData,

-                                   FX_DWORD dwEvent,

-                                   void* pParam,

-                                   void* pAdditional) {

-  if (m_iDocType != DOCTYPE_DYNAMIC_XFA || !hWidget)

-    return;

-

-  CPDFDoc_Environment* pEnv = m_pSDKDoc->GetEnv();

-  if (!pEnv)

-    return;

-

-  IXFA_PageView* pPageView =

-      m_pXFADocView->GetWidgetHandler()->GetPageView(hWidget);

-  if (pPageView == NULL)

-    return;

-

-  CPDFXFA_Page* pXFAPage = GetPage(pPageView);

-  if (pXFAPage == NULL)

-    return;

-

-  CPDFSDK_PageView* pSdkPageView = m_pSDKDoc->GetPageView(pXFAPage);

-  if (dwEvent == XFA_WIDGETEVENT_PostAdded) {

-    pSdkPageView->AddAnnot(hWidget);

-

-  } else if (dwEvent == XFA_WIDGETEVENT_PreRemoved) {

-    CPDFSDK_Annot* pAnnot = pSdkPageView->GetAnnotByXFAWidget(hWidget);

-    if (pAnnot) {

-      pSdkPageView->DeleteAnnot(pAnnot);

-    }

-  }

-}

-

-int32_t CPDFXFA_Document::CountPages(IXFA_Doc* hDoc) {

-  if (hDoc == m_pXFADoc && m_pSDKDoc) {

-    return GetPageCount();

-  }

-  return 0;

-}

-int32_t CPDFXFA_Document::GetCurrentPage(IXFA_Doc* hDoc) {

-  if (hDoc != m_pXFADoc || !m_pSDKDoc)

-    return -1;

-  if (m_iDocType != DOCTYPE_DYNAMIC_XFA)

-    return -1;

-

-  CPDFDoc_Environment* pEnv = m_pSDKDoc->GetEnv();

-  if (pEnv == NULL)

-    return -1;

-

-  return pEnv->FFI_GetCurrentPageIndex(this);

-}

-void CPDFXFA_Document::SetCurrentPage(IXFA_Doc* hDoc, int32_t iCurPage) {

-  if (hDoc != m_pXFADoc || !m_pSDKDoc)

-    return;

-  if (m_iDocType != DOCTYPE_DYNAMIC_XFA)

-    return;

-

-  CPDFDoc_Environment* pEnv = m_pSDKDoc->GetEnv();

-  if (pEnv == NULL)

-    return;

-

-  pEnv->FFI_SetCurrentPage(this, iCurPage);

-}

-FX_BOOL CPDFXFA_Document::IsCalculationsEnabled(IXFA_Doc* hDoc) {

-  if (hDoc != m_pXFADoc || !m_pSDKDoc)

-    return FALSE;

-  if (m_pSDKDoc->GetInterForm())

-    return m_pSDKDoc->GetInterForm()->IsXfaCalculateEnabled();

-

-  return FALSE;

-}

-void CPDFXFA_Document::SetCalculationsEnabled(IXFA_Doc* hDoc,

-                                              FX_BOOL bEnabled) {

-  if (hDoc != m_pXFADoc || !m_pSDKDoc)

-    return;

-  if (m_pSDKDoc->GetInterForm())

-    m_pSDKDoc->GetInterForm()->XfaEnableCalculate(bEnabled);

-}

-

-void CPDFXFA_Document::GetTitle(IXFA_Doc* hDoc, CFX_WideString& wsTitle) {

-  if (hDoc != m_pXFADoc)

-    return;

-  if (m_pPDFDoc == NULL)

-    return;

-  CPDF_Dictionary* pInfoDict = m_pPDFDoc->GetInfo();

-

-  if (pInfoDict == NULL)

-    return;

-

-  CFX_ByteString csTitle = pInfoDict->GetString("Title");

-  wsTitle = wsTitle.FromLocal(csTitle.GetBuffer(csTitle.GetLength()));

-  csTitle.ReleaseBuffer(csTitle.GetLength());

-}

-void CPDFXFA_Document::SetTitle(IXFA_Doc* hDoc,

-                                const CFX_WideStringC& wsTitle) {

-  if (hDoc != m_pXFADoc)

-    return;

-  if (m_pPDFDoc == NULL)

-    return;

-  CPDF_Dictionary* pInfoDict = m_pPDFDoc->GetInfo();

-

-  if (pInfoDict == NULL)

-    return;

-  pInfoDict->SetAt("Title", new CPDF_String(wsTitle));

-}

-void CPDFXFA_Document::ExportData(IXFA_Doc* hDoc,

-                                  const CFX_WideStringC& wsFilePath,

-                                  FX_BOOL bXDP) {

-  if (hDoc != m_pXFADoc)

-    return;

-  if (m_iDocType != DOCTYPE_DYNAMIC_XFA && m_iDocType != DOCTYPE_STATIC_XFA)

-    return;

-  CPDFDoc_Environment* pEnv = m_pSDKDoc->GetEnv();

-  if (pEnv == NULL)

-    return;

-  int fileType = bXDP ? FXFA_SAVEAS_XDP : FXFA_SAVEAS_XML;

-  CFX_ByteString bs = CFX_WideString(wsFilePath).UTF16LE_Encode();

-

-  if (wsFilePath.IsEmpty()) {

-    if (!pEnv->GetFormFillInfo() ||

-        pEnv->GetFormFillInfo()->m_pJsPlatform == NULL)

-      return;

-    CFX_WideString filepath = pEnv->JS_fieldBrowse();

-    bs = filepath.UTF16LE_Encode();

-  }

-  int len = bs.GetLength() / sizeof(unsigned short);

-  FPDF_FILEHANDLER* pFileHandler = pEnv->FFI_OpenFile(

-      bXDP ? FXFA_SAVEAS_XDP : FXFA_SAVEAS_XML,

-      (FPDF_WIDESTRING)bs.GetBuffer(len * sizeof(unsigned short)), "wb");

-  bs.ReleaseBuffer(len * sizeof(unsigned short));

-

-  if (pFileHandler == NULL)

-    return;

-

-  CFPDF_FileStream fileWrite(pFileHandler);

-

-  IXFA_DocHandler* pXFADocHander = m_pApp->GetXFAApp()->GetDocHandler();

-  CFX_ByteString content;

-  if (fileType == FXFA_SAVEAS_XML) {

-    content = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\r\n";

-    fileWrite.WriteBlock((const FX_CHAR*)content, fileWrite.GetSize(),

-                         content.GetLength());

-    CFX_WideStringC data(L"data");

-    if (pXFADocHander->SavePackage(m_pXFADocView->GetDoc(), data, &fileWrite)) {

-      // TODO: Maybe report error.

-    }

-  } else if (fileType == FXFA_SAVEAS_XDP) {

-    if (m_pPDFDoc == NULL)

-      return;

-    CPDF_Dictionary* pRoot = m_pPDFDoc->GetRoot();

-    if (pRoot == NULL)

-      return;

-    CPDF_Dictionary* pAcroForm = pRoot->GetDict("AcroForm");

-    if (NULL == pAcroForm)

-      return;

-    CPDF_Object* pXFA = pAcroForm->GetElement("XFA");

-    if (pXFA == NULL)

-      return;

-    if (!pXFA->IsArray())

-      return;

-    CPDF_Array* pArray = pXFA->GetArray();

-    if (NULL == pArray)

-      return;

-    int size = pArray->GetCount();

-    for (int i = 1; i < size; i += 2) {

-      CPDF_Object* pPDFObj = pArray->GetElement(i);

-      CPDF_Object* pPrePDFObj = pArray->GetElement(i - 1);

-      if (!pPrePDFObj->IsString())

-        continue;

-      if (!pPDFObj->IsReference())

-        continue;

-      CPDF_Object* pDirectObj = pPDFObj->GetDirect();

-      if (!pDirectObj->IsStream())

-        continue;

-      if (pPrePDFObj->GetString() == "form") {

-        CFX_WideStringC form(L"form");

-        pXFADocHander->SavePackage(m_pXFADocView->GetDoc(), form, &fileWrite);

-      } else if (pPrePDFObj->GetString() == "datasets") {

-        CFX_WideStringC datasets(L"datasets");

-        pXFADocHander->SavePackage(m_pXFADocView->GetDoc(), datasets,

-                                   &fileWrite);

-      } else {

-        if (i == size - 1) {

-          CFX_WideString wPath = CFX_WideString::FromUTF16LE(

-              (unsigned short*)(const FX_CHAR*)bs,

-              bs.GetLength() / sizeof(unsigned short));

-          CFX_ByteString bPath = wPath.UTF8Encode();

-          CFX_ByteString szFormat =

-              "\n<pdf href=\"%s\" xmlns=\"http://ns.adobe.com/xdp/pdf/\"/>";

-          content.Format(szFormat, (char*)(const FX_CHAR*)bPath);

-          fileWrite.WriteBlock((const FX_CHAR*)content, fileWrite.GetSize(),

-                               content.GetLength());

-        }

-

-        CPDF_Stream* pStream = (CPDF_Stream*)pDirectObj;

-        CPDF_StreamAcc* pAcc = new CPDF_StreamAcc;

-        pAcc->LoadAllData(pStream);

-        fileWrite.WriteBlock(pAcc->GetData(), fileWrite.GetSize(),

-                             pAcc->GetSize());

-        delete pAcc;

-      }

-    }

-  }

-  if (!fileWrite.Flush()) {

-    // TODO: Report error.

-  }

-}

-void CPDFXFA_Document::ImportData(IXFA_Doc* hDoc,

-                                  const CFX_WideStringC& wsFilePath) {

-  // TODO...

-}

-

-void CPDFXFA_Document::GotoURL(IXFA_Doc* hDoc,

-                               const CFX_WideStringC& bsURL,

-                               FX_BOOL bAppend) {

-  if (hDoc != m_pXFADoc)

-    return;

-

-  if (m_iDocType != DOCTYPE_DYNAMIC_XFA)

-    return;

-

-  CPDFDoc_Environment* pEnv = m_pSDKDoc->GetEnv();

-  if (pEnv == NULL)

-    return;

-

-  CFX_WideStringC str(bsURL.GetPtr());

-

-  pEnv->FFI_GotoURL(this, str, bAppend);

-}

-

-FX_BOOL CPDFXFA_Document::IsValidationsEnabled(IXFA_Doc* hDoc) {

-  if (hDoc != m_pXFADoc || !m_pSDKDoc)

-    return FALSE;

-  if (m_pSDKDoc->GetInterForm())

-    return m_pSDKDoc->GetInterForm()->IsXfaValidationsEnabled();

-

-  return TRUE;

-}

-void CPDFXFA_Document::SetValidationsEnabled(IXFA_Doc* hDoc, FX_BOOL bEnabled) {

-  if (hDoc != m_pXFADoc || !m_pSDKDoc)

-    return;

-  if (m_pSDKDoc->GetInterForm())

-    m_pSDKDoc->GetInterForm()->XfaSetValidationsEnabled(bEnabled);

-}

-void CPDFXFA_Document::SetFocusWidget(IXFA_Doc* hDoc, IXFA_Widget* hWidget) {

-  if (hDoc != m_pXFADoc)

-    return;

-

-  if (NULL == hWidget) {

-    m_pSDKDoc->SetFocusAnnot(NULL);

-    return;

-  }

-

-  int pageViewCount = m_pSDKDoc->GetPageViewCount();

-  for (int i = 0; i < pageViewCount; i++) {

-    CPDFSDK_PageView* pPageView = m_pSDKDoc->GetPageView(i);

-    if (pPageView == NULL)

-      continue;

-    CPDFSDK_Annot* pAnnot = pPageView->GetAnnotByXFAWidget(hWidget);

-    if (pAnnot) {

-      m_pSDKDoc->SetFocusAnnot(pAnnot);

-      break;

-    }

-  }

-}

-void CPDFXFA_Document::Print(IXFA_Doc* hDoc,

-                             int32_t nStartPage,

-                             int32_t nEndPage,

-                             FX_DWORD dwOptions) {

-  if (hDoc != m_pXFADoc)

-    return;

-

-  CPDFDoc_Environment* pEnv = m_pSDKDoc->GetEnv();

-  if (pEnv == NULL)

-    return;

-

-  if (!pEnv->GetFormFillInfo() ||

-      pEnv->GetFormFillInfo()->m_pJsPlatform == NULL)

-    return;

-  if (pEnv->GetFormFillInfo()->m_pJsPlatform->Doc_print == NULL)

-    return;

-  pEnv->GetFormFillInfo()->m_pJsPlatform->Doc_print(

-      pEnv->GetFormFillInfo()->m_pJsPlatform,

-      dwOptions & XFA_PRINTOPT_ShowDialog, nStartPage, nEndPage,

-      dwOptions & XFA_PRINTOPT_CanCancel, dwOptions & XFA_PRINTOPT_ShrinkPage,

-      dwOptions & XFA_PRINTOPT_AsImage, dwOptions & XFA_PRINTOPT_ReverseOrder,

-      dwOptions & XFA_PRINTOPT_PrintAnnot);

-}

-

-void CPDFXFA_Document::GetURL(IXFA_Doc* hDoc, CFX_WideString& wsDocURL) {

-  if (hDoc != m_pXFADoc)

-    return;

-

-  CPDFDoc_Environment* pEnv = m_pSDKDoc->GetEnv();

-  if (pEnv == NULL)

-    return;

-

-  pEnv->FFI_GetURL(this, wsDocURL);

-}

-

-FX_ARGB CPDFXFA_Document::GetHighlightColor(IXFA_Doc* hDoc) {

-  if (hDoc != m_pXFADoc)

-    return 0;

-  if (m_pSDKDoc) {

-    if (CPDFSDK_InterForm* pInterForm = m_pSDKDoc->GetInterForm()) {

-      FX_COLORREF color = pInterForm->GetHighlightColor(FPDF_FORMFIELD_XFA);

-      uint8_t alpha = pInterForm->GetHighlightAlpha();

-      FX_ARGB argb = ArgbEncode((int)alpha, color);

-      return argb;

-    }

-  }

-  return 0;

-}

-

-FX_BOOL CPDFXFA_Document::_NotifySubmit(FX_BOOL bPrevOrPost) {

-  if (bPrevOrPost)

-    return _OnBeforeNotifySumbit();

-

-  _OnAfterNotifySumbit();

-  return TRUE;

-}

-

-FX_BOOL CPDFXFA_Document::_OnBeforeNotifySumbit() {

-#ifdef PDF_ENABLE_XFA

-  if (m_iDocType != DOCTYPE_DYNAMIC_XFA && m_iDocType != DOCTYPE_STATIC_XFA)

-    return TRUE;

-  if (m_pXFADocView == NULL)

-    return TRUE;

-  IXFA_WidgetHandler* pWidgetHandler = m_pXFADocView->GetWidgetHandler();

-  if (pWidgetHandler == NULL)

-    return TRUE;

-  IXFA_WidgetAccIterator* pWidgetAccIterator =

-      m_pXFADocView->CreateWidgetAccIterator();

-  if (pWidgetAccIterator) {

-    CXFA_EventParam Param;

-    Param.m_eType = XFA_EVENT_PreSubmit;

-    CXFA_WidgetAcc* pWidgetAcc = pWidgetAccIterator->MoveToNext();

-    while (pWidgetAcc) {

-      pWidgetHandler->ProcessEvent(pWidgetAcc, &Param);

-      pWidgetAcc = pWidgetAccIterator->MoveToNext();

-    }

-    pWidgetAccIterator->Release();

-  }

-  pWidgetAccIterator = m_pXFADocView->CreateWidgetAccIterator();

-  if (pWidgetAccIterator) {

-    CXFA_WidgetAcc* pWidgetAcc = pWidgetAccIterator->MoveToNext();

-    pWidgetAcc = pWidgetAccIterator->MoveToNext();

-    while (pWidgetAcc) {

-      int fRet = pWidgetAcc->ProcessValidate(-1);

-      if (fRet == XFA_EVENTERROR_Error) {

-        CPDFDoc_Environment* pEnv = m_pSDKDoc->GetEnv();

-        if (pEnv == NULL)

-          return FALSE;

-        CFX_WideString ws;

-        ws.FromLocal(IDS_XFA_Validate_Input);

-        CFX_ByteString bs = ws.UTF16LE_Encode();

-        int len = bs.GetLength() / sizeof(unsigned short);

-        pEnv->FFI_Alert(

-            (FPDF_WIDESTRING)bs.GetBuffer(len * sizeof(unsigned short)),

-            (FPDF_WIDESTRING)L"", 0, 1);

-        bs.ReleaseBuffer(len * sizeof(unsigned short));

-        pWidgetAccIterator->Release();

-        return FALSE;

-      }

-      pWidgetAcc = pWidgetAccIterator->MoveToNext();

-    }

-    pWidgetAccIterator->Release();

-    m_pXFADocView->UpdateDocView();

-  }

-#endif

-  return TRUE;

-}

-void CPDFXFA_Document::_OnAfterNotifySumbit() {

-  if (m_iDocType != DOCTYPE_DYNAMIC_XFA && m_iDocType != DOCTYPE_STATIC_XFA)

-    return;

-  if (m_pXFADocView == NULL)

-    return;

-  IXFA_WidgetHandler* pWidgetHandler = m_pXFADocView->GetWidgetHandler();

-  if (pWidgetHandler == NULL)

-    return;

-  IXFA_WidgetAccIterator* pWidgetAccIterator =

-      m_pXFADocView->CreateWidgetAccIterator();

-  if (pWidgetAccIterator == NULL)

-    return;

-  CXFA_EventParam Param;

-  Param.m_eType = XFA_EVENT_PostSubmit;

-

-  CXFA_WidgetAcc* pWidgetAcc = pWidgetAccIterator->MoveToNext();

-  while (pWidgetAcc) {

-    pWidgetHandler->ProcessEvent(pWidgetAcc, &Param);

-    pWidgetAcc = pWidgetAccIterator->MoveToNext();

-  }

-  pWidgetAccIterator->Release();

-  m_pXFADocView->UpdateDocView();

-}

-

-FX_BOOL CPDFXFA_Document::SubmitData(IXFA_Doc* hDoc, CXFA_Submit submit) {

-  if (!_NotifySubmit(TRUE))

-    return FALSE;

-  if (NULL == m_pXFADocView)

-    return FALSE;

-  m_pXFADocView->UpdateDocView();

-

-  FX_BOOL ret = _SubmitData(hDoc, submit);

-  _NotifySubmit(FALSE);

-  return ret;

-}

-

-IFX_FileRead* CPDFXFA_Document::OpenLinkedFile(IXFA_Doc* hDoc,

-                                               const CFX_WideString& wsLink) {

-  CPDFDoc_Environment* pEnv = m_pSDKDoc->GetEnv();

-  if (pEnv == NULL)

-    return FALSE;

-  CFX_ByteString bs = wsLink.UTF16LE_Encode();

-  int len = bs.GetLength() / sizeof(unsigned short);

-  FPDF_FILEHANDLER* pFileHandler = pEnv->FFI_OpenFile(

-      0, (FPDF_WIDESTRING)bs.GetBuffer(len * sizeof(unsigned short)), "rb");

-  bs.ReleaseBuffer(len * sizeof(unsigned short));

-

-  if (pFileHandler == NULL)

-    return NULL;

-  return new CFPDF_FileStream(pFileHandler);

-}

-FX_BOOL CPDFXFA_Document::_ExportSubmitFile(FPDF_FILEHANDLER* pFileHandler,

-                                            int fileType,

-                                            FPDF_DWORD encodeType,

-                                            FPDF_DWORD flag) {

-  if (NULL == m_pXFADocView)

-    return FALSE;

-  IXFA_DocHandler* pDocHandler = m_pApp->GetXFAApp()->GetDocHandler();

-  CFX_ByteString content;

-

-  CPDFDoc_Environment* pEnv = m_pSDKDoc->GetEnv();

-  if (pEnv == NULL)

-    return FALSE;

-

-  CFPDF_FileStream fileStream(pFileHandler);

-

-  if (fileType == FXFA_SAVEAS_XML) {

-    CFX_WideString ws;

-    ws.FromLocal("data");

-    CFX_ByteString content = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\r\n";

-    fileStream.WriteBlock((const FX_CHAR*)content, 0, content.GetLength());

-    pDocHandler->SavePackage(m_pXFADoc, ws, &fileStream);

-  } else if (fileType == FXFA_SAVEAS_XDP) {

-    if (flag == 0)

-      flag = FXFA_CONFIG | FXFA_TEMPLATE | FXFA_LOCALESET | FXFA_DATASETS |

-             FXFA_XMPMETA | FXFA_XFDF | FXFA_FORM;

-    if (m_pPDFDoc == NULL) {

-      fileStream.Flush();

-      return FALSE;

-    }

-    CPDF_Dictionary* pRoot = m_pPDFDoc->GetRoot();

-    if (pRoot == NULL) {

-      fileStream.Flush();

-      return FALSE;

-    }

-    CPDF_Dictionary* pAcroForm = pRoot->GetDict("AcroForm");

-    if (NULL == pAcroForm) {

-      fileStream.Flush();

-      return FALSE;

-    }

-    CPDF_Object* pXFA = pAcroForm->GetElement("XFA");

-    if (pXFA == NULL) {

-      fileStream.Flush();

-      return FALSE;

-    }

-    if (!pXFA->IsArray()) {

-      fileStream.Flush();

-      return FALSE;

-    }

-    CPDF_Array* pArray = pXFA->GetArray();

-    if (NULL == pArray) {

-      fileStream.Flush();

-      return FALSE;

-    }

-    int size = pArray->GetCount();

-    for (int i = 1; i < size; i += 2) {

-      CPDF_Object* pPDFObj = pArray->GetElement(i);

-      CPDF_Object* pPrePDFObj = pArray->GetElement(i - 1);

-      if (!pPrePDFObj->IsString())

-        continue;

-      if (!pPDFObj->IsReference())

-        continue;

-      CPDF_Object* pDirectObj = pPDFObj->GetDirect();

-      if (!pDirectObj->IsStream())

-        continue;

-      if (pPrePDFObj->GetString() == "config" && !(flag & FXFA_CONFIG))

-        continue;

-      if (pPrePDFObj->GetString() == "template" && !(flag & FXFA_TEMPLATE))

-        continue;

-      if (pPrePDFObj->GetString() == "localeSet" && !(flag & FXFA_LOCALESET))

-        continue;

-      if (pPrePDFObj->GetString() == "datasets" && !(flag & FXFA_DATASETS))

-        continue;

-      if (pPrePDFObj->GetString() == "xmpmeta" && !(flag & FXFA_XMPMETA))

-        continue;

-      if (pPrePDFObj->GetString() == "xfdf" && !(flag & FXFA_XFDF))

-        continue;

-      if (pPrePDFObj->GetString() == "form" && !(flag & FXFA_FORM))

-        continue;

-      if (pPrePDFObj->GetString() == "form") {

-        CFX_WideString ws;

-        ws.FromLocal("form");

-        pDocHandler->SavePackage(m_pXFADoc, ws, &fileStream);

-      } else if (pPrePDFObj->GetString() == "datasets") {

-        CFX_WideString ws;

-        ws.FromLocal("datasets");

-        pDocHandler->SavePackage(m_pXFADoc, ws, &fileStream);

-      } else {

-        // PDF,creator.

-        // TODO:

-      }

-    }

-  }

-  return TRUE;

-}

-

-void CPDFXFA_Document::_ClearChangeMark() {

-  if (m_pSDKDoc)

-    m_pSDKDoc->ClearChangeMark();

-}

-

-void CPDFXFA_Document::_ToXFAContentFlags(CFX_WideString csSrcContent,

-                                          FPDF_DWORD& flag) {

-  if (csSrcContent.Find(L" config ", 0) != -1)

-    flag |= FXFA_CONFIG;

-  if (csSrcContent.Find(L" template ", 0) != -1)

-    flag |= FXFA_TEMPLATE;

-  if (csSrcContent.Find(L" localeSet ", 0) != -1)

-    flag |= FXFA_LOCALESET;

-  if (csSrcContent.Find(L" datasets ", 0) != -1)

-    flag |= FXFA_DATASETS;

-  if (csSrcContent.Find(L" xmpmeta ", 0) != -1)

-    flag |= FXFA_XMPMETA;

-  if (csSrcContent.Find(L" xfdf ", 0) != -1)

-    flag |= FXFA_XFDF;

-  if (csSrcContent.Find(L" form ", 0) != -1)

-    flag |= FXFA_FORM;

-  if (flag == 0)

-    flag = FXFA_CONFIG | FXFA_TEMPLATE | FXFA_LOCALESET | FXFA_DATASETS |

-           FXFA_XMPMETA | FXFA_XFDF | FXFA_FORM;

-}

-FX_BOOL CPDFXFA_Document::_MailToInfo(CFX_WideString& csURL,

-                                      CFX_WideString& csToAddress,

-                                      CFX_WideString& csCCAddress,

-                                      CFX_WideString& csBCCAddress,

-                                      CFX_WideString& csSubject,

-                                      CFX_WideString& csMsg) {

-  CFX_WideString srcURL = csURL;

-  srcURL.TrimLeft();

-  if (0 != srcURL.Left(7).CompareNoCase(L"mailto:"))

-    return FALSE;

-  int pos = srcURL.Find(L'?', 0);

-  CFX_WideString tmp;

-  if (pos == -1) {

-    pos = srcURL.Find(L'@', 0);

-    if (pos == -1)

-      return FALSE;

-    else {

-      tmp = srcURL.Right(csURL.GetLength() - 7);

-      tmp.TrimLeft();

-      tmp.TrimRight();

-    }

-  } else {

-    tmp = srcURL.Left(pos);

-    tmp = tmp.Right(tmp.GetLength() - 7);

-    tmp.TrimLeft();

-    tmp.TrimRight();

-  }

-

-  csToAddress = tmp;

-

-  srcURL = srcURL.Right(srcURL.GetLength() - (pos + 1));

-  while (!srcURL.IsEmpty()) {

-    srcURL.TrimLeft();

-    srcURL.TrimRight();

-    pos = srcURL.Find(L'&', 0);

-    if (pos == -1)

-      tmp = srcURL;

-    else

-      tmp = srcURL.Left(pos);

-

-    tmp.TrimLeft();

-    tmp.TrimRight();

-    if (tmp.GetLength() >= 3 && 0 == tmp.Left(3).CompareNoCase(L"cc=")) {

-      tmp = tmp.Right(tmp.GetLength() - 3);

-      if (!csCCAddress.IsEmpty())

-        csCCAddress += L';';

-      csCCAddress += tmp;

-

-    } else if (tmp.GetLength() >= 4 &&

-               0 == tmp.Left(4).CompareNoCase(L"bcc=")) {

-      tmp = tmp.Right(tmp.GetLength() - 4);

-      if (!csBCCAddress.IsEmpty())

-        csBCCAddress += L';';

-      csBCCAddress += tmp;

-    } else if (tmp.GetLength() >= 8 &&

-               0 == tmp.Left(8).CompareNoCase(L"subject=")) {

-      tmp = tmp.Right(tmp.GetLength() - 8);

-      csSubject += tmp;

-    } else if (tmp.GetLength() >= 5 &&

-               0 == tmp.Left(5).CompareNoCase(L"body=")) {

-      tmp = tmp.Right(tmp.GetLength() - 5);

-      csMsg += tmp;

-    }

-    if (pos == -1)

-      srcURL = L"";

-    else

-      srcURL = srcURL.Right(csURL.GetLength() - (pos + 1));

-  }

-  csToAddress.Replace(L",", L";");

-  csCCAddress.Replace(L",", L";");

-  csBCCAddress.Replace(L",", L";");

-  return TRUE;

-}

-

-FX_BOOL CPDFXFA_Document::_SubmitData(IXFA_Doc* hDoc, CXFA_Submit submit) {

-#ifdef PDF_ENABLE_XFA

-  CFX_WideStringC csURLC;

-  submit.GetSubmitTarget(csURLC);

-  CFX_WideString csURL = csURLC;

-  CPDFDoc_Environment* pEnv = m_pSDKDoc->GetEnv();

-  if (pEnv == NULL)

-    return FALSE;

-  if (csURL.IsEmpty()) {

-    CFX_WideString ws;

-    ws.FromLocal("Submit cancelled.");

-    CFX_ByteString bs = ws.UTF16LE_Encode();

-    int len = bs.GetLength() / sizeof(unsigned short);

-    pEnv->FFI_Alert((FPDF_WIDESTRING)bs.GetBuffer(len * sizeof(unsigned short)),

-                    (FPDF_WIDESTRING)L"", 0, 4);

-    bs.ReleaseBuffer(len * sizeof(unsigned short));

-    return FALSE;

-  }

-

-  FPDF_BOOL bRet = TRUE;

-  FPDF_FILEHANDLER* pFileHandler = NULL;

-  int fileFlag = -1;

-

-  if (submit.GetSubmitFormat() == XFA_ATTRIBUTEENUM_Xdp) {

-    CFX_WideStringC csContentC;

-    submit.GetSubmitXDPContent(csContentC);

-    CFX_WideString csContent;

-    csContent = csContentC.GetPtr();

-    csContent.TrimLeft();

-    csContent.TrimRight();

-    CFX_WideString space;

-    space.FromLocal(" ");

-    csContent = space + csContent + space;

-    FPDF_DWORD flag = 0;

-    if (submit.IsSubmitEmbedPDF())

-      flag |= FXFA_PDF;

-    _ToXFAContentFlags(csContent, flag);

-    pFileHandler = pEnv->FFI_OpenFile(FXFA_SAVEAS_XDP, NULL, "wb");

-    fileFlag = FXFA_SAVEAS_XDP;

-    _ExportSubmitFile(pFileHandler, FXFA_SAVEAS_XDP, 0, flag);

-  } else if (submit.GetSubmitFormat() == XFA_ATTRIBUTEENUM_Xml) {

-    pFileHandler = pEnv->FFI_OpenFile(FXFA_SAVEAS_XML, NULL, "wb");

-    fileFlag = FXFA_SAVEAS_XML;

-    _ExportSubmitFile(pFileHandler, FXFA_SAVEAS_XML, 0);

-  } else if (submit.GetSubmitFormat() == XFA_ATTRIBUTEENUM_Pdf) {

-    // csfilename = csDocName;

-  } else if (submit.GetSubmitFormat() == XFA_ATTRIBUTEENUM_Formdata) {

-    return FALSE;

-  } else if (submit.GetSubmitFormat() == XFA_ATTRIBUTEENUM_Urlencoded) {

-    pFileHandler = pEnv->FFI_OpenFile(FXFA_SAVEAS_XML, NULL, "wb");

-    fileFlag = FXFA_SAVEAS_XML;

-    _ExportSubmitFile(pFileHandler, FXFA_SAVEAS_XML, 0);

-  } else if (submit.GetSubmitFormat() == XFA_ATTRIBUTEENUM_Xfd) {

-    return FALSE;

-  } else {

-    return FALSE;

-  }

-  if (pFileHandler == NULL)

-    return FALSE;

-  if (0 == csURL.Left(7).CompareNoCase(L"mailto:")) {

-    CFX_WideString csToAddress;

-    CFX_WideString csCCAddress;

-    CFX_WideString csBCCAddress;

-    CFX_WideString csSubject;

-    CFX_WideString csMsg;

-

-    bRet = _MailToInfo(csURL, csToAddress, csCCAddress, csBCCAddress, csSubject,

-                       csMsg);

-    if (FALSE == bRet)

-      return FALSE;

-

-    CFX_ByteString bsTo = CFX_WideString(csToAddress).UTF16LE_Encode();

-    CFX_ByteString bsCC = CFX_WideString(csCCAddress).UTF16LE_Encode();

-    CFX_ByteString bsBcc = CFX_WideString(csBCCAddress).UTF16LE_Encode();

-    CFX_ByteString bsSubject = CFX_WideString(csSubject).UTF16LE_Encode();

-    CFX_ByteString bsMsg = CFX_WideString(csMsg).UTF16LE_Encode();

-

-    FPDF_WIDESTRING pTo = (FPDF_WIDESTRING)bsTo.GetBuffer(bsTo.GetLength());

-    FPDF_WIDESTRING pCC = (FPDF_WIDESTRING)bsCC.GetBuffer(bsCC.GetLength());

-    FPDF_WIDESTRING pBcc = (FPDF_WIDESTRING)bsBcc.GetBuffer(bsBcc.GetLength());

-    FPDF_WIDESTRING pSubject =

-        (FPDF_WIDESTRING)bsSubject.GetBuffer(bsSubject.GetLength());

-    FPDF_WIDESTRING pMsg = (FPDF_WIDESTRING)bsMsg.GetBuffer(bsMsg.GetLength());

-

-    pEnv->FFI_EmailTo(pFileHandler, pTo, pSubject, pCC, pBcc, pMsg);

-    bsTo.ReleaseBuffer();

-    bsCC.ReleaseBuffer();

-    bsBcc.ReleaseBuffer();

-    bsSubject.ReleaseBuffer();

-    bsMsg.ReleaseBuffer();

-  } else {

-    // http¡¢ftp

-    CFX_WideString ws;

-    CFX_ByteString bs = csURL.UTF16LE_Encode();

-    int len = bs.GetLength() / sizeof(unsigned short);

-    pEnv->FFI_UploadTo(

-        pFileHandler, fileFlag,

-        (FPDF_WIDESTRING)bs.GetBuffer(len * sizeof(unsigned short)));

-    bs.ReleaseBuffer(len * sizeof(unsigned short));

-  }

-

-  return bRet;

-#else

-  return TRUE;

-#endif

-}

-

-FX_BOOL CPDFXFA_Document::SetGlobalProperty(IXFA_Doc* hDoc,

-                                            const CFX_ByteStringC& szPropName,

-                                            FXJSE_HVALUE hValue) {

-  if (hDoc != m_pXFADoc)

-    return FALSE;

-

-  if (m_pSDKDoc && m_pSDKDoc->GetEnv()->GetJSRuntime())

-    return m_pSDKDoc->GetEnv()->GetJSRuntime()->SetHValueByName(szPropName,

-                                                                hValue);

-  return FALSE;

-}

-FX_BOOL CPDFXFA_Document::GetPDFScriptObject(IXFA_Doc* hDoc,

-                                             const CFX_ByteStringC& utf8Name,

-                                             FXJSE_HVALUE hValue) {

-  if (hDoc != m_pXFADoc)

-    return FALSE;

-

-  if (!m_pSDKDoc || !m_pSDKDoc->GetEnv()->GetJSRuntime())

-    return FALSE;

-

-  if (!m_pJSContext) {

-    m_pSDKDoc->GetEnv()->GetJSRuntime()->SetReaderDocument(m_pSDKDoc);

-    m_pJSContext = m_pSDKDoc->GetEnv()->GetJSRuntime()->NewContext();

-  }

-

-  return _GetHValueByName(utf8Name, hValue,

-                          m_pSDKDoc->GetEnv()->GetJSRuntime());

-}

-FX_BOOL CPDFXFA_Document::GetGlobalProperty(IXFA_Doc* hDoc,

-                                            const CFX_ByteStringC& szPropName,

-                                            FXJSE_HVALUE hValue) {

-  if (hDoc != m_pXFADoc)

-    return FALSE;

-  if (!m_pSDKDoc || !m_pSDKDoc->GetEnv()->GetJSRuntime())

-    return FALSE;

-

-  if (!m_pJSContext) {

-    m_pSDKDoc->GetEnv()->GetJSRuntime()->SetReaderDocument(m_pSDKDoc);

-    m_pJSContext = m_pSDKDoc->GetEnv()->GetJSRuntime()->NewContext();

-  }

-

-  return _GetHValueByName(szPropName, hValue,

-                          m_pSDKDoc->GetEnv()->GetJSRuntime());

-}

-FX_BOOL CPDFXFA_Document::_GetHValueByName(const CFX_ByteStringC& utf8Name,

-                                           FXJSE_HVALUE hValue,

-                                           IJS_Runtime* runTime) {

-  return runTime->GetHValueByName(utf8Name, hValue);

-}

+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "fpdfsdk/include/fsdk_define.h"
+#include "fpdfsdk/include/fpdfxfa/fpdfxfa_doc.h"
+#include "fpdfsdk/include/fsdk_mgr.h"
+#include "fpdfsdk/include/fpdfxfa/fpdfxfa_app.h"
+#include "fpdfsdk/include/fpdfxfa/fpdfxfa_util.h"
+#include "fpdfsdk/include/fpdfxfa/fpdfxfa_page.h"
+#include "fpdfsdk/include/javascript/IJavaScript.h"
+#include "public/fpdf_formfill.h"
+
+#define IDS_XFA_Validate_Input                                          \
+  "At least one required field was empty. Please fill in the required " \
+  "fields\r\n(highlighted) before continuing."
+
+// submit
+#define FXFA_CONFIG 0x00000001
+#define FXFA_TEMPLATE 0x00000010
+#define FXFA_LOCALESET 0x00000100
+#define FXFA_DATASETS 0x00001000
+#define FXFA_XMPMETA 0x00010000
+#define FXFA_XFDF 0x00100000
+#define FXFA_FORM 0x01000000
+#define FXFA_PDF 0x10000000
+
+#ifndef _WIN32
+extern void SetLastError(int err);
+
+extern int GetLastError();
+#endif
+
+CPDFXFA_Document::CPDFXFA_Document(CPDF_Document* pPDFDoc,
+                                   CPDFXFA_App* pProvider)
+    : m_iDocType(DOCTYPE_PDF),
+      m_pPDFDoc(pPDFDoc),
+      m_pSDKDoc(nullptr),
+      m_pXFADoc(nullptr),
+      m_pXFADocView(nullptr),
+      m_pApp(pProvider),
+      m_pJSContext(nullptr) {
+}
+
+CPDFXFA_Document::~CPDFXFA_Document() {
+  if (m_pJSContext && m_pSDKDoc && m_pSDKDoc->GetEnv())
+    m_pSDKDoc->GetEnv()->GetJSRuntime()->ReleaseContext(m_pJSContext);
+
+  delete m_pSDKDoc;
+
+  if (m_pPDFDoc) {
+    CPDF_Parser* pParser = m_pPDFDoc->GetParser();
+    if (pParser)
+      delete pParser;
+    else
+      delete m_pPDFDoc;
+  }
+  if (m_pXFADoc) {
+    IXFA_App* pApp = m_pApp->GetXFAApp();
+    if (pApp) {
+      IXFA_DocHandler* pDocHandler = pApp->GetDocHandler();
+      if (pDocHandler) {
+        CloseXFADoc(pDocHandler);
+      }
+    }
+    delete m_pXFADoc;
+  }
+}
+
+FX_BOOL CPDFXFA_Document::LoadXFADoc() {
+  if (!m_pPDFDoc)
+    return FALSE;
+
+  m_XFAPageList.RemoveAll();
+
+  IXFA_App* pApp = m_pApp->GetXFAApp();
+  if (!pApp)
+    return FALSE;
+
+  m_pXFADoc = pApp->CreateDoc(this, m_pPDFDoc);
+  if (!m_pXFADoc) {
+    SetLastError(FPDF_ERR_XFALOAD);
+    return FALSE;
+  }
+
+  IXFA_DocHandler* pDocHandler = pApp->GetDocHandler();
+  if (!pDocHandler) {
+    SetLastError(FPDF_ERR_XFALOAD);
+    return FALSE;
+  }
+
+  pDocHandler->StartLoad(m_pXFADoc);
+  int iStatus = pDocHandler->DoLoad(m_pXFADoc, NULL);
+  if (iStatus != XFA_PARSESTATUS_Done) {
+    CloseXFADoc(pDocHandler);
+    SetLastError(FPDF_ERR_XFALOAD);
+    return FALSE;
+  }
+  pDocHandler->StopLoad(m_pXFADoc);
+  pDocHandler->SetJSERuntime(m_pXFADoc, m_pApp->GetJSERuntime());
+
+  if (pDocHandler->GetDocType(m_pXFADoc) == XFA_DOCTYPE_Dynamic)
+    m_iDocType = DOCTYPE_DYNAMIC_XFA;
+  else
+    m_iDocType = DOCTYPE_STATIC_XFA;
+
+  m_pXFADocView = pDocHandler->CreateDocView(m_pXFADoc, XFA_DOCVIEW_View);
+  if (m_pXFADocView->StartLayout() < 0) {
+    CloseXFADoc(pDocHandler);
+    SetLastError(FPDF_ERR_XFALAYOUT);
+    return FALSE;
+  }
+
+  m_pXFADocView->DoLayout(NULL);
+  m_pXFADocView->StopLayout();
+  return TRUE;
+}
+
+int CPDFXFA_Document::GetPageCount() {
+  if (!m_pPDFDoc && !m_pXFADoc)
+    return 0;
+
+  switch (m_iDocType) {
+    case DOCTYPE_PDF:
+    case DOCTYPE_STATIC_XFA:
+      if (m_pPDFDoc)
+        return m_pPDFDoc->GetPageCount();
+    case DOCTYPE_DYNAMIC_XFA:
+      if (m_pXFADoc)
+        return m_pXFADocView->CountPageViews();
+    default:
+      return 0;
+  }
+
+  return 0;
+}
+
+CPDFXFA_Page* CPDFXFA_Document::GetPage(int page_index) {
+  if (page_index < 0)
+    return nullptr;
+  CPDFXFA_Page* pPage = nullptr;
+  int nCount = m_XFAPageList.GetSize();
+  if (nCount > 0 && page_index < nCount) {
+    pPage = m_XFAPageList.GetAt(page_index);
+    if (pPage)
+      pPage->AddRef();
+  } else {
+    m_XFAPageList.SetSize(GetPageCount());
+  }
+  if (pPage)
+    return pPage;
+  pPage = new CPDFXFA_Page(this, page_index);
+  if (!pPage->LoadPage()) {
+    delete pPage;
+    return nullptr;
+  }
+  m_XFAPageList.SetAt(page_index, pPage);
+  return pPage;
+}
+
+CPDFXFA_Page* CPDFXFA_Document::GetPage(IXFA_PageView* pPage) {
+  if (!pPage)
+    return NULL;
+
+  if (!m_pXFADoc)
+    return NULL;
+
+  if (m_iDocType != DOCTYPE_DYNAMIC_XFA)
+    return NULL;
+
+  int nSize = m_XFAPageList.GetSize();
+  for (int i = 0; i < nSize; i++) {
+    CPDFXFA_Page* pTempPage = m_XFAPageList.GetAt(i);
+    if (!pTempPage)
+      continue;
+    if (pTempPage->GetXFAPageView() && pTempPage->GetXFAPageView() == pPage)
+      return pTempPage;
+  }
+
+  return NULL;
+}
+
+void CPDFXFA_Document::RemovePage(CPDFXFA_Page* page) {
+  m_XFAPageList.SetAt(page->GetPageIndex(), NULL);
+}
+
+CPDFSDK_Document* CPDFXFA_Document::GetSDKDocument(
+    CPDFDoc_Environment* pFormFillEnv) {
+  if (!m_pSDKDoc && pFormFillEnv)
+    m_pSDKDoc = new CPDFSDK_Document(this, pFormFillEnv);
+  return m_pSDKDoc;
+}
+
+void CPDFXFA_Document::FXRect2PDFRect(const CFX_RectF& fxRectF,
+                                      CPDF_Rect& pdfRect) {
+  pdfRect.left = fxRectF.left;
+  pdfRect.top = fxRectF.bottom();
+  pdfRect.right = fxRectF.right();
+  pdfRect.bottom = fxRectF.top;
+}
+
+void CPDFXFA_Document::SetChangeMark(IXFA_Doc* hDoc) {
+  if (hDoc == m_pXFADoc && m_pSDKDoc) {
+    m_pSDKDoc->SetChangeMark();
+  }
+}
+
+FX_BOOL CPDFXFA_Document::GetChangeMark(IXFA_Doc* hDoc) {
+  if (hDoc == m_pXFADoc && m_pSDKDoc)
+    return m_pSDKDoc->GetChangeMark();
+  return FALSE;
+}
+
+void CPDFXFA_Document::InvalidateRect(IXFA_PageView* pPageView,
+                                      const CFX_RectF& rt,
+                                      FX_DWORD dwFlags /* = 0 */) {
+  if (!m_pXFADoc || !m_pSDKDoc)
+    return;
+
+  if (m_iDocType != DOCTYPE_DYNAMIC_XFA)
+    return;
+
+  CPDF_Rect rcPage;
+  FXRect2PDFRect(rt, rcPage);
+
+  CPDFXFA_Page* pPage = GetPage(pPageView);
+
+  if (pPage == NULL)
+    return;
+
+  CPDFDoc_Environment* pEnv = m_pSDKDoc->GetEnv();
+  if (!pEnv)
+    return;
+
+  pEnv->FFI_Invalidate((FPDF_PAGE)pPage, rcPage.left, rcPage.bottom,
+                       rcPage.right, rcPage.top);
+}
+
+void CPDFXFA_Document::InvalidateRect(IXFA_Widget* hWidget,
+                                      FX_DWORD dwFlags /* = 0 */) {
+  if (!hWidget)
+    return;
+
+  if (!m_pXFADoc || !m_pSDKDoc || !m_pXFADocView)
+    return;
+
+  if (m_iDocType != DOCTYPE_DYNAMIC_XFA)
+    return;
+
+  IXFA_WidgetHandler* pWidgetHandler = m_pXFADocView->GetWidgetHandler();
+  if (!pWidgetHandler)
+    return;
+
+  IXFA_PageView* pPageView = pWidgetHandler->GetPageView(hWidget);
+  if (!pPageView)
+    return;
+
+  CFX_RectF rect;
+  pWidgetHandler->GetRect(hWidget, rect);
+  InvalidateRect(pPageView, rect, dwFlags);
+}
+
+void CPDFXFA_Document::DisplayCaret(IXFA_Widget* hWidget,
+                                    FX_BOOL bVisible,
+                                    const CFX_RectF* pRtAnchor) {
+  if (!hWidget || pRtAnchor == NULL)
+    return;
+
+  if (!m_pXFADoc || !m_pSDKDoc || !m_pXFADocView)
+    return;
+
+  if (m_iDocType != DOCTYPE_DYNAMIC_XFA)
+    return;
+
+  IXFA_WidgetHandler* pWidgetHandler = m_pXFADocView->GetWidgetHandler();
+  if (!pWidgetHandler)
+    return;
+
+  IXFA_PageView* pPageView = pWidgetHandler->GetPageView(hWidget);
+  if (!pPageView)
+    return;
+
+  CPDFXFA_Page* pPage = GetPage(pPageView);
+
+  if (pPage == NULL)
+    return;
+
+  CPDF_Rect rcCaret;
+  FXRect2PDFRect(*pRtAnchor, rcCaret);
+
+  CPDFDoc_Environment* pEnv = m_pSDKDoc->GetEnv();
+  if (!pEnv)
+    return;
+
+  pEnv->FFI_DisplayCaret((FPDF_PAGE)pPage, bVisible, rcCaret.left, rcCaret.top,
+                         rcCaret.right, rcCaret.bottom);
+}
+
+FX_BOOL CPDFXFA_Document::GetPopupPos(IXFA_Widget* hWidget,
+                                      FX_FLOAT fMinPopup,
+                                      FX_FLOAT fMaxPopup,
+                                      const CFX_RectF& rtAnchor,
+                                      CFX_RectF& rtPopup) {
+  if (NULL == hWidget) {
+    return FALSE;
+  }
+  IXFA_PageView* pXFAPageView =
+      m_pXFADocView->GetWidgetHandler()->GetPageView(hWidget);
+  if (NULL == pXFAPageView) {
+    return FALSE;
+  }
+  CPDFXFA_Page* pPage = GetPage(pXFAPageView);
+  if (pPage == NULL)
+    return FALSE;
+
+  CXFA_WidgetAcc* pWidgetAcc =
+      m_pXFADocView->GetWidgetHandler()->GetDataAcc(hWidget);
+
+  int nRotate = 0;
+#ifdef PDF_ENABLE_XFA
+  nRotate = pWidgetAcc->GetRotate();
+#endif
+
+  CPDFDoc_Environment* pEnv = m_pSDKDoc->GetEnv();
+  if (pEnv == NULL)
+    return FALSE;
+  FS_RECTF pageViewRect;
+  pEnv->FFI_GetPageViewRect(pPage, pageViewRect);
+
+  CPDF_Rect rcAnchor;
+
+  rcAnchor.left = rtAnchor.left;
+  rcAnchor.top = rtAnchor.bottom();
+  rcAnchor.right = rtAnchor.right();
+  rcAnchor.bottom = rtAnchor.top;
+
+  int t1, t2, t;
+  FX_DWORD dwPos;
+  FX_FLOAT fPoupHeight;
+  switch (nRotate) {
+    case 90: {
+      t1 = (int)(pageViewRect.right - rcAnchor.right);
+      t2 = (int)(rcAnchor.left - pageViewRect.left);
+      if (rcAnchor.bottom < pageViewRect.bottom) {
+        rtPopup.left += rcAnchor.bottom - pageViewRect.bottom;
+      }
+
+      break;
+    }
+
+    case 180: {
+      t2 = (int)(pageViewRect.top - rcAnchor.top);
+      t1 = (int)(rcAnchor.bottom - pageViewRect.bottom);
+      if (rcAnchor.left < pageViewRect.left) {
+        rtPopup.left += rcAnchor.left - pageViewRect.left;
+      }
+      break;
+    }
+    case 270: {
+      t1 = (int)(rcAnchor.left - pageViewRect.left);
+      t2 = (int)(pageViewRect.right - rcAnchor.right);
+
+      if (rcAnchor.top > pageViewRect.top) {
+        rtPopup.left -= rcAnchor.top - pageViewRect.top;
+      }
+      break;
+    }
+    case 0:
+    default: {
+      t1 = (int)(pageViewRect.top - rcAnchor.top);
+      t2 = (int)(rcAnchor.bottom - pageViewRect.bottom);
+      if (rcAnchor.right > pageViewRect.right) {
+        rtPopup.left -= rcAnchor.right - pageViewRect.right;
+      }
+      break;
+    }
+  }
+
+  if (t1 <= 0 && t2 <= 0) {
+    return FALSE;
+  }
+  if (t1 <= 0) {
+    t = t2;
+    dwPos = 1;
+  } else if (t2 <= 0) {
+    t = t1;
+    dwPos = 0;
+  } else if (t1 > t2) {
+    t = t1;
+    dwPos = 0;
+  } else {
+    t = t2;
+    dwPos = 1;
+  }
+  if (t < fMinPopup) {
+    fPoupHeight = fMinPopup;
+  } else if (t > fMaxPopup) {
+    fPoupHeight = fMaxPopup;
+  } else {
+    fPoupHeight = (FX_FLOAT)t;
+  }
+
+  switch (nRotate) {
+    case 0:
+    case 180: {
+      if (dwPos == 0) {
+        rtPopup.top = rtAnchor.height;
+        rtPopup.height = fPoupHeight;
+      } else {
+        rtPopup.top = -fPoupHeight;
+        rtPopup.height = fPoupHeight;
+      }
+      break;
+    }
+    case 90:
+    case 270: {
+      if (dwPos == 0) {
+        rtPopup.top = rtAnchor.width;
+        rtPopup.height = fPoupHeight;
+      } else {
+        rtPopup.top = -fPoupHeight;
+        rtPopup.height = fPoupHeight;
+      }
+      break;
+    }
+    default:
+      break;
+  }
+
+  return TRUE;
+}
+
+FX_BOOL CPDFXFA_Document::PopupMenu(IXFA_Widget* hWidget,
+                                    CFX_PointF ptPopup,
+                                    const CFX_RectF* pRectExclude) {
+  if (NULL == hWidget) {
+    return FALSE;
+  }
+  IXFA_PageView* pXFAPageView =
+      m_pXFADocView->GetWidgetHandler()->GetPageView(hWidget);
+  if (pXFAPageView == NULL)
+    return FALSE;
+  CPDFXFA_Page* pPage = GetPage(pXFAPageView);
+
+  if (pPage == NULL)
+    return FALSE;
+
+  int menuFlag = 0;
+
+  IXFA_MenuHandler* pXFAMenuHander = m_pApp->GetXFAApp()->GetMenuHandler();
+  if (pXFAMenuHander->CanUndo(hWidget))
+    menuFlag |= FXFA_MEMU_UNDO;
+  if (pXFAMenuHander->CanRedo(hWidget))
+    menuFlag |= FXFA_MEMU_REDO;
+  if (pXFAMenuHander->CanPaste(hWidget))
+    menuFlag |= FXFA_MEMU_PASTE;
+  if (pXFAMenuHander->CanCopy(hWidget))
+    menuFlag |= FXFA_MEMU_COPY;
+  if (pXFAMenuHander->CanCut(hWidget))
+    menuFlag |= FXFA_MEMU_CUT;
+  if (pXFAMenuHander->CanSelectAll(hWidget))
+    menuFlag |= FXFA_MEMU_SELECTALL;
+
+  CPDFDoc_Environment* pEnv = m_pSDKDoc->GetEnv();
+  if (pEnv == NULL)
+    return FALSE;
+
+  return pEnv->FFI_PopupMenu(pPage, hWidget, menuFlag, ptPopup, NULL);
+}
+
+void CPDFXFA_Document::PageViewEvent(IXFA_PageView* pPageView,
+                                     FX_DWORD dwFlags) {
+  if (!pPageView || (dwFlags != XFA_PAGEVIEWEVENT_PostAdded &&
+                     dwFlags != XFA_PAGEVIEWEVENT_PostRemoved)) {
+    return;
+  }
+  CPDFXFA_Page* pPage = nullptr;
+  if (dwFlags == XFA_PAGEVIEWEVENT_PostAdded) {
+    pPage = GetPage(pPageView->GetPageViewIndex());
+    if (pPage)
+      pPage->SetXFAPageView(pPageView);
+    return;
+  }
+  pPage = GetPage(pPageView);
+  if (!pPage)
+    return;
+  pPage->SetXFAPageView(nullptr);
+  m_pSDKDoc->GetPageView(pPage)->ClearFXAnnots();
+}
+
+void CPDFXFA_Document::WidgetEvent(IXFA_Widget* hWidget,
+                                   CXFA_WidgetAcc* pWidgetData,
+                                   FX_DWORD dwEvent,
+                                   void* pParam,
+                                   void* pAdditional) {
+  if (m_iDocType != DOCTYPE_DYNAMIC_XFA || !hWidget)
+    return;
+
+  CPDFDoc_Environment* pEnv = m_pSDKDoc->GetEnv();
+  if (!pEnv)
+    return;
+
+  IXFA_PageView* pPageView =
+      m_pXFADocView->GetWidgetHandler()->GetPageView(hWidget);
+  if (pPageView == NULL)
+    return;
+
+  CPDFXFA_Page* pXFAPage = GetPage(pPageView);
+  if (pXFAPage == NULL)
+    return;
+
+  CPDFSDK_PageView* pSdkPageView = m_pSDKDoc->GetPageView(pXFAPage);
+  if (dwEvent == XFA_WIDGETEVENT_PostAdded) {
+    pSdkPageView->AddAnnot(hWidget);
+
+  } else if (dwEvent == XFA_WIDGETEVENT_PreRemoved) {
+    CPDFSDK_Annot* pAnnot = pSdkPageView->GetAnnotByXFAWidget(hWidget);
+    if (pAnnot) {
+      pSdkPageView->DeleteAnnot(pAnnot);
+    }
+  }
+}
+
+int32_t CPDFXFA_Document::CountPages(IXFA_Doc* hDoc) {
+  if (hDoc == m_pXFADoc && m_pSDKDoc) {
+    return GetPageCount();
+  }
+  return 0;
+}
+int32_t CPDFXFA_Document::GetCurrentPage(IXFA_Doc* hDoc) {
+  if (hDoc != m_pXFADoc || !m_pSDKDoc)
+    return -1;
+  if (m_iDocType != DOCTYPE_DYNAMIC_XFA)
+    return -1;
+
+  CPDFDoc_Environment* pEnv = m_pSDKDoc->GetEnv();
+  if (pEnv == NULL)
+    return -1;
+
+  return pEnv->FFI_GetCurrentPageIndex(this);
+}
+void CPDFXFA_Document::SetCurrentPage(IXFA_Doc* hDoc, int32_t iCurPage) {
+  if (hDoc != m_pXFADoc || !m_pSDKDoc)
+    return;
+  if (m_iDocType != DOCTYPE_DYNAMIC_XFA)
+    return;
+
+  CPDFDoc_Environment* pEnv = m_pSDKDoc->GetEnv();
+  if (pEnv == NULL)
+    return;
+
+  pEnv->FFI_SetCurrentPage(this, iCurPage);
+}
+FX_BOOL CPDFXFA_Document::IsCalculationsEnabled(IXFA_Doc* hDoc) {
+  if (hDoc != m_pXFADoc || !m_pSDKDoc)
+    return FALSE;
+  if (m_pSDKDoc->GetInterForm())
+    return m_pSDKDoc->GetInterForm()->IsXfaCalculateEnabled();
+
+  return FALSE;
+}
+void CPDFXFA_Document::SetCalculationsEnabled(IXFA_Doc* hDoc,
+                                              FX_BOOL bEnabled) {
+  if (hDoc != m_pXFADoc || !m_pSDKDoc)
+    return;
+  if (m_pSDKDoc->GetInterForm())
+    m_pSDKDoc->GetInterForm()->XfaEnableCalculate(bEnabled);
+}
+
+void CPDFXFA_Document::GetTitle(IXFA_Doc* hDoc, CFX_WideString& wsTitle) {
+  if (hDoc != m_pXFADoc)
+    return;
+  if (m_pPDFDoc == NULL)
+    return;
+  CPDF_Dictionary* pInfoDict = m_pPDFDoc->GetInfo();
+
+  if (pInfoDict == NULL)
+    return;
+
+  CFX_ByteString csTitle = pInfoDict->GetString("Title");
+  wsTitle = wsTitle.FromLocal(csTitle.GetBuffer(csTitle.GetLength()));
+  csTitle.ReleaseBuffer(csTitle.GetLength());
+}
+void CPDFXFA_Document::SetTitle(IXFA_Doc* hDoc,
+                                const CFX_WideStringC& wsTitle) {
+  if (hDoc != m_pXFADoc)
+    return;
+  if (m_pPDFDoc == NULL)
+    return;
+  CPDF_Dictionary* pInfoDict = m_pPDFDoc->GetInfo();
+
+  if (pInfoDict == NULL)
+    return;
+  pInfoDict->SetAt("Title", new CPDF_String(wsTitle));
+}
+void CPDFXFA_Document::ExportData(IXFA_Doc* hDoc,
+                                  const CFX_WideStringC& wsFilePath,
+                                  FX_BOOL bXDP) {
+  if (hDoc != m_pXFADoc)
+    return;
+  if (m_iDocType != DOCTYPE_DYNAMIC_XFA && m_iDocType != DOCTYPE_STATIC_XFA)
+    return;
+  CPDFDoc_Environment* pEnv = m_pSDKDoc->GetEnv();
+  if (pEnv == NULL)
+    return;
+  int fileType = bXDP ? FXFA_SAVEAS_XDP : FXFA_SAVEAS_XML;
+  CFX_ByteString bs = CFX_WideString(wsFilePath).UTF16LE_Encode();
+
+  if (wsFilePath.IsEmpty()) {
+    if (!pEnv->GetFormFillInfo() ||
+        pEnv->GetFormFillInfo()->m_pJsPlatform == NULL)
+      return;
+    CFX_WideString filepath = pEnv->JS_fieldBrowse();
+    bs = filepath.UTF16LE_Encode();
+  }
+  int len = bs.GetLength() / sizeof(unsigned short);
+  FPDF_FILEHANDLER* pFileHandler = pEnv->FFI_OpenFile(
+      bXDP ? FXFA_SAVEAS_XDP : FXFA_SAVEAS_XML,
+      (FPDF_WIDESTRING)bs.GetBuffer(len * sizeof(unsigned short)), "wb");
+  bs.ReleaseBuffer(len * sizeof(unsigned short));
+
+  if (pFileHandler == NULL)
+    return;
+
+  CFPDF_FileStream fileWrite(pFileHandler);
+
+  IXFA_DocHandler* pXFADocHander = m_pApp->GetXFAApp()->GetDocHandler();
+  CFX_ByteString content;
+  if (fileType == FXFA_SAVEAS_XML) {
+    content = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\r\n";
+    fileWrite.WriteBlock((const FX_CHAR*)content, fileWrite.GetSize(),
+                         content.GetLength());
+    CFX_WideStringC data(L"data");
+    if (pXFADocHander->SavePackage(m_pXFADocView->GetDoc(), data, &fileWrite)) {
+      // TODO: Maybe report error.
+    }
+  } else if (fileType == FXFA_SAVEAS_XDP) {
+    if (m_pPDFDoc == NULL)
+      return;
+    CPDF_Dictionary* pRoot = m_pPDFDoc->GetRoot();
+    if (pRoot == NULL)
+      return;
+    CPDF_Dictionary* pAcroForm = pRoot->GetDict("AcroForm");
+    if (NULL == pAcroForm)
+      return;
+    CPDF_Object* pXFA = pAcroForm->GetElement("XFA");
+    if (pXFA == NULL)
+      return;
+    if (!pXFA->IsArray())
+      return;
+    CPDF_Array* pArray = pXFA->GetArray();
+    if (NULL == pArray)
+      return;
+    int size = pArray->GetCount();
+    for (int i = 1; i < size; i += 2) {
+      CPDF_Object* pPDFObj = pArray->GetElement(i);
+      CPDF_Object* pPrePDFObj = pArray->GetElement(i - 1);
+      if (!pPrePDFObj->IsString())
+        continue;
+      if (!pPDFObj->IsReference())
+        continue;
+      CPDF_Object* pDirectObj = pPDFObj->GetDirect();
+      if (!pDirectObj->IsStream())
+        continue;
+      if (pPrePDFObj->GetString() == "form") {
+        CFX_WideStringC form(L"form");
+        pXFADocHander->SavePackage(m_pXFADocView->GetDoc(), form, &fileWrite);
+      } else if (pPrePDFObj->GetString() == "datasets") {
+        CFX_WideStringC datasets(L"datasets");
+        pXFADocHander->SavePackage(m_pXFADocView->GetDoc(), datasets,
+                                   &fileWrite);
+      } else {
+        if (i == size - 1) {
+          CFX_WideString wPath = CFX_WideString::FromUTF16LE(
+              (unsigned short*)(const FX_CHAR*)bs,
+              bs.GetLength() / sizeof(unsigned short));
+          CFX_ByteString bPath = wPath.UTF8Encode();
+          CFX_ByteString szFormat =
+              "\n<pdf href=\"%s\" xmlns=\"http://ns.adobe.com/xdp/pdf/\"/>";
+          content.Format(szFormat, (char*)(const FX_CHAR*)bPath);
+          fileWrite.WriteBlock((const FX_CHAR*)content, fileWrite.GetSize(),
+                               content.GetLength());
+        }
+
+        CPDF_Stream* pStream = (CPDF_Stream*)pDirectObj;
+        CPDF_StreamAcc* pAcc = new CPDF_StreamAcc;
+        pAcc->LoadAllData(pStream);
+        fileWrite.WriteBlock(pAcc->GetData(), fileWrite.GetSize(),
+                             pAcc->GetSize());
+        delete pAcc;
+      }
+    }
+  }
+  if (!fileWrite.Flush()) {
+    // TODO: Report error.
+  }
+}
+void CPDFXFA_Document::ImportData(IXFA_Doc* hDoc,
+                                  const CFX_WideStringC& wsFilePath) {
+  // TODO...
+}
+
+void CPDFXFA_Document::GotoURL(IXFA_Doc* hDoc,
+                               const CFX_WideStringC& bsURL,
+                               FX_BOOL bAppend) {
+  if (hDoc != m_pXFADoc)
+    return;
+
+  if (m_iDocType != DOCTYPE_DYNAMIC_XFA)
+    return;
+
+  CPDFDoc_Environment* pEnv = m_pSDKDoc->GetEnv();
+  if (pEnv == NULL)
+    return;
+
+  CFX_WideStringC str(bsURL.GetPtr());
+
+  pEnv->FFI_GotoURL(this, str, bAppend);
+}
+
+FX_BOOL CPDFXFA_Document::IsValidationsEnabled(IXFA_Doc* hDoc) {
+  if (hDoc != m_pXFADoc || !m_pSDKDoc)
+    return FALSE;
+  if (m_pSDKDoc->GetInterForm())
+    return m_pSDKDoc->GetInterForm()->IsXfaValidationsEnabled();
+
+  return TRUE;
+}
+void CPDFXFA_Document::SetValidationsEnabled(IXFA_Doc* hDoc, FX_BOOL bEnabled) {
+  if (hDoc != m_pXFADoc || !m_pSDKDoc)
+    return;
+  if (m_pSDKDoc->GetInterForm())
+    m_pSDKDoc->GetInterForm()->XfaSetValidationsEnabled(bEnabled);
+}
+void CPDFXFA_Document::SetFocusWidget(IXFA_Doc* hDoc, IXFA_Widget* hWidget) {
+  if (hDoc != m_pXFADoc)
+    return;
+
+  if (NULL == hWidget) {
+    m_pSDKDoc->SetFocusAnnot(NULL);
+    return;
+  }
+
+  int pageViewCount = m_pSDKDoc->GetPageViewCount();
+  for (int i = 0; i < pageViewCount; i++) {
+    CPDFSDK_PageView* pPageView = m_pSDKDoc->GetPageView(i);
+    if (pPageView == NULL)
+      continue;
+    CPDFSDK_Annot* pAnnot = pPageView->GetAnnotByXFAWidget(hWidget);
+    if (pAnnot) {
+      m_pSDKDoc->SetFocusAnnot(pAnnot);
+      break;
+    }
+  }
+}
+void CPDFXFA_Document::Print(IXFA_Doc* hDoc,
+                             int32_t nStartPage,
+                             int32_t nEndPage,
+                             FX_DWORD dwOptions) {
+  if (hDoc != m_pXFADoc)
+    return;
+
+  CPDFDoc_Environment* pEnv = m_pSDKDoc->GetEnv();
+  if (pEnv == NULL)
+    return;
+
+  if (!pEnv->GetFormFillInfo() ||
+      pEnv->GetFormFillInfo()->m_pJsPlatform == NULL)
+    return;
+  if (pEnv->GetFormFillInfo()->m_pJsPlatform->Doc_print == NULL)
+    return;
+  pEnv->GetFormFillInfo()->m_pJsPlatform->Doc_print(
+      pEnv->GetFormFillInfo()->m_pJsPlatform,
+      dwOptions & XFA_PRINTOPT_ShowDialog, nStartPage, nEndPage,
+      dwOptions & XFA_PRINTOPT_CanCancel, dwOptions & XFA_PRINTOPT_ShrinkPage,
+      dwOptions & XFA_PRINTOPT_AsImage, dwOptions & XFA_PRINTOPT_ReverseOrder,
+      dwOptions & XFA_PRINTOPT_PrintAnnot);
+}
+
+void CPDFXFA_Document::GetURL(IXFA_Doc* hDoc, CFX_WideString& wsDocURL) {
+  if (hDoc != m_pXFADoc)
+    return;
+
+  CPDFDoc_Environment* pEnv = m_pSDKDoc->GetEnv();
+  if (pEnv == NULL)
+    return;
+
+  pEnv->FFI_GetURL(this, wsDocURL);
+}
+
+FX_ARGB CPDFXFA_Document::GetHighlightColor(IXFA_Doc* hDoc) {
+  if (hDoc != m_pXFADoc)
+    return 0;
+  if (m_pSDKDoc) {
+    if (CPDFSDK_InterForm* pInterForm = m_pSDKDoc->GetInterForm()) {
+      FX_COLORREF color = pInterForm->GetHighlightColor(FPDF_FORMFIELD_XFA);
+      uint8_t alpha = pInterForm->GetHighlightAlpha();
+      FX_ARGB argb = ArgbEncode((int)alpha, color);
+      return argb;
+    }
+  }
+  return 0;
+}
+
+FX_BOOL CPDFXFA_Document::_NotifySubmit(FX_BOOL bPrevOrPost) {
+  if (bPrevOrPost)
+    return _OnBeforeNotifySumbit();
+
+  _OnAfterNotifySumbit();
+  return TRUE;
+}
+
+FX_BOOL CPDFXFA_Document::_OnBeforeNotifySumbit() {
+#ifdef PDF_ENABLE_XFA
+  if (m_iDocType != DOCTYPE_DYNAMIC_XFA && m_iDocType != DOCTYPE_STATIC_XFA)
+    return TRUE;
+  if (m_pXFADocView == NULL)
+    return TRUE;
+  IXFA_WidgetHandler* pWidgetHandler = m_pXFADocView->GetWidgetHandler();
+  if (pWidgetHandler == NULL)
+    return TRUE;
+  IXFA_WidgetAccIterator* pWidgetAccIterator =
+      m_pXFADocView->CreateWidgetAccIterator();
+  if (pWidgetAccIterator) {
+    CXFA_EventParam Param;
+    Param.m_eType = XFA_EVENT_PreSubmit;
+    CXFA_WidgetAcc* pWidgetAcc = pWidgetAccIterator->MoveToNext();
+    while (pWidgetAcc) {
+      pWidgetHandler->ProcessEvent(pWidgetAcc, &Param);
+      pWidgetAcc = pWidgetAccIterator->MoveToNext();
+    }
+    pWidgetAccIterator->Release();
+  }
+  pWidgetAccIterator = m_pXFADocView->CreateWidgetAccIterator();
+  if (pWidgetAccIterator) {
+    CXFA_WidgetAcc* pWidgetAcc = pWidgetAccIterator->MoveToNext();
+    pWidgetAcc = pWidgetAccIterator->MoveToNext();
+    while (pWidgetAcc) {
+      int fRet = pWidgetAcc->ProcessValidate(-1);
+      if (fRet == XFA_EVENTERROR_Error) {
+        CPDFDoc_Environment* pEnv = m_pSDKDoc->GetEnv();
+        if (pEnv == NULL)
+          return FALSE;
+        CFX_WideString ws;
+        ws.FromLocal(IDS_XFA_Validate_Input);
+        CFX_ByteString bs = ws.UTF16LE_Encode();
+        int len = bs.GetLength() / sizeof(unsigned short);
+        pEnv->FFI_Alert(
+            (FPDF_WIDESTRING)bs.GetBuffer(len * sizeof(unsigned short)),
+            (FPDF_WIDESTRING)L"", 0, 1);
+        bs.ReleaseBuffer(len * sizeof(unsigned short));
+        pWidgetAccIterator->Release();
+        return FALSE;
+      }
+      pWidgetAcc = pWidgetAccIterator->MoveToNext();
+    }
+    pWidgetAccIterator->Release();
+    m_pXFADocView->UpdateDocView();
+  }
+#endif
+  return TRUE;
+}
+void CPDFXFA_Document::_OnAfterNotifySumbit() {
+  if (m_iDocType != DOCTYPE_DYNAMIC_XFA && m_iDocType != DOCTYPE_STATIC_XFA)
+    return;
+  if (m_pXFADocView == NULL)
+    return;
+  IXFA_WidgetHandler* pWidgetHandler = m_pXFADocView->GetWidgetHandler();
+  if (pWidgetHandler == NULL)
+    return;
+  IXFA_WidgetAccIterator* pWidgetAccIterator =
+      m_pXFADocView->CreateWidgetAccIterator();
+  if (pWidgetAccIterator == NULL)
+    return;
+  CXFA_EventParam Param;
+  Param.m_eType = XFA_EVENT_PostSubmit;
+
+  CXFA_WidgetAcc* pWidgetAcc = pWidgetAccIterator->MoveToNext();
+  while (pWidgetAcc) {
+    pWidgetHandler->ProcessEvent(pWidgetAcc, &Param);
+    pWidgetAcc = pWidgetAccIterator->MoveToNext();
+  }
+  pWidgetAccIterator->Release();
+  m_pXFADocView->UpdateDocView();
+}
+
+FX_BOOL CPDFXFA_Document::SubmitData(IXFA_Doc* hDoc, CXFA_Submit submit) {
+  if (!_NotifySubmit(TRUE))
+    return FALSE;
+  if (NULL == m_pXFADocView)
+    return FALSE;
+  m_pXFADocView->UpdateDocView();
+
+  FX_BOOL ret = _SubmitData(hDoc, submit);
+  _NotifySubmit(FALSE);
+  return ret;
+}
+
+IFX_FileRead* CPDFXFA_Document::OpenLinkedFile(IXFA_Doc* hDoc,
+                                               const CFX_WideString& wsLink) {
+  CPDFDoc_Environment* pEnv = m_pSDKDoc->GetEnv();
+  if (pEnv == NULL)
+    return FALSE;
+  CFX_ByteString bs = wsLink.UTF16LE_Encode();
+  int len = bs.GetLength() / sizeof(unsigned short);
+  FPDF_FILEHANDLER* pFileHandler = pEnv->FFI_OpenFile(
+      0, (FPDF_WIDESTRING)bs.GetBuffer(len * sizeof(unsigned short)), "rb");
+  bs.ReleaseBuffer(len * sizeof(unsigned short));
+
+  if (pFileHandler == NULL)
+    return NULL;
+  return new CFPDF_FileStream(pFileHandler);
+}
+FX_BOOL CPDFXFA_Document::_ExportSubmitFile(FPDF_FILEHANDLER* pFileHandler,
+                                            int fileType,
+                                            FPDF_DWORD encodeType,
+                                            FPDF_DWORD flag) {
+  if (NULL == m_pXFADocView)
+    return FALSE;
+  IXFA_DocHandler* pDocHandler = m_pApp->GetXFAApp()->GetDocHandler();
+  CFX_ByteString content;
+
+  CPDFDoc_Environment* pEnv = m_pSDKDoc->GetEnv();
+  if (pEnv == NULL)
+    return FALSE;
+
+  CFPDF_FileStream fileStream(pFileHandler);
+
+  if (fileType == FXFA_SAVEAS_XML) {
+    CFX_WideString ws;
+    ws.FromLocal("data");
+    CFX_ByteString content = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\r\n";
+    fileStream.WriteBlock((const FX_CHAR*)content, 0, content.GetLength());
+    pDocHandler->SavePackage(m_pXFADoc, ws, &fileStream);
+  } else if (fileType == FXFA_SAVEAS_XDP) {
+    if (flag == 0)
+      flag = FXFA_CONFIG | FXFA_TEMPLATE | FXFA_LOCALESET | FXFA_DATASETS |
+             FXFA_XMPMETA | FXFA_XFDF | FXFA_FORM;
+    if (m_pPDFDoc == NULL) {
+      fileStream.Flush();
+      return FALSE;
+    }
+    CPDF_Dictionary* pRoot = m_pPDFDoc->GetRoot();
+    if (pRoot == NULL) {
+      fileStream.Flush();
+      return FALSE;
+    }
+    CPDF_Dictionary* pAcroForm = pRoot->GetDict("AcroForm");
+    if (NULL == pAcroForm) {
+      fileStream.Flush();
+      return FALSE;
+    }
+    CPDF_Object* pXFA = pAcroForm->GetElement("XFA");
+    if (pXFA == NULL) {
+      fileStream.Flush();
+      return FALSE;
+    }
+    if (!pXFA->IsArray()) {
+      fileStream.Flush();
+      return FALSE;
+    }
+    CPDF_Array* pArray = pXFA->GetArray();
+    if (NULL == pArray) {
+      fileStream.Flush();
+      return FALSE;
+    }
+    int size = pArray->GetCount();
+    for (int i = 1; i < size; i += 2) {
+      CPDF_Object* pPDFObj = pArray->GetElement(i);
+      CPDF_Object* pPrePDFObj = pArray->GetElement(i - 1);
+      if (!pPrePDFObj->IsString())
+        continue;
+      if (!pPDFObj->IsReference())
+        continue;
+      CPDF_Object* pDirectObj = pPDFObj->GetDirect();
+      if (!pDirectObj->IsStream())
+        continue;
+      if (pPrePDFObj->GetString() == "config" && !(flag & FXFA_CONFIG))
+        continue;
+      if (pPrePDFObj->GetString() == "template" && !(flag & FXFA_TEMPLATE))
+        continue;
+      if (pPrePDFObj->GetString() == "localeSet" && !(flag & FXFA_LOCALESET))
+        continue;
+      if (pPrePDFObj->GetString() == "datasets" && !(flag & FXFA_DATASETS))
+        continue;
+      if (pPrePDFObj->GetString() == "xmpmeta" && !(flag & FXFA_XMPMETA))
+        continue;
+      if (pPrePDFObj->GetString() == "xfdf" && !(flag & FXFA_XFDF))
+        continue;
+      if (pPrePDFObj->GetString() == "form" && !(flag & FXFA_FORM))
+        continue;
+      if (pPrePDFObj->GetString() == "form") {
+        CFX_WideString ws;
+        ws.FromLocal("form");
+        pDocHandler->SavePackage(m_pXFADoc, ws, &fileStream);
+      } else if (pPrePDFObj->GetString() == "datasets") {
+        CFX_WideString ws;
+        ws.FromLocal("datasets");
+        pDocHandler->SavePackage(m_pXFADoc, ws, &fileStream);
+      } else {
+        // PDF,creator.
+        // TODO:
+      }
+    }
+  }
+  return TRUE;
+}
+
+void CPDFXFA_Document::_ClearChangeMark() {
+  if (m_pSDKDoc)
+    m_pSDKDoc->ClearChangeMark();
+}
+
+void CPDFXFA_Document::_ToXFAContentFlags(CFX_WideString csSrcContent,
+                                          FPDF_DWORD& flag) {
+  if (csSrcContent.Find(L" config ", 0) != -1)
+    flag |= FXFA_CONFIG;
+  if (csSrcContent.Find(L" template ", 0) != -1)
+    flag |= FXFA_TEMPLATE;
+  if (csSrcContent.Find(L" localeSet ", 0) != -1)
+    flag |= FXFA_LOCALESET;
+  if (csSrcContent.Find(L" datasets ", 0) != -1)
+    flag |= FXFA_DATASETS;
+  if (csSrcContent.Find(L" xmpmeta ", 0) != -1)
+    flag |= FXFA_XMPMETA;
+  if (csSrcContent.Find(L" xfdf ", 0) != -1)
+    flag |= FXFA_XFDF;
+  if (csSrcContent.Find(L" form ", 0) != -1)
+    flag |= FXFA_FORM;
+  if (flag == 0)
+    flag = FXFA_CONFIG | FXFA_TEMPLATE | FXFA_LOCALESET | FXFA_DATASETS |
+           FXFA_XMPMETA | FXFA_XFDF | FXFA_FORM;
+}
+FX_BOOL CPDFXFA_Document::_MailToInfo(CFX_WideString& csURL,
+                                      CFX_WideString& csToAddress,
+                                      CFX_WideString& csCCAddress,
+                                      CFX_WideString& csBCCAddress,
+                                      CFX_WideString& csSubject,
+                                      CFX_WideString& csMsg) {
+  CFX_WideString srcURL = csURL;
+  srcURL.TrimLeft();
+  if (0 != srcURL.Left(7).CompareNoCase(L"mailto:"))
+    return FALSE;
+  int pos = srcURL.Find(L'?', 0);
+  CFX_WideString tmp;
+  if (pos == -1) {
+    pos = srcURL.Find(L'@', 0);
+    if (pos == -1)
+      return FALSE;
+    else {
+      tmp = srcURL.Right(csURL.GetLength() - 7);
+      tmp.TrimLeft();
+      tmp.TrimRight();
+    }
+  } else {
+    tmp = srcURL.Left(pos);
+    tmp = tmp.Right(tmp.GetLength() - 7);
+    tmp.TrimLeft();
+    tmp.TrimRight();
+  }
+
+  csToAddress = tmp;
+
+  srcURL = srcURL.Right(srcURL.GetLength() - (pos + 1));
+  while (!srcURL.IsEmpty()) {
+    srcURL.TrimLeft();
+    srcURL.TrimRight();
+    pos = srcURL.Find(L'&', 0);
+    if (pos == -1)
+      tmp = srcURL;
+    else
+      tmp = srcURL.Left(pos);
+
+    tmp.TrimLeft();
+    tmp.TrimRight();
+    if (tmp.GetLength() >= 3 && 0 == tmp.Left(3).CompareNoCase(L"cc=")) {
+      tmp = tmp.Right(tmp.GetLength() - 3);
+      if (!csCCAddress.IsEmpty())
+        csCCAddress += L';';
+      csCCAddress += tmp;
+
+    } else if (tmp.GetLength() >= 4 &&
+               0 == tmp.Left(4).CompareNoCase(L"bcc=")) {
+      tmp = tmp.Right(tmp.GetLength() - 4);
+      if (!csBCCAddress.IsEmpty())
+        csBCCAddress += L';';
+      csBCCAddress += tmp;
+    } else if (tmp.GetLength() >= 8 &&
+               0 == tmp.Left(8).CompareNoCase(L"subject=")) {
+      tmp = tmp.Right(tmp.GetLength() - 8);
+      csSubject += tmp;
+    } else if (tmp.GetLength() >= 5 &&
+               0 == tmp.Left(5).CompareNoCase(L"body=")) {
+      tmp = tmp.Right(tmp.GetLength() - 5);
+      csMsg += tmp;
+    }
+    if (pos == -1)
+      srcURL = L"";
+    else
+      srcURL = srcURL.Right(csURL.GetLength() - (pos + 1));
+  }
+  csToAddress.Replace(L",", L";");
+  csCCAddress.Replace(L",", L";");
+  csBCCAddress.Replace(L",", L";");
+  return TRUE;
+}
+
+FX_BOOL CPDFXFA_Document::_SubmitData(IXFA_Doc* hDoc, CXFA_Submit submit) {
+#ifdef PDF_ENABLE_XFA
+  CFX_WideStringC csURLC;
+  submit.GetSubmitTarget(csURLC);
+  CFX_WideString csURL = csURLC;
+  CPDFDoc_Environment* pEnv = m_pSDKDoc->GetEnv();
+  if (pEnv == NULL)
+    return FALSE;
+  if (csURL.IsEmpty()) {
+    CFX_WideString ws;
+    ws.FromLocal("Submit cancelled.");
+    CFX_ByteString bs = ws.UTF16LE_Encode();
+    int len = bs.GetLength() / sizeof(unsigned short);
+    pEnv->FFI_Alert((FPDF_WIDESTRING)bs.GetBuffer(len * sizeof(unsigned short)),
+                    (FPDF_WIDESTRING)L"", 0, 4);
+    bs.ReleaseBuffer(len * sizeof(unsigned short));
+    return FALSE;
+  }
+
+  FPDF_BOOL bRet = TRUE;
+  FPDF_FILEHANDLER* pFileHandler = NULL;
+  int fileFlag = -1;
+
+  if (submit.GetSubmitFormat() == XFA_ATTRIBUTEENUM_Xdp) {
+    CFX_WideStringC csContentC;
+    submit.GetSubmitXDPContent(csContentC);
+    CFX_WideString csContent;
+    csContent = csContentC.GetPtr();
+    csContent.TrimLeft();
+    csContent.TrimRight();
+    CFX_WideString space;
+    space.FromLocal(" ");
+    csContent = space + csContent + space;
+    FPDF_DWORD flag = 0;
+    if (submit.IsSubmitEmbedPDF())
+      flag |= FXFA_PDF;
+    _ToXFAContentFlags(csContent, flag);
+    pFileHandler = pEnv->FFI_OpenFile(FXFA_SAVEAS_XDP, NULL, "wb");
+    fileFlag = FXFA_SAVEAS_XDP;
+    _ExportSubmitFile(pFileHandler, FXFA_SAVEAS_XDP, 0, flag);
+  } else if (submit.GetSubmitFormat() == XFA_ATTRIBUTEENUM_Xml) {
+    pFileHandler = pEnv->FFI_OpenFile(FXFA_SAVEAS_XML, NULL, "wb");
+    fileFlag = FXFA_SAVEAS_XML;
+    _ExportSubmitFile(pFileHandler, FXFA_SAVEAS_XML, 0);
+  } else if (submit.GetSubmitFormat() == XFA_ATTRIBUTEENUM_Pdf) {
+    // csfilename = csDocName;
+  } else if (submit.GetSubmitFormat() == XFA_ATTRIBUTEENUM_Formdata) {
+    return FALSE;
+  } else if (submit.GetSubmitFormat() == XFA_ATTRIBUTEENUM_Urlencoded) {
+    pFileHandler = pEnv->FFI_OpenFile(FXFA_SAVEAS_XML, NULL, "wb");
+    fileFlag = FXFA_SAVEAS_XML;
+    _ExportSubmitFile(pFileHandler, FXFA_SAVEAS_XML, 0);
+  } else if (submit.GetSubmitFormat() == XFA_ATTRIBUTEENUM_Xfd) {
+    return FALSE;
+  } else {
+    return FALSE;
+  }
+  if (pFileHandler == NULL)
+    return FALSE;
+  if (0 == csURL.Left(7).CompareNoCase(L"mailto:")) {
+    CFX_WideString csToAddress;
+    CFX_WideString csCCAddress;
+    CFX_WideString csBCCAddress;
+    CFX_WideString csSubject;
+    CFX_WideString csMsg;
+
+    bRet = _MailToInfo(csURL, csToAddress, csCCAddress, csBCCAddress, csSubject,
+                       csMsg);
+    if (FALSE == bRet)
+      return FALSE;
+
+    CFX_ByteString bsTo = CFX_WideString(csToAddress).UTF16LE_Encode();
+    CFX_ByteString bsCC = CFX_WideString(csCCAddress).UTF16LE_Encode();
+    CFX_ByteString bsBcc = CFX_WideString(csBCCAddress).UTF16LE_Encode();
+    CFX_ByteString bsSubject = CFX_WideString(csSubject).UTF16LE_Encode();
+    CFX_ByteString bsMsg = CFX_WideString(csMsg).UTF16LE_Encode();
+
+    FPDF_WIDESTRING pTo = (FPDF_WIDESTRING)bsTo.GetBuffer(bsTo.GetLength());
+    FPDF_WIDESTRING pCC = (FPDF_WIDESTRING)bsCC.GetBuffer(bsCC.GetLength());
+    FPDF_WIDESTRING pBcc = (FPDF_WIDESTRING)bsBcc.GetBuffer(bsBcc.GetLength());
+    FPDF_WIDESTRING pSubject =
+        (FPDF_WIDESTRING)bsSubject.GetBuffer(bsSubject.GetLength());
+    FPDF_WIDESTRING pMsg = (FPDF_WIDESTRING)bsMsg.GetBuffer(bsMsg.GetLength());
+
+    pEnv->FFI_EmailTo(pFileHandler, pTo, pSubject, pCC, pBcc, pMsg);
+    bsTo.ReleaseBuffer();
+    bsCC.ReleaseBuffer();
+    bsBcc.ReleaseBuffer();
+    bsSubject.ReleaseBuffer();
+    bsMsg.ReleaseBuffer();
+  } else {
+    // http¡¢ftp
+    CFX_WideString ws;
+    CFX_ByteString bs = csURL.UTF16LE_Encode();
+    int len = bs.GetLength() / sizeof(unsigned short);
+    pEnv->FFI_UploadTo(
+        pFileHandler, fileFlag,
+        (FPDF_WIDESTRING)bs.GetBuffer(len * sizeof(unsigned short)));
+    bs.ReleaseBuffer(len * sizeof(unsigned short));
+  }
+
+  return bRet;
+#else
+  return TRUE;
+#endif
+}
+
+FX_BOOL CPDFXFA_Document::SetGlobalProperty(IXFA_Doc* hDoc,
+                                            const CFX_ByteStringC& szPropName,
+                                            FXJSE_HVALUE hValue) {
+  if (hDoc != m_pXFADoc)
+    return FALSE;
+
+  if (m_pSDKDoc && m_pSDKDoc->GetEnv()->GetJSRuntime())
+    return m_pSDKDoc->GetEnv()->GetJSRuntime()->SetHValueByName(szPropName,
+                                                                hValue);
+  return FALSE;
+}
+FX_BOOL CPDFXFA_Document::GetPDFScriptObject(IXFA_Doc* hDoc,
+                                             const CFX_ByteStringC& utf8Name,
+                                             FXJSE_HVALUE hValue) {
+  if (hDoc != m_pXFADoc)
+    return FALSE;
+
+  if (!m_pSDKDoc || !m_pSDKDoc->GetEnv()->GetJSRuntime())
+    return FALSE;
+
+  if (!m_pJSContext) {
+    m_pSDKDoc->GetEnv()->GetJSRuntime()->SetReaderDocument(m_pSDKDoc);
+    m_pJSContext = m_pSDKDoc->GetEnv()->GetJSRuntime()->NewContext();
+  }
+
+  return _GetHValueByName(utf8Name, hValue,
+                          m_pSDKDoc->GetEnv()->GetJSRuntime());
+}
+FX_BOOL CPDFXFA_Document::GetGlobalProperty(IXFA_Doc* hDoc,
+                                            const CFX_ByteStringC& szPropName,
+                                            FXJSE_HVALUE hValue) {
+  if (hDoc != m_pXFADoc)
+    return FALSE;
+  if (!m_pSDKDoc || !m_pSDKDoc->GetEnv()->GetJSRuntime())
+    return FALSE;
+
+  if (!m_pJSContext) {
+    m_pSDKDoc->GetEnv()->GetJSRuntime()->SetReaderDocument(m_pSDKDoc);
+    m_pJSContext = m_pSDKDoc->GetEnv()->GetJSRuntime()->NewContext();
+  }
+
+  return _GetHValueByName(szPropName, hValue,
+                          m_pSDKDoc->GetEnv()->GetJSRuntime());
+}
+FX_BOOL CPDFXFA_Document::_GetHValueByName(const CFX_ByteStringC& utf8Name,
+                                           FXJSE_HVALUE hValue,
+                                           IJS_Runtime* runTime) {
+  return runTime->GetHValueByName(utf8Name, hValue);
+}
diff --git a/fpdfsdk/src/fpdfxfa/fpdfxfa_page.cpp b/fpdfsdk/src/fpdfxfa/fpdfxfa_page.cpp
index edd25c7..24c1ed1 100644
--- a/fpdfsdk/src/fpdfxfa/fpdfxfa_page.cpp
+++ b/fpdfsdk/src/fpdfxfa/fpdfxfa_page.cpp
@@ -1,255 +1,255 @@
-// Copyright 2014 PDFium Authors. All rights reserved.

-// Use of this source code is governed by a BSD-style license that can be

-// found in the LICENSE file.

-

-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com

-

-#include "fpdfsdk/include/fsdk_define.h"

-#include "fpdfsdk/include/fsdk_mgr.h"

-#include "fpdfsdk/include/fpdfxfa/fpdfxfa_util.h"

-#include "fpdfsdk/include/fpdfxfa/fpdfxfa_doc.h"

-#include "fpdfsdk/include/fpdfxfa/fpdfxfa_page.h"

-

-CPDFXFA_Page::CPDFXFA_Page(CPDFXFA_Document* pDoc, int page_index)

-    : m_pPDFPage(NULL),

-      m_pXFAPageView(NULL),

-      m_iPageIndex(page_index),

-      m_pDocument(pDoc),

-      m_iRef(1) {}

-

-CPDFXFA_Page::~CPDFXFA_Page() {

-  if (m_pPDFPage)

-    delete m_pPDFPage;

-  m_pPDFPage = NULL;

-  m_pXFAPageView = NULL;

-}

-

-void CPDFXFA_Page::Release() {

-  m_iRef--;

-  if (m_iRef > 0)

-    return;

-

-  if (m_pDocument)

-    m_pDocument->RemovePage(this);

-

-  delete this;

-}

-

-FX_BOOL CPDFXFA_Page::LoadPDFPage() {

-  if (!m_pDocument)

-    return FALSE;

-  CPDF_Document* pPDFDoc = m_pDocument->GetPDFDoc();

-  if (pPDFDoc) {

-    CPDF_Dictionary* pDict = pPDFDoc->GetPage(m_iPageIndex);

-    if (pDict == NULL)

-      return FALSE;

-    if (m_pPDFPage) {

-      if (m_pPDFPage->m_pFormDict == pDict)

-        return TRUE;

-

-      delete m_pPDFPage;

-      m_pPDFPage = NULL;

-    }

-

-    m_pPDFPage = new CPDF_Page;

-    m_pPDFPage->Load(pPDFDoc, pDict);

-    m_pPDFPage->ParseContent(nullptr);

-    return TRUE;

-  }

-

-  return FALSE;

-}

-

-FX_BOOL CPDFXFA_Page::LoadXFAPageView() {

-  if (!m_pDocument)

-    return FALSE;

-  IXFA_Doc* pXFADoc = m_pDocument->GetXFADoc();

-  if (!pXFADoc)

-    return FALSE;

-

-  IXFA_DocView* pXFADocView = m_pDocument->GetXFADocView();

-  if (!pXFADocView)

-    return FALSE;

-

-  IXFA_PageView* pPageView = pXFADocView->GetPageView(m_iPageIndex);

-  if (!pPageView)

-    return FALSE;

-

-  if (m_pXFAPageView == pPageView)

-    return TRUE;

-

-  m_pXFAPageView = pPageView;

-  (void)m_pXFAPageView->LoadPageView(nullptr);

-  return TRUE;

-}

-

-FX_BOOL CPDFXFA_Page::LoadPage() {

-  if (!m_pDocument || m_iPageIndex < 0)

-    return FALSE;

-

-  int iDocType = m_pDocument->GetDocType();

-  switch (iDocType) {

-    case DOCTYPE_PDF:

-    case DOCTYPE_STATIC_XFA: {

-      return LoadPDFPage();

-    }

-    case DOCTYPE_DYNAMIC_XFA: {

-      return LoadXFAPageView();

-    }

-    default:

-      return FALSE;

-  }

-

-  return FALSE;

-}

-

-FX_BOOL CPDFXFA_Page::LoadPDFPage(CPDF_Dictionary* pageDict) {

-  if (!m_pDocument || m_iPageIndex < 0 || !pageDict)

-    return FALSE;

-

-  if (m_pPDFPage)

-    delete m_pPDFPage;

-

-  m_pPDFPage = new CPDF_Page();

-  m_pPDFPage->Load(m_pDocument->GetPDFDoc(), pageDict);

-  m_pPDFPage->ParseContent(nullptr);

-

-  return TRUE;

-}

-

-FX_FLOAT CPDFXFA_Page::GetPageWidth() {

-  ASSERT(m_pDocument != NULL);

-

-  if (!m_pPDFPage && !m_pXFAPageView)

-    return 0.0f;

-

-  int nDocType = m_pDocument->GetDocType();

-  switch (nDocType) {

-    case DOCTYPE_DYNAMIC_XFA: {

-      if (m_pXFAPageView) {

-        CFX_RectF rect;

-        m_pXFAPageView->GetPageViewRect(rect);

-        return rect.width;

-      }

-    } break;

-    case DOCTYPE_STATIC_XFA:

-    case DOCTYPE_PDF: {

-      if (m_pPDFPage)

-        return m_pPDFPage->GetPageWidth();

-    } break;

-    default:

-      return 0.0f;

-  }

-

-  return 0.0f;

-}

-

-FX_FLOAT CPDFXFA_Page::GetPageHeight() {

-  ASSERT(m_pDocument != NULL);

-

-  if (!m_pPDFPage && !m_pXFAPageView)

-    return 0.0f;

-

-  int nDocType = m_pDocument->GetDocType();

-  switch (nDocType) {

-    case DOCTYPE_PDF:

-    case DOCTYPE_STATIC_XFA: {

-      if (m_pPDFPage)

-        return m_pPDFPage->GetPageHeight();

-    } break;

-    case DOCTYPE_DYNAMIC_XFA: {

-      if (m_pXFAPageView) {

-        CFX_RectF rect;

-        m_pXFAPageView->GetPageViewRect(rect);

-        return rect.height;

-      }

-    } break;

-    default:

-      return 0.0f;

-  }

-

-  return 0.0f;

-}

-

-void CPDFXFA_Page::DeviceToPage(int start_x,

-                                int start_y,

-                                int size_x,

-                                int size_y,

-                                int rotate,

-                                int device_x,

-                                int device_y,

-                                double* page_x,

-                                double* page_y) {

-  ASSERT(m_pDocument != NULL);

-

-  if (!m_pPDFPage && !m_pXFAPageView)

-    return;

-

-  CFX_Matrix page2device;

-  CFX_Matrix device2page;

-  FX_FLOAT page_x_f, page_y_f;

-

-  GetDisplayMatrix(page2device, start_x, start_y, size_x, size_y, rotate);

-

-  device2page.SetReverse(page2device);

-  device2page.Transform((FX_FLOAT)(device_x), (FX_FLOAT)(device_y), page_x_f,

-                        page_y_f);

-

-  *page_x = (page_x_f);

-  *page_y = (page_y_f);

-}

-

-void CPDFXFA_Page::PageToDevice(int start_x,

-                                int start_y,

-                                int size_x,

-                                int size_y,

-                                int rotate,

-                                double page_x,

-                                double page_y,

-                                int* device_x,

-                                int* device_y) {

-  if (!m_pPDFPage && !m_pXFAPageView)

-    return;

-

-  CFX_Matrix page2device;

-  FX_FLOAT device_x_f, device_y_f;

-

-  GetDisplayMatrix(page2device, start_x, start_y, size_x, size_y, rotate);

-

-  page2device.Transform(((FX_FLOAT)page_x), ((FX_FLOAT)page_y), device_x_f,

-                        device_y_f);

-

-  *device_x = FXSYS_round(device_x_f);

-  *device_y = FXSYS_round(device_y_f);

-}

-

-void CPDFXFA_Page::GetDisplayMatrix(CFX_Matrix& matrix,

-                                    int xPos,

-                                    int yPos,

-                                    int xSize,

-                                    int ySize,

-                                    int iRotate) const {

-  ASSERT(m_pDocument != NULL);

-

-  if (!m_pPDFPage && !m_pXFAPageView)

-    return;

-

-  int nDocType = m_pDocument->GetDocType();

-  switch (nDocType) {

-    case DOCTYPE_DYNAMIC_XFA: {

-      if (m_pXFAPageView) {

-        CFX_Rect rect;

-        rect.Set(xPos, yPos, xSize, ySize);

-        m_pXFAPageView->GetDisplayMatrix(matrix, rect, iRotate);

-      }

-    } break;

-    case DOCTYPE_PDF:

-    case DOCTYPE_STATIC_XFA: {

-      if (m_pPDFPage) {

-        m_pPDFPage->GetDisplayMatrix(matrix, xPos, yPos, xSize, ySize, iRotate);

-      }

-    } break;

-    default:

-      return;

-  }

-}

+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "fpdfsdk/include/fsdk_define.h"
+#include "fpdfsdk/include/fsdk_mgr.h"
+#include "fpdfsdk/include/fpdfxfa/fpdfxfa_util.h"
+#include "fpdfsdk/include/fpdfxfa/fpdfxfa_doc.h"
+#include "fpdfsdk/include/fpdfxfa/fpdfxfa_page.h"
+
+CPDFXFA_Page::CPDFXFA_Page(CPDFXFA_Document* pDoc, int page_index)
+    : m_pPDFPage(NULL),
+      m_pXFAPageView(NULL),
+      m_iPageIndex(page_index),
+      m_pDocument(pDoc),
+      m_iRef(1) {}
+
+CPDFXFA_Page::~CPDFXFA_Page() {
+  if (m_pPDFPage)
+    delete m_pPDFPage;
+  m_pPDFPage = NULL;
+  m_pXFAPageView = NULL;
+}
+
+void CPDFXFA_Page::Release() {
+  m_iRef--;
+  if (m_iRef > 0)
+    return;
+
+  if (m_pDocument)
+    m_pDocument->RemovePage(this);
+
+  delete this;
+}
+
+FX_BOOL CPDFXFA_Page::LoadPDFPage() {
+  if (!m_pDocument)
+    return FALSE;
+  CPDF_Document* pPDFDoc = m_pDocument->GetPDFDoc();
+  if (pPDFDoc) {
+    CPDF_Dictionary* pDict = pPDFDoc->GetPage(m_iPageIndex);
+    if (pDict == NULL)
+      return FALSE;
+    if (m_pPDFPage) {
+      if (m_pPDFPage->m_pFormDict == pDict)
+        return TRUE;
+
+      delete m_pPDFPage;
+      m_pPDFPage = NULL;
+    }
+
+    m_pPDFPage = new CPDF_Page;
+    m_pPDFPage->Load(pPDFDoc, pDict);
+    m_pPDFPage->ParseContent(nullptr);
+    return TRUE;
+  }
+
+  return FALSE;
+}
+
+FX_BOOL CPDFXFA_Page::LoadXFAPageView() {
+  if (!m_pDocument)
+    return FALSE;
+  IXFA_Doc* pXFADoc = m_pDocument->GetXFADoc();
+  if (!pXFADoc)
+    return FALSE;
+
+  IXFA_DocView* pXFADocView = m_pDocument->GetXFADocView();
+  if (!pXFADocView)
+    return FALSE;
+
+  IXFA_PageView* pPageView = pXFADocView->GetPageView(m_iPageIndex);
+  if (!pPageView)
+    return FALSE;
+
+  if (m_pXFAPageView == pPageView)
+    return TRUE;
+
+  m_pXFAPageView = pPageView;
+  (void)m_pXFAPageView->LoadPageView(nullptr);
+  return TRUE;
+}
+
+FX_BOOL CPDFXFA_Page::LoadPage() {
+  if (!m_pDocument || m_iPageIndex < 0)
+    return FALSE;
+
+  int iDocType = m_pDocument->GetDocType();
+  switch (iDocType) {
+    case DOCTYPE_PDF:
+    case DOCTYPE_STATIC_XFA: {
+      return LoadPDFPage();
+    }
+    case DOCTYPE_DYNAMIC_XFA: {
+      return LoadXFAPageView();
+    }
+    default:
+      return FALSE;
+  }
+
+  return FALSE;
+}
+
+FX_BOOL CPDFXFA_Page::LoadPDFPage(CPDF_Dictionary* pageDict) {
+  if (!m_pDocument || m_iPageIndex < 0 || !pageDict)
+    return FALSE;
+
+  if (m_pPDFPage)
+    delete m_pPDFPage;
+
+  m_pPDFPage = new CPDF_Page();
+  m_pPDFPage->Load(m_pDocument->GetPDFDoc(), pageDict);
+  m_pPDFPage->ParseContent(nullptr);
+
+  return TRUE;
+}
+
+FX_FLOAT CPDFXFA_Page::GetPageWidth() {
+  ASSERT(m_pDocument != NULL);
+
+  if (!m_pPDFPage && !m_pXFAPageView)
+    return 0.0f;
+
+  int nDocType = m_pDocument->GetDocType();
+  switch (nDocType) {
+    case DOCTYPE_DYNAMIC_XFA: {
+      if (m_pXFAPageView) {
+        CFX_RectF rect;
+        m_pXFAPageView->GetPageViewRect(rect);
+        return rect.width;
+      }
+    } break;
+    case DOCTYPE_STATIC_XFA:
+    case DOCTYPE_PDF: {
+      if (m_pPDFPage)
+        return m_pPDFPage->GetPageWidth();
+    } break;
+    default:
+      return 0.0f;
+  }
+
+  return 0.0f;
+}
+
+FX_FLOAT CPDFXFA_Page::GetPageHeight() {
+  ASSERT(m_pDocument != NULL);
+
+  if (!m_pPDFPage && !m_pXFAPageView)
+    return 0.0f;
+
+  int nDocType = m_pDocument->GetDocType();
+  switch (nDocType) {
+    case DOCTYPE_PDF:
+    case DOCTYPE_STATIC_XFA: {
+      if (m_pPDFPage)
+        return m_pPDFPage->GetPageHeight();
+    } break;
+    case DOCTYPE_DYNAMIC_XFA: {
+      if (m_pXFAPageView) {
+        CFX_RectF rect;
+        m_pXFAPageView->GetPageViewRect(rect);
+        return rect.height;
+      }
+    } break;
+    default:
+      return 0.0f;
+  }
+
+  return 0.0f;
+}
+
+void CPDFXFA_Page::DeviceToPage(int start_x,
+                                int start_y,
+                                int size_x,
+                                int size_y,
+                                int rotate,
+                                int device_x,
+                                int device_y,
+                                double* page_x,
+                                double* page_y) {
+  ASSERT(m_pDocument != NULL);
+
+  if (!m_pPDFPage && !m_pXFAPageView)
+    return;
+
+  CFX_Matrix page2device;
+  CFX_Matrix device2page;
+  FX_FLOAT page_x_f, page_y_f;
+
+  GetDisplayMatrix(page2device, start_x, start_y, size_x, size_y, rotate);
+
+  device2page.SetReverse(page2device);
+  device2page.Transform((FX_FLOAT)(device_x), (FX_FLOAT)(device_y), page_x_f,
+                        page_y_f);
+
+  *page_x = (page_x_f);
+  *page_y = (page_y_f);
+}
+
+void CPDFXFA_Page::PageToDevice(int start_x,
+                                int start_y,
+                                int size_x,
+                                int size_y,
+                                int rotate,
+                                double page_x,
+                                double page_y,
+                                int* device_x,
+                                int* device_y) {
+  if (!m_pPDFPage && !m_pXFAPageView)
+    return;
+
+  CFX_Matrix page2device;
+  FX_FLOAT device_x_f, device_y_f;
+
+  GetDisplayMatrix(page2device, start_x, start_y, size_x, size_y, rotate);
+
+  page2device.Transform(((FX_FLOAT)page_x), ((FX_FLOAT)page_y), device_x_f,
+                        device_y_f);
+
+  *device_x = FXSYS_round(device_x_f);
+  *device_y = FXSYS_round(device_y_f);
+}
+
+void CPDFXFA_Page::GetDisplayMatrix(CFX_Matrix& matrix,
+                                    int xPos,
+                                    int yPos,
+                                    int xSize,
+                                    int ySize,
+                                    int iRotate) const {
+  ASSERT(m_pDocument != NULL);
+
+  if (!m_pPDFPage && !m_pXFAPageView)
+    return;
+
+  int nDocType = m_pDocument->GetDocType();
+  switch (nDocType) {
+    case DOCTYPE_DYNAMIC_XFA: {
+      if (m_pXFAPageView) {
+        CFX_Rect rect;
+        rect.Set(xPos, yPos, xSize, ySize);
+        m_pXFAPageView->GetDisplayMatrix(matrix, rect, iRotate);
+      }
+    } break;
+    case DOCTYPE_PDF:
+    case DOCTYPE_STATIC_XFA: {
+      if (m_pPDFPage) {
+        m_pPDFPage->GetDisplayMatrix(matrix, xPos, yPos, xSize, ySize, iRotate);
+      }
+    } break;
+    default:
+      return;
+  }
+}
diff --git a/fpdfsdk/src/fpdfxfa/fpdfxfa_util.cpp b/fpdfsdk/src/fpdfxfa/fpdfxfa_util.cpp
index dc1cf9b..5f8a9f0 100644
--- a/fpdfsdk/src/fpdfxfa/fpdfxfa_util.cpp
+++ b/fpdfsdk/src/fpdfxfa/fpdfxfa_util.cpp
@@ -1,65 +1,65 @@
-// Copyright 2014 PDFium Authors. All rights reserved.

-// Use of this source code is governed by a BSD-style license that can be

-// found in the LICENSE file.

-

-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com

-

-#include "fpdfsdk/include/fsdk_define.h"

-#include "fpdfsdk/include/fsdk_mgr.h"

-#include "fpdfsdk/include/fpdfxfa/fpdfxfa_util.h"

-

-CFX_PtrArray CXFA_FWLAdapterTimerMgr::ms_timerArray;

-

-FWL_ERR CXFA_FWLAdapterTimerMgr::Start(IFWL_Timer* pTimer,

-                                       FX_DWORD dwElapse,

-                                       FWL_HTIMER& hTimer,

-                                       FX_BOOL bImmediately /* = TRUE */) {

-  if (m_pEnv) {

-    uint32_t uIDEvent = m_pEnv->FFI_SetTimer(dwElapse, TimerProc);

-    CFWL_TimerInfo* pInfo = new CFWL_TimerInfo;

-    pInfo->uIDEvent = uIDEvent;

-    pInfo->pTimer = pTimer;

-    ms_timerArray.Add(pInfo);

-

-    hTimer = (FWL_HTIMER)pInfo;

-    return FWL_ERR_Succeeded;

-  }

-

-  return FWL_ERR_Indefinite;

-}

-

-FWL_ERR CXFA_FWLAdapterTimerMgr::Stop(FWL_HTIMER hTimer) {

-  if (!hTimer)

-    return FWL_ERR_Indefinite;

-

-  if (m_pEnv) {

-    CFWL_TimerInfo* pInfo = (CFWL_TimerInfo*)hTimer;

-

-    m_pEnv->FFI_KillTimer(pInfo->uIDEvent);

-

-    int32_t index = ms_timerArray.Find(pInfo);

-    if (index >= 0) {

-      ms_timerArray.RemoveAt(index);

-      delete pInfo;

-    }

-    return FWL_ERR_Succeeded;

-  }

-

-  return FWL_ERR_Indefinite;

-}

-

-void CXFA_FWLAdapterTimerMgr::TimerProc(int32_t idEvent) {

-  CFWL_TimerInfo* pInfo = NULL;

-  int32_t iCount = CXFA_FWLAdapterTimerMgr::ms_timerArray.GetSize();

-  for (int32_t i = 0; i < iCount; i++) {

-    CFWL_TimerInfo* pTemp =

-        (CFWL_TimerInfo*)CXFA_FWLAdapterTimerMgr::ms_timerArray.GetAt(i);

-    if (pTemp->uIDEvent == idEvent) {

-      pInfo = pTemp;

-      break;

-    }

-  }

-  if (pInfo) {

-    pInfo->pTimer->Run((FWL_HTIMER)pInfo);

-  }

-}

+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "fpdfsdk/include/fsdk_define.h"
+#include "fpdfsdk/include/fsdk_mgr.h"
+#include "fpdfsdk/include/fpdfxfa/fpdfxfa_util.h"
+
+CFX_PtrArray CXFA_FWLAdapterTimerMgr::ms_timerArray;
+
+FWL_ERR CXFA_FWLAdapterTimerMgr::Start(IFWL_Timer* pTimer,
+                                       FX_DWORD dwElapse,
+                                       FWL_HTIMER& hTimer,
+                                       FX_BOOL bImmediately /* = TRUE */) {
+  if (m_pEnv) {
+    uint32_t uIDEvent = m_pEnv->FFI_SetTimer(dwElapse, TimerProc);
+    CFWL_TimerInfo* pInfo = new CFWL_TimerInfo;
+    pInfo->uIDEvent = uIDEvent;
+    pInfo->pTimer = pTimer;
+    ms_timerArray.Add(pInfo);
+
+    hTimer = (FWL_HTIMER)pInfo;
+    return FWL_ERR_Succeeded;
+  }
+
+  return FWL_ERR_Indefinite;
+}
+
+FWL_ERR CXFA_FWLAdapterTimerMgr::Stop(FWL_HTIMER hTimer) {
+  if (!hTimer)
+    return FWL_ERR_Indefinite;
+
+  if (m_pEnv) {
+    CFWL_TimerInfo* pInfo = (CFWL_TimerInfo*)hTimer;
+
+    m_pEnv->FFI_KillTimer(pInfo->uIDEvent);
+
+    int32_t index = ms_timerArray.Find(pInfo);
+    if (index >= 0) {
+      ms_timerArray.RemoveAt(index);
+      delete pInfo;
+    }
+    return FWL_ERR_Succeeded;
+  }
+
+  return FWL_ERR_Indefinite;
+}
+
+void CXFA_FWLAdapterTimerMgr::TimerProc(int32_t idEvent) {
+  CFWL_TimerInfo* pInfo = NULL;
+  int32_t iCount = CXFA_FWLAdapterTimerMgr::ms_timerArray.GetSize();
+  for (int32_t i = 0; i < iCount; i++) {
+    CFWL_TimerInfo* pTemp =
+        (CFWL_TimerInfo*)CXFA_FWLAdapterTimerMgr::ms_timerArray.GetAt(i);
+    if (pTemp->uIDEvent == idEvent) {
+      pInfo = pTemp;
+      break;
+    }
+  }
+  if (pInfo) {
+    pInfo->pTimer->Run((FWL_HTIMER)pInfo);
+  }
+}