| Index: core/src/fpdfdoc/doc_form.cpp
|
| diff --git a/core/src/fpdfdoc/doc_form.cpp b/core/src/fpdfdoc/doc_form.cpp
|
| index 5cc2a66a89c3817a8b53dfed18708c3588cb5ada..8d8a836cabe2f145ceeb05fe277aebc3d8b28206 100644
|
| --- a/core/src/fpdfdoc/doc_form.cpp
|
| +++ b/core/src/fpdfdoc/doc_form.cpp
|
| @@ -9,9 +9,9 @@
|
|
|
| const int nMaxRecursion = 32;
|
|
|
| -class _CFieldNameExtractor {
|
| +class CFieldNameExtractor {
|
| public:
|
| - _CFieldNameExtractor(const CFX_WideString& full_name) {
|
| + explicit CFieldNameExtractor(const CFX_WideString& full_name) {
|
| m_pStart = full_name.c_str();
|
| m_pEnd = m_pStart + full_name.GetLength();
|
| m_pCur = m_pStart;
|
| @@ -151,7 +151,7 @@ void CFieldTree::SetField(const CFX_WideString& full_name,
|
| if (full_name == L"") {
|
| return;
|
| }
|
| - _CFieldNameExtractor name_extractor(full_name);
|
| + CFieldNameExtractor name_extractor(full_name);
|
| const FX_WCHAR* pName;
|
| FX_STRSIZE nLength;
|
| name_extractor.GetNext(pName, nLength);
|
| @@ -173,7 +173,7 @@ CPDF_FormField* CFieldTree::GetField(const CFX_WideString& full_name) {
|
| if (full_name == L"") {
|
| return NULL;
|
| }
|
| - _CFieldNameExtractor name_extractor(full_name);
|
| + CFieldNameExtractor name_extractor(full_name);
|
| const FX_WCHAR* pName;
|
| FX_STRSIZE nLength;
|
| name_extractor.GetNext(pName, nLength);
|
| @@ -190,7 +190,7 @@ CPDF_FormField* CFieldTree::RemoveField(const CFX_WideString& full_name) {
|
| if (full_name == L"") {
|
| return NULL;
|
| }
|
| - _CFieldNameExtractor name_extractor(full_name);
|
| + CFieldNameExtractor name_extractor(full_name);
|
| const FX_WCHAR* pName;
|
| FX_STRSIZE nLength;
|
| name_extractor.GetNext(pName, nLength);
|
| @@ -219,7 +219,7 @@ CFieldTree::_Node* CFieldTree::FindNode(const CFX_WideString& full_name) {
|
| if (full_name == L"") {
|
| return NULL;
|
| }
|
| - _CFieldNameExtractor name_extractor(full_name);
|
| + CFieldNameExtractor name_extractor(full_name);
|
| const FX_WCHAR* pName;
|
| FX_STRSIZE nLength;
|
| name_extractor.GetNext(pName, nLength);
|
| @@ -765,19 +765,7 @@ void CPDF_InterForm::GetAllFieldNames(CFX_WideStringArray& allFieldNames) {
|
| }
|
| }
|
| }
|
| -FX_BOOL CPDF_InterForm::IsValidFormField(const void* pField) {
|
| - if (pField == NULL) {
|
| - return FALSE;
|
| - }
|
| - int nCount = m_pFieldTree->m_Root.CountFields();
|
| - for (int i = 0; i < nCount; i++) {
|
| - CPDF_FormField* pFormField = m_pFieldTree->m_Root.GetField(i);
|
| - if (pField == pFormField) {
|
| - return TRUE;
|
| - }
|
| - }
|
| - return FALSE;
|
| -}
|
| +
|
| CPDF_FormField* CPDF_InterForm::GetFieldByDict(
|
| CPDF_Dictionary* pFieldDict) const {
|
| if (pFieldDict == NULL) {
|
| @@ -946,58 +934,45 @@ int CPDF_InterForm::GetFormAlignment() {
|
| }
|
| return m_pFormDict->GetInteger("Q", 0);
|
| }
|
| -FX_BOOL CPDF_InterForm::ResetForm(const CFX_PtrArray& fields,
|
| - FX_BOOL bIncludeOrExclude,
|
| - FX_BOOL bNotify) {
|
| - if (bNotify && m_pFormNotify != NULL) {
|
| - int iRet = m_pFormNotify->BeforeFormReset(this);
|
| - if (iRet < 0) {
|
| - return FALSE;
|
| - }
|
| - }
|
| +
|
| +bool CPDF_InterForm::ResetForm(const std::vector<CPDF_FormField*>& fields,
|
| + bool bIncludeOrExclude,
|
| + bool bNotify) {
|
| + if (bNotify && m_pFormNotify && m_pFormNotify->BeforeFormReset(this) < 0)
|
| + return false;
|
| +
|
| int nCount = m_pFieldTree->m_Root.CountFields();
|
| - for (int i = 0; i < nCount; i++) {
|
| + for (int i = 0; i < nCount; ++i) {
|
| CPDF_FormField* pField = m_pFieldTree->m_Root.GetField(i);
|
| - if (pField == NULL) {
|
| + if (!pField)
|
| continue;
|
| - }
|
| - FX_BOOL bFind = FALSE;
|
| - int iCount = fields.GetSize();
|
| - for (int i = 0; i < iCount; i++) {
|
| - if (pField == (CPDF_FormField*)fields[i]) {
|
| - bFind = TRUE;
|
| - break;
|
| - }
|
| - }
|
| - if ((bIncludeOrExclude && bFind) || (!bIncludeOrExclude && !bFind)) {
|
| +
|
| + auto it = std::find(fields.begin(), fields.end(), pField);
|
| + if (bIncludeOrExclude == (it != fields.end()))
|
| pField->ResetField(bNotify);
|
| - }
|
| }
|
| - if (bNotify && m_pFormNotify != NULL) {
|
| + if (bNotify && m_pFormNotify)
|
| m_pFormNotify->AfterFormReset(this);
|
| - }
|
| - return TRUE;
|
| + return true;
|
| }
|
| -FX_BOOL CPDF_InterForm::ResetForm(FX_BOOL bNotify) {
|
| - if (bNotify && m_pFormNotify != NULL) {
|
| - int iRet = m_pFormNotify->BeforeFormReset(this);
|
| - if (iRet < 0) {
|
| - return FALSE;
|
| - }
|
| - }
|
| +
|
| +bool CPDF_InterForm::ResetForm(bool bNotify) {
|
| + if (bNotify && m_pFormNotify && m_pFormNotify->BeforeFormReset(this) < 0)
|
| + return false;
|
| +
|
| int nCount = m_pFieldTree->m_Root.CountFields();
|
| - for (int i = 0; i < nCount; i++) {
|
| + for (int i = 0; i < nCount; ++i) {
|
| CPDF_FormField* pField = m_pFieldTree->m_Root.GetField(i);
|
| - if (pField == NULL) {
|
| + if (!pField)
|
| continue;
|
| - }
|
| +
|
| pField->ResetField(bNotify);
|
| }
|
| - if (bNotify && m_pFormNotify != NULL) {
|
| + if (bNotify && m_pFormNotify)
|
| m_pFormNotify->AfterFormReset(this);
|
| - }
|
| - return TRUE;
|
| + return true;
|
| }
|
| +
|
| void CPDF_InterForm::LoadField(CPDF_Dictionary* pFieldDict, int nLevel) {
|
| if (nLevel > nMaxRecursion) {
|
| return;
|
| @@ -1126,52 +1101,58 @@ CPDF_FormControl* CPDF_InterForm::AddControl(const CPDF_FormField* pField,
|
| ((CPDF_FormField*)pField)->m_ControlList.Add(pControl);
|
| return pControl;
|
| }
|
| +
|
| CPDF_FormField* CPDF_InterForm::CheckRequiredFields(
|
| - const CFX_PtrArray* fields,
|
| - FX_BOOL bIncludeOrExclude) const {
|
| + const std::vector<CPDF_FormField*>* fields,
|
| + bool bIncludeOrExclude) const {
|
| int nCount = m_pFieldTree->m_Root.CountFields();
|
| - for (int i = 0; i < nCount; i++) {
|
| + for (int i = 0; i < nCount; ++i) {
|
| CPDF_FormField* pField = m_pFieldTree->m_Root.GetField(i);
|
| - if (pField == NULL) {
|
| + if (!pField)
|
| continue;
|
| - }
|
| +
|
| int32_t iType = pField->GetType();
|
| if (iType == CPDF_FormField::PushButton ||
|
| iType == CPDF_FormField::CheckBox || iType == CPDF_FormField::ListBox) {
|
| continue;
|
| }
|
| FX_DWORD dwFlags = pField->GetFieldFlags();
|
| - if (dwFlags & 0x04) {
|
| + // TODO(thestig): Look up these magic numbers and add constants for them.
|
| + if (dwFlags & 0x04)
|
| continue;
|
| +
|
| + bool bFind = true;
|
| + if (fields) {
|
| + auto it = std::find(fields->begin(), fields->end(), pField);
|
| + bFind = (it != fields->end());
|
| }
|
| - FX_BOOL bFind = TRUE;
|
| - if (fields != NULL) {
|
| - bFind = fields->Find(pField, 0) >= 0;
|
| - }
|
| - if ((bIncludeOrExclude && bFind) || (!bIncludeOrExclude && !bFind)) {
|
| + if (bIncludeOrExclude == bFind) {
|
| CPDF_Dictionary* pFieldDict = pField->m_pDict;
|
| if ((dwFlags & 0x02) != 0 && pFieldDict->GetString("V").IsEmpty()) {
|
| return pField;
|
| }
|
| }
|
| }
|
| - return NULL;
|
| + return nullptr;
|
| }
|
| +
|
| CFDF_Document* CPDF_InterForm::ExportToFDF(const CFX_WideStringC& pdf_path,
|
| - FX_BOOL bSimpleFileSpec) const {
|
| - CFX_PtrArray fields;
|
| + bool bSimpleFileSpec) const {
|
| + std::vector<CPDF_FormField*> fields;
|
| int nCount = m_pFieldTree->m_Root.CountFields();
|
| - for (int i = 0; i < nCount; i++) {
|
| - CPDF_FormField* pField = m_pFieldTree->m_Root.GetField(i);
|
| - fields.Add(pField);
|
| - }
|
| - return ExportToFDF(pdf_path, fields, TRUE, bSimpleFileSpec);
|
| + for (int i = 0; i < nCount; ++i)
|
| + fields.push_back(m_pFieldTree->m_Root.GetField(i));
|
| + return ExportToFDF(pdf_path, fields, true, bSimpleFileSpec);
|
| }
|
| +
|
| +// TODO(thestig): Fix this.
|
| CFX_WideString FILESPEC_EncodeFileName(const CFX_WideStringC& filepath);
|
| -CFDF_Document* CPDF_InterForm::ExportToFDF(const CFX_WideStringC& pdf_path,
|
| - CFX_PtrArray& fields,
|
| - FX_BOOL bIncludeOrExclude,
|
| - FX_BOOL bSimpleFileSpec) const {
|
| +
|
| +CFDF_Document* CPDF_InterForm::ExportToFDF(
|
| + const CFX_WideStringC& pdf_path,
|
| + const std::vector<CPDF_FormField*>& fields,
|
| + bool bIncludeOrExclude,
|
| + bool bSimpleFileSpec) const {
|
| CFDF_Document* pDoc = CFDF_Document::CreateNewDoc();
|
| if (pDoc == NULL) {
|
| return NULL;
|
| @@ -1201,23 +1182,23 @@ CFDF_Document* CPDF_InterForm::ExportToFDF(const CFX_WideStringC& pdf_path,
|
| continue;
|
| }
|
| FX_DWORD dwFlags = pField->GetFieldFlags();
|
| - if (dwFlags & 0x04) {
|
| + if (dwFlags & 0x04)
|
| continue;
|
| - }
|
| - FX_BOOL bFind = fields.Find(pField, 0) >= 0;
|
| - if ((bIncludeOrExclude && bFind) || (!bIncludeOrExclude && !bFind)) {
|
| - if ((dwFlags & 0x02) != 0 && pField->m_pDict->GetString("V").IsEmpty()) {
|
| +
|
| + auto it = std::find(fields.begin(), fields.end(), pField);
|
| + if (bIncludeOrExclude == (it != fields.end())) {
|
| + if ((dwFlags & 0x02) != 0 && pField->m_pDict->GetString("V").IsEmpty())
|
| continue;
|
| - }
|
| +
|
| CFX_WideString fullname = GetFullName(pField->GetFieldDict());
|
| CPDF_Dictionary* pFieldDict = CPDF_Dictionary::Create();
|
| - if (pFieldDict == NULL) {
|
| - return NULL;
|
| - }
|
| + if (!pFieldDict)
|
| + return nullptr;
|
| +
|
| CPDF_String* pString = CPDF_String::Create(fullname);
|
| - if (pString == NULL) {
|
| + if (!pString) {
|
| pFieldDict->Release();
|
| - return NULL;
|
| + return nullptr;
|
| }
|
| pFieldDict->SetAt("T", pString);
|
| if (pField->GetType() == CPDF_FormField::CheckBox ||
|
| @@ -1225,16 +1206,14 @@ CFDF_Document* CPDF_InterForm::ExportToFDF(const CFX_WideStringC& pdf_path,
|
| CFX_WideString csExport = pField->GetCheckValue(FALSE);
|
| CFX_ByteString csBExport = PDF_EncodeText(csExport);
|
| CPDF_Object* pOpt = FPDF_GetFieldAttr(pField->m_pDict, "Opt");
|
| - if (pOpt == NULL) {
|
| - pFieldDict->SetAtName("V", csBExport);
|
| - } else {
|
| + if (pOpt)
|
| pFieldDict->SetAtString("V", csBExport);
|
| - }
|
| + else
|
| + pFieldDict->SetAtName("V", csBExport);
|
| } else {
|
| CPDF_Object* pV = FPDF_GetFieldAttr(pField->m_pDict, "V");
|
| - if (pV != NULL) {
|
| + if (pV)
|
| pFieldDict->SetAt("V", pV->Clone(TRUE));
|
| - }
|
| }
|
| pFields->Add(pFieldDict);
|
| }
|
|
|