mimehandler: tabs change only
This commit is contained in:
parent
83e29a9b01
commit
1b59790b02
@ -68,17 +68,17 @@ static RecollFilter *getMimeHandlerFromCache(const string& key)
|
|||||||
|
|
||||||
multimap<string, RecollFilter *>::iterator it = o_handlers.find(key);
|
multimap<string, RecollFilter *>::iterator it = o_handlers.find(key);
|
||||||
if (it != o_handlers.end()) {
|
if (it != o_handlers.end()) {
|
||||||
RecollFilter *h = it->second;
|
RecollFilter *h = it->second;
|
||||||
hlruit_tp it1 = find(o_hlru.begin(), o_hlru.end(), it);
|
hlruit_tp it1 = find(o_hlru.begin(), o_hlru.end(), it);
|
||||||
if (it1 != o_hlru.end()) {
|
if (it1 != o_hlru.end()) {
|
||||||
o_hlru.erase(it1);
|
o_hlru.erase(it1);
|
||||||
} else {
|
} else {
|
||||||
LOGERR("getMimeHandlerFromCache: lru position not found\n");
|
LOGERR("getMimeHandlerFromCache: lru position not found\n");
|
||||||
}
|
}
|
||||||
o_handlers.erase(it);
|
o_handlers.erase(it);
|
||||||
LOGDEB("getMimeHandlerFromCache: " << xdigest << " found size " <<
|
LOGDEB("getMimeHandlerFromCache: " << xdigest << " found size " <<
|
||||||
o_handlers.size() << "\n");
|
o_handlers.size() << "\n");
|
||||||
return h;
|
return h;
|
||||||
}
|
}
|
||||||
LOGDEB("getMimeHandlerFromCache: " << xdigest << " not found\n");
|
LOGDEB("getMimeHandlerFromCache: " << xdigest << " not found\n");
|
||||||
return 0;
|
return 0;
|
||||||
@ -90,8 +90,8 @@ void returnMimeHandler(RecollFilter *handler)
|
|||||||
typedef multimap<string, RecollFilter*>::value_type value_type;
|
typedef multimap<string, RecollFilter*>::value_type value_type;
|
||||||
|
|
||||||
if (handler == 0) {
|
if (handler == 0) {
|
||||||
LOGERR("returnMimeHandler: bad parameter\n");
|
LOGERR("returnMimeHandler: bad parameter\n");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
handler->clear();
|
handler->clear();
|
||||||
|
|
||||||
@ -108,20 +108,20 @@ void returnMimeHandler(RecollFilter *handler)
|
|||||||
// are processing the same mime type at the same time.
|
// are processing the same mime type at the same time.
|
||||||
multimap<string, RecollFilter *>::iterator it;
|
multimap<string, RecollFilter *>::iterator it;
|
||||||
if (o_handlers.size() >= max_handlers_cache_size) {
|
if (o_handlers.size() >= max_handlers_cache_size) {
|
||||||
static int once = 1;
|
static int once = 1;
|
||||||
if (once) {
|
if (once) {
|
||||||
once = 0;
|
once = 0;
|
||||||
for (it = o_handlers.begin(); it != o_handlers.end(); it++) {
|
for (it = o_handlers.begin(); it != o_handlers.end(); it++) {
|
||||||
LOGDEB1("Cache full. key: " << it->first << "\n");
|
LOGDEB1("Cache full. key: " << it->first << "\n");
|
||||||
}
|
}
|
||||||
LOGDEB1("Cache LRU size: " << o_hlru.size() << "\n");
|
LOGDEB1("Cache LRU size: " << o_hlru.size() << "\n");
|
||||||
}
|
}
|
||||||
if (o_hlru.size() > 0) {
|
if (o_hlru.size() > 0) {
|
||||||
it = o_hlru.back();
|
it = o_hlru.back();
|
||||||
o_hlru.pop_back();
|
o_hlru.pop_back();
|
||||||
delete it->second;
|
delete it->second;
|
||||||
o_handlers.erase(it);
|
o_handlers.erase(it);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
it = o_handlers.insert(value_type(handler->get_id(), handler));
|
it = o_handlers.insert(value_type(handler->get_id(), handler));
|
||||||
o_hlru.push_front(it);
|
o_hlru.push_front(it);
|
||||||
@ -133,7 +133,7 @@ void clearMimeHandlerCache()
|
|||||||
multimap<string, RecollFilter *>::iterator it;
|
multimap<string, RecollFilter *>::iterator it;
|
||||||
std::unique_lock<std::mutex> locker(o_handlers_mutex);
|
std::unique_lock<std::mutex> locker(o_handlers_mutex);
|
||||||
for (it = o_handlers.begin(); it != o_handlers.end(); it++) {
|
for (it = o_handlers.begin(); it != o_handlers.end(); it++) {
|
||||||
delete it->second;
|
delete it->second;
|
||||||
}
|
}
|
||||||
o_handlers.clear();
|
o_handlers.clear();
|
||||||
TempFile::tryRemoveAgain();
|
TempFile::tryRemoveAgain();
|
||||||
@ -142,7 +142,7 @@ void clearMimeHandlerCache()
|
|||||||
/** For mime types set as "internal" in mimeconf:
|
/** For mime types set as "internal" in mimeconf:
|
||||||
* create appropriate handler object. */
|
* create appropriate handler object. */
|
||||||
static RecollFilter *mhFactory(RclConfig *config, const string &mimeOrParams,
|
static RecollFilter *mhFactory(RclConfig *config, const string &mimeOrParams,
|
||||||
bool nobuild, string& id)
|
bool nobuild, string& id)
|
||||||
{
|
{
|
||||||
LOGDEB1("mhFactory(" << mimeOrParams << ")\n");
|
LOGDEB1("mhFactory(" << mimeOrParams << ")\n");
|
||||||
vector<string> lparams;
|
vector<string> lparams;
|
||||||
@ -154,50 +154,50 @@ static RecollFilter *mhFactory(RclConfig *config, const string &mimeOrParams,
|
|||||||
string lmime(lparams[0]);
|
string lmime(lparams[0]);
|
||||||
stringtolower(lmime);
|
stringtolower(lmime);
|
||||||
if (cstr_textplain == lmime) {
|
if (cstr_textplain == lmime) {
|
||||||
LOGDEB2("mhFactory(" << mime << "): returning MimeHandlerText\n");
|
LOGDEB2("mhFactory(" << mime << "): returning MimeHandlerText\n");
|
||||||
MD5String("MimeHandlerText", id);
|
MD5String("MimeHandlerText", id);
|
||||||
return nobuild ? 0 : new MimeHandlerText(config, id);
|
return nobuild ? 0 : new MimeHandlerText(config, id);
|
||||||
} else if (cstr_texthtml == lmime) {
|
} else if (cstr_texthtml == lmime) {
|
||||||
LOGDEB2("mhFactory(" << mime << "): returning MimeHandlerHtml\n");
|
LOGDEB2("mhFactory(" << mime << "): returning MimeHandlerHtml\n");
|
||||||
MD5String("MimeHandlerHtml", id);
|
MD5String("MimeHandlerHtml", id);
|
||||||
return nobuild ? 0 : new MimeHandlerHtml(config, id);
|
return nobuild ? 0 : new MimeHandlerHtml(config, id);
|
||||||
} else if ("text/x-mail" == lmime) {
|
} else if ("text/x-mail" == lmime) {
|
||||||
LOGDEB2("mhFactory(" << mime << "): returning MimeHandlerMbox\n");
|
LOGDEB2("mhFactory(" << mime << "): returning MimeHandlerMbox\n");
|
||||||
MD5String("MimeHandlerMbox", id);
|
MD5String("MimeHandlerMbox", id);
|
||||||
return nobuild ? 0 : new MimeHandlerMbox(config, id);
|
return nobuild ? 0 : new MimeHandlerMbox(config, id);
|
||||||
} else if ("message/rfc822" == lmime) {
|
} else if ("message/rfc822" == lmime) {
|
||||||
LOGDEB2("mhFactory(" << mime << "): returning MimeHandlerMail\n");
|
LOGDEB2("mhFactory(" << mime << "): returning MimeHandlerMail\n");
|
||||||
MD5String("MimeHandlerMail", id);
|
MD5String("MimeHandlerMail", id);
|
||||||
return nobuild ? 0 : new MimeHandlerMail(config, id);
|
return nobuild ? 0 : new MimeHandlerMail(config, id);
|
||||||
} else if ("inode/symlink" == lmime) {
|
} else if ("inode/symlink" == lmime) {
|
||||||
LOGDEB2("mhFactory(" << mime << "): returning MimeHandlerSymlink\n");
|
LOGDEB2("mhFactory(" << mime << "): returning MimeHandlerSymlink\n");
|
||||||
MD5String("MimeHandlerSymlink", id);
|
MD5String("MimeHandlerSymlink", id);
|
||||||
return nobuild ? 0 : new MimeHandlerSymlink(config, id);
|
return nobuild ? 0 : new MimeHandlerSymlink(config, id);
|
||||||
} else if ("application/x-zerosize" == lmime) {
|
} else if ("application/x-zerosize" == lmime) {
|
||||||
LOGDEB("mhFactory(" << lmime << "): returning MimeHandlerNull\n");
|
LOGDEB("mhFactory(" << lmime << "): returning MimeHandlerNull\n");
|
||||||
MD5String("MimeHandlerNull", id);
|
MD5String("MimeHandlerNull", id);
|
||||||
return nobuild ? 0 : new MimeHandlerNull(config, id);
|
return nobuild ? 0 : new MimeHandlerNull(config, id);
|
||||||
} else if (lmime.find("text/") == 0) {
|
} else if (lmime.find("text/") == 0) {
|
||||||
// Try to handle unknown text/xx as text/plain. This
|
// Try to handle unknown text/xx as text/plain. This
|
||||||
// only happen if the text/xx was defined as "internal" in
|
// only happen if the text/xx was defined as "internal" in
|
||||||
// mimeconf, not at random. For programs, for example this
|
// mimeconf, not at random. For programs, for example this
|
||||||
// allows indexing and previewing as text/plain (no filter
|
// allows indexing and previewing as text/plain (no filter
|
||||||
// exec) but still opening with a specific editor.
|
// exec) but still opening with a specific editor.
|
||||||
LOGDEB2("mhFactory(" << mime << "): returning MimeHandlerText(x)\n");
|
LOGDEB2("mhFactory(" << mime << "): returning MimeHandlerText(x)\n");
|
||||||
MD5String("MimeHandlerText", id);
|
MD5String("MimeHandlerText", id);
|
||||||
return nobuild ? 0 : new MimeHandlerText(config, id);
|
return nobuild ? 0 : new MimeHandlerText(config, id);
|
||||||
} else if ("xsltproc" == lmime) {
|
} else if ("xsltproc" == lmime) {
|
||||||
// XML Types processed with one or several xslt style sheets.
|
// XML Types processed with one or several xslt style sheets.
|
||||||
MD5String(mimeOrParams, id);
|
MD5String(mimeOrParams, id);
|
||||||
return nobuild ? 0 : new MimeHandlerXslt(config, id, lparams);
|
return nobuild ? 0 : new MimeHandlerXslt(config, id, lparams);
|
||||||
} else {
|
} else {
|
||||||
// We should not get there. It means that "internal" was set
|
// We should not get there. It means that "internal" was set
|
||||||
// as a handler in mimeconf for a mime type we actually can't
|
// as a handler in mimeconf for a mime type we actually can't
|
||||||
// handle.
|
// handle.
|
||||||
LOGERR("mhFactory: mime type [" << lmime <<
|
LOGERR("mhFactory: mime type [" << lmime <<
|
||||||
"] set as internal but unknown\n");
|
"] set as internal but unknown\n");
|
||||||
MD5String("MimeHandlerUnknown", id);
|
MD5String("MimeHandlerUnknown", id);
|
||||||
return nobuild ? 0 : new MimeHandlerUnknown(config, id);
|
return nobuild ? 0 : new MimeHandlerUnknown(config, id);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -218,7 +218,7 @@ MimeHandlerExec *mhExecFactory(RclConfig *cfg, const string& mtype, string& hs,
|
|||||||
string cmdstr;
|
string cmdstr;
|
||||||
|
|
||||||
if (!cfg->valueSplitAttributes(hs, cmdstr, attrs)) {
|
if (!cfg->valueSplitAttributes(hs, cmdstr, attrs)) {
|
||||||
LOGERR("mhExecFactory: bad config line for [" <<
|
LOGERR("mhExecFactory: bad config line for [" <<
|
||||||
mtype << "]: [" << hs << "]\n");
|
mtype << "]: [" << hs << "]\n");
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@ -227,12 +227,12 @@ MimeHandlerExec *mhExecFactory(RclConfig *cfg, const string& mtype, string& hs,
|
|||||||
vector<string> cmdtoks;
|
vector<string> cmdtoks;
|
||||||
stringToStrings(cmdstr, cmdtoks);
|
stringToStrings(cmdstr, cmdtoks);
|
||||||
if (cmdtoks.empty()) {
|
if (cmdtoks.empty()) {
|
||||||
LOGERR("mhExecFactory: bad config line for [" << mtype <<
|
LOGERR("mhExecFactory: bad config line for [" << mtype <<
|
||||||
"]: [" << hs << "]\n");
|
"]: [" << hs << "]\n");
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
MimeHandlerExec *h = multiple ?
|
MimeHandlerExec *h = multiple ?
|
||||||
new MimeHandlerExecMultiple(cfg, id) :
|
new MimeHandlerExecMultiple(cfg, id) :
|
||||||
new MimeHandlerExec(cfg, id);
|
new MimeHandlerExec(cfg, id);
|
||||||
vector<string>::iterator it = cmdtoks.begin();
|
vector<string>::iterator it = cmdtoks.begin();
|
||||||
|
|
||||||
@ -264,7 +264,7 @@ MimeHandlerExec *mhExecFactory(RclConfig *cfg, const string& mtype, string& hs,
|
|||||||
#if 0
|
#if 0
|
||||||
string scmd;
|
string scmd;
|
||||||
for (it = h->params.begin(); it != h->params.end(); it++) {
|
for (it = h->params.begin(); it != h->params.end(); it++) {
|
||||||
scmd += string("[") + *it + "] ";
|
scmd += string("[") + *it + "] ";
|
||||||
}
|
}
|
||||||
LOGDEB("mhExecFactory:mt [" << mtype << "] cfgmt [" <<
|
LOGDEB("mhExecFactory:mt [" << mtype << "] cfgmt [" <<
|
||||||
h->cfgFilterOutputMtype << "] cfgcs [" <<
|
h->cfgFilterOutputMtype << "] cfgcs [" <<
|
||||||
@ -293,83 +293,83 @@ RecollFilter *getMimeHandler(const string &mtype, RclConfig *cfg,
|
|||||||
string id;
|
string id;
|
||||||
|
|
||||||
if (!hs.empty()) {
|
if (!hs.empty()) {
|
||||||
// Got a handler definition line
|
// Got a handler definition line
|
||||||
// Break definition into type (internal/exec/execm)
|
// Break definition into type (internal/exec/execm)
|
||||||
// and name/command string
|
// and name/command string
|
||||||
string::size_type b1 = hs.find_first_of(" \t");
|
string::size_type b1 = hs.find_first_of(" \t");
|
||||||
string handlertype = hs.substr(0, b1);
|
string handlertype = hs.substr(0, b1);
|
||||||
string cmdstr;
|
string cmdstr;
|
||||||
if (b1 != string::npos) {
|
if (b1 != string::npos) {
|
||||||
cmdstr = hs.substr(b1);
|
cmdstr = hs.substr(b1);
|
||||||
trimstring(cmdstr);
|
trimstring(cmdstr);
|
||||||
}
|
}
|
||||||
bool internal = !stringlowercmp("internal", handlertype);
|
bool internal = !stringlowercmp("internal", handlertype);
|
||||||
if (internal) {
|
if (internal) {
|
||||||
// For internal types let the factory compute the cache id
|
// For internal types let the factory compute the cache id
|
||||||
mhFactory(cfg, cmdstr.empty() ? mtype : cmdstr, true, id);
|
mhFactory(cfg, cmdstr.empty() ? mtype : cmdstr, true, id);
|
||||||
} else {
|
} else {
|
||||||
// exec/execm: use the md5 of the def line
|
// exec/execm: use the md5 of the def line
|
||||||
MD5String(hs, id);
|
MD5String(hs, id);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Do we already have a handler object in the cache ?
|
// Do we already have a handler object in the cache ?
|
||||||
h = getMimeHandlerFromCache(id);
|
h = getMimeHandlerFromCache(id);
|
||||||
if (h != 0)
|
if (h != 0)
|
||||||
goto out;
|
goto out;
|
||||||
|
|
||||||
LOGDEB2("getMimeHandler: " << mtype << " not in cache\n");
|
LOGDEB2("getMimeHandler: " << mtype << " not in cache\n");
|
||||||
if (internal) {
|
if (internal) {
|
||||||
// If there is a parameter after "internal" it's the mime
|
// If there is a parameter after "internal" it's the mime
|
||||||
// type to use, or the further qualifier (e.g. style sheet
|
// type to use, or the further qualifier (e.g. style sheet
|
||||||
// name for xslt types). This is so that we can have bogus
|
// name for xslt types). This is so that we can have bogus
|
||||||
// mime types like text/x-purple-html-log (for ie:
|
// mime types like text/x-purple-html-log (for ie:
|
||||||
// specific icon) and still use the html filter on
|
// specific icon) and still use the html filter on
|
||||||
// them. This is partly redundant with the
|
// them. This is partly redundant with the
|
||||||
// localfields/rclaptg, but better? (and the latter will
|
// localfields/rclaptg, but better? (and the latter will
|
||||||
// probably go away at some point in the future?).
|
// probably go away at some point in the future?).
|
||||||
LOGDEB2("handlertype internal, cmdstr [" << cmdstr << "]\n");
|
LOGDEB2("handlertype internal, cmdstr [" << cmdstr << "]\n");
|
||||||
h = mhFactory(cfg, cmdstr.empty() ? mtype : cmdstr, false, id);
|
h = mhFactory(cfg, cmdstr.empty() ? mtype : cmdstr, false, id);
|
||||||
goto out;
|
goto out;
|
||||||
} else if (!stringlowercmp("dll", handlertype)) {
|
} else if (!stringlowercmp("dll", handlertype)) {
|
||||||
} else {
|
} else {
|
||||||
if (cmdstr.empty()) {
|
if (cmdstr.empty()) {
|
||||||
LOGERR("getMimeHandler: bad line for " << mtype << ": " <<
|
LOGERR("getMimeHandler: bad line for " << mtype << ": " <<
|
||||||
hs << "\n");
|
hs << "\n");
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
if (!stringlowercmp("exec", handlertype)) {
|
if (!stringlowercmp("exec", handlertype)) {
|
||||||
h = mhExecFactory(cfg, mtype, cmdstr, false, id);
|
h = mhExecFactory(cfg, mtype, cmdstr, false, id);
|
||||||
goto out;
|
goto out;
|
||||||
} else if (!stringlowercmp("execm", handlertype)) {
|
} else if (!stringlowercmp("execm", handlertype)) {
|
||||||
h = mhExecFactory(cfg, mtype, cmdstr, true, id);
|
h = mhExecFactory(cfg, mtype, cmdstr, true, id);
|
||||||
goto out;
|
goto out;
|
||||||
} else {
|
} else {
|
||||||
LOGERR("getMimeHandler: bad line for " << mtype << ": " <<
|
LOGERR("getMimeHandler: bad line for " << mtype << ": " <<
|
||||||
hs << "\n");
|
hs << "\n");
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
// No identified mime type, or no handler associated.
|
// No identified mime type, or no handler associated.
|
||||||
// Unhandled files are either ignored or their name and
|
// Unhandled files are either ignored or their name and
|
||||||
// generic metadata is indexed, depending on configuration
|
// generic metadata is indexed, depending on configuration
|
||||||
bool indexunknown = false;
|
bool indexunknown = false;
|
||||||
cfg->getConfParam("indexallfilenames", &indexunknown);
|
cfg->getConfParam("indexallfilenames", &indexunknown);
|
||||||
if (indexunknown) {
|
if (indexunknown) {
|
||||||
MD5String("MimeHandlerUnknown", id);
|
MD5String("MimeHandlerUnknown", id);
|
||||||
if ((h = getMimeHandlerFromCache(id)) == 0)
|
if ((h = getMimeHandlerFromCache(id)) == 0)
|
||||||
h = new MimeHandlerUnknown(cfg, id);
|
h = new MimeHandlerUnknown(cfg, id);
|
||||||
}
|
}
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
|
|
||||||
out:
|
out:
|
||||||
if (h) {
|
if (h) {
|
||||||
h->set_property(RecollFilter::DEFAULT_CHARSET, cfg->getDefCharset());
|
h->set_property(RecollFilter::DEFAULT_CHARSET, cfg->getDefCharset());
|
||||||
// In multithread context, and in case this handler is out
|
// In multithread context, and in case this handler is out
|
||||||
// from the cache, it may have a config pointer belonging to
|
// from the cache, it may have a config pointer belonging to
|
||||||
// another thread. Fix it.
|
// another thread. Fix it.
|
||||||
h->setConfig(cfg);
|
h->setConfig(cfg);
|
||||||
}
|
}
|
||||||
return h;
|
return h;
|
||||||
}
|
}
|
||||||
@ -378,10 +378,10 @@ out:
|
|||||||
bool canIntern(const std::string mtype, RclConfig *cfg)
|
bool canIntern(const std::string mtype, RclConfig *cfg)
|
||||||
{
|
{
|
||||||
if (mtype.empty())
|
if (mtype.empty())
|
||||||
return false;
|
return false;
|
||||||
string hs = cfg->getMimeHandlerDef(mtype);
|
string hs = cfg->getMimeHandlerDef(mtype);
|
||||||
if (hs.empty())
|
if (hs.empty())
|
||||||
return false;
|
return false;
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
/// Same, getting MIME from doc
|
/// Same, getting MIME from doc
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user