Robert Osfield schrieb:
Hi Ralf,

I think that right thing to do is probalby check the extension for all
platforms, with the appriate platform .so/.dll etc ending.  This way
we can keep the platform specific code paths to a minimum.
The class DynamicLibraries contain already platform specific code ? Would it not be possible to add a static method to DynamicLibrary like

std::string DynamicLibrary::getDefaultExtension() {
#if _WIN32
   return "dll";
#else
   return "so";
#endif
}

or with a better name if someone have and to use this method in osgDB::listAllAvailablePlugins() as shown below ?

osgDB::listAllAvailablePlugins()
{
   FileNameList pluginFiles;

std::string pluginDirectoryName = std::string("osgPlugins-")+std::string(osgGetVersion());
   std::string fullPath = osgDB::findLibraryFile(pluginDirectoryName);
   if (!fullPath.empty())
   {
       osgDB::DirectoryContents contents = getDirectoryContents(fullPath);
       for(DirectoryContents::iterator itr = contents.begin();
           itr != contents.end();
           ++itr)
       {
           std::string::size_type pos = itr->find("osgdb_");
           if (pos==std::string::npos)
           {
               continue;
           }
           std::string ext = getFileExtension(*itr);
           if (ext != DynamicLibrary::getDefaultExtension())
           {
               continue;
           }
           pluginFiles.push_back(fullPath + std::string("/")+*itr);
       }
   }
return pluginFiles;
}

Ralf


Robert.

On Fri, Sep 19, 2008 at 4:07 PM, Ralf Habacker <[EMAIL PROTECTED]> wrote:
Hi,

osgDB::listAllAvailablePlugins() which is for example used by osgconv
--formats lists all available plugins by iterating through *all* files of
the plugin directory.

When building osg on windows in the plugin directory beside the shared
library there are additional files like debug and manifest libraries, which
are returned by osgDB::listAllAvailablePlugins() too and produces error
messages about non loadable plugins.

I fixed this problem in osgDB::listAllAvailablePlugins() by checking the
filename extension.

FileNameList osgDB::listAllAvailablePlugins()
{
  FileNameList pluginFiles;
#if _WIN32
  std::string pluginExtension = "dll";
#endif

  std::string pluginDirectoryName =
std::string("osgPlugins-")+std::string(osgGetVersion());
  std::string fullPath = osgDB::findLibraryFile(pluginDirectoryName);
  if (!fullPath.empty())
  {
      osgDB::DirectoryContents contents = getDirectoryContents(fullPath);
      for(DirectoryContents::iterator itr = contents.begin();
          itr != contents.end();
          ++itr)
      {
          std::string::size_type pos = itr->find("osgdb_");
          if (pos==std::string::npos)
          {
              continue;
          }
#if _WIN32
          std::string ext = getFileExtension(*itr);
          if (ext != pluginExtension)
          {
              continue;
          }
#endif
          pluginFiles.push_back(fullPath + std::string("/")+*itr);
      }
  }
    return pluginFiles;
}

The fix is currently limited to win32, although it may be that the same
problem exists on other platforms. In that case the second #if WIN32 could
be extended to that platform and at the place of the first conditions a
valid shared library file extension for the related platform could be added.

The related file containing the fix is added.

Regards

Ralf


/* -*-c++-*- OpenSceneGraph - Copyright (C) 1998-2008 Robert Osfield
 *
 * This application is open source and may be redistributed and/or modified
 * freely and without restriction, both in commericial and non commericial
applications,
 * as long as this copyright notice is maintained.
 *
 * This application 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.
*/

#include <osgDB/FileUtils>
#include <osgDB/FileNameUtils>
#include <osg/Version>

#include <osgDB/PluginQuery>

using namespace osgDB;

FileNameList osgDB::listAllAvailablePlugins()
{
   FileNameList pluginFiles;
#if _WIN32
   std::string pluginExtension = "dll";
#endif

   std::string pluginDirectoryName =
std::string("osgPlugins-")+std::string(osgGetVersion());
   std::string fullPath = osgDB::findLibraryFile(pluginDirectoryName);
   if (!fullPath.empty())
   {
       osgDB::DirectoryContents contents = getDirectoryContents(fullPath);
       for(DirectoryContents::iterator itr = contents.begin();
           itr != contents.end();
           ++itr)
       {
           std::string::size_type pos = itr->find("osgdb_");
           if (pos==std::string::npos)
           {
               continue;
           }
#if _WIN32
           std::string ext = getFileExtension(*itr);
           if (ext != pluginExtension)
           {
               continue;
           }
#endif
           pluginFiles.push_back(fullPath + std::string("/")+*itr);
       }
   }

   return pluginFiles;
}


