Hi,

attached you can find a patch (and the Qt4 frontend work) for reading the 
Subtype entry in an embedded file stream dictionary (that represents the MIME 
type, fundamentally).

Should be pretty safe, but as we are approaching to the release, I felt to ask 
if I can add it.

Comments?

-- 
Pino Toscano
From 65a88a95a5c54c890048e8a986df361585d601dd Mon Sep 17 00:00:00 2001
From: Pino Toscano <[EMAIL PROTECTED]>
Date: Sat, 8 Mar 2008 03:11:36 +0100
Subject: [PATCH] Provide the mime type for an embedded file, if known.

Adapt the unit test for that.
---
 qt4/src/poppler-embeddedfile.cc |    5 +++++
 qt4/src/poppler-qt4.h           |    5 +++++
 qt4/tests/check_attachments.cpp |    7 +++++++
 3 files changed, 17 insertions(+), 0 deletions(-)

diff --git a/qt4/src/poppler-embeddedfile.cc b/qt4/src/poppler-embeddedfile.cc
index 5d7e8be..3eb2bcd 100644
--- a/qt4/src/poppler-embeddedfile.cc
+++ b/qt4/src/poppler-embeddedfile.cc
@@ -80,6 +80,11 @@ QByteArray EmbeddedFile::checksum() const
 	return QByteArray::fromRawData(goo_checksum->getCString(), goo_checksum->getLength());
 }
 
+QString EmbeddedFile::mimeType() const
+{
+	return QString(m_embeddedFile->embfile->mimeType()->getCString());
+}
+
 QByteArray EmbeddedFile::data()
 {
 	Object obj;
diff --git a/qt4/src/poppler-qt4.h b/qt4/src/poppler-qt4.h
index ca9ceef..726fd75 100644
--- a/qt4/src/poppler-qt4.h
+++ b/qt4/src/poppler-qt4.h
@@ -260,6 +260,11 @@ namespace Poppler {
 	QByteArray checksum() const;
 
 	/**
+	   The MIME type of the file, if known.
+	*/
+	QString mimeType() const;
+
+	/**
 	   The data as a byte array
 	*/
 	QByteArray data();
diff --git a/qt4/tests/check_attachments.cpp b/qt4/tests/check_attachments.cpp
index 7c4a697..2e02ec8 100644
--- a/qt4/tests/check_attachments.cpp
+++ b/qt4/tests/check_attachments.cpp
@@ -43,6 +43,7 @@ void TestAttachments::checkAttach1()
     QCOMPARE( embfile->description(), QString("/home/bradh/coding/svn-vers/KDE/kdeartwork/wallpapers/kroller.png") );
     QCOMPARE( embfile->createDate(), QDateTime( QDate(), QTime() ) );
     QCOMPARE( embfile->modDate(), QDateTime( QDate(), QTime() ) );
+    QCOMPARE( embfile->mimeType(), QString() );
 
     QFile file( "../../../test/unittestcases/kroller.png" );
     QVERIFY(  file.open( QIODevice::ReadOnly ) );
@@ -56,6 +57,7 @@ void TestAttachments::checkAttach1()
     QCOMPARE( embfile2->description(), QString("/usr/share/gnome-about/gnome-64.gif") );
     QCOMPARE( embfile2->modDate(), QDateTime( QDate(), QTime() ) );
     QCOMPARE( embfile2->createDate(), QDateTime( QDate(), QTime() ) );
+    QCOMPARE( embfile2->mimeType(), QString() );
 
     QFile file2( "../../../test/unittestcases/gnome-64.gif" );
     QVERIFY(  file2.open( QIODevice::ReadOnly ) );
@@ -85,18 +87,21 @@ void TestAttachments::checkAttach2()
     QCOMPARE( embfile1->description(), QString("Acro7 Thoughts") );
     QCOMPARE( embfile1->createDate(), QDateTime( QDate( 2003, 8, 4 ), QTime( 13, 54, 54), Qt::UTC ) );
     QCOMPARE( embfile1->modDate(), QDateTime( QDate( 2003, 8, 4 ), QTime( 14, 15, 27), Qt::UTC ) );
+    QCOMPARE( embfile1->mimeType(), QString("text/xml") );
 
     Poppler::EmbeddedFile *embfile2 = fileList.at(1);
     QCOMPARE( embfile2->name(), QString("acro transitions 1.xls") );
     QCOMPARE( embfile2->description(), QString("AcroTransitions") );
     QCOMPARE( embfile2->createDate(), QDateTime( QDate( 2003, 7, 18 ), QTime( 21, 7, 16), Qt::UTC ) );
     QCOMPARE( embfile2->modDate(), QDateTime( QDate( 2003, 7, 22 ), QTime( 13, 4, 40), Qt::UTC ) );
+    QCOMPARE( embfile2->mimeType(), QString("application/excel") );
 
     Poppler::EmbeddedFile *embfile3 = fileList.at(2);
     QCOMPARE( embfile3->name(), QString("apago_pdfe_wide.gif") );
     QCOMPARE( embfile3->description(), QString("PDFE Animation") );
     QCOMPARE( embfile3->createDate(), QDateTime( QDate( 2003, 1, 31 ), QTime( 15, 54, 29), Qt::UTC ) );
     QCOMPARE( embfile3->modDate(), QDateTime( QDate( 2003, 1, 31 ), QTime( 15, 52, 58), Qt::UTC ) );
+    QCOMPARE( embfile3->mimeType(), QString() );
 
     delete doc;
 }
@@ -119,6 +124,7 @@ void TestAttachments::checkAttach3()
     QCOMPARE( embfile->description(), QString("encrypted version of document") );
     QCOMPARE( embfile->createDate(), QDateTime( QDate( 2004, 3, 29 ), QTime( 19, 37, 16), Qt::UTC ) );
     QCOMPARE( embfile->modDate(), QDateTime( QDate( 2004, 3, 29 ), QTime( 19, 37, 16), Qt::UTC ) );
+    QCOMPARE( embfile->mimeType(), QString() );
     delete doc;
 
 }
