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

Side by Side Diff: core/src/fpdfapi/fpdf_parser/fpdf_parser_parser.cpp

Issue 1541703003: Use std::map as CPDF_Dictionary's underlying store. (Closed) Base URL: https://pdfium.googlesource.com/pdfium.git@master
Patch Set: XFA still uses CFX_CMapByteStringToPtr :( Created 5 years 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
OLDNEW
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 "parser_int.h" 7 #include "parser_int.h"
8 8
9 #include <set> 9 #include <set>
10 #include <utility> 10 #include <utility>
(...skipping 821 matching lines...) Expand 10 before | Expand all | Expand 10 after
832 if (CPDF_Dictionary* pTrailer = 832 if (CPDF_Dictionary* pTrailer =
833 pStream ? pStream->GetDict() : pObj->AsDictionary()) { 833 pStream ? pStream->GetDict() : pObj->AsDictionary()) {
834 if (m_pTrailer) { 834 if (m_pTrailer) {
835 CPDF_Object* pRoot = pTrailer->GetElement("Root"); 835 CPDF_Object* pRoot = pTrailer->GetElement("Root");
836 CPDF_Reference* pRef = ToReference(pRoot); 836 CPDF_Reference* pRef = ToReference(pRoot);
837 if (!pRoot || 837 if (!pRoot ||
838 (pRef && 838 (pRef &&
839 (FX_DWORD)m_CrossRef.GetSize() > 839 (FX_DWORD)m_CrossRef.GetSize() >
840 pRef->GetRefObjNum() && 840 pRef->GetRefObjNum() &&
841 m_CrossRef.GetAt(pRef->GetRefObjNum()) != 0)) { 841 m_CrossRef.GetAt(pRef->GetRefObjNum()) != 0)) {
842 FX_POSITION pos = pTrailer->GetStartPos(); 842 for (const auto& it : *pTrailer) {
843 while (pos) { 843 const CFX_ByteString& key = it.first;
844 CFX_ByteString key; 844 CPDF_Object* pElement = it.second;
845 CPDF_Object* pElement =
846 pTrailer->GetNextElement(pos, key);
847 FX_DWORD dwObjNum = 845 FX_DWORD dwObjNum =
848 pElement ? pElement->GetObjNum() : 0; 846 pElement ? pElement->GetObjNum() : 0;
849 if (dwObjNum) { 847 if (dwObjNum) {
850 m_pTrailer->SetAtReference(key, m_pDocument, 848 m_pTrailer->SetAtReference(key, m_pDocument,
851 dwObjNum); 849 dwObjNum);
852 } else { 850 } else {
853 m_pTrailer->SetAt(key, pElement->Clone()); 851 m_pTrailer->SetAt(key, pElement->Clone());
854 } 852 }
855 } 853 }
856 pObj->Release(); 854 pObj->Release();
(...skipping 1255 matching lines...) Expand 10 before | Expand all | Expand 10 after
2112 continue; 2110 continue;
2113 2111
2114 if (key == "/Contents") 2112 if (key == "/Contents")
2115 dwSignValuePos = m_Pos; 2113 dwSignValuePos = m_Pos;
2116 2114
2117 CPDF_Object* pObj = GetObject(pObjList, objnum, gennum); 2115 CPDF_Object* pObj = GetObject(pObjList, objnum, gennum);
2118 if (!pObj) 2116 if (!pObj)
2119 continue; 2117 continue;
2120 2118
2121 CFX_ByteStringC keyNoSlash(key.c_str() + 1, key.GetLength() - 1); 2119 CFX_ByteStringC keyNoSlash(key.c_str() + 1, key.GetLength() - 1);
2122 // TODO(thestig): Remove this conditional once CPDF_Dictionary has a 2120 pDict->SetAt(keyNoSlash, pObj);
2123 // better underlying map implementation.
2124 if (nKeys < 32) {
2125 pDict->SetAt(keyNoSlash, pObj);
2126 } else {
2127 pDict->AddValue(keyNoSlash, pObj);
2128 }
2129 } 2121 }
2130 2122
2131 if (IsSignatureDict(pDict.get())) { 2123 if (IsSignatureDict(pDict.get())) {
2132 FX_FILESIZE dwSavePos = m_Pos; 2124 FX_FILESIZE dwSavePos = m_Pos;
2133 m_Pos = dwSignValuePos; 2125 m_Pos = dwSignValuePos;
2134 CPDF_Object* pObj = GetObject(pObjList, objnum, gennum, NULL, FALSE); 2126 CPDF_Object* pObj = GetObject(pObjList, objnum, gennum, NULL, FALSE);
2135 pDict->SetAt("Contents", pObj); 2127 pDict->SetAt("Contents", pObj);
2136 m_Pos = dwSavePos; 2128 m_Pos = dwSavePos;
2137 } 2129 }
2138 if (pContext) { 2130 if (pContext) {
(...skipping 126 matching lines...) Expand 10 before | Expand all | Expand 10 after
2265 key = PDF_NameDecode(key); 2257 key = PDF_NameDecode(key);
2266 nonstd::unique_ptr<CPDF_Object, ReleaseDeleter<CPDF_Object>> obj( 2258 nonstd::unique_ptr<CPDF_Object, ReleaseDeleter<CPDF_Object>> obj(
2267 GetObject(pObjList, objnum, gennum)); 2259 GetObject(pObjList, objnum, gennum));
2268 if (!obj) { 2260 if (!obj) {
2269 uint8_t ch; 2261 uint8_t ch;
2270 while (GetNextChar(ch) && ch != 0x0A && ch != 0x0D) { 2262 while (GetNextChar(ch) && ch != 0x0A && ch != 0x0D) {
2271 } 2263 }
2272 return nullptr; 2264 return nullptr;
2273 } 2265 }
2274 if (key.GetLength() > 1) { 2266 if (key.GetLength() > 1) {
2275 pDict->AddValue(CFX_ByteStringC(key.c_str() + 1, key.GetLength() - 1), 2267 pDict->SetAt(CFX_ByteStringC(key.c_str() + 1, key.GetLength() - 1),
2276 obj.release()); 2268 obj.release());
2277 } 2269 }
2278 } 2270 }
2279 if (pContext) { 2271 if (pContext) {
2280 pContext->m_DictEnd = m_Pos; 2272 pContext->m_DictEnd = m_Pos;
2281 if (pContext->m_Flags & PDFPARSE_NOSTREAM) { 2273 if (pContext->m_Flags & PDFPARSE_NOSTREAM) {
2282 return pDict.release(); 2274 return pDict.release();
2283 } 2275 }
2284 } 2276 }
2285 FX_FILESIZE SavedPos = m_Pos; 2277 FX_FILESIZE SavedPos = m_Pos;
2286 FX_BOOL bIsNumber; 2278 FX_BOOL bIsNumber;
(...skipping 730 matching lines...) Expand 10 before | Expand all | Expand 10 after
3017 new_obj_array.Add(pArray->GetElement(k)); 3009 new_obj_array.Add(pArray->GetElement(k));
3018 } 3010 }
3019 } break; 3011 } break;
3020 case PDFOBJ_STREAM: 3012 case PDFOBJ_STREAM:
3021 pObj = pObj->GetDict(); 3013 pObj = pObj->GetDict();
3022 case PDFOBJ_DICTIONARY: { 3014 case PDFOBJ_DICTIONARY: {
3023 CPDF_Dictionary* pDict = pObj->GetDict(); 3015 CPDF_Dictionary* pDict = pObj->GetDict();
3024 if (pDict && pDict->GetString("Type") == "Page" && !bParsePage) { 3016 if (pDict && pDict->GetString("Type") == "Page" && !bParsePage) {
3025 continue; 3017 continue;
3026 } 3018 }
3027 FX_POSITION pos = pDict->GetStartPos(); 3019 for (const auto& it : *pDict) {
3028 while (pos) { 3020 const CFX_ByteString& key = it.first;
3029 CPDF_Object* value; 3021 CPDF_Object* value = it.second;
3030 CFX_ByteString key;
3031 value = pDict->GetNextElement(pos, key);
3032 if (key != "Parent") { 3022 if (key != "Parent") {
3033 new_obj_array.Add(value); 3023 new_obj_array.Add(value);
3034 } 3024 }
3035 } 3025 }
3036 } break; 3026 } break;
3037 case PDFOBJ_REFERENCE: { 3027 case PDFOBJ_REFERENCE: {
3038 CPDF_Reference* pRef = pObj->AsReference(); 3028 CPDF_Reference* pRef = pObj->AsReference();
3039 FX_DWORD dwNum = pRef->GetRefObjNum(); 3029 FX_DWORD dwNum = pRef->GetRefObjNum();
3040 FX_FILESIZE offset; 3030 FX_FILESIZE offset;
3041 FX_DWORD size = GetObjectSize(dwNum, offset); 3031 FX_DWORD size = GetObjectSize(dwNum, offset);
(...skipping 1942 matching lines...) Expand 10 before | Expand all | Expand 10 after
4984 if (!m_pLinearizedDict) 4974 if (!m_pLinearizedDict)
4985 return -1; 4975 return -1;
4986 CPDF_Array* pRange = m_pLinearizedDict->GetArray("H"); 4976 CPDF_Array* pRange = m_pLinearizedDict->GetArray("H");
4987 if (!pRange) 4977 if (!pRange)
4988 return -1; 4978 return -1;
4989 CPDF_Object* pStreamLen = pRange->GetElementValue(1); 4979 CPDF_Object* pStreamLen = pRange->GetElementValue(1);
4990 if (!pStreamLen) 4980 if (!pStreamLen)
4991 return -1; 4981 return -1;
4992 return pStreamLen->GetInteger(); 4982 return pStreamLen->GetInteger();
4993 } 4983 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698