1e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov// Copyright 2014 PDFium Authors. All rights reserved. 2e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov// Use of this source code is governed by a BSD-style license that can be 3e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov// found in the LICENSE file. 4e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 5e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com 6e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 74d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "core/fpdfapi/edit/editint.h" 8ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 94d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include <memory> 10ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#include <vector> 11ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 124d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "core/fpdfapi/edit/cpdf_creator.h" 134d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "core/fpdfapi/parser/cpdf_array.h" 144d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "core/fpdfapi/parser/cpdf_crypto_handler.h" 154d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "core/fpdfapi/parser/cpdf_dictionary.h" 164d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "core/fpdfapi/parser/cpdf_document.h" 174d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "core/fpdfapi/parser/cpdf_name.h" 184d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "core/fpdfapi/parser/cpdf_number.h" 194d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "core/fpdfapi/parser/cpdf_parser.h" 204d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "core/fpdfapi/parser/cpdf_reference.h" 214d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "core/fpdfapi/parser/cpdf_security_handler.h" 224d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "core/fpdfapi/parser/cpdf_stream.h" 234d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "core/fpdfapi/parser/cpdf_stream_acc.h" 244d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "core/fpdfapi/parser/cpdf_string.h" 254d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "core/fpdfapi/parser/fpdf_parser_decode.h" 264d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "core/fxcrt/cfx_maybe_owned.h" 274d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "core/fxcrt/fx_ext.h" 284d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "third_party/base/ptr_util.h" 29ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#include "third_party/base/stl_util.h" 30ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 31ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#define PDF_OBJECTSTREAM_MAXLENGTH (256 * 1024) 32ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#define PDF_XREFSTREAM_MAXSIZE 10000 33ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 344d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#define FX_GETBYTEOFFSET32(a) 0 354d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#define FX_GETBYTEOFFSET40(a) 0 364d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#define FX_GETBYTEOFFSET48(a) 0 374d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#define FX_GETBYTEOFFSET56(a) 0 384d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#define FX_GETBYTEOFFSET24(a) ((uint8_t)(a >> 24)) 394d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#define FX_GETBYTEOFFSET16(a) ((uint8_t)(a >> 16)) 404d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#define FX_GETBYTEOFFSET8(a) ((uint8_t)(a >> 8)) 414d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#define FX_GETBYTEOFFSET0(a) ((uint8_t)(a)) 424d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 43ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann// TODO(ochang): Make helper for appending "objnum 0 R ". 44ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 45ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannnamespace { 46ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 47ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannint32_t PDF_CreatorAppendObject(const CPDF_Object* pObj, 48ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CFX_FileBufferArchive* pFile, 49ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FX_FILESIZE& offset) { 50ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann int32_t len = 0; 51ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (!pObj) { 52ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (pFile->AppendString(" null") < 0) { 53ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return -1; 54ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 55ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann offset += 5; 56e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return 1; 57ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 58ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann switch (pObj->GetType()) { 594d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann case CPDF_Object::NULLOBJ: 60ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (pFile->AppendString(" null") < 0) { 61ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return -1; 62ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 63ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann offset += 5; 64ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann break; 654d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann case CPDF_Object::BOOLEAN: 664d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann case CPDF_Object::NUMBER: 67ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (pFile->AppendString(" ") < 0) { 68e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return -1; 69ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 704d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if ((len = pFile->AppendString(pObj->GetString().AsStringC())) < 0) { 71ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return -1; 72ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 73ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann offset += len + 1; 74ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann break; 754d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann case CPDF_Object::STRING: { 76ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CFX_ByteString str = pObj->GetString(); 774d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann bool bHex = pObj->AsString()->IsHex(); 784d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if ((len = pFile->AppendString(PDF_EncodeString(str, bHex).AsStringC())) < 794d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 0) { 80ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return -1; 81ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 82ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann offset += len; 83ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann break; 84e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 854d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann case CPDF_Object::NAME: { 86ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (pFile->AppendString("/") < 0) { 87e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return -1; 88ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 89ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CFX_ByteString str = pObj->GetString(); 904d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if ((len = pFile->AppendString(PDF_NameEncode(str).AsStringC())) < 0) { 91ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return -1; 92ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 93ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann offset += len + 1; 94ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann break; 95e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 964d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann case CPDF_Object::REFERENCE: { 97ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (pFile->AppendString(" ") < 0) 98ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return -1; 99ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if ((len = pFile->AppendDWord(pObj->AsReference()->GetRefObjNum())) < 0) 100e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return -1; 101ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (pFile->AppendString(" 0 R ") < 0) 102ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return -1; 103ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann offset += len + 6; 104ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann break; 105e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 1064d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann case CPDF_Object::ARRAY: { 107ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (pFile->AppendString("[") < 0) { 108ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return -1; 109ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 110ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann offset += 1; 111ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann const CPDF_Array* p = pObj->AsArray(); 1124d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann for (size_t i = 0; i < p->GetCount(); i++) { 1134d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann CPDF_Object* pElement = p->GetObjectAt(i); 1144d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (!pElement->IsInline()) { 115ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (pFile->AppendString(" ") < 0) { 116e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return -1; 117ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 118ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if ((len = pFile->AppendDWord(pElement->GetObjNum())) < 0) { 119e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return -1; 120ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 121ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (pFile->AppendString(" 0 R") < 0) { 122e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return -1; 123ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 124ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann offset += len + 5; 125ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } else { 126ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (PDF_CreatorAppendObject(pElement, pFile, offset) < 0) { 127ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return -1; 128ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 129e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 130ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 131ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (pFile->AppendString("]") < 0) { 132ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return -1; 133ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 134ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann offset += 1; 135ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann break; 136e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 1374d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann case CPDF_Object::DICTIONARY: { 138ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (pFile->AppendString("<<") < 0) { 139ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return -1; 140ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 141ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann offset += 2; 142ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann const CPDF_Dictionary* p = pObj->AsDictionary(); 143ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann for (const auto& it : *p) { 144ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann const CFX_ByteString& key = it.first; 1454d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann CPDF_Object* pValue = it.second.get(); 146ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (pFile->AppendString("/") < 0) { 147ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return -1; 148ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 1494d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if ((len = pFile->AppendString(PDF_NameEncode(key).AsStringC())) < 0) { 150ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return -1; 151e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 152ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann offset += len + 1; 1534d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (!pValue->IsInline()) { 154ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (pFile->AppendString(" ") < 0) { 155e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return -1; 156ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 157ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if ((len = pFile->AppendDWord(pValue->GetObjNum())) < 0) { 158ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return -1; 159ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 160ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (pFile->AppendString(" 0 R") < 0) { 161ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return -1; 162ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 163ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann offset += len + 5; 164ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } else { 165ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (PDF_CreatorAppendObject(pValue, pFile, offset) < 0) { 166ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return -1; 167ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 168e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 169ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 170ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (pFile->AppendString(">>") < 0) { 171ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return -1; 172ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 173ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann offset += 2; 174ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann break; 175e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 1764d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann case CPDF_Object::STREAM: { 177ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann const CPDF_Stream* p = pObj->AsStream(); 178ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (PDF_CreatorAppendObject(p->GetDict(), pFile, offset) < 0) { 179ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return -1; 180ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 181ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (pFile->AppendString("stream\r\n") < 0) { 182ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return -1; 183ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 184ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann offset += 8; 185ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CPDF_StreamAcc acc; 1864d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann acc.LoadAllData(p, true); 187ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (pFile->AppendBlock(acc.GetData(), acc.GetSize()) < 0) { 188ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return -1; 189ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 190ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann offset += acc.GetSize(); 191ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if ((len = pFile->AppendString("\r\nendstream")) < 0) { 192ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return -1; 193ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 194ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann offset += len; 195ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann break; 196ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 197ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann default: 1984d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann ASSERT(false); 199ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann break; 200ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 201ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return 1; 202e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 203ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 204ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannint32_t PDF_CreatorWriteTrailer(CPDF_Document* pDocument, 205ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CFX_FileBufferArchive* pFile, 2064d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann CPDF_Array* pIDArray) { 207ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FX_FILESIZE offset = 0; 208ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann int32_t len = 0; 2094d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann CPDF_Parser* pParser = pDocument->GetParser(); 210ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (pParser) { 211ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CPDF_Dictionary* p = pParser->GetTrailer(); 212ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann for (const auto& it : *p) { 213ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann const CFX_ByteString& key = it.first; 2144d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann CPDF_Object* pValue = it.second.get(); 215ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (key == "Encrypt" || key == "Size" || key == "Filter" || 216ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann key == "Index" || key == "Length" || key == "Prev" || key == "W" || 217ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann key == "XRefStm" || key == "Type" || key == "ID") { 218ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann continue; 219ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 2204d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (key == "DecodeParms") 221ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann continue; 2224d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 223ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (pFile->AppendString(("/")) < 0) { 224e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return -1; 225ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 2264d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if ((len = pFile->AppendString(PDF_NameEncode(key).AsStringC())) < 0) { 227e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return -1; 228ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 229ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann offset += len + 1; 2304d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (!pValue->IsInline()) { 231ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (pFile->AppendString(" ") < 0) { 232ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return -1; 233ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 234ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if ((len = pFile->AppendDWord(pValue->GetObjNum())) < 0) { 235ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return -1; 236ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 237ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (pFile->AppendString(" 0 R ") < 0) { 238ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return -1; 239ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 240ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann offset += len + 6; 241ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } else { 242ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (PDF_CreatorAppendObject(pValue, pFile, offset) < 0) { 243ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return -1; 244ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 245ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 246e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 247ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (pIDArray) { 248ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (pFile->AppendString(("/ID")) < 0) { 249e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return -1; 250ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 251ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann offset += 3; 252ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (PDF_CreatorAppendObject(pIDArray, pFile, offset) < 0) { 253e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return -1; 254ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 255e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 256e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return offset; 257ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 258ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (pFile->AppendString("\r\n/Root ") < 0) { 259ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return -1; 260ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 261ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if ((len = pFile->AppendDWord(pDocument->GetRoot()->GetObjNum())) < 0) { 262ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return -1; 263ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 264ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (pFile->AppendString(" 0 R\r\n") < 0) { 265ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return -1; 266ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 267ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann offset += len + 14; 268ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (pDocument->GetInfo()) { 269ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (pFile->AppendString("/Info ") < 0) { 270ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return -1; 271ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 272ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if ((len = pFile->AppendDWord(pDocument->GetInfo()->GetObjNum())) < 0) { 273ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return -1; 274ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 275ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (pFile->AppendString(" 0 R\r\n") < 0) { 276ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return -1; 277ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 278ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann offset += len + 12; 279ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 280ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (pIDArray) { 281ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (pFile->AppendString(("/ID")) < 0) { 282ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return -1; 283ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 284ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann offset += 3; 285ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (PDF_CreatorAppendObject(pIDArray, pFile, offset) < 0) { 286ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return -1; 287ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 288ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 289ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return offset; 290e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 291ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 292ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannint32_t PDF_CreatorWriteEncrypt(const CPDF_Dictionary* pEncryptDict, 2934d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann uint32_t dwObjNum, 294ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CFX_FileBufferArchive* pFile) { 295ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (!pEncryptDict) { 296ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return 0; 297ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 2984d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann ASSERT(pFile); 299ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FX_FILESIZE offset = 0; 300ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann int32_t len = 0; 301ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (pFile->AppendString("/Encrypt") < 0) { 302ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return -1; 303ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 304ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann offset += 8; 305ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (pFile->AppendString(" ") < 0) { 306ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return -1; 307ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 308ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if ((len = pFile->AppendDWord(dwObjNum)) < 0) { 309ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return -1; 310ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 311ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (pFile->AppendString(" 0 R ") < 0) { 312ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return -1; 313ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 314ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann offset += len + 6; 315ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return offset; 316e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 317ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 3184d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannstd::vector<uint8_t> PDF_GenerateFileID(uint32_t dwSeed1, uint32_t dwSeed2) { 3194d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann std::vector<uint8_t> buffer(sizeof(uint32_t) * 4); 3204d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann uint32_t* pBuffer = reinterpret_cast<uint32_t*>(buffer.data()); 321ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann void* pContext = FX_Random_MT_Start(dwSeed1); 322ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann for (int i = 0; i < 2; ++i) 323ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann *pBuffer++ = FX_Random_MT_Generate(pContext); 324ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FX_Random_MT_Close(pContext); 325ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann pContext = FX_Random_MT_Start(dwSeed2); 326ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann for (int i = 0; i < 2; ++i) 327ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann *pBuffer++ = FX_Random_MT_Generate(pContext); 328ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FX_Random_MT_Close(pContext); 329ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return buffer; 330e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 331ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 332ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannvoid AppendIndex0(CFX_ByteTextBuf& buffer, bool bFirstObject) { 333ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann buffer.AppendByte(0); 334ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann buffer.AppendByte(0); 335ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann buffer.AppendByte(0); 336ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann buffer.AppendByte(0); 337ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann buffer.AppendByte(0); 338ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann const uint8_t byte = bFirstObject ? 0xFF : 0; 339ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann buffer.AppendByte(byte); 340ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann buffer.AppendByte(byte); 341e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 342ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 343ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannvoid AppendIndex1(CFX_ByteTextBuf& buffer, FX_FILESIZE offset) { 344ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann buffer.AppendByte(1); 345ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann buffer.AppendByte(FX_GETBYTEOFFSET24(offset)); 346ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann buffer.AppendByte(FX_GETBYTEOFFSET16(offset)); 347ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann buffer.AppendByte(FX_GETBYTEOFFSET8(offset)); 348ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann buffer.AppendByte(FX_GETBYTEOFFSET0(offset)); 349ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann buffer.AppendByte(0); 350ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann buffer.AppendByte(0); 351ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann} 352ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 3534d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannvoid AppendIndex2(CFX_ByteTextBuf& buffer, uint32_t objnum, int32_t index) { 354ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann buffer.AppendByte(2); 355ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann buffer.AppendByte(FX_GETBYTEOFFSET24(objnum)); 356ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann buffer.AppendByte(FX_GETBYTEOFFSET16(objnum)); 357ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann buffer.AppendByte(FX_GETBYTEOFFSET8(objnum)); 358ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann buffer.AppendByte(FX_GETBYTEOFFSET0(objnum)); 359ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann buffer.AppendByte(FX_GETBYTEOFFSET8(index)); 360ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann buffer.AppendByte(FX_GETBYTEOFFSET0(index)); 361ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann} 362ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 3634d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannbool IsXRefNeedEnd(CPDF_XRefStream* pXRef, uint32_t flag) { 364ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (!(flag & FPDFCREATE_INCREMENTAL)) 365ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return false; 366ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 3674d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann uint32_t iCount = 0; 3684d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann for (const auto& pair : pXRef->m_IndexArray) 3694d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann iCount += pair.count; 3704d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 371ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return iCount >= PDF_XREFSTREAM_MAXSIZE; 372ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann} 373ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 374ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannint32_t OutputIndex(CFX_FileBufferArchive* pFile, FX_FILESIZE offset) { 375ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (sizeof(offset) > 4) { 376ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (FX_GETBYTEOFFSET32(offset)) { 377ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (pFile->AppendByte(FX_GETBYTEOFFSET56(offset)) < 0) 378ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return -1; 379ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (pFile->AppendByte(FX_GETBYTEOFFSET48(offset)) < 0) 380ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return -1; 381ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (pFile->AppendByte(FX_GETBYTEOFFSET40(offset)) < 0) 382ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return -1; 383ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (pFile->AppendByte(FX_GETBYTEOFFSET32(offset)) < 0) 384ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return -1; 385e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 386ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 387ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (pFile->AppendByte(FX_GETBYTEOFFSET24(offset)) < 0) 388ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return -1; 389ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (pFile->AppendByte(FX_GETBYTEOFFSET16(offset)) < 0) 390ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return -1; 391ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (pFile->AppendByte(FX_GETBYTEOFFSET8(offset)) < 0) 392ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return -1; 393ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (pFile->AppendByte(FX_GETBYTEOFFSET0(offset)) < 0) 394ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return -1; 395ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (pFile->AppendByte(0) < 0) 396ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return -1; 397ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return 0; 398ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann} 399ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 400ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannclass CPDF_FlateEncoder { 401ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann public: 4024d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann CPDF_FlateEncoder(CPDF_Stream* pStream, bool bFlateEncode); 4034d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann CPDF_FlateEncoder(const uint8_t* pBuffer, 4044d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann uint32_t size, 4054d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann bool bFlateEncode, 4064d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann bool bXRefStream); 407ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann ~CPDF_FlateEncoder(); 4084d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 409ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann void CloneDict(); 4104d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 4114d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann uint32_t m_dwSize; 4124d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann CFX_MaybeOwned<uint8_t, FxFreeDeleter> m_pData; 4134d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann CFX_MaybeOwned<CPDF_Dictionary> m_pDict; 414ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CPDF_StreamAcc m_Acc; 415ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}; 4164d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 417ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannvoid CPDF_FlateEncoder::CloneDict() { 4184d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (m_pDict.IsOwned()) 4194d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return; 4204d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_pDict = ToDictionary(m_pDict->Clone()); 4214d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann ASSERT(m_pDict.IsOwned()); 422e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 4234d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 4244d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. MoltmannCPDF_FlateEncoder::CPDF_FlateEncoder(CPDF_Stream* pStream, bool bFlateEncode) 4254d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann : m_dwSize(0) { 4264d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_Acc.LoadAllData(pStream, true); 4274d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann bool bHasFilter = pStream && pStream->HasFilter(); 4284d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (bHasFilter && !bFlateEncode) { 4294d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann CPDF_StreamAcc destAcc; 4304d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann destAcc.LoadAllData(pStream); 4314d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_dwSize = destAcc.GetSize(); 4324d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_pData = destAcc.DetachData(); 4334d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_pDict = ToDictionary(pStream->GetDict()->Clone()); 4344d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_pDict->RemoveFor("Filter"); 4354d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return; 4364d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 4374d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (bHasFilter || !bFlateEncode) { 4384d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_pData = const_cast<uint8_t*>(m_Acc.GetData()); 4394d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_dwSize = m_Acc.GetSize(); 4404d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_pDict = pStream->GetDict(); 4414d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return; 442ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 4434d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann // TODO(thestig): Move to Init() and check return value. 4444d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann uint8_t* buffer = nullptr; 4454d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann ::FlateEncode(m_Acc.GetData(), m_Acc.GetSize(), &buffer, &m_dwSize); 4464d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_pData = std::unique_ptr<uint8_t, FxFreeDeleter>(buffer); 447ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_pDict = ToDictionary(pStream->GetDict()->Clone()); 4484d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_pDict->SetNewFor<CPDF_Number>("Length", static_cast<int>(m_dwSize)); 4494d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_pDict->SetNewFor<CPDF_Name>("Filter", "FlateDecode"); 4504d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_pDict->RemoveFor("DecodeParms"); 451e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 4524d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 4534d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. MoltmannCPDF_FlateEncoder::CPDF_FlateEncoder(const uint8_t* pBuffer, 4544d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann uint32_t size, 4554d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann bool bFlateEncode, 4564d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann bool bXRefStream) 4574d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann : m_dwSize(0) { 458ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (!bFlateEncode) { 4594d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_pData = const_cast<uint8_t*>(pBuffer); 460ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_dwSize = size; 4614d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return; 462ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 4634d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann uint8_t* buffer = nullptr; 4644d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann // TODO(thestig): Move to Init() and check return value. 4654d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (bXRefStream) 4664d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann ::PngEncode(pBuffer, size, &buffer, &m_dwSize); 4674d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann else 4684d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann ::FlateEncode(pBuffer, size, &buffer, &m_dwSize); 4694d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_pData = std::unique_ptr<uint8_t, FxFreeDeleter>(buffer); 470ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann} 4714d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 4724d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. MoltmannCPDF_FlateEncoder::~CPDF_FlateEncoder() {} 4734d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 474ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannclass CPDF_Encryptor { 475ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann public: 4764d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann CPDF_Encryptor(CPDF_CryptoHandler* pHandler, 4774d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int objnum, 4784d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann uint8_t* src_data, 4794d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann uint32_t src_size); 480ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann ~CPDF_Encryptor(); 4814d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 482ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann uint8_t* m_pData; 4834d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann uint32_t m_dwSize; 4844d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann bool m_bNewBuf; 485e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}; 4864d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 4874d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. MoltmannCPDF_Encryptor::CPDF_Encryptor(CPDF_CryptoHandler* pHandler, 4884d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int objnum, 4894d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann uint8_t* src_data, 4904d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann uint32_t src_size) 4914d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann : m_pData(nullptr), m_dwSize(0), m_bNewBuf(false) { 4924d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (src_size == 0) 4934d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return; 4944d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 495ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (!pHandler) { 496ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_pData = (uint8_t*)src_data; 497ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_dwSize = src_size; 4984d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return; 499ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 500ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_dwSize = pHandler->EncryptGetSize(objnum, 0, src_data, src_size); 501ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_pData = FX_Alloc(uint8_t, m_dwSize); 502ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann pHandler->EncryptContent(objnum, 0, src_data, src_size, m_pData, m_dwSize); 5034d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_bNewBuf = true; 504e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 5054d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 506ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannCPDF_Encryptor::~CPDF_Encryptor() { 5074d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (m_bNewBuf) 508ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FX_Free(m_pData); 509e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 510ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 511ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann} // namespace 512ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 513ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannCPDF_ObjectStream::CPDF_ObjectStream() : m_dwObjNum(0), m_index(0) {} 5144d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 5154d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. MoltmannCPDF_ObjectStream::~CPDF_ObjectStream() {} 5164d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 5174d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannvoid CPDF_ObjectStream::Start() { 5184d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_Items.clear(); 519ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_Buffer.Clear(); 520ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_dwObjNum = 0; 521ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_index = 0; 522e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 5234d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 5244d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannvoid CPDF_ObjectStream::CompressIndirectObject(uint32_t dwObjNum, 5254d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann const CPDF_Object* pObj) { 5264d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_Items.push_back({dwObjNum, m_Buffer.GetLength()}); 527ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_Buffer << pObj; 528e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 5294d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 5304d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannvoid CPDF_ObjectStream::CompressIndirectObject(uint32_t dwObjNum, 5314d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann const uint8_t* pBuffer, 5324d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann uint32_t dwSize) { 5334d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_Items.push_back({dwObjNum, m_Buffer.GetLength()}); 534ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_Buffer.AppendBlock(pBuffer, dwSize); 535e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 5364d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 537ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannFX_FILESIZE CPDF_ObjectStream::End(CPDF_Creator* pCreator) { 5384d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann ASSERT(pCreator); 5394d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (m_Items.empty()) 540ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return 0; 5414d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 542ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CFX_FileBufferArchive* pFile = &pCreator->m_File; 543ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FX_FILESIZE ObjOffset = pCreator->m_Offset; 544ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (!m_dwObjNum) { 545ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_dwObjNum = ++pCreator->m_dwLastObjNum; 546ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 547ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CFX_ByteTextBuf tempBuffer; 5484d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann for (const auto& pair : m_Items) 5494d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann tempBuffer << pair.objnum << " " << pair.offset << " "; 5504d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 551ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FX_FILESIZE& offset = pCreator->m_Offset; 552ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann int32_t len = pFile->AppendDWord(m_dwObjNum); 553ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (len < 0) { 554ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return -1; 555ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 556ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann offset += len; 557ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if ((len = pFile->AppendString(" 0 obj\r\n<</Type /ObjStm /N ")) < 0) { 558ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return -1; 559ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 560ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann offset += len; 5614d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann uint32_t iCount = pdfium::CollectionSize<uint32_t>(m_Items); 5624d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if ((len = pFile->AppendDWord(iCount)) < 0) { 563ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return -1; 564ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 565ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann offset += len; 566ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (pFile->AppendString("/First ") < 0) { 567ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return -1; 568ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 5694d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if ((len = pFile->AppendDWord((uint32_t)tempBuffer.GetLength())) < 0) { 570ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return -1; 571ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 572ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (pFile->AppendString("/Length ") < 0) { 573ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return -1; 574ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 575ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann offset += len + 15; 5764d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 5774d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann tempBuffer << m_Buffer; 5784d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann CPDF_FlateEncoder encoder(tempBuffer.GetBuffer(), tempBuffer.GetLength(), 5794d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann true, false); 5804d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann CPDF_Encryptor encryptor(pCreator->m_pCryptoHandler, m_dwObjNum, 5814d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann encoder.m_pData.Get(), encoder.m_dwSize); 5824d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if ((len = pFile->AppendDWord(encryptor.m_dwSize)) < 0) { 5834d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return -1; 584ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 5854d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann offset += len; 5864d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (pFile->AppendString("/Filter /FlateDecode") < 0) { 5874d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return -1; 5884d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 5894d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann offset += 20; 5904d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if ((len = pFile->AppendString(">>stream\r\n")) < 0) { 5914d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return -1; 5924d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 5934d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (pFile->AppendBlock(encryptor.m_pData, encryptor.m_dwSize) < 0) { 5944d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return -1; 5954d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 5964d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann offset += len + encryptor.m_dwSize; 597ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if ((len = pFile->AppendString("\r\nendstream\r\nendobj\r\n")) < 0) { 598ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return -1; 599ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 600ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann offset += len; 601ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return ObjOffset; 602e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 6034d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 604e6986e1e8d4a57987f47c215490cb080a65ee29aSvet GanovCPDF_XRefStream::CPDF_XRefStream() 605ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann : m_PrevOffset(0), m_dwTempObjNum(0), m_iSeg(0) {} 6064d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 6074d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. MoltmannCPDF_XRefStream::~CPDF_XRefStream() {} 6084d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 6094d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannbool CPDF_XRefStream::Start() { 6104d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_IndexArray.clear(); 611ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_Buffer.Clear(); 612ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_iSeg = 0; 6134d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return true; 614e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 6154d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannint32_t CPDF_XRefStream::CompressIndirectObject(uint32_t dwObjNum, 616ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann const CPDF_Object* pObj, 617ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CPDF_Creator* pCreator) { 6184d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (!pCreator) 619ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return 0; 6204d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 621ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_ObjStream.CompressIndirectObject(dwObjNum, pObj); 6224d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (pdfium::CollectionSize<int32_t>(m_ObjStream.m_Items) < 6234d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pCreator->m_ObjectStreamSize && 624ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_ObjStream.m_Buffer.GetLength() < PDF_OBJECTSTREAM_MAXLENGTH) { 625ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return 1; 626ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 627ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return EndObjectStream(pCreator); 628e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 6294d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannint32_t CPDF_XRefStream::CompressIndirectObject(uint32_t dwObjNum, 630ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann const uint8_t* pBuffer, 6314d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann uint32_t dwSize, 632ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CPDF_Creator* pCreator) { 6334d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (!pCreator) 634ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return 0; 6354d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 636ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_ObjStream.CompressIndirectObject(dwObjNum, pBuffer, dwSize); 6374d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (pdfium::CollectionSize<int32_t>(m_ObjStream.m_Items) < 6384d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pCreator->m_ObjectStreamSize && 639ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_ObjStream.m_Buffer.GetLength() < PDF_OBJECTSTREAM_MAXLENGTH) { 640ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return 1; 641ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 642ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return EndObjectStream(pCreator); 643e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 644ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 6454d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannint32_t CPDF_XRefStream::EndObjectStream(CPDF_Creator* pCreator, bool bEOF) { 646ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FX_FILESIZE objOffset = 0; 647ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (bEOF) { 648ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann objOffset = m_ObjStream.End(pCreator); 649ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (objOffset < 0) { 650ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return -1; 651ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 652ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 6534d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann uint32_t& dwObjStmNum = m_ObjStream.m_dwObjNum; 654ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (!dwObjStmNum) { 655ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann dwObjStmNum = ++pCreator->m_dwLastObjNum; 656ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 6574d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int32_t iSize = pdfium::CollectionSize<int32_t>(m_ObjStream.m_Items); 6584d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann size_t iSeg = m_IndexArray.size(); 659ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (!(pCreator->m_dwFlags & FPDFCREATE_INCREMENTAL)) { 660ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (m_dwTempObjNum == 0) { 661ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann AppendIndex0(m_Buffer, true); 662ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_dwTempObjNum++; 663ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 6644d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann uint32_t end_num = m_IndexArray.back().objnum + m_IndexArray.back().count; 665ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann int index = 0; 666ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann for (; m_dwTempObjNum < end_num; m_dwTempObjNum++) { 667ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FX_FILESIZE* offset = pCreator->m_ObjectOffset.GetPtrAt(m_dwTempObjNum); 668ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (offset) { 669ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (index >= iSize || 6704d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_dwTempObjNum != m_ObjStream.m_Items[index].objnum) { 671ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann AppendIndex1(m_Buffer, *offset); 672ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } else { 673ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann AppendIndex2(m_Buffer, dwObjStmNum, index++); 674e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 675ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } else { 676ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann AppendIndex0(m_Buffer, false); 677ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 678e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 679e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (iSize > 0 && bEOF) { 680ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann pCreator->m_ObjectOffset.Add(dwObjStmNum, 1); 681ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann pCreator->m_ObjectOffset[dwObjStmNum] = objOffset; 682e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 683e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov m_iSeg = iSeg; 684e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (bEOF) { 685ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_ObjStream.Start(); 686e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 687e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return 1; 688ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 6894d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann for (auto it = m_IndexArray.begin() + m_iSeg; it != m_IndexArray.end(); 6904d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann ++it) { 6914d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann for (uint32_t m = it->objnum; m < it->objnum + it->count; ++m) { 6924d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (m_ObjStream.m_index >= iSize || 6934d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m != m_ObjStream.m_Items[it - m_IndexArray.begin()].objnum) { 694ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann AppendIndex1(m_Buffer, pCreator->m_ObjectOffset[m]); 695ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } else { 6964d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann AppendIndex2(m_Buffer, dwObjStmNum, m_ObjStream.m_index++); 697ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 698ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 699ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 700ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (iSize > 0 && bEOF) { 701ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann AppendIndex1(m_Buffer, objOffset); 7024d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_IndexArray.push_back({dwObjStmNum, 1}); 703ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann iSeg += 1; 704ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 705ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_iSeg = iSeg; 706ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (bEOF) { 707ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_ObjStream.Start(); 708ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 709ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return 1; 710e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 7114d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannbool CPDF_XRefStream::GenerateXRefStream(CPDF_Creator* pCreator, bool bEOF) { 712ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FX_FILESIZE offset_tmp = pCreator->m_Offset; 7134d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann uint32_t objnum = ++pCreator->m_dwLastObjNum; 714ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CFX_FileBufferArchive* pFile = &pCreator->m_File; 7154d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann bool bIncremental = (pCreator->m_dwFlags & FPDFCREATE_INCREMENTAL) != 0; 716ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (bIncremental) { 717ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann AddObjectNumberToIndexArray(objnum); 718ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } else { 719ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann for (; m_dwTempObjNum < pCreator->m_dwLastObjNum; m_dwTempObjNum++) { 720ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FX_FILESIZE* offset = pCreator->m_ObjectOffset.GetPtrAt(m_dwTempObjNum); 721ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (offset) { 722ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann AppendIndex1(m_Buffer, *offset); 723ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } else { 724ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann AppendIndex0(m_Buffer, false); 725ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 726ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 727ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 728ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann AppendIndex1(m_Buffer, offset_tmp); 729ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FX_FILESIZE& offset = pCreator->m_Offset; 730ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann int32_t len = pFile->AppendDWord(objnum); 731ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (len < 0) { 7324d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return false; 733ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 734ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann offset += len; 735ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if ((len = pFile->AppendString(" 0 obj\r\n<</Type /XRef/W[1 4 2]/Index[")) < 736ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 0) { 7374d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return false; 738ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 739ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann offset += len; 740ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (!bIncremental) { 741ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if ((len = pFile->AppendDWord(0)) < 0) { 7424d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return false; 743ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 744ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if ((len = pFile->AppendString(" ")) < 0) { 7454d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return false; 746ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 747ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann offset += len + 1; 748ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if ((len = pFile->AppendDWord(objnum + 1)) < 0) { 7494d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return false; 750e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 751e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov offset += len; 752ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } else { 7534d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann for (const auto& pair : m_IndexArray) { 7544d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if ((len = pFile->AppendDWord(pair.objnum)) < 0) { 7554d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return false; 756ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 757ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (pFile->AppendString(" ") < 0) { 7584d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return false; 759ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 760ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann offset += len + 1; 7614d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if ((len = pFile->AppendDWord(pair.count)) < 0) { 7624d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return false; 763ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 764ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (pFile->AppendString(" ") < 0) { 7654d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return false; 766ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 767ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann offset += len + 1; 768ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 769ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 770ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (pFile->AppendString("]/Size ") < 0) { 7714d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return false; 772ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 773ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if ((len = pFile->AppendDWord(objnum + 1)) < 0) { 7744d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return false; 775ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 776ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann offset += len + 7; 777ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (m_PrevOffset > 0) { 778ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (pFile->AppendString("/Prev ") < 0) { 7794d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return false; 780e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 781ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FX_CHAR offset_buf[20]; 782ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FXSYS_memset(offset_buf, 0, sizeof(offset_buf)); 783ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FXSYS_i64toa(m_PrevOffset, offset_buf, 10); 7844d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int32_t offset_len = (int32_t)FXSYS_strlen(offset_buf); 7854d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (pFile->AppendBlock(offset_buf, offset_len) < 0) { 7864d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return false; 787ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 7884d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann offset += offset_len + 6; 789ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 7904d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann CPDF_FlateEncoder encoder(m_Buffer.GetBuffer(), m_Buffer.GetLength(), true, 7914d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann true); 7924d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (pFile->AppendString("/Filter /FlateDecode") < 0) 7934d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return false; 7944d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 7954d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann offset += 20; 7964d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if ((len = pFile->AppendString("/DecodeParms<</Columns 7/Predictor 12>>")) < 7974d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 0) { 7984d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return false; 799ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 8004d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 8014d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann offset += len; 8024d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (pFile->AppendString("/Length ") < 0) 8034d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return false; 8044d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 8054d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if ((len = pFile->AppendDWord(encoder.m_dwSize)) < 0) 8064d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return false; 8074d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 808ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann offset += len + 8; 809ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (bEOF) { 810ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if ((len = PDF_CreatorWriteTrailer(pCreator->m_pDocument, pFile, 8114d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pCreator->m_pIDArray.get())) < 0) { 8124d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return false; 813e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 814e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov offset += len; 815ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (pCreator->m_pEncryptDict) { 8164d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann uint32_t dwEncryptObjNum = pCreator->m_pEncryptDict->GetObjNum(); 817ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (dwEncryptObjNum == 0) { 8184d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann dwEncryptObjNum = pCreator->m_dwEncryptObjNum; 819ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 820ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if ((len = PDF_CreatorWriteEncrypt(pCreator->m_pEncryptDict, 821ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann dwEncryptObjNum, pFile)) < 0) { 8224d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return false; 823ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 824ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann offset += len; 825ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 826ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 8274d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if ((len = pFile->AppendString(">>stream\r\n")) < 0) 8284d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return false; 8294d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 830ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann offset += len; 8314d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (pFile->AppendBlock(encoder.m_pData.Get(), encoder.m_dwSize) < 0) 8324d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return false; 8334d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 8344d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if ((len = pFile->AppendString("\r\nendstream\r\nendobj\r\n")) < 0) 8354d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return false; 8364d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 837ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann offset += encoder.m_dwSize + len; 838ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_PrevOffset = offset_tmp; 8394d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return true; 840e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 8414d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 8424d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannbool CPDF_XRefStream::End(CPDF_Creator* pCreator, bool bEOF) { 843ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (EndObjectStream(pCreator, bEOF) < 0) { 8444d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return false; 845ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 846ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return GenerateXRefStream(pCreator, bEOF); 847e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 8484d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannbool CPDF_XRefStream::EndXRefStream(CPDF_Creator* pCreator) { 849ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (!(pCreator->m_dwFlags & FPDFCREATE_INCREMENTAL)) { 850ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann AppendIndex0(m_Buffer, true); 8514d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann for (uint32_t i = 1; i < pCreator->m_dwLastObjNum + 1; i++) { 852ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FX_FILESIZE* offset = pCreator->m_ObjectOffset.GetPtrAt(i); 853ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (offset) { 854ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann AppendIndex1(m_Buffer, *offset); 855ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } else { 856ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann AppendIndex0(m_Buffer, false); 857ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 858ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 859ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } else { 8604d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann for (const auto& pair : m_IndexArray) { 8614d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann for (uint32_t j = pair.objnum; j < pair.objnum + pair.count; ++j) 862ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann AppendIndex1(m_Buffer, pCreator->m_ObjectOffset[j]); 863ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 864ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 8654d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return GenerateXRefStream(pCreator, false); 866e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 8674d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannvoid CPDF_XRefStream::AddObjectNumberToIndexArray(uint32_t objnum) { 8684d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (m_IndexArray.empty()) { 8694d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_IndexArray.push_back({objnum, 1}); 8704d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return; 871ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 8724d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann uint32_t next_objnum = m_IndexArray.back().objnum + m_IndexArray.back().count; 8734d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (objnum == next_objnum) 8744d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_IndexArray.back().count += 1; 8754d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann else 8764d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_IndexArray.push_back({objnum, 1}); 877e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 8784d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 8794d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. MoltmannCPDF_Creator::CPDF_Creator(CPDF_Document* pDoc) 8804d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann : m_pDocument(pDoc), 8814d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_pParser(pDoc->GetParser()), 8824d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_bSecurityChanged(false), 8834d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_pEncryptDict(m_pParser ? m_pParser->GetEncryptDict() : nullptr), 8844d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_dwEncryptObjNum(0), 8854d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_bEncryptCloned(false), 8864d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_pCryptoHandler(m_pParser ? m_pParser->GetCryptoHandler() : nullptr), 8874d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_bLocalCryptoHandler(false), 8884d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_pMetadata(nullptr), 8894d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_ObjectStreamSize(200), 8904d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_dwLastObjNum(m_pDocument->GetLastObjNum()), 8914d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_Offset(0), 8924d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_iStage(-1), 8934d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_dwFlags(0), 8944d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_Pos(nullptr), 8954d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_XrefStart(0), 8964d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_pIDArray(nullptr), 8974d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_FileVersion(0) {} 8984d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 899ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannCPDF_Creator::~CPDF_Creator() { 900ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann ResetStandardSecurity(); 9014d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (m_bEncryptCloned) { 9024d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann delete m_pEncryptDict; 9034d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_pEncryptDict = nullptr; 904ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 905ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann Clear(); 906e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 907ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 908ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannint32_t CPDF_Creator::WriteIndirectObjectToStream(const CPDF_Object* pObj) { 909ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (!m_pXRefStream) 910ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return 1; 911ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 9124d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann uint32_t objnum = pObj->GetObjNum(); 9134d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (m_pParser && m_pParser->GetObjectGenNum(objnum) > 0) 914ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return 1; 915ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 916ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (pObj->IsNumber()) 917ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return 1; 918ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 919ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CPDF_Dictionary* pDict = pObj->GetDict(); 920ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (pObj->IsStream()) { 9214d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (pDict && pDict->GetStringFor("Type") == "XRef") 922ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return 0; 923ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return 1; 924ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 925ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 926ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (pDict) { 9274d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (pDict == m_pDocument->GetRoot() || pDict == m_pEncryptDict) 928ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return 1; 9294d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (pDict->IsSignatureDict()) 930ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return 1; 9314d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (pDict->GetStringFor("Type") == "Page") 932ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return 1; 933ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 934ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 935ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_pXRefStream->AddObjectNumberToIndexArray(objnum); 936ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (m_pXRefStream->CompressIndirectObject(objnum, pObj, this) < 0) 937ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return -1; 9384d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (!IsXRefNeedEnd(m_pXRefStream.get(), m_dwFlags)) 939ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return 0; 940ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (!m_pXRefStream->End(this)) 941ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return -1; 942ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (!m_pXRefStream->Start()) 943ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return -1; 944ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return 0; 945e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 9464d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannint32_t CPDF_Creator::WriteIndirectObjectToStream(uint32_t objnum, 947ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann const uint8_t* pBuffer, 9484d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann uint32_t dwSize) { 949ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (!m_pXRefStream) { 950ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return 1; 951ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 952ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_pXRefStream->AddObjectNumberToIndexArray(objnum); 953ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann int32_t iRet = 954ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_pXRefStream->CompressIndirectObject(objnum, pBuffer, dwSize, this); 955ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (iRet < 1) { 956ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return iRet; 957ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 9584d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (!IsXRefNeedEnd(m_pXRefStream.get(), m_dwFlags)) { 959e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return 0; 960ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 961ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (!m_pXRefStream->End(this)) { 962ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return -1; 963ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 964ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (!m_pXRefStream->Start()) { 965ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return -1; 966ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 967ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return 0; 968e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 9694d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannint32_t CPDF_Creator::AppendObjectNumberToXRef(uint32_t objnum) { 970ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (!m_pXRefStream) { 971ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return 1; 972ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 973ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_pXRefStream->AddObjectNumberToIndexArray(objnum); 9744d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (!IsXRefNeedEnd(m_pXRefStream.get(), m_dwFlags)) { 975e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return 0; 976ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 977ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (!m_pXRefStream->End(this)) { 978ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return -1; 979ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 980ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (!m_pXRefStream->Start()) { 981ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return -1; 982ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 983ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return 0; 984e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 985ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannint32_t CPDF_Creator::WriteStream(const CPDF_Object* pStream, 9864d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann uint32_t objnum, 987ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CPDF_CryptoHandler* pCrypto) { 9884d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann CPDF_FlateEncoder encoder(const_cast<CPDF_Stream*>(pStream->AsStream()), 9894d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pStream != m_pMetadata); 9904d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann CPDF_Encryptor encryptor(pCrypto, objnum, encoder.m_pData.Get(), 9914d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann encoder.m_dwSize); 9924d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (static_cast<uint32_t>(encoder.m_pDict->GetIntegerFor("Length")) != 9934d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann encryptor.m_dwSize) { 994ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann encoder.CloneDict(); 9954d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann encoder.m_pDict->SetNewFor<CPDF_Number>( 9964d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann "Length", static_cast<int>(encryptor.m_dwSize)); 997ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 9984d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (WriteDirectObj(objnum, encoder.m_pDict.Get()) < 0) 999ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return -1; 10004d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 1001ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann int len = m_File.AppendString("stream\r\n"); 10024d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (len < 0) 1003ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return -1; 10044d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 1005ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_Offset += len; 10064d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (m_File.AppendBlock(encryptor.m_pData, encryptor.m_dwSize) < 0) 1007ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return -1; 10084d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 1009ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_Offset += encryptor.m_dwSize; 10104d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if ((len = m_File.AppendString("\r\nendstream")) < 0) 1011ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return -1; 10124d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 1013ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_Offset += len; 1014ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return 1; 1015ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann} 10164d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannint32_t CPDF_Creator::WriteIndirectObj(uint32_t objnum, 1017ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann const CPDF_Object* pObj) { 1018ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann int32_t len = m_File.AppendDWord(objnum); 1019ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (len < 0) 1020ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return -1; 1021ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 1022ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_Offset += len; 1023ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if ((len = m_File.AppendString(" 0 obj\r\n")) < 0) 1024ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return -1; 1025ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 1026ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_Offset += len; 1027ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (pObj->IsStream()) { 10284d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann CPDF_CryptoHandler* pHandler = 10294d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pObj != m_pMetadata ? m_pCryptoHandler : nullptr; 1030ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (WriteStream(pObj, objnum, pHandler) < 0) 1031ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return -1; 1032ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } else { 1033ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (WriteDirectObj(objnum, pObj) < 0) 1034ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return -1; 1035ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 1036ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if ((len = m_File.AppendString("\r\nendobj\r\n")) < 0) 1037ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return -1; 1038ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 1039ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_Offset += len; 1040ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (AppendObjectNumberToXRef(objnum) < 0) 1041ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return -1; 1042ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return 0; 1043ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann} 1044ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannint32_t CPDF_Creator::WriteIndirectObj(const CPDF_Object* pObj) { 1045ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann int32_t iRet = WriteIndirectObjectToStream(pObj); 1046ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (iRet < 1) { 1047ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return iRet; 1048ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 1049ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return WriteIndirectObj(pObj->GetObjNum(), pObj); 1050ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann} 10514d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannint32_t CPDF_Creator::WriteDirectObj(uint32_t objnum, 1052ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann const CPDF_Object* pObj, 10534d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann bool bEncrypt) { 1054ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann int32_t len = 0; 1055ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (!pObj) { 1056ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (m_File.AppendString(" null") < 0) { 1057ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return -1; 1058ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 1059ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_Offset += 5; 1060ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return 1; 1061ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 1062ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann switch (pObj->GetType()) { 10634d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann case CPDF_Object::NULLOBJ: 1064ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (m_File.AppendString(" null") < 0) { 1065e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return -1; 1066ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 1067ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_Offset += 5; 1068ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann break; 10694d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann case CPDF_Object::BOOLEAN: 10704d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann case CPDF_Object::NUMBER: 1071ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (m_File.AppendString(" ") < 0) { 1072e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return -1; 1073ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 10744d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if ((len = m_File.AppendString(pObj->GetString().AsStringC())) < 0) { 1075e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return -1; 1076ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 1077ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_Offset += len + 1; 1078ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann break; 10794d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann case CPDF_Object::STRING: { 1080ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CFX_ByteString str = pObj->GetString(); 10814d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann bool bHex = pObj->AsString()->IsHex(); 1082ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (!m_pCryptoHandler || !bEncrypt) { 1083ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CFX_ByteString content = PDF_EncodeString(str, bHex); 10844d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if ((len = m_File.AppendString(content.AsStringC())) < 0) { 1085ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return -1; 1086ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 1087ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_Offset += len; 1088ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann break; 1089ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 10904d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann CPDF_Encryptor encryptor(m_pCryptoHandler, objnum, (uint8_t*)str.c_str(), 10914d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann str.GetLength()); 1092ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CFX_ByteString content = PDF_EncodeString( 1093ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CFX_ByteString((const FX_CHAR*)encryptor.m_pData, encryptor.m_dwSize), 1094ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann bHex); 10954d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if ((len = m_File.AppendString(content.AsStringC())) < 0) { 1096ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return -1; 1097ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 1098ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_Offset += len; 1099ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann break; 1100ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 11014d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann case CPDF_Object::STREAM: { 11024d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann CPDF_FlateEncoder encoder(const_cast<CPDF_Stream*>(pObj->AsStream()), 11034d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann true); 11044d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann CPDF_Encryptor encryptor(m_pCryptoHandler, objnum, encoder.m_pData.Get(), 11054d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann encoder.m_dwSize); 11064d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (static_cast<uint32_t>(encoder.m_pDict->GetIntegerFor("Length")) != 1107ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann encryptor.m_dwSize) { 1108e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov encoder.CloneDict(); 11094d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann encoder.m_pDict->SetNewFor<CPDF_Number>( 11104d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann "Length", static_cast<int>(encryptor.m_dwSize)); 1111ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 11124d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (WriteDirectObj(objnum, encoder.m_pDict.Get()) < 0) 1113e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return -1; 11144d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 11154d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if ((len = m_File.AppendString("stream\r\n")) < 0) 1116e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return -1; 11174d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 1118ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_Offset += len; 11194d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (m_File.AppendBlock(encryptor.m_pData, encryptor.m_dwSize) < 0) 1120e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return -1; 11214d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 1122ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_Offset += encryptor.m_dwSize; 11234d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if ((len = m_File.AppendString("\r\nendstream")) < 0) 1124e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return -1; 11254d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 1126ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_Offset += len; 1127ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann break; 1128e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 11294d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann case CPDF_Object::NAME: { 1130ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (m_File.AppendString("/") < 0) { 1131e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return -1; 1132ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 1133ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CFX_ByteString str = pObj->GetString(); 11344d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if ((len = m_File.AppendString(PDF_NameEncode(str).AsStringC())) < 0) { 1135ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return -1; 1136ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 1137ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_Offset += len + 1; 1138ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann break; 1139e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 11404d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann case CPDF_Object::REFERENCE: { 1141ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (m_File.AppendString(" ") < 0) 1142ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return -1; 1143ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if ((len = m_File.AppendDWord(pObj->AsReference()->GetRefObjNum())) < 0) 1144e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return -1; 1145ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (m_File.AppendString(" 0 R") < 0) 1146ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return -1; 1147ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_Offset += len + 5; 1148ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann break; 1149e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 11504d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann case CPDF_Object::ARRAY: { 1151ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (m_File.AppendString("[") < 0) { 1152ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return -1; 1153ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 1154ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_Offset += 1; 1155ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann const CPDF_Array* p = pObj->AsArray(); 11564d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann for (size_t i = 0; i < p->GetCount(); i++) { 11574d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann CPDF_Object* pElement = p->GetObjectAt(i); 11584d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (!pElement->IsInline()) { 1159ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (m_File.AppendString(" ") < 0) { 1160e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return -1; 1161ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 1162ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if ((len = m_File.AppendDWord(pElement->GetObjNum())) < 0) { 1163e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return -1; 1164ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 1165ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (m_File.AppendString(" 0 R") < 0) { 1166ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return -1; 1167ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 1168ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_Offset += len + 5; 1169ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } else { 1170ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (WriteDirectObj(objnum, pElement) < 0) { 1171ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return -1; 1172ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 1173e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 1174ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 1175ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (m_File.AppendString("]") < 0) { 1176e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return -1; 1177ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 1178ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_Offset += 1; 1179ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann break; 1180ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 11814d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann case CPDF_Object::DICTIONARY: { 11824d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (!m_pCryptoHandler || pObj == m_pEncryptDict) 1183ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return PDF_CreatorAppendObject(pObj, &m_File, m_Offset); 11844d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (m_File.AppendString("<<") < 0) 1185e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return -1; 11864d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 1187ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_Offset += 2; 1188ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann const CPDF_Dictionary* p = pObj->AsDictionary(); 11894d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann bool bSignDict = p->IsSignatureDict(); 1190ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann for (const auto& it : *p) { 11914d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann bool bSignValue = false; 1192ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann const CFX_ByteString& key = it.first; 11934d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann CPDF_Object* pValue = it.second.get(); 1194ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (m_File.AppendString("/") < 0) { 1195ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return -1; 1196ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 11974d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if ((len = m_File.AppendString(PDF_NameEncode(key).AsStringC())) < 0) { 1198ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return -1; 1199ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 1200ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_Offset += len + 1; 1201ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (bSignDict && key == "Contents") { 12024d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann bSignValue = true; 1203ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 12044d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (!pValue->IsInline()) { 1205ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (m_File.AppendString(" ") < 0) { 1206e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return -1; 1207ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 1208ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if ((len = m_File.AppendDWord(pValue->GetObjNum())) < 0) { 1209e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return -1; 1210ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 1211ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (m_File.AppendString(" 0 R ") < 0) { 1212ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return -1; 1213ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 1214ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_Offset += len + 6; 1215e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } else { 1216ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (WriteDirectObj(objnum, pValue, !bSignValue) < 0) { 1217ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return -1; 1218ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 1219e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 1220ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 1221ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (m_File.AppendString(">>") < 0) { 1222ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return -1; 1223ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 1224ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_Offset += 2; 1225ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann break; 1226e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 1227ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 1228ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return 1; 1229e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 12304d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannint32_t CPDF_Creator::WriteOldIndirectObject(uint32_t objnum) { 12314d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (m_pParser->IsObjectFreeOrNull(objnum)) 1232ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return 0; 12334d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 1234ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_ObjectOffset[objnum] = m_Offset; 12354d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann bool bExistInMap = !!m_pDocument->GetIndirectObject(objnum); 12364d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann const uint8_t object_type = m_pParser->GetObjectType(objnum); 12374d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann bool bObjStm = (object_type == 2) && m_pEncryptDict && !m_pXRefStream; 12384d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (m_pParser->IsVersionUpdated() || m_bSecurityChanged || bExistInMap || 1239ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann bObjStm) { 12404d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann CPDF_Object* pObj = m_pDocument->GetOrParseIndirectObject(objnum); 1241ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (!pObj) { 1242ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_ObjectOffset[objnum] = 0; 1243ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return 0; 1244ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 1245ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (WriteIndirectObj(pObj)) { 1246ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return -1; 1247ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 1248ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (!bExistInMap) { 12494d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_pDocument->DeleteIndirectObject(objnum); 1250ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 1251ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } else { 1252ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann uint8_t* pBuffer; 12534d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann uint32_t size; 1254ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_pParser->GetIndirectBinary(objnum, pBuffer, size); 1255ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (!pBuffer) { 1256ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return 0; 1257ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 12584d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (object_type == 2) { 1259ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (m_pXRefStream) { 1260ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (WriteIndirectObjectToStream(objnum, pBuffer, size) < 0) { 1261ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FX_Free(pBuffer); 1262ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return -1; 1263e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 1264ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } else { 1265ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann int32_t len = m_File.AppendDWord(objnum); 1266ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (len < 0) { 1267ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return -1; 1268e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 1269ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (m_File.AppendString(" 0 obj ") < 0) { 1270ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return -1; 1271e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 1272ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_Offset += len + 7; 1273ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (m_File.AppendBlock(pBuffer, size) < 0) { 1274ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return -1; 1275e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 1276ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_Offset += size; 1277ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (m_File.AppendString("\r\nendobj\r\n") < 0) { 1278ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return -1; 1279e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 1280ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_Offset += 10; 1281ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 1282ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } else { 1283ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (m_File.AppendBlock(pBuffer, size) < 0) { 1284ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return -1; 1285ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 1286ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_Offset += size; 1287ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (AppendObjectNumberToXRef(objnum) < 0) { 1288ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return -1; 1289ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 1290e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 1291ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FX_Free(pBuffer); 1292ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 1293ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return 1; 1294e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 1295ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannint32_t CPDF_Creator::WriteOldObjs(IFX_Pause* pPause) { 12964d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann uint32_t nLastObjNum = m_pParser->GetLastObjNum(); 1297ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (!m_pParser->IsValidObjectNumber(nLastObjNum)) 1298ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return 0; 1299ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 13004d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann uint32_t objnum = (uint32_t)(uintptr_t)m_Pos; 1301ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann for (; objnum <= nLastObjNum; ++objnum) { 1302ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann int32_t iRet = WriteOldIndirectObject(objnum); 1303ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (iRet < 0) 1304ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return iRet; 1305ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 1306ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (!iRet) 1307ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann continue; 1308ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 1309ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (pPause && pPause->NeedToPauseNow()) { 1310ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_Pos = (void*)(uintptr_t)(objnum + 1); 1311ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return 1; 1312e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 1313ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 1314ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return 0; 1315e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 13164d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 13174d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannint32_t CPDF_Creator::WriteNewObjs(bool bIncremental, IFX_Pause* pPause) { 13184d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann size_t iCount = m_NewObjNumArray.size(); 13194d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann size_t index = (size_t)(uintptr_t)m_Pos; 1320ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann while (index < iCount) { 13214d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann uint32_t objnum = m_NewObjNumArray[index]; 13224d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann CPDF_Object* pObj = m_pDocument->GetIndirectObject(objnum); 13234d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (!pObj) { 1324ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann ++index; 1325ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann continue; 1326e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 1327ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_ObjectOffset[objnum] = m_Offset; 13284d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (WriteIndirectObj(pObj)) 1329ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return -1; 13304d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 1331ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann index++; 1332ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (pPause && pPause->NeedToPauseNow()) { 1333ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_Pos = (FX_POSITION)(uintptr_t)index; 1334ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return 1; 1335e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 1336ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 1337ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return 0; 1338ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann} 13394d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 1340ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannvoid CPDF_Creator::InitOldObjNumOffsets() { 1341ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (!m_pParser) { 1342ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return; 1343ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 13444d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann uint32_t j = 0; 13454d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann uint32_t dwStart = 0; 13464d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann uint32_t dwEnd = m_pParser->GetLastObjNum(); 1347ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann while (dwStart <= dwEnd) { 13484d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann while (dwStart <= dwEnd && m_pParser->IsObjectFreeOrNull(dwStart)) 1349ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann dwStart++; 13504d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 13514d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (dwStart > dwEnd) 1352ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann break; 13534d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 1354ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann j = dwStart; 13554d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann while (j <= dwEnd && !m_pParser->IsObjectFreeOrNull(j)) 1356ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann j++; 13574d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 1358ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_ObjectOffset.Add(dwStart, j - dwStart); 1359ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann dwStart = j; 1360ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 1361ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann} 13624d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 1363ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannvoid CPDF_Creator::InitNewObjNumOffsets() { 13644d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann bool bIncremental = (m_dwFlags & FPDFCREATE_INCREMENTAL) != 0; 13654d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann bool bNoOriginal = (m_dwFlags & FPDFCREATE_NO_ORIGINAL) != 0; 13664d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann for (const auto& pair : *m_pDocument) { 13674d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann const uint32_t objnum = pair.first; 13684d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann const CPDF_Object* pObj = pair.second.get(); 13694d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (bIncremental || pObj->GetObjNum() == CPDF_Object::kInvalidObjNum) 1370ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann continue; 13714d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (m_pParser && m_pParser->IsValidObjectNumber(objnum) && 13724d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_pParser->GetObjectType(objnum)) { 1373ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann continue; 1374ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 13754d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann AppendNewObjNum(objnum); 1376ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 13774d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 13784d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann size_t iCount = m_NewObjNumArray.size(); 13794d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (iCount == 0) 1380ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return; 13814d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 13824d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann size_t i = 0; 13834d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann uint32_t dwStartObjNum = 0; 13844d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann bool bCrossRefValid = m_pParser && m_pParser->GetLastXRefOffset() > 0; 1385ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann while (i < iCount) { 13864d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann dwStartObjNum = m_NewObjNumArray[i]; 1387ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if ((bIncremental && (bNoOriginal || bCrossRefValid)) || 1388ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann !m_ObjectOffset.GetPtrAt(dwStartObjNum)) { 1389ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann break; 1390e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 1391e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov i++; 1392ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 13934d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (i >= iCount) 1394ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return; 13954d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 13964d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann uint32_t dwLastObjNum = dwStartObjNum; 1397ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann i++; 13984d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann bool bNewStart = false; 1399ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann for (; i < iCount; i++) { 14004d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann uint32_t dwCurObjNum = m_NewObjNumArray[i]; 1401ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann bool bExist = m_pParser && m_pParser->IsValidObjectNumber(dwCurObjNum) && 1402ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_ObjectOffset.GetPtrAt(dwCurObjNum); 1403ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (bExist || dwCurObjNum - dwLastObjNum > 1) { 1404ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (!bNewStart) 1405ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_ObjectOffset.Add(dwStartObjNum, dwLastObjNum - dwStartObjNum + 1); 1406ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann dwStartObjNum = dwCurObjNum; 1407ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 14084d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (bNewStart) 1409ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann dwStartObjNum = dwCurObjNum; 14104d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 1411ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann bNewStart = bExist; 1412ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann dwLastObjNum = dwCurObjNum; 1413ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 1414ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_ObjectOffset.Add(dwStartObjNum, dwLastObjNum - dwStartObjNum + 1); 1415e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 14164d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 14174d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannvoid CPDF_Creator::AppendNewObjNum(uint32_t objnum) { 14184d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_NewObjNumArray.insert(std::lower_bound(m_NewObjNumArray.begin(), 14194d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_NewObjNumArray.end(), objnum), 14204d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann objnum); 1421e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 14224d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 1423ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannint32_t CPDF_Creator::WriteDoc_Stage1(IFX_Pause* pPause) { 14244d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann ASSERT(m_iStage > -1 || m_iStage < 20); 1425ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (m_iStage == 0) { 1426ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (!m_pParser) { 1427ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_dwFlags &= ~FPDFCREATE_INCREMENTAL; 1428ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 1429ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (m_bSecurityChanged && (m_dwFlags & FPDFCREATE_NO_ORIGINAL) == 0) { 1430ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_dwFlags &= ~FPDFCREATE_INCREMENTAL; 1431ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 1432ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CPDF_Dictionary* pDict = m_pDocument->GetRoot(); 14334d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_pMetadata = pDict ? pDict->GetDirectObjectFor("Metadata") : nullptr; 1434ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (m_dwFlags & FPDFCREATE_OBJECTSTREAM) { 14354d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_pXRefStream = pdfium::MakeUnique<CPDF_XRefStream>(); 1436ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_pXRefStream->Start(); 1437ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if ((m_dwFlags & FPDFCREATE_INCREMENTAL) != 0 && m_pParser) { 1438ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FX_FILESIZE prev = m_pParser->GetLastXRefOffset(); 1439ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_pXRefStream->m_PrevOffset = prev; 1440ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 1441ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 1442ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_iStage = 10; 1443ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 1444ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (m_iStage == 10) { 1445ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if ((m_dwFlags & FPDFCREATE_INCREMENTAL) == 0) { 1446ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (m_File.AppendString("%PDF-1.") < 0) { 1447ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return -1; 1448ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 1449ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_Offset += 7; 1450ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann int32_t version = 7; 1451ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (m_FileVersion) { 1452ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann version = m_FileVersion; 1453ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } else if (m_pParser) { 1454ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann version = m_pParser->GetFileVersion(); 1455ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 1456ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann int32_t len = m_File.AppendDWord(version % 10); 1457ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (len < 0) { 1458ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return -1; 1459ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 1460ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_Offset += len; 1461ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if ((len = m_File.AppendString("\r\n%\xA1\xB3\xC5\xD7\r\n")) < 0) { 1462ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return -1; 1463ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 1464ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_Offset += len; 1465ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann InitOldObjNumOffsets(); 1466ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_iStage = 20; 1467ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } else { 14684d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann CFX_RetainPtr<IFX_SeekableReadStream> pSrcFile = 14694d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_pParser->GetFileAccess(); 1470ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_Offset = pSrcFile->GetSize(); 1471ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_Pos = (void*)(uintptr_t)m_Offset; 1472ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_iStage = 15; 1473ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 1474ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 1475ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (m_iStage == 15) { 1476ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if ((m_dwFlags & FPDFCREATE_NO_ORIGINAL) == 0 && m_Pos) { 14774d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann CFX_RetainPtr<IFX_SeekableReadStream> pSrcFile = 14784d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_pParser->GetFileAccess(); 14794d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann uint8_t buffer[4096]; // TODO(tsepez): don't stack allocate. 14804d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann uint32_t src_size = (uint32_t)(uintptr_t)m_Pos; 1481ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann while (src_size) { 14824d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann uint32_t block_size = src_size > 4096 ? 4096 : src_size; 1483ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (!pSrcFile->ReadBlock(buffer, m_Offset - src_size, block_size)) { 1484ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return -1; 1485ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 1486ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (m_File.AppendBlock(buffer, block_size) < 0) { 1487ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return -1; 1488ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 1489ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann src_size -= block_size; 1490ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (pPause && pPause->NeedToPauseNow()) { 1491ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_Pos = (void*)(uintptr_t)src_size; 1492ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return 1; 1493ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 1494ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 1495ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 1496ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if ((m_dwFlags & FPDFCREATE_NO_ORIGINAL) == 0 && 1497ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_pParser->GetLastXRefOffset() == 0) { 1498ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann InitOldObjNumOffsets(); 14994d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann uint32_t dwEnd = m_pParser->GetLastObjNum(); 15004d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann bool bObjStm = (m_dwFlags & FPDFCREATE_OBJECTSTREAM) != 0; 15014d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann for (uint32_t objnum = 0; objnum <= dwEnd; objnum++) { 15024d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (m_pParser->IsObjectFreeOrNull(objnum)) 1503ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann continue; 15044d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 15054d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_ObjectOffset[objnum] = m_pParser->GetObjectPositionOrZero(objnum); 1506ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (bObjStm) { 1507ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_pXRefStream->AddObjectNumberToIndexArray(objnum); 1508ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 1509ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 1510ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (bObjStm) { 1511ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_pXRefStream->EndXRefStream(this); 1512ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_pXRefStream->Start(); 1513ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 1514ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 1515ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_iStage = 20; 1516ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 1517ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann InitNewObjNumOffsets(); 1518ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return m_iStage; 1519ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann} 1520ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannint32_t CPDF_Creator::WriteDoc_Stage2(IFX_Pause* pPause) { 15214d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann ASSERT(m_iStage >= 20 || m_iStage < 30); 1522ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (m_iStage == 20) { 1523ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if ((m_dwFlags & FPDFCREATE_INCREMENTAL) == 0 && m_pParser) { 1524ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_Pos = (void*)(uintptr_t)0; 1525ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_iStage = 21; 1526ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } else { 1527ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_iStage = 25; 1528ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 1529ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 1530ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (m_iStage == 21) { 1531ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann int32_t iRet = WriteOldObjs(pPause); 1532ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (iRet) { 1533ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return iRet; 1534ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 1535ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_iStage = 25; 1536ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 1537ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (m_iStage == 25) { 1538ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_Pos = (void*)(uintptr_t)0; 1539ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_iStage = 26; 1540ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 1541ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (m_iStage == 26) { 1542ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann int32_t iRet = 1543ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann WriteNewObjs((m_dwFlags & FPDFCREATE_INCREMENTAL) != 0, pPause); 1544ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (iRet) { 1545ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return iRet; 1546ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 1547ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_iStage = 27; 1548ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 1549ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (m_iStage == 27) { 15504d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (m_pEncryptDict && m_pEncryptDict->IsInline()) { 1551ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_dwLastObjNum += 1; 1552ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FX_FILESIZE saveOffset = m_Offset; 15534d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (WriteIndirectObj(m_dwLastObjNum, m_pEncryptDict) < 0) 1554ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return -1; 15554d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 1556ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_ObjectOffset.Add(m_dwLastObjNum, 1); 1557ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_ObjectOffset[m_dwLastObjNum] = saveOffset; 15584d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_dwEncryptObjNum = m_dwLastObjNum; 15594d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (m_dwFlags & FPDFCREATE_INCREMENTAL) 15604d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_NewObjNumArray.push_back(m_dwLastObjNum); 1561ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 1562ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_iStage = 80; 1563ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 1564ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return m_iStage; 1565ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann} 1566ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannint32_t CPDF_Creator::WriteDoc_Stage3(IFX_Pause* pPause) { 15674d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann ASSERT(m_iStage >= 80 || m_iStage < 90); 15684d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann uint32_t dwLastObjNum = m_dwLastObjNum; 1569ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (m_iStage == 80) { 1570ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_XrefStart = m_Offset; 1571ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (m_dwFlags & FPDFCREATE_OBJECTSTREAM) { 15724d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_pXRefStream->End(this, true); 1573ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_XrefStart = m_pXRefStream->m_PrevOffset; 1574ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_iStage = 90; 1575ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } else if ((m_dwFlags & FPDFCREATE_INCREMENTAL) == 0 || 1576ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann !m_pParser->IsXRefStream()) { 1577ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if ((m_dwFlags & FPDFCREATE_INCREMENTAL) == 0 || 1578ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_pParser->GetLastXRefOffset() == 0) { 1579ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CFX_ByteString str; 1580ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann str = m_ObjectOffset.GetPtrAt(1) 1581ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann ? "xref\r\n" 1582ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann : "xref\r\n0 1\r\n0000000000 65535 f\r\n"; 15834d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (m_File.AppendString(str.AsStringC()) < 0) { 1584ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return -1; 1585ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 1586ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_Pos = (void*)(uintptr_t)1; 1587ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_iStage = 81; 1588ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } else { 1589ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (m_File.AppendString("xref\r\n") < 0) { 1590ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return -1; 1591ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 1592ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_Pos = (void*)(uintptr_t)0; 1593ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_iStage = 82; 1594ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 1595ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } else { 1596ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_iStage = 90; 1597ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 1598ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 1599ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (m_iStage == 81) { 1600ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CFX_ByteString str; 16014d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann uint32_t i = (uint32_t)(uintptr_t)m_Pos, j; 1602ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann while (i <= dwLastObjNum) { 1603ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann while (i <= dwLastObjNum && !m_ObjectOffset.GetPtrAt(i)) { 1604ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann i++; 1605ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 1606ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (i > dwLastObjNum) { 1607ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann break; 1608ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 1609ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann j = i; 1610ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann while (j <= dwLastObjNum && m_ObjectOffset.GetPtrAt(j)) { 1611ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann j++; 1612ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 1613ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (i == 1) { 1614ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann str.Format("0 %d\r\n0000000000 65535 f\r\n", j); 1615ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } else { 1616ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann str.Format("%d %d\r\n", i, j - i); 1617ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 1618ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (m_File.AppendBlock(str.c_str(), str.GetLength()) < 0) { 1619ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return -1; 1620ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 1621ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann while (i < j) { 1622ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann str.Format("%010d 00000 n\r\n", m_ObjectOffset[i++]); 1623ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (m_File.AppendBlock(str.c_str(), str.GetLength()) < 0) { 1624ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return -1; 1625ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 1626ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 1627ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (i > dwLastObjNum) { 1628ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann break; 1629ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 1630ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (pPause && pPause->NeedToPauseNow()) { 1631ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_Pos = (void*)(uintptr_t)i; 1632ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return 1; 1633ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 1634ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 1635ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_iStage = 90; 1636ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 1637ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (m_iStage == 82) { 1638ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CFX_ByteString str; 16394d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann size_t iCount = m_NewObjNumArray.size(); 16404d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann size_t i = (size_t)(uintptr_t)m_Pos; 1641ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann while (i < iCount) { 16424d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann size_t j = i; 16434d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann uint32_t objnum = m_NewObjNumArray[i]; 1644ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann while (j < iCount) { 16454d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (++j == iCount) 1646ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann break; 16474d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann uint32_t dwCurrent = m_NewObjNumArray[j]; 16484d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (dwCurrent - objnum > 1) 1649ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann break; 1650ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann objnum = dwCurrent; 1651ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 16524d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann objnum = m_NewObjNumArray[i]; 1653ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (objnum == 1) { 1654ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann str.Format("0 %d\r\n0000000000 65535 f\r\n", j - i + 1); 1655ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } else { 1656ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann str.Format("%d %d\r\n", objnum, j - i); 1657ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 1658ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (m_File.AppendBlock(str.c_str(), str.GetLength()) < 0) { 1659ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return -1; 1660ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 1661ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann while (i < j) { 16624d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann objnum = m_NewObjNumArray[i++]; 1663ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann str.Format("%010d 00000 n\r\n", m_ObjectOffset[objnum]); 16644d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (m_File.AppendBlock(str.c_str(), str.GetLength()) < 0) 1665ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return -1; 1666ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 1667ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (pPause && (i % 100) == 0 && pPause->NeedToPauseNow()) { 1668ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_Pos = (void*)(uintptr_t)i; 1669ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return 1; 1670ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 1671e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 1672ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_iStage = 90; 1673ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 1674ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return m_iStage; 1675e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 1676ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 1677ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannint32_t CPDF_Creator::WriteDoc_Stage4(IFX_Pause* pPause) { 16784d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann ASSERT(m_iStage >= 90); 1679ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if ((m_dwFlags & FPDFCREATE_OBJECTSTREAM) == 0) { 16804d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann bool bXRefStream = 1681ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann (m_dwFlags & FPDFCREATE_INCREMENTAL) != 0 && m_pParser->IsXRefStream(); 1682ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (!bXRefStream) { 1683ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (m_File.AppendString("trailer\r\n<<") < 0) { 1684ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return -1; 1685ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 1686ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } else { 16874d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (m_File.AppendDWord(m_pDocument->GetLastObjNum() + 1) < 0) { 1688ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return -1; 1689ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 1690ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (m_File.AppendString(" 0 obj <<") < 0) { 1691ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return -1; 1692ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 1693ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 1694ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (m_pParser) { 16954d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann CPDF_Dictionary* p = m_pParser->GetTrailer(); 1696ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann for (const auto& it : *p) { 1697ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann const CFX_ByteString& key = it.first; 16984d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann CPDF_Object* pValue = it.second.get(); 1699ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann // TODO(ochang): Consolidate with similar check in 1700ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann // PDF_CreatorWriteTrailer. 1701ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (key == "Encrypt" || key == "Size" || key == "Filter" || 1702ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann key == "Index" || key == "Length" || key == "Prev" || key == "W" || 1703ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann key == "XRefStm" || key == "ID") { 1704ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann continue; 1705ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 1706ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (m_File.AppendString(("/")) < 0) { 1707ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return -1; 1708ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 17094d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (m_File.AppendString(PDF_NameEncode(key).AsStringC()) < 0) { 1710ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return -1; 1711ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 17124d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (!pValue->IsInline()) { 1713ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (m_File.AppendString(" ") < 0) { 1714ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return -1; 1715ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 1716ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (m_File.AppendDWord(pValue->GetObjNum()) < 0) { 1717ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return -1; 1718ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 1719ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (m_File.AppendString(" 0 R ") < 0) { 1720ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return -1; 1721ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 1722e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } else { 1723ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FX_FILESIZE offset = 0; 1724ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (PDF_CreatorAppendObject(pValue, &m_File, offset) < 0) { 1725ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return -1; 1726ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 1727e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 1728ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 1729ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } else { 1730ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (m_File.AppendString("\r\n/Root ") < 0) { 1731ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return -1; 1732ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 17334d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (m_File.AppendDWord(m_pDocument->GetRoot()->GetObjNum()) < 0) { 1734ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return -1; 1735ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 1736ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (m_File.AppendString(" 0 R\r\n") < 0) { 1737ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return -1; 1738ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 17394d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (m_pDocument->GetInfo()) { 1740ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (m_File.AppendString("/Info ") < 0) { 1741ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return -1; 1742e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 17434d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (m_File.AppendDWord(m_pDocument->GetInfo()->GetObjNum()) < 0) { 1744ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return -1; 1745e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 1746ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (m_File.AppendString(" 0 R\r\n") < 0) { 1747ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return -1; 1748e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 1749ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 1750e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 1751ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (m_pEncryptDict) { 1752ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (m_File.AppendString("/Encrypt") < 0) { 1753ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return -1; 1754ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 17554d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann uint32_t dwObjNum = m_pEncryptDict->GetObjNum(); 1756ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (dwObjNum == 0) { 1757ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann dwObjNum = m_pDocument->GetLastObjNum() + 1; 1758ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 1759ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (m_File.AppendString(" ") < 0) { 1760ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return -1; 1761ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 1762ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (m_File.AppendDWord(dwObjNum) < 0) { 1763ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return -1; 1764ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 1765ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (m_File.AppendString(" 0 R ") < 0) { 1766ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return -1; 1767ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 1768e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 1769ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (m_File.AppendString("/Size ") < 0) { 1770ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return -1; 1771e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 1772ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (m_File.AppendDWord(m_dwLastObjNum + (bXRefStream ? 2 : 1)) < 0) { 1773ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return -1; 1774e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 1775ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if ((m_dwFlags & FPDFCREATE_INCREMENTAL) != 0) { 1776ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FX_FILESIZE prev = m_pParser->GetLastXRefOffset(); 1777ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (prev) { 1778ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (m_File.AppendString("/Prev ") < 0) { 1779ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return -1; 1780e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 1781ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FX_CHAR offset_buf[20]; 1782ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FXSYS_memset(offset_buf, 0, sizeof(offset_buf)); 1783ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FXSYS_i64toa(prev, offset_buf, 10); 1784ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (m_File.AppendBlock(offset_buf, FXSYS_strlen(offset_buf)) < 0) { 1785ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return -1; 1786ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 1787ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 1788e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 1789ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (m_pIDArray) { 1790ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (m_File.AppendString(("/ID")) < 0) { 1791e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return -1; 1792ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 1793ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FX_FILESIZE offset = 0; 17944d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (PDF_CreatorAppendObject(m_pIDArray.get(), &m_File, offset) < 0) { 1795e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return -1; 1796ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 1797e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 1798ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (!bXRefStream) { 1799ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (m_File.AppendString(">>") < 0) { 1800e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return -1; 1801ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 1802ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } else { 1803ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (m_File.AppendString("/W[0 4 1]/Index[") < 0) { 1804e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return -1; 1805ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 1806ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if ((m_dwFlags & FPDFCREATE_INCREMENTAL) != 0 && m_pParser && 1807ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_pParser->GetLastXRefOffset() == 0) { 18084d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann uint32_t i = 0; 1809ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann for (i = 0; i < m_dwLastObjNum; i++) { 1810ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (!m_ObjectOffset.GetPtrAt(i)) { 1811ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann continue; 1812ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 1813ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (m_File.AppendDWord(i) < 0) { 1814ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return -1; 1815ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 1816ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (m_File.AppendString(" 1 ") < 0) { 1817ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return -1; 1818ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 1819e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 1820ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (m_File.AppendString("]/Length ") < 0) { 1821ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return -1; 1822e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 1823ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (m_File.AppendDWord(m_dwLastObjNum * 5) < 0) { 1824ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return -1; 1825e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 1826ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (m_File.AppendString(">>stream\r\n") < 0) { 1827ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return -1; 1828e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 1829ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann for (i = 0; i < m_dwLastObjNum; i++) { 1830ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FX_FILESIZE* offset = m_ObjectOffset.GetPtrAt(i); 18314d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (!offset) 1832ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann continue; 1833ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann OutputIndex(&m_File, *offset); 1834ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 1835ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } else { 18364d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann size_t count = m_NewObjNumArray.size(); 18374d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann size_t i = 0; 1838ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann for (i = 0; i < count; i++) { 18394d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (m_File.AppendDWord(m_NewObjNumArray[i]) < 0) 1840e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return -1; 18414d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (m_File.AppendString(" 1 ") < 0) 1842ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return -1; 1843e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 18444d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (m_File.AppendString("]/Length ") < 0) 1845ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return -1; 18464d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (m_File.AppendDWord(count * 5) < 0) 1847ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return -1; 18484d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (m_File.AppendString(">>stream\r\n") < 0) 1849ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return -1; 1850ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann for (i = 0; i < count; i++) { 18514d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann uint32_t objnum = m_NewObjNumArray[i]; 1852ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FX_FILESIZE offset = m_ObjectOffset[objnum]; 1853ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann OutputIndex(&m_File, offset); 1854ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 1855ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 18564d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (m_File.AppendString("\r\nendstream") < 0) 1857e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return -1; 1858ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 1859ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 1860ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (m_File.AppendString("\r\nstartxref\r\n") < 0) { 1861ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return -1; 1862ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 1863ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FX_CHAR offset_buf[20]; 1864ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FXSYS_memset(offset_buf, 0, sizeof(offset_buf)); 1865ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FXSYS_i64toa(m_XrefStart, offset_buf, 10); 1866ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (m_File.AppendBlock(offset_buf, FXSYS_strlen(offset_buf)) < 0) { 1867ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return -1; 1868ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 1869ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (m_File.AppendString("\r\n%%EOF\r\n") < 0) { 1870ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return -1; 1871ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 1872ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_File.Flush(); 1873ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return m_iStage = 100; 1874e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 18754d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 1876ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannvoid CPDF_Creator::Clear() { 18774d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_pXRefStream.reset(); 1878ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_File.Clear(); 18794d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_NewObjNumArray.clear(); 18804d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_pIDArray.reset(); 1881e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 18824d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 18834d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannbool CPDF_Creator::Create(const CFX_RetainPtr<IFX_WriteStream>& pFile, 18844d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann uint32_t flags) { 18854d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_File.AttachFile(pFile); 1886ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return Create(flags); 1887e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 18884d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 18894d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannbool CPDF_Creator::Create(uint32_t flags) { 1890ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_dwFlags = flags; 1891ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_iStage = 0; 1892ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_Offset = 0; 1893ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_dwLastObjNum = m_pDocument->GetLastObjNum(); 1894ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_ObjectOffset.Clear(); 18954d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_NewObjNumArray.clear(); 1896ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann InitID(); 18974d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (flags & FPDFCREATE_PROGRESSIVE) 18984d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return true; 18994d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return Continue(nullptr) > -1; 1900e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 19014d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 19024d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannvoid CPDF_Creator::InitID(bool bDefault) { 19034d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann CPDF_Array* pOldIDArray = m_pParser ? m_pParser->GetIDArray() : nullptr; 19044d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann bool bNewId = !m_pIDArray; 19054d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (bNewId) { 19064d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_pIDArray = pdfium::MakeUnique<CPDF_Array>(); 19074d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann CPDF_Object* pID1 = pOldIDArray ? pOldIDArray->GetObjectAt(0) : nullptr; 1908ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (pID1) { 1909ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_pIDArray->Add(pID1->Clone()); 1910ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } else { 1911ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann std::vector<uint8_t> buffer = 19124d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann PDF_GenerateFileID((uint32_t)(uintptr_t) this, m_dwLastObjNum); 19134d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann CFX_ByteString bsBuffer(buffer.data(), buffer.size()); 19144d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_pIDArray->AddNew<CPDF_String>(bsBuffer, true); 1915ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 1916ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 1917ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (!bDefault) { 1918ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return; 1919ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 1920ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (pOldIDArray) { 19214d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann CPDF_Object* pID2 = pOldIDArray->GetObjectAt(1); 1922ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if ((m_dwFlags & FPDFCREATE_INCREMENTAL) && m_pEncryptDict && pID2) { 1923ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_pIDArray->Add(pID2->Clone()); 1924ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return; 1925ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 1926ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann std::vector<uint8_t> buffer = 19274d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann PDF_GenerateFileID((uint32_t)(uintptr_t) this, m_dwLastObjNum); 19284d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann CFX_ByteString bsBuffer(buffer.data(), buffer.size()); 19294d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_pIDArray->AddNew<CPDF_String>(bsBuffer, true); 1930ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return; 1931ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 19324d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_pIDArray->Add(m_pIDArray->GetObjectAt(0)->Clone()); 1933ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (m_pEncryptDict && !pOldIDArray && m_pParser && bNewId) { 19344d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (m_pEncryptDict->GetStringFor("Filter") == "Standard") { 1935ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CFX_ByteString user_pass = m_pParser->GetPassword(); 19364d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann uint32_t flag = PDF_ENCRYPT_CONTENT; 19374d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann CPDF_SecurityHandler handler; 19384d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann handler.OnCreate(m_pEncryptDict, m_pIDArray.get(), user_pass.raw_str(), 1939ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann user_pass.GetLength(), flag); 19404d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (m_bLocalCryptoHandler) 1941ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann delete m_pCryptoHandler; 19424d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_pCryptoHandler = new CPDF_CryptoHandler; 1943ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_pCryptoHandler->Init(m_pEncryptDict, &handler); 19444d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_bLocalCryptoHandler = true; 19454d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_bSecurityChanged = true; 1946e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 1947ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 1948e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 1949ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannint32_t CPDF_Creator::Continue(IFX_Pause* pPause) { 1950ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (m_iStage < 0) { 1951ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return m_iStage; 1952ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 1953ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann int32_t iRet = 0; 1954ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann while (m_iStage < 100) { 1955ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (m_iStage < 20) { 1956ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann iRet = WriteDoc_Stage1(pPause); 1957ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } else if (m_iStage < 30) { 1958ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann iRet = WriteDoc_Stage2(pPause); 1959ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } else if (m_iStage < 90) { 1960ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann iRet = WriteDoc_Stage3(pPause); 1961ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } else { 1962ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann iRet = WriteDoc_Stage4(pPause); 1963e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 1964ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (iRet < m_iStage) { 1965ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann break; 1966e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 1967ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 1968ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (iRet < 1 || m_iStage == 100) { 1969ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_iStage = -1; 1970ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann Clear(); 1971ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return iRet > 99 ? 0 : (iRet < 1 ? -1 : iRet); 1972ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 1973ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return m_iStage; 1974e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 19754d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannbool CPDF_Creator::SetFileVersion(int32_t fileVersion) { 1976ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (fileVersion < 10 || fileVersion > 17) { 19774d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return false; 1978ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 1979ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_FileVersion = fileVersion; 19804d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return true; 1981e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 1982ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannvoid CPDF_Creator::RemoveSecurity() { 1983ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann ResetStandardSecurity(); 19844d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_bSecurityChanged = true; 19854d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_pEncryptDict = nullptr; 19864d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_pCryptoHandler = nullptr; 1987e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 1988ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannvoid CPDF_Creator::ResetStandardSecurity() { 19894d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (!m_bLocalCryptoHandler) 1990ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return; 19914d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 19924d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann delete m_pCryptoHandler; 19934d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_pCryptoHandler = nullptr; 19944d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_bLocalCryptoHandler = false; 1995e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 1996