// 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 "xfa/src/foxitlib.h"
#include "xfa/src/fxfa/src/common/xfa_common.h"
#include "xfa_ffdochandler.h"
#include "xfa_ffdoc.h"
CXFA_FFDocHandler::CXFA_FFDocHandler() {}
CXFA_FFDocHandler::~CXFA_FFDocHandler() {}
void CXFA_FFDocHandler::ReleaseDoc(IXFA_Doc* hDoc) {
  delete hDoc;  // virtual dtor.
}
IXFA_DocProvider* CXFA_FFDocHandler::GetDocProvider(IXFA_Doc* hDoc) {
  return static_cast<CXFA_FFDoc*>(hDoc)->GetDocProvider();
}
FX_DWORD CXFA_FFDocHandler::GetDocType(IXFA_Doc* hDoc) {
  return static_cast<CXFA_FFDoc*>(hDoc)->GetDocType();
}
int32_t CXFA_FFDocHandler::StartLoad(IXFA_Doc* hDoc) {
  return static_cast<CXFA_FFDoc*>(hDoc)->StartLoad();
}
int32_t CXFA_FFDocHandler::DoLoad(IXFA_Doc* hDoc, IFX_Pause* pPause) {
  return static_cast<CXFA_FFDoc*>(hDoc)->DoLoad(pPause);
}
void CXFA_FFDocHandler::StopLoad(IXFA_Doc* hDoc) {
  static_cast<CXFA_FFDoc*>(hDoc)->StopLoad();
}

IXFA_DocView* CXFA_FFDocHandler::CreateDocView(IXFA_Doc* hDoc,
                                               FX_DWORD dwView) {
  return static_cast<CXFA_FFDoc*>(hDoc)->CreateDocView(dwView);
}
int32_t CXFA_FFDocHandler::CountPackages(IXFA_Doc* hDoc) {
  return 0;
}
void CXFA_FFDocHandler::GetPackageName(IXFA_Doc* hDoc,
                                       int32_t iPackage,
                                       CFX_WideStringC& wsPackage) {}
IFDE_XMLElement* CXFA_FFDocHandler::GetPackageData(
    IXFA_Doc* hDoc,
    const CFX_WideStringC& wsPackage) {
  return static_cast<CXFA_FFDoc*>(hDoc)->GetPackageData(wsPackage);
}
FX_BOOL CXFA_FFDocHandler::SavePackage(IXFA_Doc* hDoc,
                                       const CFX_WideStringC& wsPackage,
                                       IFX_FileWrite* pFile,
                                       IXFA_ChecksumContext* pCSContext) {
  return static_cast<CXFA_FFDoc*>(hDoc)
      ->SavePackage(wsPackage, pFile, pCSContext);
}
FX_BOOL CXFA_FFDocHandler::CloseDoc(IXFA_Doc* hDoc) {
  return static_cast<CXFA_FFDoc*>(hDoc)->CloseDoc();
}

FX_BOOL CXFA_FFDocHandler::ImportData(IXFA_Doc* hDoc,
                                      IFX_FileRead* pStream,
                                      FX_BOOL bXDP) {
  return static_cast<CXFA_FFDoc*>(hDoc)->ImportData(pStream, bXDP);
}
void CXFA_FFDocHandler::SetJSERuntime(IXFA_Doc* hDoc, FXJSE_HRUNTIME hRuntime) {
  static_cast<CXFA_FFDoc*>(hDoc)->GetXFADoc()->InitScriptContext(hRuntime);
}
FXJSE_HVALUE CXFA_FFDocHandler::GetXFAScriptObject(IXFA_Doc* hDoc) {
  CXFA_Document* pXFADoc = static_cast<CXFA_FFDoc*>(hDoc)->GetXFADoc();
  if (!pXFADoc) {
    return NULL;
  }
  IXFA_ScriptContext* pScriptContext = pXFADoc->GetScriptContext();
  if (!pScriptContext) {
    return NULL;
  }
  return pScriptContext->GetJSValueFromMap(pXFADoc->GetRoot());
}
XFA_ATTRIBUTEENUM CXFA_FFDocHandler::GetRestoreState(IXFA_Doc* hDoc) {
  CXFA_Document* pXFADoc = static_cast<CXFA_FFDoc*>(hDoc)->GetXFADoc();
  if (!pXFADoc) {
    return XFA_ATTRIBUTEENUM_Unknown;
  }
  CXFA_Node* pForm = ToNode(pXFADoc->GetXFAObject(XFA_HASHCODE_Form));
  if (!pForm) {
    return XFA_ATTRIBUTEENUM_Unknown;
  }
  CXFA_Node* pSubForm = pForm->GetFirstChildByClass(XFA_ELEMENT_Subform);
  if (!pSubForm) {
    return XFA_ATTRIBUTEENUM_Unknown;
  }
  return pSubForm->GetEnum(XFA_ATTRIBUTE_RestoreState);
}
FX_BOOL CXFA_FFDocHandler::RunDocScript(IXFA_Doc* hDoc,
                                        XFA_SCRIPTTYPE eScriptType,
                                        const CFX_WideStringC& wsScript,
                                        FXJSE_HVALUE hRetValue,
                                        FXJSE_HVALUE hThisObject) {
  CXFA_Document* pXFADoc = static_cast<CXFA_FFDoc*>(hDoc)->GetXFADoc();
  if (!pXFADoc) {
    return FALSE;
  }
  IXFA_ScriptContext* pScriptContext = pXFADoc->GetScriptContext();
  if (!pScriptContext) {
    return FALSE;
  }
  return pScriptContext->RunScript(
      (XFA_SCRIPTLANGTYPE)eScriptType, wsScript, hRetValue,
      hThisObject ? (CXFA_Object*)FXJSE_Value_ToObject(hThisObject, NULL)
                  : NULL);
}
