OLD | NEW |
1 // Copyright 2014 PDFium Authors. All rights reserved. | 1 // Copyright 2014 PDFium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com | 5 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com |
6 | 6 |
7 #include "../../include/fpdfdoc/fpdf_doc.h" | 7 #include "../../include/fpdfdoc/fpdf_doc.h" |
8 #include "doc_utils.h" | 8 #include "doc_utils.h" |
9 | 9 |
10 const int nMaxRecursion = 32; | 10 const int nMaxRecursion = 32; |
11 | 11 |
12 class _CFieldNameExtractor { | 12 class CFieldNameExtractor { |
13 public: | 13 public: |
14 _CFieldNameExtractor(const CFX_WideString& full_name) { | 14 explicit CFieldNameExtractor(const CFX_WideString& full_name) { |
15 m_pStart = full_name.c_str(); | 15 m_pStart = full_name.c_str(); |
16 m_pEnd = m_pStart + full_name.GetLength(); | 16 m_pEnd = m_pStart + full_name.GetLength(); |
17 m_pCur = m_pStart; | 17 m_pCur = m_pStart; |
18 } | 18 } |
19 void GetNext(const FX_WCHAR*& pSubName, FX_STRSIZE& size) { | 19 void GetNext(const FX_WCHAR*& pSubName, FX_STRSIZE& size) { |
20 pSubName = m_pCur; | 20 pSubName = m_pCur; |
21 while (m_pCur < m_pEnd && m_pCur[0] != L'.') { | 21 while (m_pCur < m_pEnd && m_pCur[0] != L'.') { |
22 m_pCur++; | 22 m_pCur++; |
23 } | 23 } |
24 size = (FX_STRSIZE)(m_pCur - pSubName); | 24 size = (FX_STRSIZE)(m_pCur - pSubName); |
(...skipping 119 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
144 for (int i = 0; i < ptr_array.GetSize(); i++) { | 144 for (int i = 0; i < ptr_array.GetSize(); i++) { |
145 _Node* pNode = (_Node*)ptr_array[i]; | 145 _Node* pNode = (_Node*)ptr_array[i]; |
146 RemoveNode(pNode); | 146 RemoveNode(pNode); |
147 } | 147 } |
148 } | 148 } |
149 void CFieldTree::SetField(const CFX_WideString& full_name, | 149 void CFieldTree::SetField(const CFX_WideString& full_name, |
150 CPDF_FormField* field_ptr) { | 150 CPDF_FormField* field_ptr) { |
151 if (full_name == L"") { | 151 if (full_name == L"") { |
152 return; | 152 return; |
153 } | 153 } |
154 _CFieldNameExtractor name_extractor(full_name); | 154 CFieldNameExtractor name_extractor(full_name); |
155 const FX_WCHAR* pName; | 155 const FX_WCHAR* pName; |
156 FX_STRSIZE nLength; | 156 FX_STRSIZE nLength; |
157 name_extractor.GetNext(pName, nLength); | 157 name_extractor.GetNext(pName, nLength); |
158 _Node *pNode = &m_Root, *pLast = NULL; | 158 _Node *pNode = &m_Root, *pLast = NULL; |
159 while (nLength > 0) { | 159 while (nLength > 0) { |
160 pLast = pNode; | 160 pLast = pNode; |
161 CFX_WideString name = CFX_WideString(pName, nLength); | 161 CFX_WideString name = CFX_WideString(pName, nLength); |
162 pNode = _Lookup(pLast, name); | 162 pNode = _Lookup(pLast, name); |
163 if (pNode == NULL) { | 163 if (pNode == NULL) { |
164 pNode = AddChild(pLast, name, NULL); | 164 pNode = AddChild(pLast, name, NULL); |
165 } | 165 } |
166 name_extractor.GetNext(pName, nLength); | 166 name_extractor.GetNext(pName, nLength); |
167 } | 167 } |
168 if (pNode != &m_Root) { | 168 if (pNode != &m_Root) { |
169 pNode->field_ptr = field_ptr; | 169 pNode->field_ptr = field_ptr; |
170 } | 170 } |
171 } | 171 } |
172 CPDF_FormField* CFieldTree::GetField(const CFX_WideString& full_name) { | 172 CPDF_FormField* CFieldTree::GetField(const CFX_WideString& full_name) { |
173 if (full_name == L"") { | 173 if (full_name == L"") { |
174 return NULL; | 174 return NULL; |
175 } | 175 } |
176 _CFieldNameExtractor name_extractor(full_name); | 176 CFieldNameExtractor name_extractor(full_name); |
177 const FX_WCHAR* pName; | 177 const FX_WCHAR* pName; |
178 FX_STRSIZE nLength; | 178 FX_STRSIZE nLength; |
179 name_extractor.GetNext(pName, nLength); | 179 name_extractor.GetNext(pName, nLength); |
180 _Node *pNode = &m_Root, *pLast = NULL; | 180 _Node *pNode = &m_Root, *pLast = NULL; |
181 while (nLength > 0 && pNode) { | 181 while (nLength > 0 && pNode) { |
182 pLast = pNode; | 182 pLast = pNode; |
183 CFX_WideString name = CFX_WideString(pName, nLength); | 183 CFX_WideString name = CFX_WideString(pName, nLength); |
184 pNode = _Lookup(pLast, name); | 184 pNode = _Lookup(pLast, name); |
185 name_extractor.GetNext(pName, nLength); | 185 name_extractor.GetNext(pName, nLength); |
186 } | 186 } |
187 return pNode ? pNode->field_ptr : NULL; | 187 return pNode ? pNode->field_ptr : NULL; |
188 } | 188 } |
189 CPDF_FormField* CFieldTree::RemoveField(const CFX_WideString& full_name) { | 189 CPDF_FormField* CFieldTree::RemoveField(const CFX_WideString& full_name) { |
190 if (full_name == L"") { | 190 if (full_name == L"") { |
191 return NULL; | 191 return NULL; |
192 } | 192 } |
193 _CFieldNameExtractor name_extractor(full_name); | 193 CFieldNameExtractor name_extractor(full_name); |
194 const FX_WCHAR* pName; | 194 const FX_WCHAR* pName; |
195 FX_STRSIZE nLength; | 195 FX_STRSIZE nLength; |
196 name_extractor.GetNext(pName, nLength); | 196 name_extractor.GetNext(pName, nLength); |
197 _Node *pNode = &m_Root, *pLast = NULL; | 197 _Node *pNode = &m_Root, *pLast = NULL; |
198 while (nLength > 0 && pNode) { | 198 while (nLength > 0 && pNode) { |
199 pLast = pNode; | 199 pLast = pNode; |
200 CFX_WideString name = CFX_WideString(pName, nLength); | 200 CFX_WideString name = CFX_WideString(pName, nLength); |
201 pNode = _Lookup(pLast, name); | 201 pNode = _Lookup(pLast, name); |
202 name_extractor.GetNext(pName, nLength); | 202 name_extractor.GetNext(pName, nLength); |
203 } | 203 } |
204 if (pNode && pNode != &m_Root) { | 204 if (pNode && pNode != &m_Root) { |
205 CFX_PtrArray& ptr_array = pLast->children; | 205 CFX_PtrArray& ptr_array = pLast->children; |
206 for (int i = 0; i < ptr_array.GetSize(); i++) { | 206 for (int i = 0; i < ptr_array.GetSize(); i++) { |
207 if (pNode == (_Node*)ptr_array[i]) { | 207 if (pNode == (_Node*)ptr_array[i]) { |
208 ptr_array.RemoveAt(i); | 208 ptr_array.RemoveAt(i); |
209 break; | 209 break; |
210 } | 210 } |
211 } | 211 } |
212 CPDF_FormField* pField = pNode->field_ptr; | 212 CPDF_FormField* pField = pNode->field_ptr; |
213 RemoveNode(pNode); | 213 RemoveNode(pNode); |
214 return pField; | 214 return pField; |
215 } | 215 } |
216 return NULL; | 216 return NULL; |
217 } | 217 } |
218 CFieldTree::_Node* CFieldTree::FindNode(const CFX_WideString& full_name) { | 218 CFieldTree::_Node* CFieldTree::FindNode(const CFX_WideString& full_name) { |
219 if (full_name == L"") { | 219 if (full_name == L"") { |
220 return NULL; | 220 return NULL; |
221 } | 221 } |
222 _CFieldNameExtractor name_extractor(full_name); | 222 CFieldNameExtractor name_extractor(full_name); |
223 const FX_WCHAR* pName; | 223 const FX_WCHAR* pName; |
224 FX_STRSIZE nLength; | 224 FX_STRSIZE nLength; |
225 name_extractor.GetNext(pName, nLength); | 225 name_extractor.GetNext(pName, nLength); |
226 _Node *pNode = &m_Root, *pLast = NULL; | 226 _Node *pNode = &m_Root, *pLast = NULL; |
227 while (nLength > 0 && pNode) { | 227 while (nLength > 0 && pNode) { |
228 pLast = pNode; | 228 pLast = pNode; |
229 CFX_WideString name = CFX_WideString(pName, nLength); | 229 CFX_WideString name = CFX_WideString(pName, nLength); |
230 pNode = _Lookup(pLast, name); | 230 pNode = _Lookup(pLast, name); |
231 name_extractor.GetNext(pName, nLength); | 231 name_extractor.GetNext(pName, nLength); |
232 } | 232 } |
(...skipping 525 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
758 allFieldNames.RemoveAll(); | 758 allFieldNames.RemoveAll(); |
759 int nCount = m_pFieldTree->m_Root.CountFields(); | 759 int nCount = m_pFieldTree->m_Root.CountFields(); |
760 for (int i = 0; i < nCount; i++) { | 760 for (int i = 0; i < nCount; i++) { |
761 CPDF_FormField* pField = m_pFieldTree->m_Root.GetField(i); | 761 CPDF_FormField* pField = m_pFieldTree->m_Root.GetField(i); |
762 if (pField) { | 762 if (pField) { |
763 CFX_WideString full_name = GetFullName(pField->GetFieldDict()); | 763 CFX_WideString full_name = GetFullName(pField->GetFieldDict()); |
764 allFieldNames.Add(full_name); | 764 allFieldNames.Add(full_name); |
765 } | 765 } |
766 } | 766 } |
767 } | 767 } |
768 FX_BOOL CPDF_InterForm::IsValidFormField(const void* pField) { | 768 |
769 if (pField == NULL) { | |
770 return FALSE; | |
771 } | |
772 int nCount = m_pFieldTree->m_Root.CountFields(); | |
773 for (int i = 0; i < nCount; i++) { | |
774 CPDF_FormField* pFormField = m_pFieldTree->m_Root.GetField(i); | |
775 if (pField == pFormField) { | |
776 return TRUE; | |
777 } | |
778 } | |
779 return FALSE; | |
780 } | |
781 CPDF_FormField* CPDF_InterForm::GetFieldByDict( | 769 CPDF_FormField* CPDF_InterForm::GetFieldByDict( |
782 CPDF_Dictionary* pFieldDict) const { | 770 CPDF_Dictionary* pFieldDict) const { |
783 if (pFieldDict == NULL) { | 771 if (pFieldDict == NULL) { |
784 return NULL; | 772 return NULL; |
785 } | 773 } |
786 CFX_WideString csWName = GetFullName(pFieldDict); | 774 CFX_WideString csWName = GetFullName(pFieldDict); |
787 return m_pFieldTree->GetField(csWName); | 775 return m_pFieldTree->GetField(csWName); |
788 } | 776 } |
789 | 777 |
790 CPDF_FormControl* CPDF_InterForm::GetControlAtPoint(CPDF_Page* pPage, | 778 CPDF_FormControl* CPDF_InterForm::GetControlAtPoint(CPDF_Page* pPage, |
(...skipping 148 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
939 } | 927 } |
940 CPDF_Font* CPDF_InterForm::GetDefaultFormFont() { | 928 CPDF_Font* CPDF_InterForm::GetDefaultFormFont() { |
941 return GetDefaultInterFormFont(m_pFormDict, m_pDocument); | 929 return GetDefaultInterFormFont(m_pFormDict, m_pDocument); |
942 } | 930 } |
943 int CPDF_InterForm::GetFormAlignment() { | 931 int CPDF_InterForm::GetFormAlignment() { |
944 if (m_pFormDict == NULL) { | 932 if (m_pFormDict == NULL) { |
945 return 0; | 933 return 0; |
946 } | 934 } |
947 return m_pFormDict->GetInteger("Q", 0); | 935 return m_pFormDict->GetInteger("Q", 0); |
948 } | 936 } |
949 FX_BOOL CPDF_InterForm::ResetForm(const CFX_PtrArray& fields, | 937 |
950 FX_BOOL bIncludeOrExclude, | 938 bool CPDF_InterForm::ResetForm(const std::vector<CPDF_FormField*>& fields, |
951 FX_BOOL bNotify) { | 939 bool bIncludeOrExclude, |
952 if (bNotify && m_pFormNotify != NULL) { | 940 bool bNotify) { |
953 int iRet = m_pFormNotify->BeforeFormReset(this); | 941 if (bNotify && m_pFormNotify && m_pFormNotify->BeforeFormReset(this) < 0) |
954 if (iRet < 0) { | 942 return false; |
955 return FALSE; | 943 |
956 } | 944 int nCount = m_pFieldTree->m_Root.CountFields(); |
| 945 for (int i = 0; i < nCount; ++i) { |
| 946 CPDF_FormField* pField = m_pFieldTree->m_Root.GetField(i); |
| 947 if (!pField) |
| 948 continue; |
| 949 |
| 950 auto it = std::find(fields.begin(), fields.end(), pField); |
| 951 if (bIncludeOrExclude == (it != fields.end())) |
| 952 pField->ResetField(bNotify); |
957 } | 953 } |
| 954 if (bNotify && m_pFormNotify) |
| 955 m_pFormNotify->AfterFormReset(this); |
| 956 return true; |
| 957 } |
| 958 |
| 959 bool CPDF_InterForm::ResetForm(bool bNotify) { |
| 960 if (bNotify && m_pFormNotify && m_pFormNotify->BeforeFormReset(this) < 0) |
| 961 return false; |
| 962 |
958 int nCount = m_pFieldTree->m_Root.CountFields(); | 963 int nCount = m_pFieldTree->m_Root.CountFields(); |
959 for (int i = 0; i < nCount; i++) { | 964 for (int i = 0; i < nCount; ++i) { |
960 CPDF_FormField* pField = m_pFieldTree->m_Root.GetField(i); | 965 CPDF_FormField* pField = m_pFieldTree->m_Root.GetField(i); |
961 if (pField == NULL) { | 966 if (!pField) |
962 continue; | 967 continue; |
963 } | 968 |
964 FX_BOOL bFind = FALSE; | |
965 int iCount = fields.GetSize(); | |
966 for (int i = 0; i < iCount; i++) { | |
967 if (pField == (CPDF_FormField*)fields[i]) { | |
968 bFind = TRUE; | |
969 break; | |
970 } | |
971 } | |
972 if ((bIncludeOrExclude && bFind) || (!bIncludeOrExclude && !bFind)) { | |
973 pField->ResetField(bNotify); | |
974 } | |
975 } | |
976 if (bNotify && m_pFormNotify != NULL) { | |
977 m_pFormNotify->AfterFormReset(this); | |
978 } | |
979 return TRUE; | |
980 } | |
981 FX_BOOL CPDF_InterForm::ResetForm(FX_BOOL bNotify) { | |
982 if (bNotify && m_pFormNotify != NULL) { | |
983 int iRet = m_pFormNotify->BeforeFormReset(this); | |
984 if (iRet < 0) { | |
985 return FALSE; | |
986 } | |
987 } | |
988 int nCount = m_pFieldTree->m_Root.CountFields(); | |
989 for (int i = 0; i < nCount; i++) { | |
990 CPDF_FormField* pField = m_pFieldTree->m_Root.GetField(i); | |
991 if (pField == NULL) { | |
992 continue; | |
993 } | |
994 pField->ResetField(bNotify); | 969 pField->ResetField(bNotify); |
995 } | 970 } |
996 if (bNotify && m_pFormNotify != NULL) { | 971 if (bNotify && m_pFormNotify) |
997 m_pFormNotify->AfterFormReset(this); | 972 m_pFormNotify->AfterFormReset(this); |
998 } | 973 return true; |
999 return TRUE; | |
1000 } | 974 } |
| 975 |
1001 void CPDF_InterForm::LoadField(CPDF_Dictionary* pFieldDict, int nLevel) { | 976 void CPDF_InterForm::LoadField(CPDF_Dictionary* pFieldDict, int nLevel) { |
1002 if (nLevel > nMaxRecursion) { | 977 if (nLevel > nMaxRecursion) { |
1003 return; | 978 return; |
1004 } | 979 } |
1005 if (pFieldDict == NULL) { | 980 if (pFieldDict == NULL) { |
1006 return; | 981 return; |
1007 } | 982 } |
1008 FX_DWORD dwParentObjNum = pFieldDict->GetObjNum(); | 983 FX_DWORD dwParentObjNum = pFieldDict->GetObjNum(); |
1009 CPDF_Array* pKids = pFieldDict->GetArray("Kids"); | 984 CPDF_Array* pKids = pFieldDict->GetArray("Kids"); |
1010 if (!pKids) { | 985 if (!pKids) { |
(...skipping 108 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1119 const auto it = m_ControlMap.find(pWidgetDict); | 1094 const auto it = m_ControlMap.find(pWidgetDict); |
1120 if (it != m_ControlMap.end()) | 1095 if (it != m_ControlMap.end()) |
1121 return it->second; | 1096 return it->second; |
1122 | 1097 |
1123 CPDF_FormControl* pControl = | 1098 CPDF_FormControl* pControl = |
1124 new CPDF_FormControl((CPDF_FormField*)pField, pWidgetDict); | 1099 new CPDF_FormControl((CPDF_FormField*)pField, pWidgetDict); |
1125 m_ControlMap[pWidgetDict] = pControl; | 1100 m_ControlMap[pWidgetDict] = pControl; |
1126 ((CPDF_FormField*)pField)->m_ControlList.Add(pControl); | 1101 ((CPDF_FormField*)pField)->m_ControlList.Add(pControl); |
1127 return pControl; | 1102 return pControl; |
1128 } | 1103 } |
| 1104 |
1129 CPDF_FormField* CPDF_InterForm::CheckRequiredFields( | 1105 CPDF_FormField* CPDF_InterForm::CheckRequiredFields( |
1130 const CFX_PtrArray* fields, | 1106 const std::vector<CPDF_FormField*>* fields, |
1131 FX_BOOL bIncludeOrExclude) const { | 1107 bool bIncludeOrExclude) const { |
1132 int nCount = m_pFieldTree->m_Root.CountFields(); | 1108 int nCount = m_pFieldTree->m_Root.CountFields(); |
1133 for (int i = 0; i < nCount; i++) { | 1109 for (int i = 0; i < nCount; ++i) { |
1134 CPDF_FormField* pField = m_pFieldTree->m_Root.GetField(i); | 1110 CPDF_FormField* pField = m_pFieldTree->m_Root.GetField(i); |
1135 if (pField == NULL) { | 1111 if (!pField) |
1136 continue; | 1112 continue; |
1137 } | 1113 |
1138 int32_t iType = pField->GetType(); | 1114 int32_t iType = pField->GetType(); |
1139 if (iType == CPDF_FormField::PushButton || | 1115 if (iType == CPDF_FormField::PushButton || |
1140 iType == CPDF_FormField::CheckBox || iType == CPDF_FormField::ListBox) { | 1116 iType == CPDF_FormField::CheckBox || iType == CPDF_FormField::ListBox) { |
1141 continue; | 1117 continue; |
1142 } | 1118 } |
1143 FX_DWORD dwFlags = pField->GetFieldFlags(); | 1119 FX_DWORD dwFlags = pField->GetFieldFlags(); |
1144 if (dwFlags & 0x04) { | 1120 // TODO(thestig): Look up these magic numbers and add constants for them. |
| 1121 if (dwFlags & 0x04) |
1145 continue; | 1122 continue; |
| 1123 |
| 1124 bool bFind = true; |
| 1125 if (fields) { |
| 1126 auto it = std::find(fields->begin(), fields->end(), pField); |
| 1127 bFind = (it != fields->end()); |
1146 } | 1128 } |
1147 FX_BOOL bFind = TRUE; | 1129 if (bIncludeOrExclude == bFind) { |
1148 if (fields != NULL) { | |
1149 bFind = fields->Find(pField, 0) >= 0; | |
1150 } | |
1151 if ((bIncludeOrExclude && bFind) || (!bIncludeOrExclude && !bFind)) { | |
1152 CPDF_Dictionary* pFieldDict = pField->m_pDict; | 1130 CPDF_Dictionary* pFieldDict = pField->m_pDict; |
1153 if ((dwFlags & 0x02) != 0 && pFieldDict->GetString("V").IsEmpty()) { | 1131 if ((dwFlags & 0x02) != 0 && pFieldDict->GetString("V").IsEmpty()) { |
1154 return pField; | 1132 return pField; |
1155 } | 1133 } |
1156 } | 1134 } |
1157 } | 1135 } |
1158 return NULL; | 1136 return nullptr; |
1159 } | 1137 } |
| 1138 |
1160 CFDF_Document* CPDF_InterForm::ExportToFDF(const CFX_WideStringC& pdf_path, | 1139 CFDF_Document* CPDF_InterForm::ExportToFDF(const CFX_WideStringC& pdf_path, |
1161 FX_BOOL bSimpleFileSpec) const { | 1140 bool bSimpleFileSpec) const { |
1162 CFX_PtrArray fields; | 1141 std::vector<CPDF_FormField*> fields; |
1163 int nCount = m_pFieldTree->m_Root.CountFields(); | 1142 int nCount = m_pFieldTree->m_Root.CountFields(); |
1164 for (int i = 0; i < nCount; i++) { | 1143 for (int i = 0; i < nCount; ++i) |
1165 CPDF_FormField* pField = m_pFieldTree->m_Root.GetField(i); | 1144 fields.push_back(m_pFieldTree->m_Root.GetField(i)); |
1166 fields.Add(pField); | 1145 return ExportToFDF(pdf_path, fields, true, bSimpleFileSpec); |
1167 } | |
1168 return ExportToFDF(pdf_path, fields, TRUE, bSimpleFileSpec); | |
1169 } | 1146 } |
| 1147 |
| 1148 // TODO(thestig): Fix this. |
1170 CFX_WideString FILESPEC_EncodeFileName(const CFX_WideStringC& filepath); | 1149 CFX_WideString FILESPEC_EncodeFileName(const CFX_WideStringC& filepath); |
1171 CFDF_Document* CPDF_InterForm::ExportToFDF(const CFX_WideStringC& pdf_path, | 1150 |
1172 CFX_PtrArray& fields, | 1151 CFDF_Document* CPDF_InterForm::ExportToFDF( |
1173 FX_BOOL bIncludeOrExclude, | 1152 const CFX_WideStringC& pdf_path, |
1174 FX_BOOL bSimpleFileSpec) const { | 1153 const std::vector<CPDF_FormField*>& fields, |
| 1154 bool bIncludeOrExclude, |
| 1155 bool bSimpleFileSpec) const { |
1175 CFDF_Document* pDoc = CFDF_Document::CreateNewDoc(); | 1156 CFDF_Document* pDoc = CFDF_Document::CreateNewDoc(); |
1176 if (pDoc == NULL) { | 1157 if (pDoc == NULL) { |
1177 return NULL; | 1158 return NULL; |
1178 } | 1159 } |
1179 CPDF_Dictionary* pMainDict = pDoc->GetRoot()->GetDict("FDF"); | 1160 CPDF_Dictionary* pMainDict = pDoc->GetRoot()->GetDict("FDF"); |
1180 if (!pdf_path.IsEmpty()) { | 1161 if (!pdf_path.IsEmpty()) { |
1181 if (bSimpleFileSpec) { | 1162 if (bSimpleFileSpec) { |
1182 CFX_WideString wsFilePath = FILESPEC_EncodeFileName(pdf_path); | 1163 CFX_WideString wsFilePath = FILESPEC_EncodeFileName(pdf_path); |
1183 pMainDict->SetAtString(FX_BSTRC("F"), | 1164 pMainDict->SetAtString(FX_BSTRC("F"), |
1184 CFX_ByteString::FromUnicode(wsFilePath)); | 1165 CFX_ByteString::FromUnicode(wsFilePath)); |
1185 pMainDict->SetAtString(FX_BSTRC("UF"), PDF_EncodeText(wsFilePath)); | 1166 pMainDict->SetAtString(FX_BSTRC("UF"), PDF_EncodeText(wsFilePath)); |
1186 } else { | 1167 } else { |
1187 CPDF_FileSpec filespec; | 1168 CPDF_FileSpec filespec; |
1188 filespec.SetFileName(pdf_path); | 1169 filespec.SetFileName(pdf_path); |
1189 pMainDict->SetAt("F", static_cast<CPDF_Object*>(filespec)); | 1170 pMainDict->SetAt("F", static_cast<CPDF_Object*>(filespec)); |
1190 } | 1171 } |
1191 } | 1172 } |
1192 CPDF_Array* pFields = CPDF_Array::Create(); | 1173 CPDF_Array* pFields = CPDF_Array::Create(); |
1193 if (pFields == NULL) { | 1174 if (pFields == NULL) { |
1194 return NULL; | 1175 return NULL; |
1195 } | 1176 } |
1196 pMainDict->SetAt("Fields", pFields); | 1177 pMainDict->SetAt("Fields", pFields); |
1197 int nCount = m_pFieldTree->m_Root.CountFields(); | 1178 int nCount = m_pFieldTree->m_Root.CountFields(); |
1198 for (int i = 0; i < nCount; i++) { | 1179 for (int i = 0; i < nCount; i++) { |
1199 CPDF_FormField* pField = m_pFieldTree->m_Root.GetField(i); | 1180 CPDF_FormField* pField = m_pFieldTree->m_Root.GetField(i); |
1200 if (pField == NULL || pField->GetType() == CPDF_FormField::PushButton) { | 1181 if (pField == NULL || pField->GetType() == CPDF_FormField::PushButton) { |
1201 continue; | 1182 continue; |
1202 } | 1183 } |
1203 FX_DWORD dwFlags = pField->GetFieldFlags(); | 1184 FX_DWORD dwFlags = pField->GetFieldFlags(); |
1204 if (dwFlags & 0x04) { | 1185 if (dwFlags & 0x04) |
1205 continue; | 1186 continue; |
1206 } | 1187 |
1207 FX_BOOL bFind = fields.Find(pField, 0) >= 0; | 1188 auto it = std::find(fields.begin(), fields.end(), pField); |
1208 if ((bIncludeOrExclude && bFind) || (!bIncludeOrExclude && !bFind)) { | 1189 if (bIncludeOrExclude == (it != fields.end())) { |
1209 if ((dwFlags & 0x02) != 0 && pField->m_pDict->GetString("V").IsEmpty()) { | 1190 if ((dwFlags & 0x02) != 0 && pField->m_pDict->GetString("V").IsEmpty()) |
1210 continue; | 1191 continue; |
1211 } | 1192 |
1212 CFX_WideString fullname = GetFullName(pField->GetFieldDict()); | 1193 CFX_WideString fullname = GetFullName(pField->GetFieldDict()); |
1213 CPDF_Dictionary* pFieldDict = CPDF_Dictionary::Create(); | 1194 CPDF_Dictionary* pFieldDict = CPDF_Dictionary::Create(); |
1214 if (pFieldDict == NULL) { | 1195 if (!pFieldDict) |
1215 return NULL; | 1196 return nullptr; |
1216 } | 1197 |
1217 CPDF_String* pString = CPDF_String::Create(fullname); | 1198 CPDF_String* pString = CPDF_String::Create(fullname); |
1218 if (pString == NULL) { | 1199 if (!pString) { |
1219 pFieldDict->Release(); | 1200 pFieldDict->Release(); |
1220 return NULL; | 1201 return nullptr; |
1221 } | 1202 } |
1222 pFieldDict->SetAt("T", pString); | 1203 pFieldDict->SetAt("T", pString); |
1223 if (pField->GetType() == CPDF_FormField::CheckBox || | 1204 if (pField->GetType() == CPDF_FormField::CheckBox || |
1224 pField->GetType() == CPDF_FormField::RadioButton) { | 1205 pField->GetType() == CPDF_FormField::RadioButton) { |
1225 CFX_WideString csExport = pField->GetCheckValue(FALSE); | 1206 CFX_WideString csExport = pField->GetCheckValue(FALSE); |
1226 CFX_ByteString csBExport = PDF_EncodeText(csExport); | 1207 CFX_ByteString csBExport = PDF_EncodeText(csExport); |
1227 CPDF_Object* pOpt = FPDF_GetFieldAttr(pField->m_pDict, "Opt"); | 1208 CPDF_Object* pOpt = FPDF_GetFieldAttr(pField->m_pDict, "Opt"); |
1228 if (pOpt == NULL) { | 1209 if (pOpt) |
| 1210 pFieldDict->SetAtString("V", csBExport); |
| 1211 else |
1229 pFieldDict->SetAtName("V", csBExport); | 1212 pFieldDict->SetAtName("V", csBExport); |
1230 } else { | |
1231 pFieldDict->SetAtString("V", csBExport); | |
1232 } | |
1233 } else { | 1213 } else { |
1234 CPDF_Object* pV = FPDF_GetFieldAttr(pField->m_pDict, "V"); | 1214 CPDF_Object* pV = FPDF_GetFieldAttr(pField->m_pDict, "V"); |
1235 if (pV != NULL) { | 1215 if (pV) |
1236 pFieldDict->SetAt("V", pV->Clone(TRUE)); | 1216 pFieldDict->SetAt("V", pV->Clone(TRUE)); |
1237 } | |
1238 } | 1217 } |
1239 pFields->Add(pFieldDict); | 1218 pFields->Add(pFieldDict); |
1240 } | 1219 } |
1241 } | 1220 } |
1242 return pDoc; | 1221 return pDoc; |
1243 } | 1222 } |
1244 const struct _SupportFieldEncoding { | 1223 const struct _SupportFieldEncoding { |
1245 const FX_CHAR* m_name; | 1224 const FX_CHAR* m_name; |
1246 int32_t m_codePage; | 1225 int32_t m_codePage; |
1247 } g_fieldEncoding[] = { | 1226 } g_fieldEncoding[] = { |
(...skipping 122 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1370 FDF_ImportField(pField, L"", bNotify); | 1349 FDF_ImportField(pField, L"", bNotify); |
1371 } | 1350 } |
1372 if (bNotify && m_pFormNotify != NULL) { | 1351 if (bNotify && m_pFormNotify != NULL) { |
1373 m_pFormNotify->AfterFormImportData(this); | 1352 m_pFormNotify->AfterFormImportData(this); |
1374 } | 1353 } |
1375 return TRUE; | 1354 return TRUE; |
1376 } | 1355 } |
1377 void CPDF_InterForm::SetFormNotify(const CPDF_FormNotify* pNotify) { | 1356 void CPDF_InterForm::SetFormNotify(const CPDF_FormNotify* pNotify) { |
1378 m_pFormNotify = (CPDF_FormNotify*)pNotify; | 1357 m_pFormNotify = (CPDF_FormNotify*)pNotify; |
1379 } | 1358 } |
OLD | NEW |