Hi Ralf,

CMake knows the extension of the plugins, so this is probably where to
get it from - via a define passed in.

I'm going offline right now so feel free to chase this up, or wait
till I have time to look into this.

Robert.

On Fri, Sep 19, 2008 at 6:18 PM, Ralf Habacker <[EMAIL PROTECTED]> wrote:
> Ralf Habacker schrieb:
>>
>> 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
>> }
>>
> Another location would be in osgDB/FileUtils, which contains also platform
> related code - for example something like this:
>
> std::string osgDB::getLibraryExtension()
> {
> #if _WIN32
>  return "dll";
> #else
>  return "so";
> #endif
> }
>
> or
> std::string osgDB::getPluginExtension()
>
> Ralf
>
>> 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
>
> _______________________________________________
> 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