diff --git a/src/internfile/Filter.h b/src/internfile/Filter.h index 4ed70a1b..328a1d29 100644 --- a/src/internfile/Filter.h +++ b/src/internfile/Filter.h @@ -21,6 +21,8 @@ #include #include +class RclConfig; + namespace Dijon { class Filter; @@ -54,7 +56,7 @@ namespace Dijon Filter(const std::string &mime_type) : m_mimeType(mime_type) {} /// Destroys the filter. virtual ~Filter() {} - + virtual void setConfig(RclConfig *) = 0; // Enumerations. diff --git a/src/internfile/mimehandler.cpp b/src/internfile/mimehandler.cpp index fda87fc0..61a9d514 100644 --- a/src/internfile/mimehandler.cpp +++ b/src/internfile/mimehandler.cpp @@ -315,6 +315,10 @@ Dijon::Filter *getMimeHandler(const string &mtype, RclConfig *cfg, out: if (h) { h->set_property(Dijon::Filter::DEFAULT_CHARSET, cfg->getDefCharset()); + // In multithread context, and in case this handler is out + // from the cache, it may have a config pointer belonging to + // another thread. Fix it. + h->setConfig(cfg); } return h; } diff --git a/src/internfile/mimehandler.h b/src/internfile/mimehandler.h index 4124f587..03ec039e 100644 --- a/src/internfile/mimehandler.h +++ b/src/internfile/mimehandler.h @@ -36,6 +36,10 @@ public: m_forPreview(false), m_havedoc(false) {} virtual ~RecollFilter() {} + virtual void setConfig(RclConfig *config) + { + m_config = config; + } virtual bool set_property(Properties p, const string &v) { switch (p) { case DJF_UDI: