Ignore:
Timestamp:
Jun 30, 2008, 10:13:07 AM (13 years ago)
Author:
Eugene Romanenko
Message:

PDF plugin: poppler library updated to version 0.8.3

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/poppler/mypoppler/poppler/Parser.cc

    r134 r250  
    1717#include "Array.h"
    1818#include "Dict.h"
     19#include "Decrypt.h"
    1920#include "Parser.h"
    2021#include "XRef.h"
    2122#include "Error.h"
    22 #include "Decrypt.h"
    23 #include "UGooString.h"
    24 
    25 Parser::Parser(XRef *xrefA, Lexer *lexerA) {
     23
     24Parser::Parser(XRef *xrefA, Lexer *lexerA, GBool allowStreamsA) {
    2625  xref = xrefA;
    2726  lexer = lexerA;
    2827  inlineImg = 0;
     28  allowStreams = allowStreamsA;
    2929  lexer->getObj(&buf1);
    3030  lexer->getObj(&buf2);
     
    3737}
    3838
    39 Object *Parser::getObj(Object *obj,
    40                        Guchar *fileKey, int keyLength,
     39Object *Parser::getObj(Object *obj, Guchar *fileKey,
     40                       CryptAlgorithm encAlgorithm, int keyLength,
    4141                       int objNum, int objGen) {
     42  char *key;
    4243  Stream *str;
    4344  Object obj2;
    4445  int num;
    45   Decrypt *decrypt;
    46   GooString *s;
    47   char *p;
    48   int i;
     46  DecryptStream *decrypt;
     47  GooString *s, *s2;
     48  int c;
    4949
    5050  // refill buffer after inline image data
     
    6262    obj->initArray(xref);
    6363    while (!buf1.isCmd("]") && !buf1.isEOF())
    64       obj->arrayAdd(getObj(&obj2, fileKey, keyLength, objNum, objGen));
     64      obj->arrayAdd(getObj(&obj2, fileKey, encAlgorithm, keyLength,
     65                           objNum, objGen));
    6566    if (buf1.isEOF())
    6667      error(getPos(), "End of file inside array");
     
    7677        shift();
    7778      } else {
    78         // buf1 might go away in shift(), so construct the key
    79         UGooString *key = new UGooString(buf1.getName());
     79        // buf1 might go away in shift(), so construct the key
     80        key = copyString(buf1.getName());
    8081        shift();
    8182        if (buf1.isEOF() || buf1.isError()) {
     
    8384          break;
    8485        }
    85         obj->dictAddOwnKeyVal(key, getObj(&obj2, fileKey, keyLength, objNum, objGen));
     86        obj->dictAdd(key, getObj(&obj2, fileKey, encAlgorithm, keyLength, objNum, objGen));
    8687      }
    8788    }
    8889    if (buf1.isEOF())
    8990      error(getPos(), "End of file inside dictionary");
    90     if (buf2.isCmd("stream")) {
    91       if ((str = makeStream(obj))) {
     91    // stream objects are not allowed inside content streams or
     92    // object streams
     93    if (allowStreams && buf2.isCmd("stream")) {
     94      if ((str = makeStream(obj, fileKey, encAlgorithm, keyLength,
     95                            objNum, objGen))) {
    9296        obj->initStream(str);
    93         if (fileKey) {
    94           str->getBaseStream()->doDecryption(fileKey, keyLength,
    95                                              objNum, objGen);
    96         }
    9797      } else {
    9898        obj->free();
     
    117117  // string
    118118  } else if (buf1.isString() && fileKey) {
    119     buf1.copy(obj);
    120     s = obj->getString();
    121     decrypt = new Decrypt(fileKey, keyLength, objNum, objGen);
    122     for (i = 0, p = obj->getString()->getCString();
    123          i < s->getLength();
    124          ++i, ++p) {
    125       *p = decrypt->decryptByte(*p);
     119    s = buf1.getString();
     120    s2 = new GooString();
     121    obj2.initNull();
     122    decrypt = new DecryptStream(new MemStream(s->getCString(), 0,
     123                                              s->getLength(), &obj2),
     124                                fileKey, encAlgorithm, keyLength,
     125                                objNum, objGen);
     126    decrypt->reset();
     127    while ((c = decrypt->getChar()) != EOF) {
     128      s2->append((char)c);
    126129    }
    127130    delete decrypt;
     131    obj->initString(s2);
    128132    shift();
    129133
     
    141145}
    142146
    143 Stream *Parser::makeStream(Object *dict) {
     147Stream *Parser::makeStream(Object *dict, Guchar *fileKey,
     148                           CryptAlgorithm encAlgorithm, int keyLength,
     149                           int objNum, int objGen) {
    144150  Object obj;
    145151  BaseStream *baseStr;
     
    175181
    176182  // skip over stream data
     183  if (Lexer::LOOK_VALUE_NOT_CACHED != lexer->lookCharLastValueCached) {
     184      // take into account the fact that we've cached one value
     185      pos = pos - 1;
     186      lexer->lookCharLastValueCached = Lexer::LOOK_VALUE_NOT_CACHED;
     187  }
    177188  lexer->setPos(pos + length);
    178189
     
    191202  // make base stream
    192203  str = baseStr->makeSubStream(pos, gTrue, length, dict);
     204
     205  // handle decryption
     206  if (fileKey) {
     207    str = new DecryptStream(str, fileKey, encAlgorithm, keyLength,
     208                            objNum, objGen);
     209  }
    193210
    194211  // get filters
Note: See TracChangeset for help on using the changeset viewer.