| Index: core/fpdfdoc/cpdf_actionfields.cpp
|
| diff --git a/core/fpdfdoc/cpdf_actionfields.cpp b/core/fpdfdoc/cpdf_actionfields.cpp
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..1ad1eb4673dc5519383b1d1aa18627cff6b5ec71
|
| --- /dev/null
|
| +++ b/core/fpdfdoc/cpdf_actionfields.cpp
|
| @@ -0,0 +1,96 @@
|
| +// Copyright 2016 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 "core/fpdfdoc/include/cpdf_actionfields.h"
|
| +
|
| +#include "core/fpdfapi/fpdf_parser/include/cpdf_array.h"
|
| +#include "core/fpdfapi/fpdf_parser/include/cpdf_dictionary.h"
|
| +#include "core/fpdfdoc/include/cpdf_action.h"
|
| +
|
| +size_t CPDF_ActionFields::GetFieldsCount() const {
|
| + if (!m_pAction)
|
| + return 0;
|
| +
|
| + CPDF_Dictionary* pDict = m_pAction->GetDict();
|
| + if (!pDict)
|
| + return 0;
|
| +
|
| + CFX_ByteString csType = pDict->GetStringBy("S");
|
| + CPDF_Object* pFields = nullptr;
|
| + if (csType == "Hide")
|
| + pFields = pDict->GetDirectObjectBy("T");
|
| + else
|
| + pFields = pDict->GetArrayBy("Fields");
|
| +
|
| + if (!pFields)
|
| + return 0;
|
| + if (pFields->IsDictionary())
|
| + return 1;
|
| + if (pFields->IsString())
|
| + return 1;
|
| + if (CPDF_Array* pArray = pFields->AsArray())
|
| + return pArray->GetCount();
|
| + return 0;
|
| +}
|
| +
|
| +std::vector<CPDF_Object*> CPDF_ActionFields::GetAllFields() const {
|
| + std::vector<CPDF_Object*> fields;
|
| + if (!m_pAction)
|
| + return fields;
|
| +
|
| + CPDF_Dictionary* pDict = m_pAction->GetDict();
|
| + if (!pDict)
|
| + return fields;
|
| +
|
| + CFX_ByteString csType = pDict->GetStringBy("S");
|
| + CPDF_Object* pFields;
|
| + if (csType == "Hide")
|
| + pFields = pDict->GetDirectObjectBy("T");
|
| + else
|
| + pFields = pDict->GetArrayBy("Fields");
|
| +
|
| + if (!pFields)
|
| + return fields;
|
| +
|
| + if (pFields->IsDictionary() || pFields->IsString()) {
|
| + fields.push_back(pFields);
|
| + } else if (CPDF_Array* pArray = pFields->AsArray()) {
|
| + for (size_t i = 0; i < pArray->GetCount(); ++i) {
|
| + CPDF_Object* pObj = pArray->GetDirectObjectAt(i);
|
| + if (pObj)
|
| + fields.push_back(pObj);
|
| + }
|
| + }
|
| + return fields;
|
| +}
|
| +
|
| +CPDF_Object* CPDF_ActionFields::GetField(size_t iIndex) const {
|
| + if (!m_pAction)
|
| + return nullptr;
|
| +
|
| + CPDF_Dictionary* pDict = m_pAction->GetDict();
|
| + if (!pDict)
|
| + return nullptr;
|
| +
|
| + CFX_ByteString csType = pDict->GetStringBy("S");
|
| + CPDF_Object* pFields = nullptr;
|
| + if (csType == "Hide")
|
| + pFields = pDict->GetDirectObjectBy("T");
|
| + else
|
| + pFields = pDict->GetArrayBy("Fields");
|
| +
|
| + if (!pFields)
|
| + return nullptr;
|
| +
|
| + CPDF_Object* pFindObj = nullptr;
|
| + if (pFields->IsDictionary() || pFields->IsString()) {
|
| + if (iIndex == 0)
|
| + pFindObj = pFields;
|
| + } else if (CPDF_Array* pArray = pFields->AsArray()) {
|
| + pFindObj = pArray->GetDirectObjectAt(iIndex);
|
| + }
|
| + return pFindObj;
|
| +}
|
|
|