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.

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

Reply via email to