bool Plugin::validatePluginLib(vpr::LibraryPtr pluginLib) { plugin::Module pm(pluginLib); AbstractPlugin::basicValidation(pm); const std::string get_version_func("getPluginInterfaceVersion"); boost::function<void (vpr::Uint32&, vpr::Uint32&)> version_func = pm.getFunction<void (vpr::Uint32&, vpr::Uint32&)>(get_version_func); vpr::Uint32 major_ver; vpr::Uint32 minor_ver; version_func(major_ver, minor_ver); if ( major_ver != VRKIT_PLUGIN_API_MAJOR ) { std::ostringstream msg_stream; msg_stream << "Interface version mismatch: run-time does not match " << "compile-time plug-in setting (" << VRKIT_PLUGIN_API_MAJOR << "." << VRKIT_PLUGIN_API_MINOR << " != " << major_ver << "." << minor_ver << ")"; throw PluginInterfaceException(msg_stream.str(), VRKIT_LOCATION); } return true; }
static int check_version(const char *lib_name, void *handle, const char *symbol, unsigned ver_inc) { ffmpeg_version_t version_func; unsigned ver_lib; const char *result_msgs[] = { "full match","major.minor matches","major matches","unsupported" }; enum { FULL_MATCH=0, MAJOR_MINOR_MATCH=1, MAJOR_MATCH=2, NO_MATCH=3 } result; version_func = (ffmpeg_version_t)vice_dynlib_symbol(handle, symbol); if (version_func == NULL) { log_debug("ffmpeg %s: version function '%s' not found!",lib_name, symbol); return -1; } ver_lib = version_func(); /* version matches exactly */ if (ver_lib == ver_inc) { result = FULL_MATCH; } else { /* compare major.minor */ ver_lib >>= 8; ver_inc >>= 8; if (ver_lib == ver_inc) { result = MAJOR_MINOR_MATCH; } else { /* compare major */ ver_lib >>= 8; ver_inc >>= 8; if (ver_lib == ver_inc) { result = MAJOR_MATCH; } else { result = NO_MATCH; } } } log_debug("ffmpeg %8s lib has version %06x, VICE expects %06x: %s", lib_name, ver_lib, ver_inc, result_msgs[result]); /* now decide what level of matching fails */ if (result == NO_MATCH) { return -1; } return 0; }