diff options
-rw-r--r-- | ChangeLog | 8 | ||||
-rw-r--r-- | poppler/Stream.cc | 5 | ||||
-rw-r--r-- | poppler/Stream.h | 1 | ||||
-rw-r--r-- | qt4/src/poppler-document.cc | 22 | ||||
-rw-r--r-- | qt4/src/poppler-private.h | 17 | ||||
-rw-r--r-- | qt4/src/poppler-qt4.h | 16 |
6 files changed, 67 insertions, 2 deletions
@@ -1,3 +1,11 @@ +2007-01-13 Albert Astals Cid <aacid@kde.org> + + * poppler/Stream.h: + * poppler/Stream.cc: Add MemStream::setNeedFree method + * qt4/src/poppler-document.cc: + * qt4/src/poppler-private.h: + * qt4/src/poppler-qt4.h: Add Document::loadFromData method + 2007-01-11 Albert Astals Cid <aacid@kde.org> * goo/gmem.c: Merge change from xpdf-3.01pl2 diff --git a/poppler/Stream.cc b/poppler/Stream.cc index 91b91476..4983bad0 100644 --- a/poppler/Stream.cc +++ b/poppler/Stream.cc @@ -806,6 +806,11 @@ void MemStream::doDecryption(Guchar *fileKey, int keyLength, } } +void MemStream::setNeedFree(GBool needsFree) +{ + needFree = needsFree; +} + //------------------------------------------------------------------------ // EmbedStream //------------------------------------------------------------------------ diff --git a/poppler/Stream.h b/poppler/Stream.h index 2b8dfd25..605f8af6 100644 --- a/poppler/Stream.h +++ b/poppler/Stream.h @@ -318,6 +318,7 @@ public: virtual void moveStart(int delta); virtual void doDecryption(Guchar *fileKey, int keyLength, int objNum, int objGen); + void setNeedFree(GBool needsFree); private: diff --git a/qt4/src/poppler-document.cc b/qt4/src/poppler-document.cc index 5ff9d642..ab4f00bb 100644 --- a/qt4/src/poppler-document.cc +++ b/qt4/src/poppler-document.cc @@ -49,6 +49,28 @@ namespace Poppler { DocumentData *doc = new DocumentData(new GooString(QFile::encodeName(filePath)), new GooString(ownerPassword.data()), new GooString(userPassword.data())); + return checkDocument(doc); + } + + Document *Document::loadFromData(const QByteArray &fileContents, + const QByteArray &ownerPassword, + const QByteArray &userPassword) + { + // create stream + Object obj; + obj.initNull(); + char *data = (char*)gmalloc(fileContents.length()); + memcpy(data, fileContents.data(), fileContents.length() * sizeof(char)); + MemStream *str = new MemStream(data, 0, fileContents.length(), &obj); + str->setNeedFree(true); + DocumentData *doc = new DocumentData(str, + new GooString(ownerPassword.data()), + new GooString(userPassword.data())); + return checkDocument(doc); + } + + Document *Document::checkDocument(DocumentData *doc) + { Document *pdoc; if (doc->doc.isOk() || doc->doc.getErrorCode() == errEncrypted) { pdoc = new Document(doc); diff --git a/qt4/src/poppler-private.h b/qt4/src/poppler-private.h index 9c23950e..b4e6cafc 100644 --- a/qt4/src/poppler-private.h +++ b/qt4/src/poppler-private.h @@ -66,9 +66,22 @@ namespace Poppler { class DocumentData { public: DocumentData(GooString *filePath, GooString *ownerPassword, GooString *userPassword) : - doc(filePath, ownerPassword, userPassword), m_fontInfoScanner(0), - m_backend(Document::SplashBackend), m_outputDev(0) + doc(filePath, ownerPassword, userPassword) { + init(ownerPassword, userPassword); + } + + DocumentData(MemStream *str, GooString *ownerPassword, GooString *userPassword) : + doc(str, ownerPassword, userPassword) + { + init(ownerPassword, userPassword); + } + + void init(GooString *ownerPassword, GooString *userPassword) + { + m_fontInfoScanner = 0; + m_backend = Document::SplashBackend; + m_outputDev = 0; paperColor = Qt::white; // It might be more appropriate to delete these in PDFDoc delete ownerPassword; diff --git a/qt4/src/poppler-qt4.h b/qt4/src/poppler-qt4.h index 67b6b356..e716ac4e 100644 --- a/qt4/src/poppler-qt4.h +++ b/qt4/src/poppler-qt4.h @@ -441,6 +441,20 @@ namespace Poppler { static Document *load(const QString & filePath, const QByteArray &ownerPassword=QByteArray(), const QByteArray &userPassword=QByteArray()); + + /** + Load the document from memory + + \param fileContents the file contents. They are copied so there is no need + to keep the byte array around for the full life time of + the document. + + \warning The application owns the pointer to Document, and this should + be deleted when no longer required. + */ + static Document *loadFromData(const QByteArray &fileContents, + const QByteArray &ownerPassword=QByteArray(), + const QByteArray &userPassword=QByteArray()); /** Get a specified Page @@ -721,7 +735,9 @@ height = dummy.height(); private: DocumentData *m_doc; + Document(DocumentData *dataA); + static Document *checkDocument(DocumentData *doc); }; /** |