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