| Index: fpdfsdk/src/fsdk_baseform.cpp
|
| diff --git a/fpdfsdk/src/fsdk_baseform.cpp b/fpdfsdk/src/fsdk_baseform.cpp
|
| index 5c4269e354c1c8d2063cf5357f65c896faabe409..06ed0f4c22df4a0a3d9c664d90d6c6e7f5f02d10 100644
|
| --- a/fpdfsdk/src/fsdk_baseform.cpp
|
| +++ b/fpdfsdk/src/fsdk_baseform.cpp
|
| @@ -15,10 +15,6 @@
|
| #include "../include/javascript/IJavaScript.h"
|
| #include "third_party/base/nonstd_unique_ptr.h"
|
|
|
| -//------------------------------------------------------------------------------------
|
| -//* CPDFSDK_Widget
|
| -//------------------------------------------------------------------------------------
|
| -
|
| #define IsFloatZero(f) ((f) < 0.01 && (f) > -0.01)
|
| #define IsFloatBigger(fa, fb) ((fa) > (fb) && !IsFloatZero((fa) - (fb)))
|
| #define IsFloatSmaller(fa, fb) ((fa) < (fb) && !IsFloatZero((fa) - (fb)))
|
| @@ -1499,9 +1495,9 @@ void CPDFSDK_Widget::ResetAppearance_ComboBox(const FX_WCHAR* sValue) {
|
|
|
| pEdit->Initialize();
|
|
|
| - if (sValue)
|
| + if (sValue) {
|
| pEdit->SetText(sValue);
|
| - else {
|
| + } else {
|
| int32_t nCurSel = pField->GetSelectedIndex(0);
|
|
|
| if (nCurSel < 0)
|
| @@ -2211,30 +2207,25 @@ CPDFSDK_Widget* CPDFSDK_InterForm::GetWidget(CPDF_FormControl* pControl) const {
|
| return (CPDFSDK_Widget*)pPage->GetAnnotByDict(pControlDict);
|
| }
|
|
|
| -void CPDFSDK_InterForm::GetWidgets(const CFX_WideString& sFieldName,
|
| - CFX_PtrArray& widgets) {
|
| - ASSERT(m_pInterForm != NULL);
|
| -
|
| - for (int i = 0, sz = m_pInterForm->CountFields(sFieldName); i < sz; i++) {
|
| +void CPDFSDK_InterForm::GetWidgets(
|
| + const CFX_WideString& sFieldName,
|
| + std::vector<CPDFSDK_Widget*>* widgets) const {
|
| + for (int i = 0, sz = m_pInterForm->CountFields(sFieldName); i < sz; ++i) {
|
| CPDF_FormField* pFormField = m_pInterForm->GetField(i, sFieldName);
|
| - ASSERT(pFormField != NULL);
|
| -
|
| + ASSERT(pFormField);
|
| GetWidgets(pFormField, widgets);
|
| }
|
| }
|
|
|
| -void CPDFSDK_InterForm::GetWidgets(CPDF_FormField* pField,
|
| - CFX_PtrArray& widgets) {
|
| - ASSERT(pField != NULL);
|
| -
|
| - for (int i = 0, isz = pField->CountControls(); i < isz; i++) {
|
| +void CPDFSDK_InterForm::GetWidgets(
|
| + CPDF_FormField* pField,
|
| + std::vector<CPDFSDK_Widget*>* widgets) const {
|
| + for (int i = 0, sz = pField->CountControls(); i < sz; ++i) {
|
| CPDF_FormControl* pFormCtrl = pField->GetControl(i);
|
| - ASSERT(pFormCtrl != NULL);
|
| -
|
| + ASSERT(pFormCtrl);
|
| CPDFSDK_Widget* pWidget = GetWidget(pFormCtrl);
|
| -
|
| if (pWidget)
|
| - widgets.Add(pWidget);
|
| + widgets->push_back(pWidget);
|
| }
|
| }
|
|
|
| @@ -2584,42 +2575,27 @@ FX_BOOL CPDFSDK_InterForm::DoAction_Hide(const CPDF_Action& action) {
|
| ASSERT(action);
|
|
|
| CPDF_ActionFields af = action.GetWidgets();
|
| - CFX_PtrArray fieldObjects;
|
| - af.GetAllFields(fieldObjects);
|
| - CFX_PtrArray widgetArray;
|
| - CFX_PtrArray fields;
|
| - GetFieldFromObjects(fieldObjects, fields);
|
| + std::vector<CPDF_Object*> fieldObjects = af.GetAllFields();
|
| + std::vector<CPDF_FormField*> fields = GetFieldFromObjects(fieldObjects);
|
|
|
| FX_BOOL bHide = action.GetHideStatus();
|
| -
|
| FX_BOOL bChanged = FALSE;
|
|
|
| - for (int i = 0, sz = fields.GetSize(); i < sz; i++) {
|
| - CPDF_FormField* pField = (CPDF_FormField*)fields[i];
|
| - ASSERT(pField != NULL);
|
| -
|
| - for (int j = 0, jsz = pField->CountControls(); j < jsz; j++) {
|
| - CPDF_FormControl* pControl = pField->GetControl(j);
|
| - ASSERT(pControl != NULL);
|
| + for (CPDF_FormField* pField : fields) {
|
| + for (int i = 0, sz = pField->CountControls(); i < sz; ++i) {
|
| + CPDF_FormControl* pControl = pField->GetControl(i);
|
| + ASSERT(pControl);
|
|
|
| if (CPDFSDK_Widget* pWidget = GetWidget(pControl)) {
|
| int nFlags = pWidget->GetFlags();
|
| - if (bHide) {
|
| - nFlags &= (~ANNOTFLAG_INVISIBLE);
|
| - nFlags &= (~ANNOTFLAG_NOVIEW);
|
| - nFlags |= (ANNOTFLAG_HIDDEN);
|
| - } else {
|
| - nFlags &= (~ANNOTFLAG_INVISIBLE);
|
| - nFlags &= (~ANNOTFLAG_HIDDEN);
|
| - nFlags &= (~ANNOTFLAG_NOVIEW);
|
| - }
|
| + nFlags &= ~ANNOTFLAG_INVISIBLE;
|
| + nFlags &= ~ANNOTFLAG_NOVIEW;
|
| + if (bHide)
|
| + nFlags |= ANNOTFLAG_HIDDEN;
|
| + else
|
| + nFlags &= ~ANNOTFLAG_HIDDEN;
|
| pWidget->SetFlags(nFlags);
|
| -
|
| - CPDFSDK_PageView* pPageView = pWidget->GetPageView();
|
| - ASSERT(pPageView != NULL);
|
| -
|
| - pPageView->UpdateView(pWidget);
|
| -
|
| + pWidget->GetPageView()->UpdateView(pWidget);
|
| bChanged = TRUE;
|
| }
|
| }
|
| @@ -2638,31 +2614,28 @@ FX_BOOL CPDFSDK_InterForm::DoAction_SubmitForm(const CPDF_Action& action) {
|
| if (pActionDict->KeyExist("Fields")) {
|
| CPDF_ActionFields af = action.GetWidgets();
|
| FX_DWORD dwFlags = action.GetFlags();
|
| - CFX_PtrArray fieldObjects;
|
| - af.GetAllFields(fieldObjects);
|
| -
|
| - CFX_PtrArray fields;
|
| - GetFieldFromObjects(fieldObjects, fields);
|
| - if (fields.GetSize() != 0) {
|
| - FX_BOOL bIncludeOrExclude = !(dwFlags & 0x01);
|
| + std::vector<CPDF_Object*> fieldObjects = af.GetAllFields();
|
| + std::vector<CPDF_FormField*> fields = GetFieldFromObjects(fieldObjects);
|
| + if (!fields.empty()) {
|
| + bool bIncludeOrExclude = !(dwFlags & 0x01);
|
| if (m_pInterForm->CheckRequiredFields(&fields, bIncludeOrExclude))
|
| return FALSE;
|
|
|
| return SubmitFields(sDestination, fields, bIncludeOrExclude, FALSE);
|
| }
|
| }
|
| - if (m_pInterForm->CheckRequiredFields())
|
| + if (m_pInterForm->CheckRequiredFields(nullptr, true))
|
| return FALSE;
|
|
|
| return SubmitForm(sDestination, FALSE);
|
| }
|
|
|
| -FX_BOOL CPDFSDK_InterForm::SubmitFields(const CFX_WideString& csDestination,
|
| - const CFX_PtrArray& fields,
|
| - FX_BOOL bIncludeOrExclude,
|
| - FX_BOOL bUrlEncoded) {
|
| +FX_BOOL CPDFSDK_InterForm::SubmitFields(
|
| + const CFX_WideString& csDestination,
|
| + const std::vector<CPDF_FormField*>& fields,
|
| + FX_BOOL bIncludeOrExclude,
|
| + FX_BOOL bUrlEncoded) {
|
| CPDFDoc_Environment* pEnv = m_pDocument->GetEnv();
|
| - ASSERT(pEnv != NULL);
|
|
|
| CFX_ByteTextBuf textBuf;
|
| ExportFieldsToFDFTextBuf(fields, bIncludeOrExclude, textBuf);
|
| @@ -2670,13 +2643,10 @@ FX_BOOL CPDFSDK_InterForm::SubmitFields(const CFX_WideString& csDestination,
|
| uint8_t* pBuffer = textBuf.GetBuffer();
|
| FX_STRSIZE nBufSize = textBuf.GetLength();
|
|
|
| - if (bUrlEncoded) {
|
| - if (!FDFToURLEncodedData(pBuffer, nBufSize))
|
| - return FALSE;
|
| - }
|
| + if (bUrlEncoded && !FDFToURLEncodedData(pBuffer, nBufSize))
|
| + return FALSE;
|
|
|
| pEnv->JS_docSubmitForm(pBuffer, nBufSize, csDestination.c_str());
|
| -
|
| return TRUE;
|
| }
|
|
|
| @@ -2728,20 +2698,13 @@ FX_BOOL CPDFSDK_InterForm::FDFToURLEncodedData(uint8_t*& pBuf,
|
| return TRUE;
|
| }
|
|
|
| -FX_BOOL CPDFSDK_InterForm::ExportFieldsToFDFTextBuf(const CFX_PtrArray& fields,
|
| - FX_BOOL bIncludeOrExclude,
|
| - CFX_ByteTextBuf& textBuf) {
|
| - ASSERT(m_pDocument != NULL);
|
| - ASSERT(m_pInterForm != NULL);
|
| -
|
| - CFDF_Document* pFDF = m_pInterForm->ExportToFDF(
|
| - m_pDocument->GetPath(), (CFX_PtrArray&)fields, bIncludeOrExclude);
|
| - if (!pFDF)
|
| - return FALSE;
|
| - FX_BOOL bRet = pFDF->WriteBuf(textBuf);
|
| - delete pFDF;
|
| -
|
| - return bRet;
|
| +FX_BOOL CPDFSDK_InterForm::ExportFieldsToFDFTextBuf(
|
| + const std::vector<CPDF_FormField*>& fields,
|
| + FX_BOOL bIncludeOrExclude,
|
| + CFX_ByteTextBuf& textBuf) {
|
| + nonstd::unique_ptr<CFDF_Document> pFDF(m_pInterForm->ExportToFDF(
|
| + m_pDocument->GetPath(), fields, bIncludeOrExclude));
|
| + return pFDF ? pFDF->WriteBuf(textBuf) : FALSE;
|
| }
|
|
|
| void CPDFSDK_InterForm::SynchronizeField(CPDF_FormField* pFormField,
|
| @@ -2829,44 +2792,33 @@ FX_BOOL CPDFSDK_InterForm::DoAction_ResetForm(const CPDF_Action& action) {
|
| ASSERT(action);
|
|
|
| CPDF_Dictionary* pActionDict = action.GetDict();
|
| - if (pActionDict->KeyExist("Fields")) {
|
| - CPDF_ActionFields af = action.GetWidgets();
|
| - FX_DWORD dwFlags = action.GetFlags();
|
| + if (!pActionDict->KeyExist("Fields"))
|
| + return m_pInterForm->ResetForm(true);
|
|
|
| - CFX_PtrArray fieldObjects;
|
| - af.GetAllFields(fieldObjects);
|
| - CFX_PtrArray fields;
|
| - GetFieldFromObjects(fieldObjects, fields);
|
| - return m_pInterForm->ResetForm(fields, !(dwFlags & 0x01), TRUE);
|
| - }
|
| + CPDF_ActionFields af = action.GetWidgets();
|
| + FX_DWORD dwFlags = action.GetFlags();
|
|
|
| - return m_pInterForm->ResetForm(TRUE);
|
| + std::vector<CPDF_Object*> fieldObjects = af.GetAllFields();
|
| + std::vector<CPDF_FormField*> fields = GetFieldFromObjects(fieldObjects);
|
| + return m_pInterForm->ResetForm(fields, !(dwFlags & 0x01), true);
|
| }
|
|
|
| FX_BOOL CPDFSDK_InterForm::DoAction_ImportData(const CPDF_Action& action) {
|
| return FALSE;
|
| }
|
|
|
| -void CPDFSDK_InterForm::GetFieldFromObjects(const CFX_PtrArray& objects,
|
| - CFX_PtrArray& fields) {
|
| - ASSERT(m_pInterForm != NULL);
|
| -
|
| - int iCount = objects.GetSize();
|
| - for (int i = 0; i < iCount; i++) {
|
| - CPDF_Object* pObject = static_cast<CPDF_Object*>(objects[i]);
|
| - if (!pObject)
|
| - continue;
|
| -
|
| - if (pObject->IsString()) {
|
| +std::vector<CPDF_FormField*> CPDFSDK_InterForm::GetFieldFromObjects(
|
| + const std::vector<CPDF_Object*>& objects) const {
|
| + std::vector<CPDF_FormField*> fields;
|
| + for (CPDF_Object* pObject : objects) {
|
| + if (pObject && pObject->IsString()) {
|
| CFX_WideString csName = pObject->GetUnicodeText();
|
| CPDF_FormField* pField = m_pInterForm->GetField(0, csName);
|
| if (pField)
|
| - fields.Add(pField);
|
| - } else if (pObject->IsDictionary()) {
|
| - if (m_pInterForm->IsValidFormField(pObject))
|
| - fields.Add(pObject);
|
| + fields.push_back(pField);
|
| }
|
| }
|
| + return fields;
|
| }
|
|
|
| /* ----------------------------- CPDF_FormNotify -----------------------------
|
|
|