@@ -141,6 +147,7 @@ void TestAttachments::checkAttach4()
     QCOMPARE( embfile->description(), QString("Altona Export") );
     QCOMPARE( embfile->createDate(), QDateTime( QDate( 2005, 8, 30 ), QTime( 20, 49, 35), Qt::UTC ) );
     QCOMPARE( embfile->modDate(), QDateTime( QDate( 2005, 8, 30 ), QTime( 20, 49, 52), Qt::UTC ) );
+    QCOMPARE( embfile->mimeType(), QString("application/vnd.ms-excel") );
     delete doc;
 
 }
-- 
1.5.4.3

From 23da27a229c8b3cc2a0a0dd6354c40723934390c Mon Sep 17 00:00:00 2001
From: Pino Toscano <[EMAIL PROTECTED]>
Date: Sat, 8 Mar 2008 03:10:58 +0100
Subject: [PATCH] Optionally read the mimetype for the embedded files.

---
 poppler/Catalog.cc |   17 +++++++++--------
 poppler/Catalog.h  |    7 ++++++-
 2 files changed, 15 insertions(+), 9 deletions(-)

diff --git a/poppler/Catalog.cc b/poppler/Catalog.cc
index 0a6b005..ea786c5 100644
--- a/poppler/Catalog.cc
+++ b/poppler/Catalog.cc
@@ -396,6 +396,7 @@ EmbFile *Catalog::embeddedFile(int i)
     GooString *createDate = new GooString();
     GooString *modDate = new GooString();
     GooString *checksum = new GooString();
+    GooString *mimetype = new GooString();
     Stream *efStream = NULL;
     int size = -1;
     if (obj.isRef()) {
@@ -436,13 +437,13 @@ EmbFile *Catalog::embeddedFile(int i)
 		// dataDict corresponds to Table 3.41 in the PDF1.6 spec.
 		Dict *dataDict = efStream->getDict();
 
-		// subtype is normally mimetype. You can extract it with code like this:
-		// Object subtypeName;
-		// dataDict->lookup( "Subtype", &subtypeName );
-		// It is optional, so this will sometimes return a null object
-		// if (subtypeName.isName()) {
-		//        std::cout << "got subtype name: " << subtypeName.getName() << std::endl;
-		// }
+		// subtype is normally the mimetype
+		Object subtypeName;
+		if (dataDict->lookup("Subtype", &subtypeName)->isName()) {
+		    delete mimetype;
+		    mimetype = new GooString(subtypeName.getName());
+		}
+		subtypeName.free();
 
 		// paramDict corresponds to Table 3.42 in the PDF1.6 spec
 		Object paramDict;
@@ -478,7 +479,7 @@ EmbFile *Catalog::embeddedFile(int i)
 	    obj2.free();
 	}
     }
-    EmbFile *embeddedFile = new EmbFile(fileName, desc, size, createDate, modDate, checksum, strObj);
+    EmbFile *embeddedFile = new EmbFile(fileName, desc, size, createDate, modDate, checksum, mimetype, strObj);
     strObj.free();
     return embeddedFile;
 }
diff --git a/poppler/Catalog.h b/poppler/Catalog.h
index 5b6e166..97fa08d 100644
--- a/poppler/Catalog.h
+++ b/poppler/Catalog.h
@@ -65,13 +65,15 @@ public:
 	  int size,
 	  GooString *createDate,
 	  GooString *modDate, GooString *checksum,
+	  GooString *mimetype,
 	  Object objStr) :
     m_name(name),
     m_description(description),
     m_size(size),
     m_createDate(createDate),
     m_modDate(modDate),
-    m_checksum(checksum)
+    m_checksum(checksum),
+    m_mimetype(mimetype)
   {
     objStr.copy(&m_objStr);
   }
@@ -83,6 +85,7 @@ public:
     delete m_modDate;
     delete m_createDate;
     delete m_checksum;
+    delete m_mimetype;
     m_objStr.free();
   }
 
@@ -92,6 +95,7 @@ public:
   GooString *modDate() { return m_modDate; }
   GooString *createDate() { return m_createDate; }
   GooString *checksum() { return m_checksum; }
+  GooString *mimeType() { return m_mimetype; }
   Object &streamObject() { return m_objStr; }
 
 private:
@@ -101,6 +105,7 @@ private:
   GooString *m_createDate;
   GooString *m_modDate;
   GooString *m_checksum;
+  GooString *m_mimetype;
   Object m_objStr;
 };
 
-- 
1.5.4.3

Attachment: signature.asc
Description: This is a digitally signed message part.

_______________________________________________
poppler mailing list
[email protected]
http://lists.freedesktop.org/mailman/listinfo/poppler

Reply via email to