예제 #1
0
파일: stage_data.hpp 프로젝트: bnkr/nerve
 bool built_in() const {
   NERVE_ASSERT(plugin_id() != plug_id::unset, "plugin must be set before testing");
   return stages::is_built_in(this->plugin_id());
 }
예제 #2
0
  //----------------------------------------------------------------
  // TPluginRegistry::load
  //
  bool
  TPluginRegistry::load(const char * pluginsFolder)
  {
    try
    {
      TOpenFolder folder(pluginsFolder);

      bool foundPlugins = false;
      do
      {
        std::string srcName = folder.itemName();
        std::string srcPath = folder.itemPath();

        if (folder.itemIsFolder())
        {
          if (strcmp(srcName.c_str(), ".") == 0 ||
              strcmp(srcName.c_str(), "..") == 0)
          {
            continue;
          }

          if (this->load(srcPath.c_str()))
          {
            foundPlugins = true;
          }

          continue;
        }

        if (!boost::algorithm::ends_with(srcName, ".yae"))
        {
          continue;
        }

        void * module = loadLibrary(srcPath.c_str());
        if (!module)
        {
          continue;
        }

        TPluginFactory factory =
          (TPluginFactory)getSymbol(module, "yae_create_plugin");
        if (!factory)
        {
          continue;
        }

        for (std::size_t i = 0; ; i++)
        {
          IPluginPtr plugin(factory(i), IPlugin::Deallocator());

          if (!plugin)
          {
            break;
          }

          std::string plugin_id(plugin->guid());
          (*this)[plugin_id] = plugin;
          foundPlugins = true;
        }

      } while (folder.parseNextItem());

      return foundPlugins;
    }
    catch (const std::exception & e)
    {}

    return false;
  }