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