Chromium Code Reviews| 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 "xfa/fxfa/include/xfa_ffdoc.h" | 7 #include "xfa/fxfa/include/xfa_ffdoc.h" |
| 8 | 8 |
| 9 #include <algorithm> | 9 #include <algorithm> |
| 10 | 10 |
| 11 #include "core/fpdfapi/fpdf_parser/include/cpdf_array.h" | 11 #include "core/fpdfapi/fpdf_parser/include/cpdf_array.h" |
| 12 #include "core/fpdfapi/fpdf_parser/include/cpdf_document.h" | 12 #include "core/fpdfapi/fpdf_parser/include/cpdf_document.h" |
| 13 #include "core/fpdfdoc/include/fpdf_doc.h" | 13 #include "core/fpdfdoc/include/fpdf_doc.h" |
| 14 #include "core/fxcrt/include/fx_ext.h" | 14 #include "core/fxcrt/include/fx_ext.h" |
| 15 #include "core/fxcrt/include/fx_memory.h" | 15 #include "core/fxcrt/include/fx_memory.h" |
| 16 #include "xfa/fde/xml/fde_xml_imp.h" | 16 #include "xfa/fde/xml/fde_xml_imp.h" |
| 17 #include "xfa/fgas/crt/fgas_algorithm.h" | |
| 18 #include "xfa/fwl/core/fwl_noteimp.h" | 17 #include "xfa/fwl/core/fwl_noteimp.h" |
| 19 #include "xfa/fxfa/app/xfa_ffnotify.h" | 18 #include "xfa/fxfa/app/xfa_ffnotify.h" |
| 20 #include "xfa/fxfa/include/xfa_checksum.h" | 19 #include "xfa/fxfa/include/xfa_checksum.h" |
| 21 #include "xfa/fxfa/include/xfa_ffapp.h" | 20 #include "xfa/fxfa/include/xfa_ffapp.h" |
| 22 #include "xfa/fxfa/include/xfa_ffdocview.h" | 21 #include "xfa/fxfa/include/xfa_ffdocview.h" |
| 23 #include "xfa/fxfa/include/xfa_ffwidget.h" | 22 #include "xfa/fxfa/include/xfa_ffwidget.h" |
| 24 #include "xfa/fxfa/include/xfa_fontmgr.h" | 23 #include "xfa/fxfa/include/xfa_fontmgr.h" |
| 25 #include "xfa/fxfa/parser/xfa_document.h" | 24 #include "xfa/fxfa/parser/xfa_document.h" |
| 26 #include "xfa/fxfa/parser/xfa_document_serialize.h" | 25 #include "xfa/fxfa/parser/xfa_document_serialize.h" |
| 27 #include "xfa/fxfa/parser/xfa_parser.h" | 26 #include "xfa/fxfa/parser/xfa_parser.h" |
| 28 #include "xfa/fxfa/parser/xfa_parser_imp.h" | 27 #include "xfa/fxfa/parser/xfa_parser_imp.h" |
| 29 #include "xfa/fxfa/parser/xfa_parser_imp.h" | 28 #include "xfa/fxfa/parser/xfa_parser_imp.h" |
| 30 | 29 |
| 30 namespace { | |
| 31 | |
| 32 struct FX_BASE64DATA { | |
|
dsinclair
2016/05/18 21:15:35
This struct is duplicated, but given what it conta
Tom Sepez
2016/05/18 22:01:21
Acknowledged.
| |
| 33 uint32_t data1 : 2; | |
| 34 uint32_t data2 : 6; | |
| 35 uint32_t data3 : 4; | |
| 36 uint32_t data4 : 4; | |
| 37 uint32_t data5 : 6; | |
| 38 uint32_t data6 : 2; | |
| 39 uint32_t data7 : 8; | |
| 40 }; | |
| 41 | |
| 42 const uint8_t g_FXBase64DecoderMap[256] = { | |
| 43 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, | |
| 44 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, | |
| 45 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, | |
| 46 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x3E, 0xFF, 0xFF, 0xFF, 0x3F, | |
| 47 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3A, 0x3B, 0x3C, 0x3D, 0xFF, 0xFF, | |
| 48 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, | |
| 49 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, 0x10, 0x11, 0x12, | |
| 50 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, | |
| 51 0xFF, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F, 0x20, 0x21, 0x22, 0x23, 0x24, | |
| 52 0x25, 0x26, 0x27, 0x28, 0x29, 0x2A, 0x2B, 0x2C, 0x2D, 0x2E, 0x2F, 0x30, | |
| 53 0x31, 0x32, 0x33, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, | |
| 54 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, | |
| 55 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, | |
|
Tom Sepez
2016/05/18 22:01:21
Again, we could probably save 128 bytes here.
dsinclair
2016/05/19 14:24:44
Done.
Please check my numbers are right.
| |
| 56 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, | |
| 57 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, | |
| 58 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, | |
| 59 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, | |
| 60 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, | |
| 61 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, | |
| 62 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, | |
| 63 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, | |
| 64 0xFF, 0xFF, 0xFF, 0xFF, | |
| 65 }; | |
| 66 | |
| 67 void Base64DecodePiece(const FX_CHAR src[4], | |
| 68 int32_t iChars, | |
| 69 FX_BASE64DATA& dst, | |
| 70 int32_t& iBytes) { | |
| 71 ASSERT(iChars > 0 && iChars < 5); | |
| 72 iBytes = 1; | |
| 73 dst.data2 = g_FXBase64DecoderMap[(uint8_t)src[0]]; | |
| 74 if (iChars > 1) { | |
| 75 uint8_t b = g_FXBase64DecoderMap[(uint8_t)src[1]]; | |
| 76 dst.data1 = b >> 4; | |
| 77 dst.data4 = b; | |
| 78 if (iChars > 2) { | |
| 79 iBytes = 2; | |
| 80 b = g_FXBase64DecoderMap[(uint8_t)src[2]]; | |
| 81 dst.data3 = b >> 2; | |
| 82 dst.data6 = b; | |
| 83 if (iChars > 3) { | |
| 84 iBytes = 3; | |
| 85 dst.data5 = g_FXBase64DecoderMap[(uint8_t)src[3]]; | |
| 86 } else { | |
| 87 dst.data5 = 0; | |
| 88 } | |
| 89 } else { | |
| 90 dst.data3 = 0; | |
| 91 } | |
| 92 } else { | |
| 93 dst.data1 = 0; | |
| 94 } | |
| 95 } | |
| 96 | |
| 97 int32_t Base64DecodeW(const FX_WCHAR* pSrc, int32_t iSrcLen, uint8_t* pDst) { | |
| 98 ASSERT(pSrc != NULL); | |
| 99 if (iSrcLen < 1) { | |
| 100 return 0; | |
| 101 } | |
| 102 while (iSrcLen > 0 && pSrc[iSrcLen - 1] == '=') { | |
| 103 iSrcLen--; | |
| 104 } | |
| 105 if (iSrcLen < 1) { | |
| 106 return 0; | |
| 107 } | |
| 108 if (pDst == NULL) { | |
| 109 int32_t iDstLen = iSrcLen / 4 * 3; | |
| 110 iSrcLen %= 4; | |
| 111 if (iSrcLen == 1) { | |
| 112 iDstLen += 1; | |
| 113 } else if (iSrcLen == 2) { | |
| 114 iDstLen += 1; | |
| 115 } else if (iSrcLen == 3) { | |
| 116 iDstLen += 2; | |
| 117 } | |
| 118 return iDstLen; | |
| 119 } | |
| 120 FX_CHAR srcData[4]; | |
| 121 FX_BASE64DATA dstData; | |
| 122 int32_t iChars = 4, iBytes; | |
| 123 uint8_t* pDstEnd = pDst; | |
| 124 while (iSrcLen > 0) { | |
| 125 if (iSrcLen > 3) { | |
| 126 srcData[0] = (FX_CHAR)*pSrc++; | |
| 127 srcData[1] = (FX_CHAR)*pSrc++; | |
| 128 srcData[2] = (FX_CHAR)*pSrc++; | |
| 129 srcData[3] = (FX_CHAR)*pSrc++; | |
| 130 iSrcLen -= 4; | |
| 131 } else { | |
| 132 *((uint32_t*)&dstData) = 0; | |
| 133 *((uint32_t*)srcData) = 0; | |
| 134 srcData[0] = (FX_CHAR)*pSrc++; | |
| 135 if (iSrcLen > 1) { | |
| 136 srcData[1] = (FX_CHAR)*pSrc++; | |
| 137 } | |
| 138 if (iSrcLen > 2) { | |
| 139 srcData[2] = (FX_CHAR)*pSrc++; | |
| 140 } | |
| 141 iChars = iSrcLen; | |
| 142 iSrcLen = 0; | |
| 143 } | |
| 144 Base64DecodePiece(srcData, iChars, dstData, iBytes); | |
| 145 *pDstEnd++ = ((uint8_t*)&dstData)[0]; | |
| 146 if (iBytes > 1) { | |
| 147 *pDstEnd++ = ((uint8_t*)&dstData)[1]; | |
| 148 } | |
| 149 if (iBytes > 2) { | |
| 150 *pDstEnd++ = ((uint8_t*)&dstData)[2]; | |
| 151 } | |
| 152 } | |
| 153 return pDstEnd - pDst; | |
| 154 } | |
| 155 | |
| 156 } // namespace | |
| 157 | |
| 31 CXFA_FFDoc::CXFA_FFDoc(CXFA_FFApp* pApp, IXFA_DocProvider* pDocProvider) | 158 CXFA_FFDoc::CXFA_FFDoc(CXFA_FFApp* pApp, IXFA_DocProvider* pDocProvider) |
| 32 : m_pDocProvider(pDocProvider), | 159 : m_pDocProvider(pDocProvider), |
| 33 m_pDocument(nullptr), | 160 m_pDocument(nullptr), |
| 34 m_pStream(nullptr), | 161 m_pStream(nullptr), |
| 35 m_pApp(pApp), | 162 m_pApp(pApp), |
| 36 m_pNotify(nullptr), | 163 m_pNotify(nullptr), |
| 37 m_pPDFDoc(nullptr), | 164 m_pPDFDoc(nullptr), |
| 38 m_dwDocType(XFA_DOCTYPE_Static), | 165 m_dwDocType(XFA_DOCTYPE_Static), |
| 39 m_bOwnStream(TRUE) {} | 166 m_bOwnStream(TRUE) {} |
| 40 CXFA_FFDoc::~CXFA_FFDoc() { | 167 CXFA_FFDoc::~CXFA_FFDoc() { |
| (...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 83 break; | 210 break; |
| 84 } | 211 } |
| 85 } | 212 } |
| 86 } | 213 } |
| 87 if (!pChunkElement) { | 214 if (!pChunkElement) { |
| 88 return FALSE; | 215 return FALSE; |
| 89 } | 216 } |
| 90 CFX_WideString wsPDFContent; | 217 CFX_WideString wsPDFContent; |
| 91 pChunkElement->GetTextData(wsPDFContent); | 218 pChunkElement->GetTextData(wsPDFContent); |
| 92 iBufferSize = | 219 iBufferSize = |
| 93 FX_Base64DecodeW(wsPDFContent.c_str(), wsPDFContent.GetLength(), NULL); | 220 Base64DecodeW(wsPDFContent.c_str(), wsPDFContent.GetLength(), NULL); |
|
Tom Sepez
2016/05/18 22:01:21
nit: nullptr
dsinclair
2016/05/19 14:24:44
Done.
| |
| 94 pByteBuffer = FX_Alloc(uint8_t, iBufferSize + 1); | 221 pByteBuffer = FX_Alloc(uint8_t, iBufferSize + 1); |
| 95 pByteBuffer[iBufferSize] = '0'; // FIXME: I bet this is wrong. | 222 pByteBuffer[iBufferSize] = '0'; // FIXME: I bet this is wrong. |
| 96 FX_Base64DecodeW(wsPDFContent.c_str(), wsPDFContent.GetLength(), pByteBuffer); | 223 Base64DecodeW(wsPDFContent.c_str(), wsPDFContent.GetLength(), pByteBuffer); |
| 97 return TRUE; | 224 return TRUE; |
| 98 } | 225 } |
| 99 void XFA_XPDPacket_MergeRootNode(CXFA_Node* pOriginRoot, CXFA_Node* pNewRoot) { | 226 void XFA_XPDPacket_MergeRootNode(CXFA_Node* pOriginRoot, CXFA_Node* pNewRoot) { |
| 100 CXFA_Node* pChildNode = pNewRoot->GetNodeItem(XFA_NODEITEM_FirstChild); | 227 CXFA_Node* pChildNode = pNewRoot->GetNodeItem(XFA_NODEITEM_FirstChild); |
| 101 while (pChildNode) { | 228 while (pChildNode) { |
| 102 CXFA_Node* pOriginChild = | 229 CXFA_Node* pOriginChild = |
| 103 pOriginRoot->GetFirstChildByName(pChildNode->GetNameHash()); | 230 pOriginRoot->GetFirstChildByName(pChildNode->GetNameHash()); |
| 104 if (pOriginChild) { | 231 if (pOriginChild) { |
| 105 pChildNode = pChildNode->GetNodeItem(XFA_NODEITEM_NextSibling); | 232 pChildNode = pChildNode->GetNodeItem(XFA_NODEITEM_NextSibling); |
| 106 } else { | 233 } else { |
| (...skipping 274 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 381 | 508 |
| 382 return pExport->Export(pFile, pNode, 0, | 509 return pExport->Export(pFile, pNode, 0, |
| 383 bsChecksum.GetLength() ? bsChecksum.c_str() : nullptr); | 510 bsChecksum.GetLength() ? bsChecksum.c_str() : nullptr); |
| 384 } | 511 } |
| 385 | 512 |
| 386 FX_BOOL CXFA_FFDoc::ImportData(IFX_FileRead* pStream, FX_BOOL bXDP) { | 513 FX_BOOL CXFA_FFDoc::ImportData(IFX_FileRead* pStream, FX_BOOL bXDP) { |
| 387 std::unique_ptr<CXFA_DataImporter> importer( | 514 std::unique_ptr<CXFA_DataImporter> importer( |
| 388 new CXFA_DataImporter(m_pDocument)); | 515 new CXFA_DataImporter(m_pDocument)); |
| 389 return importer->ImportData(pStream); | 516 return importer->ImportData(pStream); |
| 390 } | 517 } |
| OLD | NEW |