diff --git a/src/internfile/internfile.cpp b/src/internfile/internfile.cpp index 540bd0ab..9e3829b5 100644 --- a/src/internfile/internfile.cpp +++ b/src/internfile/internfile.cpp @@ -1,5 +1,5 @@ #ifndef lint -static char rcsid[] = "@(#$Id: internfile.cpp,v 1.42 2008-09-16 08:18:30 dockes Exp $ (C) 2004 J.F.Dockes"; +static char rcsid[] = "@(#$Id: internfile.cpp,v 1.43 2008-10-03 06:23:23 dockes Exp $ (C) 2004 J.F.Dockes"; #endif /* * This program is free software; you can redistribute it and/or modify @@ -42,10 +42,12 @@ using namespace std; #include "pathut.h" #include "wipedir.h" #include "rclconfig.h" +#include "mh_html.h" // The internal path element separator. This can't be the same as the rcldb // file to ipath separator : "|" static const string isep(":"); +static const string stxtplain("text/plain"); // This is used when the user wants to retrieve a search result doc's parent // (ie message having a given attachment) @@ -194,7 +196,7 @@ FileInterner::FileInterner(const std::string &f, const struct stat *stp, m_handlers.push_back(df); LOGDEB(("FileInterner::FileInterner: %s [%s]\n", l_mime.c_str(), m_fn.c_str())); - m_targetMType = "text/plain"; + m_targetMType = stxtplain; } FileInterner::~FileInterner() @@ -397,9 +399,13 @@ int FileInterner::addHandler() getKeyValue(docdata, keymt, mimetype); LOGDEB(("FileInterner::addHandler: next_doc is %s\n", mimetype.c_str())); + // If we find a document of the target type (text/plain in - // general), we're done decoding - if (!stringicmp(mimetype, m_targetMType)) { + // general), we're done decoding. If we hit text/plain, we're done + // in any case + if (!stringicmp(mimetype, m_targetMType) || + !stringicmp(mimetype, stxtplain)) { + m_reachedMType = mimetype; LOGDEB1(("FileInterner::addHandler: target reached\n")); return ADD_BREAK; } @@ -568,11 +574,25 @@ FileInterner::Status FileInterner::internfile(Rcl::Doc& doc, string& ipath) // of calls is important. if (!m_forPreview) collectIpathAndMT(doc, ipath); + else + doc.mimetype = m_reachedMType; + // Keep this AFTER collectIpathAndMT dijontorcl(doc); - // Possibly destack so that we can test for FIDone. + // Possibly destack so that we can test for FIDone. While doing this + // possibly set aside an ancestor html text (for the GUI preview) while (!m_handlers.empty() && !m_handlers.back()->has_documents()) { + LOGDEB(("FileInterner::internfile: dstck filter fpv %d tgt %s\n", + m_forPreview, m_targetMType.c_str())); + if (m_forPreview) { + LOGDEB(("FileInterner::internfile: Testing for html handler\n")); + MimeHandlerHtml *hth = + dynamic_cast(m_handlers.back()); + if (hth) { + m_html = hth->get_html(); + } + } popHandler(); } if (m_handlers.empty()) diff --git a/src/internfile/internfile.h b/src/internfile/internfile.h index c25e998e..ad7e9a5f 100644 --- a/src/internfile/internfile.h +++ b/src/internfile/internfile.h @@ -16,7 +16,7 @@ */ #ifndef _INTERNFILE_H_INCLUDED_ #define _INTERNFILE_H_INCLUDED_ -/* @(#$Id: internfile.h,v 1.18 2008-09-05 10:36:06 dockes Exp $ (C) 2004 J.F.Dockes */ +/* @(#$Id: internfile.h,v 1.19 2008-10-03 06:23:23 dockes Exp $ (C) 2004 J.F.Dockes */ #include #include @@ -90,7 +90,8 @@ class FileInterner { const string& getMimetype() {return m_mimetype;} /** We normally always return text/plain data. A caller can request - * that we stop conversion at the native document type (ie: text/html) + * that we stop conversion at the native document type (ie: extracting + * an email attachment and starting an external viewer) */ void setTargetMType(const string& tp) {m_targetMType = tp;} @@ -111,6 +112,7 @@ class FileInterner { const string& getReason() const {return m_reason;} const list& getMissingExternal(); void getMissingExternal(string& missing); + const string& get_html() {return m_html;} private: static const unsigned int MAXHANDLERS = 20; @@ -118,7 +120,9 @@ class FileInterner { string m_fn; string m_mimetype; // Mime type for [uncompressed] file bool m_forPreview; + string m_html; // Possibly set-aside html text for preview string m_targetMType; + string m_reachedMType; // target or text/plain // m_tdir and m_tfile are used only for decompressing input file if needed const string& m_tdir; string m_tfile;