Chromium Code Reviews| Index: core/fpdfdoc/cpdf_interform.cpp |
| diff --git a/core/fpdfdoc/cpdf_interform.cpp b/core/fpdfdoc/cpdf_interform.cpp |
| index 924084d4e2b3b5c01ce7f6fb481211291022e0a0..eea5bbaa88ace843cc92093070358709c6643b40 100644 |
| --- a/core/fpdfdoc/cpdf_interform.cpp |
| +++ b/core/fpdfdoc/cpdf_interform.cpp |
| @@ -537,33 +537,41 @@ FX_BOOL RetrieveSpecificFont(uint8_t charSet, |
| class CFieldTree { |
| public: |
| - struct Node { |
| - Node* parent; |
| - CFX_ArrayTemplate<Node*> children; |
| - CFX_WideString short_name; |
| - CPDF_FormField* field_ptr; |
| + class Node { |
| + public: |
| + Node() : field_ptr_(nullptr) {} |
| + Node(const CFX_WideString& short_name, CPDF_FormField* field_ptr) |
| + : short_name_(short_name), field_ptr_(field_ptr) {} |
| + ~Node() {} |
| + |
| + void AddChildNode(Node* pNode) { children_.push_back(pNode); } |
| + |
| + size_t GetChildrenCount() const { return children_.size(); } |
| + |
| + Node* GetChildAt(size_t i) { return children_[i]; } |
|
Tom Sepez
2016/09/28 00:10:01
nit: is this a const method?
Lei Zhang
2016/09/28 00:22:54
Added a const version.
|
| + |
| int CountFields(int nLevel = 0) { |
| if (nLevel > nMaxRecursion) |
| return 0; |
| - if (field_ptr) |
| + if (field_ptr_) |
| return 1; |
| int count = 0; |
| - for (int i = 0; i < children.GetSize(); i++) |
| - count += children.GetAt(i)->CountFields(nLevel + 1); |
| + for (size_t i = 0; i < GetChildrenCount(); ++i) |
| + count += GetChildAt(i)->CountFields(nLevel + 1); |
| return count; |
| } |
| CPDF_FormField* GetField(int* fields_to_go) { |
| - if (field_ptr) { |
| + if (field_ptr_) { |
| if (*fields_to_go == 0) |
| - return field_ptr; |
| + return field_ptr_; |
| --*fields_to_go; |
| return nullptr; |
| } |
| - for (int i = 0; i < children.GetSize(); i++) { |
| - if (CPDF_FormField* pField = children.GetAt(i)->GetField(fields_to_go)) |
| + for (size_t i = 0; i < GetChildrenCount(); ++i) { |
| + if (CPDF_FormField* pField = GetChildAt(i)->GetField(fields_to_go)) |
| return pField; |
| } |
| return nullptr; |
| @@ -573,6 +581,15 @@ class CFieldTree { |
| int fields_to_go = index; |
| return GetField(&fields_to_go); |
| } |
| + |
| + void set_field_ptr(CPDF_FormField* field) { field_ptr_ = field; } |
|
Tom Sepez
2016/09/28 00:10:01
nit: not sure time to go full chromium naming.
Se
Lei Zhang
2016/09/28 00:22:54
Done.
|
| + CPDF_FormField* field() { return field_ptr_; } |
|
Tom Sepez
2016/09/28 00:10:01
nit: const method?
Lei Zhang
2016/09/28 00:22:54
Added const version.
|
| + const CFX_WideString& short_name() const { return short_name_; } |
| + |
| + private: |
| + std::vector<Node*> children_; |
|
Tom Sepez
2016/09/28 00:10:01
nit: not sure now is the time to go full chromium
Lei Zhang
2016/09/28 00:22:55
Oh, they started out looking like chromium naming
|
| + CFX_WideString short_name_; |
| + CPDF_FormField* field_ptr_; |
| }; |
| CFieldTree(); |
| @@ -580,7 +597,6 @@ class CFieldTree { |
| void SetField(const CFX_WideString& full_name, CPDF_FormField* field_ptr); |
| CPDF_FormField* GetField(const CFX_WideString& full_name); |
| - CPDF_FormField* RemoveField(const CFX_WideString& full_name); |
| void RemoveAll(); |
| Node* FindNode(const CFX_WideString& full_name); |
| @@ -594,10 +610,7 @@ class CFieldTree { |
| Node m_Root; |
| }; |
| -CFieldTree::CFieldTree() { |
| - m_Root.parent = nullptr; |
| - m_Root.field_ptr = nullptr; |
| -} |
| +CFieldTree::CFieldTree() {} |
| CFieldTree::~CFieldTree() { |
| RemoveAll(); |
| @@ -609,20 +622,18 @@ CFieldTree::Node* CFieldTree::AddChild(Node* pParent, |
| if (!pParent) |
| return nullptr; |
| - Node* pNode = new Node; |
| - pNode->parent = pParent; |
| - pNode->short_name = short_name; |
| - pNode->field_ptr = field_ptr; |
| - pParent->children.Add(pNode); |
| + Node* pNode = new Node(short_name, field_ptr); |
| + pParent->AddChildNode(pNode); |
| return pNode; |
| } |
| void CFieldTree::RemoveNode(Node* pNode, int nLevel) { |
| if (!pNode) |
| return; |
| + |
| if (nLevel <= nMaxRecursion) { |
| - for (int i = 0; i < pNode->children.GetSize(); i++) |
| - RemoveNode(pNode->children[i], nLevel + 1); |
| + for (size_t i = 0; i < pNode->GetChildrenCount(); ++i) |
| + RemoveNode(pNode->GetChildAt(i), nLevel + 1); |
| } |
| delete pNode; |
| } |
| @@ -632,17 +643,17 @@ CFieldTree::Node* CFieldTree::Lookup(Node* pParent, |
| if (!pParent) |
| return nullptr; |
| - for (int i = 0; i < pParent->children.GetSize(); i++) { |
| - Node* pNode = pParent->children[i]; |
| - if (pNode->short_name == short_name) |
| + for (size_t i = 0; i < pParent->GetChildrenCount(); ++i) { |
| + Node* pNode = pParent->GetChildAt(i); |
| + if (pNode->short_name() == short_name) |
| return pNode; |
| } |
| return nullptr; |
| } |
| void CFieldTree::RemoveAll() { |
| - for (int i = 0; i < m_Root.children.GetSize(); i++) |
| - RemoveNode(m_Root.children[i]); |
| + for (size_t i = 0; i < m_Root.GetChildrenCount(); ++i) |
| + RemoveNode(m_Root.GetChildAt(i)); |
| } |
| void CFieldTree::SetField(const CFX_WideString& full_name, |
| @@ -666,7 +677,7 @@ void CFieldTree::SetField(const CFX_WideString& full_name, |
| name_extractor.GetNext(pName, nLength); |
| } |
| if (pNode != &m_Root) |
| - pNode->field_ptr = field_ptr; |
| + pNode->set_field_ptr(field_ptr); |
| } |
| CPDF_FormField* CFieldTree::GetField(const CFX_WideString& full_name) { |
| @@ -685,38 +696,7 @@ CPDF_FormField* CFieldTree::GetField(const CFX_WideString& full_name) { |
| pNode = Lookup(pLast, name); |
| name_extractor.GetNext(pName, nLength); |
| } |
| - return pNode ? pNode->field_ptr : nullptr; |
| -} |
| - |
| -CPDF_FormField* CFieldTree::RemoveField(const CFX_WideString& full_name) { |
| - if (full_name == L"") |
| - return nullptr; |
| - |
| - CFieldNameExtractor name_extractor(full_name); |
| - const FX_WCHAR* pName; |
| - FX_STRSIZE nLength; |
| - name_extractor.GetNext(pName, nLength); |
| - Node* pNode = &m_Root; |
| - Node* pLast = nullptr; |
| - while (nLength > 0 && pNode) { |
| - pLast = pNode; |
| - CFX_WideString name = CFX_WideString(pName, nLength); |
| - pNode = Lookup(pLast, name); |
| - name_extractor.GetNext(pName, nLength); |
| - } |
| - |
| - if (pNode && pNode != &m_Root) { |
| - for (int i = 0; i < pLast->children.GetSize(); i++) { |
| - if (pNode == pLast->children[i]) { |
| - pLast->children.RemoveAt(i); |
| - break; |
| - } |
| - } |
| - CPDF_FormField* pField = pNode->field_ptr; |
| - RemoveNode(pNode); |
| - return pField; |
| - } |
| - return nullptr; |
| + return pNode ? pNode->field() : nullptr; |
| } |
| CFieldTree::Node* CFieldTree::FindNode(const CFX_WideString& full_name) { |