bool osgDB::queryPlugin(const std::string& fileName, ReaderWriterInfoList&
infoList)
{
   typedef std::set<const ReaderWriter*> ReaderWriterSet;
   ReaderWriterSet previouslyLoadedReaderWriters;

   const Registry::ReaderWriterList& rwList =
osgDB::Registry::instance()->getReaderWriterList();
   for(Registry::ReaderWriterList::const_iterator itr = rwList.begin();
       itr != rwList.end();
       ++itr)
   {
       const ReaderWriter* rw = itr->get();
       previouslyLoadedReaderWriters.insert(rw);
   }

   if (osgDB::Registry::instance()->loadLibrary(fileName))
   {
       const Registry::ReaderWriterList& rwList =
osgDB::Registry::instance()->getReaderWriterList();
       for(Registry::ReaderWriterList::const_iterator itr = rwList.begin();
           itr != rwList.end();
           ++itr)
       {
           const ReaderWriter* rw = itr->get();

           if (previouslyLoadedReaderWriters.count(rw)==0)
           {
               osg::ref_ptr<ReaderWriterInfo> rwi = new ReaderWriterInfo;
               rwi->plugin = fileName;
               rwi->description = rw->className();
               rwi->protocols = rw->supportedProtocols();
               rwi->extensions = rw->supportedExtensions();
               rwi->options = rw->supportedOptions();

               infoList.push_back(rwi.get());
           }
       }

       osgDB::Registry::instance()->closeLibrary(fileName);
       return true;
   }
   else
   {
       return false;
   }
}

static std::string padwithspaces(const std::string& str, unsigned int
padLength)
{
   std::string newStr(str);
   while(newStr.length()<padLength) newStr.push_back(' ');
   return newStr;
}

bool osgDB::outputPluginDetails(std::ostream& out, const std::string&
fileName)
{
   osgDB::ReaderWriterInfoList infoList;
   if (osgDB::queryPlugin(fileName, infoList))
   {
       out<<"Plugin "<<fileName<<std::endl;
       out<<"{"<<std::endl;

       for(osgDB::ReaderWriterInfoList::iterator rwi_itr = infoList.begin();
           rwi_itr != infoList.end();
           ++rwi_itr)
       {
           osgDB::ReaderWriterInfo& info = *(*rwi_itr);
           out<<"    ReaderWriter : "<<info.description<<std::endl;
           out<<"    {"<<std::endl;

           unsigned int longestOptionLength = 0;
           osgDB::ReaderWriter::FormatDescriptionMap::iterator fdm_itr;
           for(fdm_itr = info.protocols.begin();
               fdm_itr != info.protocols.end();
               ++fdm_itr)
           {
               if (fdm_itr->first.length()>longestOptionLength)
longestOptionLength = fdm_itr->first.length();
           }

           for(fdm_itr = info.extensions.begin();
               fdm_itr != info.extensions.end();
               ++fdm_itr)
           {
               if (fdm_itr->first.length()>longestOptionLength)
longestOptionLength = fdm_itr->first.length();
           }

           for(fdm_itr = info.options.begin();
               fdm_itr != info.options.end();
               ++fdm_itr)
           {
               if (fdm_itr->first.length()>longestOptionLength)
longestOptionLength = fdm_itr->first.length();
           }

           unsigned int padLength = longestOptionLength+4;

           for(fdm_itr = info.protocols.begin();
               fdm_itr != info.protocols.end();
               ++fdm_itr)
           {
               out<<"        protocol   : "<<padwithspaces(fdm_itr->first,
padLength)<<fdm_itr->second<<std::endl;
           }

           for(fdm_itr = info.extensions.begin();
               fdm_itr != info.extensions.end();
               ++fdm_itr)
           {
               out<<"        extensions : ."<<padwithspaces(fdm_itr->first,
padLength-1)<<fdm_itr->second<<std::endl;
           }

           for(fdm_itr = info.options.begin();
               fdm_itr != info.options.end();
               ++fdm_itr)
           {
               out<<"        options    : "<<padwithspaces(fdm_itr->first,
padLength)<<fdm_itr->second<<std::endl;
           }
           out<<"    }"<<std::endl;
       }
       out<<"}"<<std::endl<<std::endl;
       return true;
   }
   else
   {
       out<<"Plugin "<<fileName<<" not found."<<std::endl;
       return false;
   }
}


_______________________________________________
osg-submissions mailing list
[email protected]
http://lists.openscenegraph.org/listinfo.cgi/osg-submissions-openscenegraph.org


_______________________________________________
osg-submissions mailing list
[email protected]
http://lists.openscenegraph.org/listinfo.cgi/osg-submissions-openscenegraph.org

_______________________________________________
osg-submissions mailing list
[email protected]
http://lists.openscenegraph.org/listinfo.cgi/osg-submissions-openscenegraph.org

Reply via email to