Chris@2: /* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ Chris@5: /* Chris@5: Copyright (c) 2016 Queen Mary, University of London Chris@5: Chris@5: Permission is hereby granted, free of charge, to any person Chris@5: obtaining a copy of this software and associated documentation Chris@5: files (the "Software"), to deal in the Software without Chris@5: restriction, including without limitation the rights to use, copy, Chris@5: modify, merge, publish, distribute, sublicense, and/or sell copies Chris@5: of the Software, and to permit persons to whom the Software is Chris@5: furnished to do so, subject to the following conditions: Chris@5: Chris@5: The above copyright notice and this permission notice shall be Chris@5: included in all copies or substantial portions of the Software. Chris@5: Chris@5: THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, Chris@5: EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF Chris@5: MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND Chris@5: NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY Chris@5: CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF Chris@5: CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION Chris@5: WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. Chris@5: Chris@5: Except as contained in this notice, the names of the Centre for Chris@5: Digital Music and Queen Mary, University of London shall not be Chris@5: used in advertising or otherwise to promote the sale, use or other Chris@5: dealings in this Software without prior written authorization. Chris@5: */ Chris@2: Chris@2: #ifndef PLUGIN_CANDIDATES_H Chris@2: #define PLUGIN_CANDIDATES_H Chris@2: Chris@2: #include Chris@2: #include Chris@2: #include Chris@2: Chris@2: /** Chris@2: * Class to identify and list candidate shared-library files possibly Chris@2: * containing plugins. Uses a separate process (the "helper", whose Chris@2: * executable name must be provided at construction) to test-load each Chris@2: * library in order to winnow out any that fail to load or crash on Chris@2: * load. Chris@2: * Chris@2: * Requires C++11 and the Qt5 QtCore library. Chris@2: */ Chris@2: class PluginCandidates Chris@2: { Chris@2: typedef std::vector stringlist; Chris@6: Chris@2: public: Chris@2: /** Construct a PluginCandidates scanner that uses the given Chris@2: * executable as its load check helper. Chris@2: */ Chris@2: PluginCandidates(std::string helperExecutableName); Chris@2: Chris@6: struct LogCallback { Chris@6: virtual void log(std::string) = 0; Chris@6: }; Chris@6: Chris@6: /** Set a callback to be called for log output. Chris@6: */ Chris@6: void setLogCallback(LogCallback *cb); Chris@6: Chris@2: /** Scan the libraries found in the given plugin path (i.e. list Chris@2: * of plugin directories), checking that the given descriptor Chris@4: * symbol can be looked up in each. Store the results Chris@2: * internally, associated with the given (arbitrary) tag, for Chris@2: * later querying using getCandidateLibrariesFor() and Chris@2: * getFailedLibrariesFor(). Chris@2: * Chris@2: * Not thread-safe. Chris@2: */ Chris@2: void scan(std::string tag, Chris@2: stringlist pluginPath, Chris@4: std::string descriptorSymbolName); Chris@2: Chris@2: /** Return list of plugin library paths that were checked Chris@2: * successfully during the scan for the given tag. Chris@2: */ Chris@4: stringlist getCandidateLibrariesFor(std::string tag) const; Chris@2: Chris@2: struct FailureRec { Chris@2: std::string library; Chris@2: std::string message; Chris@2: }; Chris@2: Chris@2: /** Return list of failure reports arising from the prior scan for Chris@2: * the given tag. Chris@2: */ Chris@4: std::vector getFailedLibrariesFor(std::string tag) const; Chris@2: Chris@2: private: Chris@2: std::string m_helper; Chris@2: std::map m_candidates; Chris@2: std::map > m_failures; Chris@6: LogCallback *m_logCallback; Chris@2: Chris@2: stringlist getLibrariesInPath(stringlist path); Chris@2: stringlist runHelper(stringlist libraries, std::string descriptor); Chris@2: void recordResult(std::string tag, stringlist results); Chris@6: void log(std::string); Chris@2: }; Chris@2: Chris@2: #endif