/* Copyright (C) 2017-2019 J.F.Dockes * * License: GPL 2.1 * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ #include #include #include #include #include using namespace std; #include "log.h" #include "rclinit.h" #include "rclconfig.h" #include "cstr.h" void showFields(RclConfig *config) { set stored = config->getStoredFields(); set indexed = config->getIndexedFields(); cout << "Stored fields: "; for (const auto& field: stored) { cout << "[" << field << "] "; } cout << "\n"; cout << "Indexed fields: "; for (const auto& field : indexed) { const FieldTraits *ftp; config->getFieldTraits(field, &ftp); if (ftp) cout << "[" << field << "]" << " -> [" << ftp->pfx << "] "; else cout << "[" << field << "]" << " -> [" << "(none)" << "] "; } cout << "\n"; } void checkMtypesConsistency(RclConfig *config) { // Checking the configuration consistency // Find and display category names vector catnames; config->getMimeCategories(catnames); cout << "Categories: "; for (const auto& catg : catnames) { cout << catg << " "; } cout << "\n"; // Compute union of all types from each category. Check that there // are no duplicates while we are at it. set allmtsfromcats; for (const auto& catg : catnames) { vector cts; config->getMimeCatTypes(catg, cts); for (const auto& cattype : cts) { // Already in map -> duplicate if (allmtsfromcats.find(cattype) != allmtsfromcats.end()) { cout << "Duplicate: [" << cattype << "]" << "\n"; } allmtsfromcats.insert(cattype); } } // Retrieve complete list of mime types vector mtypes = config->getAllMimeTypes(); // And check that each mime type is found in exactly one category // And have an icon for (const auto& mtype: mtypes) { if (allmtsfromcats.find(mtype) == allmtsfromcats.end()) { cout << "Not found in catgs: [" << mtype << "]" << "\n"; } // We'd like to check for types with no icons, but // getMimeIconPath() returns the valid 'document' by // default, we'd have to go look into the confsimple // directly. // string path = config->getMimeIconPath(mtype, string()); // cout << mtype << " -> " << path << "\n"; } // List mime types not in mimeview for (const auto & mtype : mtypes) { if (config->getMimeViewerDef(mtype, "", false).empty()) { cout << "No viewer: [" << mtype << "]" << "\n"; } } // Check that each mime type has an indexer for (const auto & mtype : mtypes) { if (config->getMimeHandlerDef(mtype, false).empty()) { cout << "No filter: [" << mtype << "]" << "\n"; } } // Check that each mime type has a defined icon for (const auto & mtype : mtypes) { if (config->getMimeIconPath(mtype, "") == "document") { cout << "No or generic icon: [" << mtype << "]" << "\n"; } } } static char *thisprog; static char usage [] = "\n" " -h : print help\n" "-c: check a few things in the configuration files\n" "[-s subkey] -q param : query parameter value\n" "-f : print some field data\n" "-l : list recoll.conf parameters\n" " : default: nothing\n" ; static void Usage(FILE *fp = stderr) { fprintf(fp, "%s: usage: %s\n", thisprog, usage); exit(1); } static int op_flags; #define OPT_MOINS 0x1 #define OPT_s 0x2 #define OPT_q 0x4 #define OPT_c 0x8 #define OPT_f 0x10 #define OPT_l 0x20 #define OPT_h 0x40 int main(int argc, char **argv) { string pname, skey; thisprog = argv[0]; argc--; argv++; while (argc > 0 && **argv == '-') { (*argv)++; if (!(**argv)) /* Cas du "adb - core" */ Usage(); while (**argv) switch (*(*argv)++) { case 'c': op_flags |= OPT_c; break; case 'f': op_flags |= OPT_f; break; case 'h': op_flags |= OPT_h; Usage(stdout); break; case 'l': op_flags |= OPT_l; break; case 's': op_flags |= OPT_s; if (argc < 2) Usage(); skey = *(++argv); argc--; goto b1; case 'q': op_flags |= OPT_q; if (argc < 2) Usage(); pname = *(++argv); argc--; goto b1; default: Usage(); break; } b1: argc--; argv++; } if (argc != 0) Usage(); string reason; RclConfig *config = recollinit(0, 0, 0, reason); if (config == 0 || !config->ok()) { cerr << "Configuration problem: " << reason << "\n"; exit(1); } if (op_flags & OPT_s) config->setKeyDir(skey); if (op_flags & OPT_q) { string value; if (!config->getConfParam(pname, value)) { fprintf(stderr, "getConfParam failed for [%s]\n", pname.c_str()); exit(1); } printf("[%s] -> [%s]\n", pname.c_str(), value.c_str()); } else if (op_flags & OPT_f) { showFields(config); } else if (op_flags & OPT_c) { checkMtypesConsistency(config); } else if (op_flags & OPT_l) { config->setKeyDir(cstr_null); vector names = config->getConfNames(); for (const auto& name : names) { string value; config->getConfParam(name, value); cout << name << " -> [" << value << "]" << "\n"; } } else if (1) { std::vector samples { "ebook-viewer %F;ignoreipath=1", "rclshowinfo %F %(title);ignoreipath=1", "xterm -u8 -e \"groff -T ascii -man %f | more\"", "xterm -e \"info -f %f\"", "\"C:/Program Files/Tracker Software/PDF Editor/PDFXEdit.exe\" /A " "\"page=%p;search=%s\" \"%f\"", "\"C:/Program Files/Tracker Software/PDF Editor/PDFXEdit.exe\" /A " "\"page=%p;search=\\\"%s\\\"\" \"%f\"", "\"C:/Program Files/Tracker Software/PDF Editor/PDFXEdit.exe\" /A " "\"page=%p;search=%s\" \"%f\"; someattr = somevalue;quotedattr = \"hello world\"", }; for (const auto& sample: samples) { string value; ConfSimple attrs; config->valueSplitAttributes(sample, value, attrs); std::cout << "Input: ["<< sample << "]\n"; std::cout << "Value: [" << value << "]\n"; std::cout << "Attrs: "; for (const auto& nm : attrs.getNames("")) { std::string attr; attrs.get(nm, attr); std::cout << "{[" << nm << "] -> [" << attr << "]} "; } std::cout << "\n\n"; } } return 0; }