Switch to side-by-side view

--- a/src/internfile/internfile.cpp
+++ b/src/internfile/internfile.cpp
@@ -201,9 +201,9 @@
 {
     m_fn = f;
 
-    // This is used by filters which manage some kind of cache.
-    // Indexing by udi makes things easier (because they sometimes get a temp 
-    // as input
+    // Compute udi for the input file. This is used by filters which
+    // manage some kind of cache.  Indexing by udi makes things easier
+    // because they sometimes get a temp as actual input.
     string udi;
     make_udi(f, cstr_null, udi);
 
@@ -216,7 +216,9 @@
     // In general, even when the input mime type is set (when
     // previewing), we can't use it: it's the type for the actual
     // document, but this can be part of a compound document, and
-    // we're dealing with the top level file here.
+    // we're dealing with the top level file here, or this could be a
+    // compressed file. The flag tells us we really can use it
+    // (e.g. the beagle indexer sets it).
     if (flags & FIF_doUseInputMimetype) {
         if (!imime) {
             LOGERR(("FileInterner:: told to use null imime\n"));
@@ -227,8 +229,7 @@
         LOGDEB(("FileInterner:: [%s] mime [%s] preview %d\n", 
                 f.c_str(), imime?imime->c_str() : "(null)", m_forPreview));
 
-        // We need to run mime type identification in any case to check
-        // for a compressed file.
+        // Run mime type identification in any case (see comment above).
         l_mime = mimetype(m_fn, stp, m_cfg, usfci);
 
         // If identification fails, try to use the input parameter. This
@@ -344,22 +345,21 @@
     df->set_property(Dijon::Filter::OPERATING_MODE, 
 			    m_forPreview ? "view" : "index");
 
-    bool setres = false;
+    bool result = false;
     df->set_docsize(data.length());
     if (df->is_data_input_ok(Dijon::Filter::DOCUMENT_STRING)) {
-	setres = df->set_document_string(data);
+	result = df->set_document_string(data);
     } else if (df->is_data_input_ok(Dijon::Filter::DOCUMENT_DATA)) {
-	setres = df->set_document_data(data.c_str(), data.length());
+	result = df->set_document_data(data.c_str(), data.length());
     } else if (df->is_data_input_ok(Dijon::Filter::DOCUMENT_FILE_NAME)) {
-	string filename;
-	if (dataToTempFile(data, m_mimetype, filename)) {
-	    if (!(setres=df->set_document_file(filename))) {
-		m_tmpflgs[0] = false;
-		m_tempfiles.pop_back();
-	    }
-	}
-    }
-    if (!setres) {
+	TempFile temp = dataToTempFile(data, m_mimetype);
+	if (temp.isNotNull() && 
+	    (result = df->set_document_file(temp->filename()))) {
+	    m_tmpflgs[m_handlers.size()] = true;
+	    m_tempfiles.push_back(temp);
+	}
+    }
+    if (!result) {
 	LOGINFO(("FileInterner:: set_doc failed inside for mtype %s\n", 
                  m_mimetype.c_str()));
 	delete df;
@@ -436,38 +436,30 @@
 // Create a temporary file for a block of data (ie: attachment) found
 // while walking the internal document tree, with a type for which the
 // handler needs an actual file (ie : external script).
-bool FileInterner::dataToTempFile(const string& dt, const string& mt, 
-				  string& fn)
-{
-    // Find appropriate suffix for mime type
+TempFile FileInterner::dataToTempFile(const string& dt, const string& mt)
+{
+    // Create temp file with appropriate suffix for mime type
     TempFile temp(new TempFileInternal(m_cfg->getSuffixFromMimeType(mt)));
-    if (temp->ok()) {
-        // We are called before the handler is actually on the stack, so the
-        // index is m_handlers.size(). m_tmpflgs is a static array, so this is
-        // no problem
-	m_tmpflgs[m_handlers.size()] = true;
-	m_tempfiles.push_back(temp);
-    } else {
+    if (!temp->ok()) {
 	LOGERR(("FileInterner::dataToTempFile: cant create tempfile: %s\n",
 		temp->getreason().c_str()));
-	return false;
+	return TempFile();
     }
 
     int fd = open(temp->filename(), O_WRONLY);
     if (fd < 0) {
 	LOGERR(("FileInterner::dataToTempFile: open(%s) failed errno %d\n",
 		temp->filename(), errno));
-	return false;
+	return TempFile();
     }
     if (write(fd, dt.c_str(), dt.length()) != (int)dt.length()) {
 	close(fd);
 	LOGERR(("FileInterner::dataToTempFile: write to %s failed errno %d\n",
 		temp->filename(), errno));
-	return false;
+	return TempFile();
     }
     close(fd);
-    fn = temp->filename();
-    return true;
+    return temp;
 }
 
 // See if the error string is formatted as a missing helper message,
@@ -707,7 +699,7 @@
 {
     if (m_handlers.empty())
 	return;
-    int i = m_handlers.size()-1;
+    int i = m_handlers.size() - 1;
     if (m_tmpflgs[i]) {
 	m_tempfiles.pop_back();
 	m_tmpflgs[i] = false;
@@ -777,18 +769,16 @@
     } else if (newflt->is_data_input_ok(Dijon::Filter::DOCUMENT_DATA)) {
 	setres = newflt->set_document_data(txt->c_str(), txt->length());
     } else if (newflt->is_data_input_ok(Dijon::Filter::DOCUMENT_FILE_NAME)) {
-	string filename;
-	if (dataToTempFile(*txt, mimetype, filename)) {
-	    if (!(setres = newflt->set_document_file(filename))) {
-		m_tmpflgs[m_handlers.size()] = false;
-		m_tempfiles.pop_back();
-	    } else {
-		// Hack here, but really helps perfs: if we happen to
-		// create a temp file for, ie, an image attachment,
-		// keep it around for preview reuse
-		if (!mimetype.compare(0, 6, "image/")) {
-		    m_imgtmp = m_tempfiles.back();
-		}
+	TempFile temp = dataToTempFile(*txt, mimetype);
+	if (temp.isNotNull() && 
+	    (setres = newflt->set_document_file(temp->filename()))) {
+	    m_tmpflgs[m_handlers.size()] = true;
+	    m_tempfiles.push_back(temp);
+	    // Hack here, but really helps perfs: if we happen to
+	    // create a temp file for, ie, an image attachment, keep
+	    // it around for preview to use it through get_imgtmp()
+	    if (!mimetype.compare(0, 6, "image/")) {
+		m_imgtmp = m_tempfiles.back();
 	    }
 	}
     }