Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(828)

Side by Side Diff: core/fpdfdoc/cpdf_interform.cpp

Issue 2380753003: Remove dead code from CPDF_InterForm. (Closed)
Patch Set: more Created 4 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « no previous file | core/fpdfdoc/include/cpdf_interform.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2016 PDFium Authors. All rights reserved. 1 // Copyright 2016 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 <vector> 7 #include <vector>
8 8
9 #include "core/fpdfapi/fpdf_font/include/cpdf_font.h" 9 #include "core/fpdfapi/fpdf_font/include/cpdf_font.h"
10 #include "core/fpdfapi/fpdf_font/include/cpdf_fontencoding.h" 10 #include "core/fpdfapi/fpdf_font/include/cpdf_fontencoding.h"
(...skipping 78 matching lines...) Expand 10 before | Expand all | Expand 10 after
89 csDA = "/" + PDF_NameEncode(csDefault) + " 0 Tf"; 89 csDA = "/" + PDF_NameEncode(csDefault) + " 0 Tf";
90 } 90 }
91 if (!csDA.IsEmpty()) 91 if (!csDA.IsEmpty())
92 csDA += " "; 92 csDA += " ";
93 93
94 csDA += "0 g"; 94 csDA += "0 g";
95 if (!pFormDict->KeyExist("DA")) 95 if (!pFormDict->KeyExist("DA"))
96 pFormDict->SetStringFor("DA", csDA); 96 pFormDict->SetStringFor("DA", csDA);
97 } 97 }
98 98
99 uint32_t CountFonts(CPDF_Dictionary* pFormDict) {
100 if (!pFormDict)
101 return 0;
102
103 CPDF_Dictionary* pDR = pFormDict->GetDictFor("DR");
104 if (!pDR)
105 return 0;
106
107 CPDF_Dictionary* pFonts = pDR->GetDictFor("Font");
108 if (!pFonts)
109 return 0;
110
111 uint32_t dwCount = 0;
112 for (const auto& it : *pFonts) {
113 CPDF_Object* pObj = it.second;
114 if (!pObj)
115 continue;
116
117 if (CPDF_Dictionary* pDirect = ToDictionary(pObj->GetDirect())) {
118 if (pDirect->GetStringFor("Type") == "Font")
119 dwCount++;
120 }
121 }
122 return dwCount;
123 }
124
125 CPDF_Font* GetFont(CPDF_Dictionary* pFormDict,
126 CPDF_Document* pDocument,
127 uint32_t index,
128 CFX_ByteString& csNameTag) {
129 if (!pFormDict)
130 return nullptr;
131
132 CPDF_Dictionary* pDR = pFormDict->GetDictFor("DR");
133 if (!pDR)
134 return nullptr;
135
136 CPDF_Dictionary* pFonts = pDR->GetDictFor("Font");
137 if (!pFonts)
138 return nullptr;
139
140 uint32_t dwCount = 0;
141 for (const auto& it : *pFonts) {
142 const CFX_ByteString& csKey = it.first;
143 CPDF_Object* pObj = it.second;
144 if (!pObj)
145 continue;
146
147 CPDF_Dictionary* pElement = ToDictionary(pObj->GetDirect());
148 if (!pElement)
149 continue;
150 if (pElement->GetStringFor("Type") != "Font")
151 continue;
152 if (dwCount == index) {
153 csNameTag = csKey;
154 return pDocument->LoadFont(pElement);
155 }
156 dwCount++;
157 }
158 return nullptr;
159 }
160
161 CPDF_Font* GetFont(CPDF_Dictionary* pFormDict, 99 CPDF_Font* GetFont(CPDF_Dictionary* pFormDict,
162 CPDF_Document* pDocument, 100 CPDF_Document* pDocument,
163 CFX_ByteString csNameTag) { 101 CFX_ByteString csNameTag) {
164 CFX_ByteString csAlias = PDF_NameDecode(csNameTag); 102 CFX_ByteString csAlias = PDF_NameDecode(csNameTag);
165 if (!pFormDict || csAlias.IsEmpty()) 103 if (!pFormDict || csAlias.IsEmpty())
166 return nullptr; 104 return nullptr;
167 105
168 CPDF_Dictionary* pDR = pFormDict->GetDictFor("DR"); 106 CPDF_Dictionary* pDR = pFormDict->GetDictFor("DR");
169 if (!pDR) 107 if (!pDR)
170 return nullptr; 108 return nullptr;
171 109
172 CPDF_Dictionary* pFonts = pDR->GetDictFor("Font"); 110 CPDF_Dictionary* pFonts = pDR->GetDictFor("Font");
173 if (!pFonts) 111 if (!pFonts)
174 return nullptr; 112 return nullptr;
175 113
176 CPDF_Dictionary* pElement = pFonts->GetDictFor(csAlias); 114 CPDF_Dictionary* pElement = pFonts->GetDictFor(csAlias);
177 if (!pElement) 115 if (!pElement)
178 return nullptr; 116 return nullptr;
179 117
180 if (pElement->GetStringFor("Type") == "Font") 118 if (pElement->GetStringFor("Type") == "Font")
181 return pDocument->LoadFont(pElement); 119 return pDocument->LoadFont(pElement);
182 return nullptr; 120 return nullptr;
183 } 121 }
184 122
185 CPDF_Font* GetFont(CPDF_Dictionary* pFormDict,
186 CPDF_Document* pDocument,
187 CFX_ByteString csFontName,
188 CFX_ByteString& csNameTag) {
189 if (!pFormDict || csFontName.IsEmpty())
190 return nullptr;
191
192 CPDF_Dictionary* pDR = pFormDict->GetDictFor("DR");
193 if (!pDR)
194 return nullptr;
195
196 CPDF_Dictionary* pFonts = pDR->GetDictFor("Font");
197 if (!pFonts)
198 return nullptr;
199
200 for (const auto& it : *pFonts) {
201 const CFX_ByteString& csKey = it.first;
202 CPDF_Object* pObj = it.second;
203 if (!pObj)
204 continue;
205
206 CPDF_Dictionary* pElement = ToDictionary(pObj->GetDirect());
207 if (!pElement)
208 continue;
209 if (pElement->GetStringFor("Type") != "Font")
210 continue;
211
212 CPDF_Font* pFind = pDocument->LoadFont(pElement);
213 if (!pFind)
214 continue;
215
216 CFX_ByteString csBaseFont;
217 csBaseFont = pFind->GetBaseFont();
218 csBaseFont.Remove(' ');
219 if (csBaseFont == csFontName) {
220 csNameTag = csKey;
221 return pFind;
222 }
223 }
224 return nullptr;
225 }
226
227 CPDF_Font* GetNativeFont(CPDF_Dictionary* pFormDict, 123 CPDF_Font* GetNativeFont(CPDF_Dictionary* pFormDict,
228 CPDF_Document* pDocument, 124 CPDF_Document* pDocument,
229 uint8_t charSet, 125 uint8_t charSet,
230 CFX_ByteString& csNameTag) { 126 CFX_ByteString& csNameTag) {
231 if (!pFormDict) 127 if (!pFormDict)
232 return nullptr; 128 return nullptr;
233 129
234 CPDF_Dictionary* pDR = pFormDict->GetDictFor("DR"); 130 CPDF_Dictionary* pDR = pFormDict->GetDictFor("DR");
235 if (!pDR) 131 if (!pDR)
236 return nullptr; 132 return nullptr;
(...skipping 22 matching lines...) Expand all
259 continue; 155 continue;
260 156
261 if (pSubst->m_Charset == (int)charSet) { 157 if (pSubst->m_Charset == (int)charSet) {
262 csNameTag = csKey; 158 csNameTag = csKey;
263 return pFind; 159 return pFind;
264 } 160 }
265 } 161 }
266 return nullptr; 162 return nullptr;
267 } 163 }
268 164
269 CPDF_Font* GetDefaultFont(CPDF_Dictionary* pFormDict,
270 CPDF_Document* pDocument) {
271 if (!pFormDict)
272 return nullptr;
273
274 CPDF_DefaultAppearance cDA(pFormDict->GetStringFor("DA"));
275 CFX_ByteString csFontNameTag;
276 FX_FLOAT fFontSize;
277 cDA.GetFont(csFontNameTag, fFontSize);
278 return GetFont(pFormDict, pDocument, csFontNameTag);
279 }
280
281 FX_BOOL FindFont(CPDF_Dictionary* pFormDict, 165 FX_BOOL FindFont(CPDF_Dictionary* pFormDict,
282 const CPDF_Font* pFont, 166 const CPDF_Font* pFont,
283 CFX_ByteString& csNameTag) { 167 CFX_ByteString& csNameTag) {
284 if (!pFormDict || !pFont) 168 if (!pFormDict || !pFont)
285 return FALSE; 169 return FALSE;
286 170
287 CPDF_Dictionary* pDR = pFormDict->GetDictFor("DR"); 171 CPDF_Dictionary* pDR = pFormDict->GetDictFor("DR");
288 if (!pDR) 172 if (!pDR)
289 return FALSE; 173 return FALSE;
290 174
(...skipping 13 matching lines...) Expand all
304 if (pElement->GetStringFor("Type") != "Font") 188 if (pElement->GetStringFor("Type") != "Font")
305 continue; 189 continue;
306 if (pFont->GetFontDict() == pElement) { 190 if (pFont->GetFontDict() == pElement) {
307 csNameTag = csKey; 191 csNameTag = csKey;
308 return TRUE; 192 return TRUE;
309 } 193 }
310 } 194 }
311 return FALSE; 195 return FALSE;
312 } 196 }
313 197
314 CPDF_Font* GetNativeFont(CPDF_Dictionary* pFormDict,
315 CPDF_Document* pDocument,
316 CFX_ByteString& csNameTag) {
317 csNameTag.clear();
318 uint8_t charSet = CPDF_InterForm::GetNativeCharSet();
319 CPDF_Font* pFont = GetDefaultFont(pFormDict, pDocument);
320 if (pFont) {
321 CFX_SubstFont* pSubst = pFont->GetSubstFont();
322 if (pSubst && pSubst->m_Charset == (int)charSet) {
323 FindFont(pFormDict, pFont, csNameTag);
324 return pFont;
325 }
326 }
327 return GetNativeFont(pFormDict, pDocument, charSet, csNameTag);
328 }
329
330 FX_BOOL FindFont(CPDF_Dictionary* pFormDict, 198 FX_BOOL FindFont(CPDF_Dictionary* pFormDict,
331 CPDF_Document* pDocument, 199 CPDF_Document* pDocument,
332 CFX_ByteString csFontName, 200 CFX_ByteString csFontName,
333 CPDF_Font*& pFont, 201 CPDF_Font*& pFont,
334 CFX_ByteString& csNameTag) { 202 CFX_ByteString& csNameTag) {
335 if (!pFormDict) 203 if (!pFormDict)
336 return FALSE; 204 return FALSE;
337 205
338 CPDF_Dictionary* pDR = pFormDict->GetDictFor("DR"); 206 CPDF_Dictionary* pDR = pFormDict->GetDictFor("DR");
339 if (!pDR) 207 if (!pDR)
(...skipping 75 matching lines...) Expand 10 before | Expand all | Expand 10 after
415 CFX_ByteString& csNameTag) { 283 CFX_ByteString& csNameTag) {
416 if (!pFormDict) 284 if (!pFormDict)
417 InitDict(pFormDict, pDocument); 285 InitDict(pFormDict, pDocument);
418 286
419 CFX_ByteString csTemp; 287 CFX_ByteString csTemp;
420 CPDF_Font* pFont = GetNativeFont(pFormDict, pDocument, charSet, csTemp); 288 CPDF_Font* pFont = GetNativeFont(pFormDict, pDocument, charSet, csTemp);
421 if (pFont) { 289 if (pFont) {
422 csNameTag = csTemp; 290 csNameTag = csTemp;
423 return pFont; 291 return pFont;
424 } 292 }
425 CFX_ByteString csFontName = CPDF_InterForm::GetNativeFont(charSet); 293 CFX_ByteString csFontName = CPDF_InterForm::GetNativeFont(charSet, nullptr);
426 if (!csFontName.IsEmpty() && 294 if (!csFontName.IsEmpty() &&
427 FindFont(pFormDict, pDocument, csFontName, pFont, csNameTag)) { 295 FindFont(pFormDict, pDocument, csFontName, pFont, csNameTag)) {
428 return pFont; 296 return pFont;
429 } 297 }
430 pFont = CPDF_InterForm::AddNativeFont(charSet, pDocument); 298 pFont = CPDF_InterForm::AddNativeFont(charSet, pDocument);
431 if (pFont) 299 if (pFont)
432 AddFont(pFormDict, pDocument, pFont, csNameTag); 300 AddFont(pFormDict, pDocument, pFont, csNameTag);
433 301
434 return pFont; 302 return pFont;
435 } 303 }
436 304
437 void RemoveFont(CPDF_Dictionary* pFormDict, const CPDF_Font* pFont) {
438 if (!pFormDict || !pFont)
439 return;
440
441 CFX_ByteString csTag;
442 if (!FindFont(pFormDict, pFont, csTag))
443 return;
444
445 CPDF_Dictionary* pDR = pFormDict->GetDictFor("DR");
446 CPDF_Dictionary* pFonts = pDR->GetDictFor("Font");
447 pFonts->RemoveFor(csTag);
448 }
449
450 void RemoveFont(CPDF_Dictionary* pFormDict, CFX_ByteString csNameTag) {
451 if (!pFormDict || csNameTag.IsEmpty())
452 return;
453
454 CPDF_Dictionary* pDR = pFormDict->GetDictFor("DR");
455 if (!pDR)
456 return;
457
458 CPDF_Dictionary* pFonts = pDR->GetDictFor("Font");
459 if (!pFonts)
460 return;
461
462 pFonts->RemoveFor(csNameTag);
463 }
464
465 class CFieldNameExtractor { 305 class CFieldNameExtractor {
466 public: 306 public:
467 explicit CFieldNameExtractor(const CFX_WideString& full_name) 307 explicit CFieldNameExtractor(const CFX_WideString& full_name)
468 : m_FullName(full_name) { 308 : m_FullName(full_name) {
469 m_pCur = m_FullName.c_str(); 309 m_pCur = m_FullName.c_str();
470 m_pEnd = m_pCur + m_FullName.GetLength(); 310 m_pEnd = m_pCur + m_FullName.GetLength();
471 } 311 }
472 312
473 void GetNext(const FX_WCHAR*& pSubName, FX_STRSIZE& size) { 313 void GetNext(const FX_WCHAR*& pSubName, FX_STRSIZE& size) {
474 pSubName = m_pCur; 314 pSubName = m_pCur;
(...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after
526 lf.lfCharSet = charSet; 366 lf.lfCharSet = charSet;
527 lf.lfPitchAndFamily = pitchAndFamily; 367 lf.lfPitchAndFamily = pitchAndFamily;
528 if (pcsFontName) { 368 if (pcsFontName) {
529 // TODO(dsinclair): Should this be strncpy? 369 // TODO(dsinclair): Should this be strncpy?
530 strcpy(lf.lfFaceName, pcsFontName); 370 strcpy(lf.lfFaceName, pcsFontName);
531 } 371 }
532 return RetrieveSpecificFont(lf); 372 return RetrieveSpecificFont(lf);
533 } 373 }
534 #endif // _FXM_PLATFORM_ == _FXM_PLATFORM_WINDOWS_ 374 #endif // _FXM_PLATFORM_ == _FXM_PLATFORM_WINDOWS_
535 375
376 int CompareFieldName(const CFX_WideString& name1, const CFX_WideString& name2) {
377 const FX_WCHAR* ptr1 = name1.c_str();
378 const FX_WCHAR* ptr2 = name2.c_str();
379 if (name1.GetLength() == name2.GetLength())
380 return name1 == name2 ? 1 : 0;
381
382 int i = 0;
383 while (ptr1[i] == ptr2[i])
384 i++;
385 if (i == name1.GetLength())
386 return 2;
387 if (i == name2.GetLength())
388 return 3;
389 return 0;
390 }
391
536 } // namespace 392 } // namespace
537 393
538 class CFieldTree { 394 class CFieldTree {
539 public: 395 public:
540 class Node { 396 class Node {
541 public: 397 public:
542 Node() : m_pField(nullptr) {} 398 Node() : m_pField(nullptr) {}
543 Node(const CFX_WideString& short_name, CPDF_FormField* pField) 399 Node(const CFX_WideString& short_name, CPDF_FormField* pField)
544 : m_ShortName(short_name), m_pField(pField) {} 400 : m_ShortName(short_name), m_pField(pField) {}
545 ~Node() {} 401 ~Node() {}
546 402
547 void AddChildNode(Node* pNode) { m_Children.push_back(pNode); } 403 void AddChildNode(Node* pNode) { m_Children.push_back(pNode); }
548 404
549 size_t GetChildrenCount() const { return m_Children.size(); } 405 size_t GetChildrenCount() const { return m_Children.size(); }
550 406
551 Node* GetChildAt(size_t i) { return m_Children[i]; } 407 Node* GetChildAt(size_t i) { return m_Children[i]; }
552 const Node* GetChildAt(size_t i) const { return m_Children[i]; } 408 const Node* GetChildAt(size_t i) const { return m_Children[i]; }
553 409
554 CPDF_FormField* GetFieldAtIndex(int index) { 410 CPDF_FormField* GetFieldAtIndex(size_t index) {
555 int nFieldsToGo = index; 411 size_t nFieldsToGo = index;
556 return GetFieldInternal(&nFieldsToGo); 412 return GetFieldInternal(&nFieldsToGo);
557 } 413 }
558 414
559 int CountFields() const { return CountFieldsInternal(0); } 415 size_t CountFields() const { return CountFieldsInternal(0); }
560 416
561 void SetField(CPDF_FormField* pField) { m_pField = pField; } 417 void SetField(CPDF_FormField* pField) { m_pField = pField; }
562 418
563 CPDF_FormField* GetField() { return m_pField; } 419 CPDF_FormField* GetField() { return m_pField; }
564 const CPDF_FormField* GetField() const { return m_pField; } 420 const CPDF_FormField* GetField() const { return m_pField; }
565 421
566 const CFX_WideString& GetShortName() const { return m_ShortName; } 422 const CFX_WideString& GetShortName() const { return m_ShortName; }
567 423
568 private: 424 private:
569 CPDF_FormField* GetFieldInternal(int* pFieldsToGo) { 425 CPDF_FormField* GetFieldInternal(size_t* pFieldsToGo) {
570 if (m_pField) { 426 if (m_pField) {
571 if (*pFieldsToGo == 0) 427 if (*pFieldsToGo == 0)
572 return m_pField; 428 return m_pField;
573 429
574 --*pFieldsToGo; 430 --*pFieldsToGo;
575 return nullptr; 431 return nullptr;
576 } 432 }
577 for (size_t i = 0; i < GetChildrenCount(); ++i) { 433 for (size_t i = 0; i < GetChildrenCount(); ++i) {
578 CPDF_FormField* pField = GetChildAt(i)->GetFieldInternal(pFieldsToGo); 434 CPDF_FormField* pField = GetChildAt(i)->GetFieldInternal(pFieldsToGo);
579 if (pField) 435 if (pField)
580 return pField; 436 return pField;
581 } 437 }
582 return nullptr; 438 return nullptr;
583 } 439 }
584 440
585 int CountFieldsInternal(int nLevel) const { 441 size_t CountFieldsInternal(int nLevel) const {
586 if (nLevel > nMaxRecursion) 442 if (nLevel > nMaxRecursion)
587 return 0; 443 return 0;
588 if (m_pField) 444 if (m_pField)
589 return 1; 445 return 1;
590 446
591 int count = 0; 447 size_t count = 0;
592 for (size_t i = 0; i < GetChildrenCount(); ++i) 448 for (size_t i = 0; i < GetChildrenCount(); ++i)
593 count += GetChildAt(i)->CountFieldsInternal(nLevel + 1); 449 count += GetChildAt(i)->CountFieldsInternal(nLevel + 1);
594 return count; 450 return count;
595 } 451 }
596 452
597 std::vector<Node*> m_Children; 453 std::vector<Node*> m_Children;
598 CFX_WideString m_ShortName; 454 CFX_WideString m_ShortName;
599 CPDF_FormField* m_pField; 455 CPDF_FormField* m_pField;
600 }; 456 };
601 457
(...skipping 201 matching lines...) Expand 10 before | Expand all | Expand 10 after
803 return; 659 return;
804 660
805 m_pFormDict = pRoot->GetDictFor("AcroForm"); 661 m_pFormDict = pRoot->GetDictFor("AcroForm");
806 if (!m_pFormDict) 662 if (!m_pFormDict)
807 return; 663 return;
808 664
809 CPDF_Array* pFields = m_pFormDict->GetArrayFor("Fields"); 665 CPDF_Array* pFields = m_pFormDict->GetArrayFor("Fields");
810 if (!pFields) 666 if (!pFields)
811 return; 667 return;
812 668
813 for (size_t i = 0; i < pFields->GetCount(); i++) 669 for (size_t i = 0; i < pFields->GetCount(); ++i)
814 LoadField(pFields->GetDictAt(i)); 670 LoadField(pFields->GetDictAt(i), 0);
815 } 671 }
816 672
817 CPDF_InterForm::~CPDF_InterForm() { 673 CPDF_InterForm::~CPDF_InterForm() {
818 for (auto it : m_ControlMap) 674 for (auto it : m_ControlMap)
819 delete it.second; 675 delete it.second;
820 676
821 int nCount = m_pFieldTree->m_Root.CountFields(); 677 size_t nCount = m_pFieldTree->m_Root.CountFields();
822 for (int i = 0; i < nCount; ++i) 678 for (size_t i = 0; i < nCount; ++i)
823 delete m_pFieldTree->m_Root.GetFieldAtIndex(i); 679 delete m_pFieldTree->m_Root.GetFieldAtIndex(i);
824 } 680 }
825 681
826 FX_BOOL CPDF_InterForm::s_bUpdateAP = TRUE; 682 bool CPDF_InterForm::s_bUpdateAP = true;
827 683
828 FX_BOOL CPDF_InterForm::IsUpdateAPEnabled() { 684 bool CPDF_InterForm::IsUpdateAPEnabled() {
829 return s_bUpdateAP; 685 return s_bUpdateAP;
830 } 686 }
831 687
832 void CPDF_InterForm::SetUpdateAP(FX_BOOL bUpdateAP) { 688 void CPDF_InterForm::SetUpdateAP(bool bUpdateAP) {
833 s_bUpdateAP = bUpdateAP; 689 s_bUpdateAP = bUpdateAP;
834 } 690 }
835 691
836 CFX_ByteString CPDF_InterForm::GenerateNewResourceName( 692 CFX_ByteString CPDF_InterForm::GenerateNewResourceName(
837 const CPDF_Dictionary* pResDict, 693 const CPDF_Dictionary* pResDict,
838 const FX_CHAR* csType, 694 const FX_CHAR* csType,
839 int iMinLen, 695 int iMinLen,
840 const FX_CHAR* csPrefix) { 696 const FX_CHAR* csPrefix) {
841 CFX_ByteString csStr = csPrefix; 697 CFX_ByteString csStr = csPrefix;
842 CFX_ByteString csBType = csType; 698 CFX_ByteString csBType = csType;
(...skipping 91 matching lines...) Expand 10 before | Expand all | Expand 10 after
934 if (pLogFont) 790 if (pLogFont)
935 memcpy(pLogFont, &lf, sizeof(LOGFONTA)); 791 memcpy(pLogFont, &lf, sizeof(LOGFONTA));
936 792
937 csFontName = lf.lfFaceName; 793 csFontName = lf.lfFaceName;
938 return csFontName; 794 return csFontName;
939 } 795 }
940 #endif 796 #endif
941 return csFontName; 797 return csFontName;
942 } 798 }
943 799
944 CFX_ByteString CPDF_InterForm::GetNativeFont(void* pLogFont) {
945 #if _FXM_PLATFORM_ == _FXM_PLATFORM_WINDOWS_
946 return GetNativeFont(GetNativeCharSet(), pLogFont);
947 #else
948 return CFX_ByteString();
949 #endif
950 }
951
952 CPDF_Font* CPDF_InterForm::AddNativeFont(uint8_t charSet, 800 CPDF_Font* CPDF_InterForm::AddNativeFont(uint8_t charSet,
953 CPDF_Document* pDocument) { 801 CPDF_Document* pDocument) {
954 if (!pDocument) 802 if (!pDocument)
955 return nullptr; 803 return nullptr;
956 804
957 #if _FXM_PLATFORM_ == _FXM_PLATFORM_WINDOWS_ 805 #if _FXM_PLATFORM_ == _FXM_PLATFORM_WINDOWS_
958 LOGFONTA lf; 806 LOGFONTA lf;
959 CFX_ByteString csFontName = GetNativeFont(charSet, &lf); 807 CFX_ByteString csFontName = GetNativeFont(charSet, &lf);
960 if (!csFontName.IsEmpty()) { 808 if (!csFontName.IsEmpty()) {
961 if (csFontName == "Helvetica") 809 if (csFontName == "Helvetica")
962 return AddStandardFont(pDocument, csFontName); 810 return AddStandardFont(pDocument, csFontName);
963 return pDocument->AddWindowsFont(&lf, FALSE, TRUE); 811 return pDocument->AddWindowsFont(&lf, FALSE, TRUE);
964 } 812 }
965 #endif 813 #endif
966 return nullptr; 814 return nullptr;
967 } 815 }
968 816
969 CPDF_Font* CPDF_InterForm::AddNativeFont(CPDF_Document* pDocument) { 817 CPDF_Font* CPDF_InterForm::AddNativeFont(CPDF_Document* pDocument) {
970 return pDocument ? AddNativeFont(GetNativeCharSet(), pDocument) : nullptr; 818 return pDocument ? AddNativeFont(GetNativeCharSet(), pDocument) : nullptr;
971 } 819 }
972 820
973 FX_BOOL CPDF_InterForm::ValidateFieldName( 821 bool CPDF_InterForm::ValidateFieldName(
974 CFX_WideString& csNewFieldName, 822 CFX_WideString& csNewFieldName,
975 int iType, 823 int iType,
976 const CPDF_FormField* pExcludedField, 824 const CPDF_FormField* pExcludedField,
977 const CPDF_FormControl* pExcludedControl) { 825 const CPDF_FormControl* pExcludedControl) const {
978 if (csNewFieldName.IsEmpty()) 826 if (csNewFieldName.IsEmpty())
979 return FALSE; 827 return false;
980 828
981 int iPos = 0; 829 int iPos = 0;
982 int iLength = csNewFieldName.GetLength(); 830 int iLength = csNewFieldName.GetLength();
983 CFX_WideString csSub; 831 CFX_WideString csSub;
984 while (TRUE) { 832 while (true) {
985 while (iPos < iLength && 833 while (iPos < iLength &&
986 (csNewFieldName[iPos] == L'.' || csNewFieldName[iPos] == L' ')) { 834 (csNewFieldName[iPos] == L'.' || csNewFieldName[iPos] == L' ')) {
987 iPos++; 835 iPos++;
988 } 836 }
989 if (iPos < iLength && !csSub.IsEmpty()) 837 if (iPos < iLength && !csSub.IsEmpty())
990 csSub += L'.'; 838 csSub += L'.';
991 while (iPos < iLength && csNewFieldName[iPos] != L'.') 839 while (iPos < iLength && csNewFieldName[iPos] != L'.')
992 csSub += csNewFieldName[iPos++]; 840 csSub += csNewFieldName[iPos++];
993 for (int i = csSub.GetLength() - 1; i > -1; i--) { 841 for (int i = csSub.GetLength() - 1; i > -1; i--) {
994 if (csSub[i] == L' ' || csSub[i] == L'.') 842 if (csSub[i] != L' ' && csSub[i] != L'.')
995 csSub.SetAt(i, L'\0');
996 else
997 break; 843 break;
844
845 csSub.SetAt(i, L'\0');
998 } 846 }
999 uint32_t dwCount = m_pFieldTree->m_Root.CountFields(); 847 size_t dwCount = m_pFieldTree->m_Root.CountFields();
1000 for (uint32_t m = 0; m < dwCount; m++) { 848 for (size_t m = 0; m < dwCount; ++m) {
1001 CPDF_FormField* pField = m_pFieldTree->m_Root.GetFieldAtIndex(m); 849 CPDF_FormField* pField = m_pFieldTree->m_Root.GetFieldAtIndex(m);
1002 if (!pField) 850 if (!pField)
1003 continue; 851 continue;
1004 if (pField == pExcludedField) { 852 if (pField == pExcludedField) {
1005 if (pExcludedControl) { 853 if (!pExcludedControl)
1006 if (pField->CountControls() < 2)
1007 continue;
1008 } else {
1009 continue; 854 continue;
1010 } 855 if (pField->CountControls() < 2)
Tom Sepez 2016/09/28 20:46:49 nit: combine with 853
Lei Zhang 2016/09/28 21:02:39 Done.
856 continue;
1011 } 857 }
1012 CFX_WideString csFullName = pField->GetFullName(); 858 CFX_WideString csFullName = pField->GetFullName();
1013 int iRet = CompareFieldName(csSub, csFullName); 859 int iRet = CompareFieldName(csSub, csFullName);
1014 if (iRet == 1) { 860 if (iRet == 1) {
1015 if (pField->GetFieldType() != iType) 861 if (pField->GetFieldType() != iType)
1016 return FALSE; 862 return false;
1017 } else if (iRet == 2 && csSub == csNewFieldName) { 863 } else if (iRet == 2 && csSub == csNewFieldName) {
1018 if (csFullName[iPos] == L'.') 864 if (csFullName[iPos] == L'.')
1019 return FALSE; 865 return false;
1020 } else if (iRet == 3 && csSub == csNewFieldName) { 866 } else if (iRet == 3 && csSub == csNewFieldName) {
1021 if (csNewFieldName[csFullName.GetLength()] == L'.') 867 if (csNewFieldName[csFullName.GetLength()] == L'.')
1022 return FALSE; 868 return false;
1023 } 869 }
1024 } 870 }
1025 if (iPos >= iLength) 871 if (iPos >= iLength)
1026 break; 872 break;
1027 } 873 }
1028 if (csSub.IsEmpty()) 874 if (csSub.IsEmpty())
1029 return FALSE; 875 return false;
1030 876
1031 csNewFieldName = csSub; 877 csNewFieldName = csSub;
1032 return TRUE; 878 return true;
1033 } 879 }
1034 880
1035 FX_BOOL CPDF_InterForm::ValidateFieldName(CFX_WideString& csNewFieldName, 881 size_t CPDF_InterForm::CountFields(const CFX_WideString& csFieldName) const {
1036 int iType) {
1037 return ValidateFieldName(csNewFieldName, iType, nullptr, nullptr);
1038 }
1039
1040 FX_BOOL CPDF_InterForm::ValidateFieldName(const CPDF_FormField* pField,
1041 CFX_WideString& csNewFieldName) {
1042 return pField && !csNewFieldName.IsEmpty() &&
1043 ValidateFieldName(csNewFieldName, pField->GetFieldType(), pField,
1044 nullptr);
1045 }
1046
1047 FX_BOOL CPDF_InterForm::ValidateFieldName(const CPDF_FormControl* pControl,
1048 CFX_WideString& csNewFieldName) {
1049 if (!pControl || csNewFieldName.IsEmpty())
1050 return FALSE;
1051
1052 CPDF_FormField* pField = pControl->GetField();
1053 return ValidateFieldName(csNewFieldName, pField->GetFieldType(), pField,
1054 pControl);
1055 }
1056
1057 int CPDF_InterForm::CompareFieldName(const CFX_ByteString& name1,
1058 const CFX_ByteString& name2) {
1059 if (name1.GetLength() == name2.GetLength())
1060 return name1 == name2 ? 1 : 0;
1061
1062 const FX_CHAR* ptr1 = name1.c_str();
1063 const FX_CHAR* ptr2 = name2.c_str();
1064 int i = 0;
1065 while (ptr1[i] == ptr2[i])
1066 i++;
1067 if (i == name1.GetLength())
1068 return 2;
1069 if (i == name2.GetLength())
1070 return 3;
1071 return 0;
1072 }
1073
1074 int CPDF_InterForm::CompareFieldName(const CFX_WideString& name1,
1075 const CFX_WideString& name2) {
1076 const FX_WCHAR* ptr1 = name1.c_str();
1077 const FX_WCHAR* ptr2 = name2.c_str();
1078 if (name1.GetLength() == name2.GetLength())
1079 return name1 == name2 ? 1 : 0;
1080
1081 int i = 0;
1082 while (ptr1[i] == ptr2[i])
1083 i++;
1084 if (i == name1.GetLength())
1085 return 2;
1086 if (i == name2.GetLength())
1087 return 3;
1088 return 0;
1089 }
1090
1091 uint32_t CPDF_InterForm::CountFields(const CFX_WideString& csFieldName) {
1092 if (csFieldName.IsEmpty()) 882 if (csFieldName.IsEmpty())
1093 return (uint32_t)m_pFieldTree->m_Root.CountFields(); 883 return m_pFieldTree->m_Root.CountFields();
1094 884
1095 CFieldTree::Node* pNode = m_pFieldTree->FindNode(csFieldName); 885 CFieldTree::Node* pNode = m_pFieldTree->FindNode(csFieldName);
1096 return pNode ? pNode->CountFields() : 0; 886 return pNode ? pNode->CountFields() : 0;
1097 } 887 }
1098 888
1099 CPDF_FormField* CPDF_InterForm::GetField(uint32_t index, 889 CPDF_FormField* CPDF_InterForm::GetField(
1100 const CFX_WideString& csFieldName) { 890 uint32_t index,
891 const CFX_WideString& csFieldName) const {
1101 if (csFieldName.IsEmpty()) 892 if (csFieldName.IsEmpty())
1102 return m_pFieldTree->m_Root.GetFieldAtIndex(index); 893 return m_pFieldTree->m_Root.GetFieldAtIndex(index);
1103 894
1104 CFieldTree::Node* pNode = m_pFieldTree->FindNode(csFieldName); 895 CFieldTree::Node* pNode = m_pFieldTree->FindNode(csFieldName);
1105 return pNode ? pNode->GetFieldAtIndex(index) : nullptr; 896 return pNode ? pNode->GetFieldAtIndex(index) : nullptr;
1106 } 897 }
1107 898
1108 CPDF_FormField* CPDF_InterForm::GetFieldByDict( 899 CPDF_FormField* CPDF_InterForm::GetFieldByDict(
1109 CPDF_Dictionary* pFieldDict) const { 900 CPDF_Dictionary* pFieldDict) const {
1110 if (!pFieldDict) 901 if (!pFieldDict)
(...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after
1183 return -1; 974 return -1;
1184 975
1185 for (size_t i = 0; i < pArray->GetCount(); i++) { 976 for (size_t i = 0; i < pArray->GetCount(); i++) {
1186 CPDF_Object* pElement = pArray->GetDirectObjectAt(i); 977 CPDF_Object* pElement = pArray->GetDirectObjectAt(i);
1187 if (pElement == pField->m_pDict) 978 if (pElement == pField->m_pDict)
1188 return i; 979 return i;
1189 } 980 }
1190 return -1; 981 return -1;
1191 } 982 }
1192 983
1193 uint32_t CPDF_InterForm::CountFormFonts() {
1194 return CountFonts(m_pFormDict);
1195 }
1196
1197 CPDF_Font* CPDF_InterForm::GetFormFont(uint32_t index,
1198 CFX_ByteString& csNameTag) {
1199 return GetFont(m_pFormDict, m_pDocument, index, csNameTag);
1200 }
1201
1202 CPDF_Font* CPDF_InterForm::GetFormFont(CFX_ByteString csNameTag) { 984 CPDF_Font* CPDF_InterForm::GetFormFont(CFX_ByteString csNameTag) {
1203 return GetFont(m_pFormDict, m_pDocument, csNameTag); 985 return GetFont(m_pFormDict, m_pDocument, csNameTag);
1204 } 986 }
1205 987
1206 CPDF_Font* CPDF_InterForm::GetFormFont(CFX_ByteString csFontName, 988 CPDF_DefaultAppearance CPDF_InterForm::GetDefaultAppearance() const {
1207 CFX_ByteString& csNameTag) {
1208 return GetFont(m_pFormDict, m_pDocument, csFontName, csNameTag);
1209 }
1210
1211 CPDF_Font* CPDF_InterForm::GetNativeFormFont(uint8_t charSet,
1212 CFX_ByteString& csNameTag) {
1213 return ::GetNativeFont(m_pFormDict, m_pDocument, charSet, csNameTag);
1214 }
1215
1216 CPDF_Font* CPDF_InterForm::GetNativeFormFont(CFX_ByteString& csNameTag) {
1217 return ::GetNativeFont(m_pFormDict, m_pDocument, csNameTag);
1218 }
1219
1220 FX_BOOL CPDF_InterForm::FindFormFont(const CPDF_Font* pFont,
1221 CFX_ByteString& csNameTag) {
1222 return FindFont(m_pFormDict, pFont, csNameTag);
1223 }
1224
1225 FX_BOOL CPDF_InterForm::FindFormFont(CFX_ByteString csFontName,
1226 CPDF_Font*& pFont,
1227 CFX_ByteString& csNameTag) {
1228 return FindFont(m_pFormDict, m_pDocument, csFontName, pFont, csNameTag);
1229 }
1230
1231 void CPDF_InterForm::AddFormFont(const CPDF_Font* pFont,
1232 CFX_ByteString& csNameTag) {
1233 AddFont(m_pFormDict, m_pDocument, pFont, csNameTag);
1234 }
1235
1236 CPDF_Font* CPDF_InterForm::AddNativeFormFont(uint8_t charSet,
1237 CFX_ByteString& csNameTag) {
1238 return ::AddNativeFont(m_pFormDict, m_pDocument, charSet, csNameTag);
1239 }
1240
1241 CPDF_Font* CPDF_InterForm::AddNativeFormFont(CFX_ByteString& csNameTag) {
1242 return AddNativeInterFormFont(m_pFormDict, m_pDocument, csNameTag);
1243 }
1244
1245 void CPDF_InterForm::RemoveFormFont(const CPDF_Font* pFont) {
1246 RemoveFont(m_pFormDict, pFont);
1247 }
1248
1249 void CPDF_InterForm::RemoveFormFont(CFX_ByteString csNameTag) {
1250 RemoveFont(m_pFormDict, csNameTag);
1251 }
1252
1253 CPDF_DefaultAppearance CPDF_InterForm::GetDefaultAppearance() {
1254 if (!m_pFormDict) 989 if (!m_pFormDict)
1255 return CPDF_DefaultAppearance(); 990 return CPDF_DefaultAppearance();
1256 return CPDF_DefaultAppearance(m_pFormDict->GetStringFor("DA")); 991 return CPDF_DefaultAppearance(m_pFormDict->GetStringFor("DA"));
1257 } 992 }
1258 993
1259 CPDF_Font* CPDF_InterForm::GetDefaultFormFont() { 994 int CPDF_InterForm::GetFormAlignment() const {
1260 return GetDefaultFont(m_pFormDict, m_pDocument);
1261 }
1262
1263 int CPDF_InterForm::GetFormAlignment() {
1264 return m_pFormDict ? m_pFormDict->GetIntegerFor("Q", 0) : 0; 995 return m_pFormDict ? m_pFormDict->GetIntegerFor("Q", 0) : 0;
1265 } 996 }
1266 997
1267 bool CPDF_InterForm::ResetForm(const std::vector<CPDF_FormField*>& fields, 998 bool CPDF_InterForm::ResetForm(const std::vector<CPDF_FormField*>& fields,
1268 bool bIncludeOrExclude, 999 bool bIncludeOrExclude,
1269 bool bNotify) { 1000 bool bNotify) {
1270 if (bNotify && m_pFormNotify && m_pFormNotify->BeforeFormReset(this) < 0) 1001 if (bNotify && m_pFormNotify && m_pFormNotify->BeforeFormReset(this) < 0)
1271 return false; 1002 return false;
1272 1003
1273 int nCount = m_pFieldTree->m_Root.CountFields(); 1004 size_t nCount = m_pFieldTree->m_Root.CountFields();
1274 for (int i = 0; i < nCount; ++i) { 1005 for (size_t i = 0; i < nCount; ++i) {
1275 CPDF_FormField* pField = m_pFieldTree->m_Root.GetFieldAtIndex(i); 1006 CPDF_FormField* pField = m_pFieldTree->m_Root.GetFieldAtIndex(i);
1276 if (!pField) 1007 if (!pField)
1277 continue; 1008 continue;
1278 1009
1279 if (bIncludeOrExclude == pdfium::ContainsValue(fields, pField)) 1010 if (bIncludeOrExclude == pdfium::ContainsValue(fields, pField))
1280 pField->ResetField(bNotify); 1011 pField->ResetField(bNotify);
1281 } 1012 }
1282 if (bNotify && m_pFormNotify) 1013 if (bNotify && m_pFormNotify)
1283 m_pFormNotify->AfterFormReset(this); 1014 m_pFormNotify->AfterFormReset(this);
1284 return true; 1015 return true;
1285 } 1016 }
1286 1017
1287 bool CPDF_InterForm::ResetForm(bool bNotify) { 1018 bool CPDF_InterForm::ResetForm(bool bNotify) {
1288 if (bNotify && m_pFormNotify && m_pFormNotify->BeforeFormReset(this) < 0) 1019 if (bNotify && m_pFormNotify && m_pFormNotify->BeforeFormReset(this) < 0)
1289 return false; 1020 return false;
1290 1021
1291 int nCount = m_pFieldTree->m_Root.CountFields(); 1022 size_t nCount = m_pFieldTree->m_Root.CountFields();
1292 for (int i = 0; i < nCount; ++i) { 1023 for (size_t i = 0; i < nCount; ++i) {
1293 CPDF_FormField* pField = m_pFieldTree->m_Root.GetFieldAtIndex(i); 1024 CPDF_FormField* pField = m_pFieldTree->m_Root.GetFieldAtIndex(i);
1294 if (!pField) 1025 if (!pField)
1295 continue; 1026 continue;
1296 1027
1297 pField->ResetField(bNotify); 1028 pField->ResetField(bNotify);
1298 } 1029 }
1299 if (bNotify && m_pFormNotify) 1030 if (bNotify && m_pFormNotify)
1300 m_pFormNotify->AfterFormReset(this); 1031 m_pFormNotify->AfterFormReset(this);
1301 return true; 1032 return true;
1302 } 1033 }
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after
1340 if (!pPageDict) 1071 if (!pPageDict)
1341 return; 1072 return;
1342 1073
1343 CPDF_Array* pAnnots = pPageDict->GetArrayFor("Annots"); 1074 CPDF_Array* pAnnots = pPageDict->GetArrayFor("Annots");
1344 if (!pAnnots) 1075 if (!pAnnots)
1345 return; 1076 return;
1346 1077
1347 for (size_t i = 0; i < pAnnots->GetCount(); i++) { 1078 for (size_t i = 0; i < pAnnots->GetCount(); i++) {
1348 CPDF_Dictionary* pAnnot = pAnnots->GetDictAt(i); 1079 CPDF_Dictionary* pAnnot = pAnnots->GetDictAt(i);
1349 if (pAnnot && pAnnot->GetStringFor("Subtype") == "Widget") 1080 if (pAnnot && pAnnot->GetStringFor("Subtype") == "Widget")
1350 LoadField(pAnnot); 1081 LoadField(pAnnot, 0);
1351 } 1082 }
1352 } 1083 }
1353 1084
1354 CPDF_FormField* CPDF_InterForm::AddTerminalField(CPDF_Dictionary* pFieldDict) { 1085 CPDF_FormField* CPDF_InterForm::AddTerminalField(CPDF_Dictionary* pFieldDict) {
1355 if (!pFieldDict->KeyExist("T")) 1086 if (!pFieldDict->KeyExist("T"))
1356 return nullptr; 1087 return nullptr;
1357 1088
1358 CPDF_Dictionary* pDict = pFieldDict; 1089 CPDF_Dictionary* pDict = pFieldDict;
1359 CFX_WideString csWName = FPDF_GetFullName(pFieldDict); 1090 CFX_WideString csWName = FPDF_GetFullName(pFieldDict);
1360 if (csWName.IsEmpty()) 1091 if (csWName.IsEmpty())
(...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after
1423 1154
1424 CPDF_FormControl* pControl = new CPDF_FormControl(pField, pWidgetDict); 1155 CPDF_FormControl* pControl = new CPDF_FormControl(pField, pWidgetDict);
1425 m_ControlMap[pWidgetDict] = pControl; 1156 m_ControlMap[pWidgetDict] = pControl;
1426 pField->m_ControlList.Add(pControl); 1157 pField->m_ControlList.Add(pControl);
1427 return pControl; 1158 return pControl;
1428 } 1159 }
1429 1160
1430 CPDF_FormField* CPDF_InterForm::CheckRequiredFields( 1161 CPDF_FormField* CPDF_InterForm::CheckRequiredFields(
1431 const std::vector<CPDF_FormField*>* fields, 1162 const std::vector<CPDF_FormField*>* fields,
1432 bool bIncludeOrExclude) const { 1163 bool bIncludeOrExclude) const {
1433 int nCount = m_pFieldTree->m_Root.CountFields(); 1164 size_t nCount = m_pFieldTree->m_Root.CountFields();
1434 for (int i = 0; i < nCount; ++i) { 1165 for (size_t i = 0; i < nCount; ++i) {
1435 CPDF_FormField* pField = m_pFieldTree->m_Root.GetFieldAtIndex(i); 1166 CPDF_FormField* pField = m_pFieldTree->m_Root.GetFieldAtIndex(i);
1436 if (!pField) 1167 if (!pField)
1437 continue; 1168 continue;
1438 1169
1439 int32_t iType = pField->GetType(); 1170 int32_t iType = pField->GetType();
1440 if (iType == CPDF_FormField::PushButton || 1171 if (iType == CPDF_FormField::PushButton ||
1441 iType == CPDF_FormField::CheckBox || iType == CPDF_FormField::ListBox) { 1172 iType == CPDF_FormField::CheckBox || iType == CPDF_FormField::ListBox) {
1442 continue; 1173 continue;
1443 } 1174 }
1444 uint32_t dwFlags = pField->GetFieldFlags(); 1175 uint32_t dwFlags = pField->GetFieldFlags();
1445 // TODO(thestig): Look up these magic numbers and add constants for them. 1176 // TODO(thestig): Look up these magic numbers and add constants for them.
1446 if (dwFlags & 0x04) 1177 if (dwFlags & 0x04)
1447 continue; 1178 continue;
1448 1179
1449 bool bFind = true; 1180 bool bFind = true;
1450 if (fields) 1181 if (fields)
1451 bFind = pdfium::ContainsValue(*fields, pField); 1182 bFind = pdfium::ContainsValue(*fields, pField);
1452 if (bIncludeOrExclude == bFind) { 1183 if (bIncludeOrExclude == bFind) {
1453 CPDF_Dictionary* pFieldDict = pField->m_pDict; 1184 CPDF_Dictionary* pFieldDict = pField->m_pDict;
1454 if ((dwFlags & 0x02) != 0 && pFieldDict->GetStringFor("V").IsEmpty()) 1185 if ((dwFlags & 0x02) != 0 && pFieldDict->GetStringFor("V").IsEmpty())
1455 return pField; 1186 return pField;
1456 } 1187 }
1457 } 1188 }
1458 return nullptr; 1189 return nullptr;
1459 } 1190 }
1460 1191
1461 CFDF_Document* CPDF_InterForm::ExportToFDF(const CFX_WideStringC& pdf_path, 1192 CFDF_Document* CPDF_InterForm::ExportToFDF(const CFX_WideStringC& pdf_path,
1462 bool bSimpleFileSpec) const { 1193 bool bSimpleFileSpec) const {
1463 std::vector<CPDF_FormField*> fields; 1194 std::vector<CPDF_FormField*> fields;
1464 int nCount = m_pFieldTree->m_Root.CountFields(); 1195 size_t nCount = m_pFieldTree->m_Root.CountFields();
1465 for (int i = 0; i < nCount; ++i) 1196 for (size_t i = 0; i < nCount; ++i)
1466 fields.push_back(m_pFieldTree->m_Root.GetFieldAtIndex(i)); 1197 fields.push_back(m_pFieldTree->m_Root.GetFieldAtIndex(i));
1467 return ExportToFDF(pdf_path, fields, true, bSimpleFileSpec); 1198 return ExportToFDF(pdf_path, fields, true, bSimpleFileSpec);
1468 } 1199 }
1469 1200
1470 CFDF_Document* CPDF_InterForm::ExportToFDF( 1201 CFDF_Document* CPDF_InterForm::ExportToFDF(
1471 const CFX_WideStringC& pdf_path, 1202 const CFX_WideStringC& pdf_path,
1472 const std::vector<CPDF_FormField*>& fields, 1203 const std::vector<CPDF_FormField*>& fields,
1473 bool bIncludeOrExclude, 1204 bool bIncludeOrExclude,
1474 bool bSimpleFileSpec) const { 1205 bool bSimpleFileSpec) const {
1475 CFDF_Document* pDoc = CFDF_Document::CreateNewDoc(); 1206 CFDF_Document* pDoc = CFDF_Document::CreateNewDoc();
1476 if (!pDoc) 1207 if (!pDoc)
1477 return nullptr; 1208 return nullptr;
1478 1209
1479 CPDF_Dictionary* pMainDict = pDoc->GetRoot()->GetDictFor("FDF"); 1210 CPDF_Dictionary* pMainDict = pDoc->GetRoot()->GetDictFor("FDF");
1480 if (!pdf_path.IsEmpty()) { 1211 if (!pdf_path.IsEmpty()) {
1481 if (bSimpleFileSpec) { 1212 if (bSimpleFileSpec) {
1482 CFX_WideString wsFilePath = CPDF_FileSpec::EncodeFileName(pdf_path); 1213 CFX_WideString wsFilePath = CPDF_FileSpec::EncodeFileName(pdf_path);
1483 pMainDict->SetStringFor("F", CFX_ByteString::FromUnicode(wsFilePath)); 1214 pMainDict->SetStringFor("F", CFX_ByteString::FromUnicode(wsFilePath));
1484 pMainDict->SetStringFor("UF", PDF_EncodeText(wsFilePath)); 1215 pMainDict->SetStringFor("UF", PDF_EncodeText(wsFilePath));
1485 } else { 1216 } else {
1486 CPDF_FileSpec filespec; 1217 CPDF_FileSpec filespec;
1487 filespec.SetFileName(pdf_path); 1218 filespec.SetFileName(pdf_path);
1488 pMainDict->SetFor("F", filespec.GetObj()); 1219 pMainDict->SetFor("F", filespec.GetObj());
1489 } 1220 }
1490 } 1221 }
1491 1222
1492 CPDF_Array* pFields = new CPDF_Array; 1223 CPDF_Array* pFields = new CPDF_Array;
1493 pMainDict->SetFor("Fields", pFields); 1224 pMainDict->SetFor("Fields", pFields);
1494 int nCount = m_pFieldTree->m_Root.CountFields(); 1225 size_t nCount = m_pFieldTree->m_Root.CountFields();
1495 for (int i = 0; i < nCount; i++) { 1226 for (size_t i = 0; i < nCount; ++i) {
1496 CPDF_FormField* pField = m_pFieldTree->m_Root.GetFieldAtIndex(i); 1227 CPDF_FormField* pField = m_pFieldTree->m_Root.GetFieldAtIndex(i);
1497 if (!pField || pField->GetType() == CPDF_FormField::PushButton) 1228 if (!pField || pField->GetType() == CPDF_FormField::PushButton)
1498 continue; 1229 continue;
1499 1230
1500 uint32_t dwFlags = pField->GetFieldFlags(); 1231 uint32_t dwFlags = pField->GetFieldFlags();
1501 if (dwFlags & 0x04) 1232 if (dwFlags & 0x04)
1502 continue; 1233 continue;
1503 1234
1504 if (bIncludeOrExclude == pdfium::ContainsValue(fields, pField)) { 1235 if (bIncludeOrExclude == pdfium::ContainsValue(fields, pField)) {
1505 if ((dwFlags & 0x02) != 0 && pField->m_pDict->GetStringFor("V").IsEmpty()) 1236 if ((dwFlags & 0x02) != 0 && pField->m_pDict->GetStringFor("V").IsEmpty())
(...skipping 73 matching lines...) Expand 10 before | Expand all | Expand 10 after
1579 if (bNotify && m_pFormNotify) { 1310 if (bNotify && m_pFormNotify) {
1580 if (iType == FIELDTYPE_CHECKBOX || iType == FIELDTYPE_RADIOBUTTON) 1311 if (iType == FIELDTYPE_CHECKBOX || iType == FIELDTYPE_RADIOBUTTON)
1581 m_pFormNotify->AfterCheckedStatusChange(pField); 1312 m_pFormNotify->AfterCheckedStatusChange(pField);
1582 else if (iType == FIELDTYPE_LISTBOX) 1313 else if (iType == FIELDTYPE_LISTBOX)
1583 m_pFormNotify->AfterSelectionChange(pField); 1314 m_pFormNotify->AfterSelectionChange(pField);
1584 else if (iType == FIELDTYPE_COMBOBOX || iType == FIELDTYPE_TEXTFIELD) 1315 else if (iType == FIELDTYPE_COMBOBOX || iType == FIELDTYPE_TEXTFIELD)
1585 m_pFormNotify->AfterValueChange(pField); 1316 m_pFormNotify->AfterValueChange(pField);
1586 } 1317 }
1587 } 1318 }
1588 1319
1589 FX_BOOL CPDF_InterForm::ImportFromFDF(const CFDF_Document* pFDF,
1590 FX_BOOL bNotify) {
1591 if (!pFDF)
1592 return FALSE;
1593
1594 CPDF_Dictionary* pMainDict = pFDF->GetRoot()->GetDictFor("FDF");
1595 if (!pMainDict)
1596 return FALSE;
1597
1598 CPDF_Array* pFields = pMainDict->GetArrayFor("Fields");
1599 if (!pFields)
1600 return FALSE;
1601
1602 m_bsEncoding = pMainDict->GetStringFor("Encoding");
1603 if (bNotify && m_pFormNotify && m_pFormNotify->BeforeFormImportData(this) < 0)
1604 return FALSE;
1605
1606 for (size_t i = 0; i < pFields->GetCount(); i++) {
1607 CPDF_Dictionary* pField = pFields->GetDictAt(i);
1608 if (!pField)
1609 continue;
1610
1611 FDF_ImportField(pField, L"", bNotify);
1612 }
1613 if (bNotify && m_pFormNotify)
1614 m_pFormNotify->AfterFormImportData(this);
1615 return TRUE;
1616 }
1617
1618 void CPDF_InterForm::SetFormNotify(IPDF_FormNotify* pNotify) { 1320 void CPDF_InterForm::SetFormNotify(IPDF_FormNotify* pNotify) {
1619 m_pFormNotify = pNotify; 1321 m_pFormNotify = pNotify;
1620 } 1322 }
OLDNEW
« no previous file with comments | « no previous file | core/fpdfdoc/include/cpdf_interform.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698