From Stephan Huber,
"Attached you'll find a proposal for using different protocols. The idea behind the new code is: 1.) plugins/apps register protocols which they can handle. This is done via osgDB::Registry::registerProtocol(aProtocolName). Plugins register supported protocols as usual via ReaderWriter::supportsProtocol(..), the Registry is updated accordingly. 2.) osgDB::containsServerAddress checks first for an appearance of "://" in the filename and then checks the protocol against the set of registered protocols via Registry::isProtocolRegistered(aProtocollName) 3.) the other getServer*-functions changed as well, there's even a getServerProtocol-function With these changes filenames/Urls get routed to loaded plugins even with different protocols than 'http'."
This commit is contained in:
parent
199067d150
commit
b5a15fb5b4
@ -40,6 +40,7 @@ extern OSGDB_EXPORT bool equalCaseInsensitive(const std::string& lhs,const std::
|
|||||||
extern OSGDB_EXPORT bool equalCaseInsensitive(const std::string& lhs,const char* rhs);
|
extern OSGDB_EXPORT bool equalCaseInsensitive(const std::string& lhs,const char* rhs);
|
||||||
|
|
||||||
extern OSGDB_EXPORT bool containsServerAddress(const std::string& filename);
|
extern OSGDB_EXPORT bool containsServerAddress(const std::string& filename);
|
||||||
|
extern OSGDB_EXPORT std::string getServerProtocol(const std::string& filename);
|
||||||
extern OSGDB_EXPORT std::string getServerAddress(const std::string& filename);
|
extern OSGDB_EXPORT std::string getServerAddress(const std::string& filename);
|
||||||
extern OSGDB_EXPORT std::string getServerFileName(const std::string& filename);
|
extern OSGDB_EXPORT std::string getServerFileName(const std::string& filename);
|
||||||
|
|
||||||
|
@ -478,7 +478,13 @@ class OSGDB_EXPORT Registry : public osg::Referenced
|
|||||||
|
|
||||||
/** Add an Archive extension.*/
|
/** Add an Archive extension.*/
|
||||||
void addArchiveExtension(const std::string ext);
|
void addArchiveExtension(const std::string ext);
|
||||||
|
|
||||||
|
/** registers a protocol */
|
||||||
|
void registerProtocol(const std::string& protocol);
|
||||||
|
|
||||||
|
/** returns true, if named protocol is registered */
|
||||||
|
bool isProtocolRegistered(const std::string& protocol);
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
|
|
||||||
virtual ~Registry();
|
virtual ~Registry();
|
||||||
@ -491,6 +497,8 @@ class OSGDB_EXPORT Registry : public osg::Referenced
|
|||||||
typedef std::pair<osg::ref_ptr<osg::Object>, double > ObjectTimeStampPair;
|
typedef std::pair<osg::ref_ptr<osg::Object>, double > ObjectTimeStampPair;
|
||||||
typedef std::map<std::string, ObjectTimeStampPair > ObjectCache;
|
typedef std::map<std::string, ObjectTimeStampPair > ObjectCache;
|
||||||
typedef std::map<std::string, osg::ref_ptr<osgDB::Archive> > ArchiveCache;
|
typedef std::map<std::string, osg::ref_ptr<osgDB::Archive> > ArchiveCache;
|
||||||
|
|
||||||
|
typedef std::set<std::string> RegisteredProtocolsSet;
|
||||||
|
|
||||||
/** constructor is private, as its a singleton, preventing
|
/** constructor is private, as its a singleton, preventing
|
||||||
construction other than via the instance() method and
|
construction other than via the instance() method and
|
||||||
@ -508,6 +516,8 @@ class OSGDB_EXPORT Registry : public osg::Referenced
|
|||||||
osg::ref_ptr<AuthenticationMap> _authenticationMap;
|
osg::ref_ptr<AuthenticationMap> _authenticationMap;
|
||||||
|
|
||||||
bool _createNodeFromImage;
|
bool _createNodeFromImage;
|
||||||
|
|
||||||
|
RegisteredProtocolsSet _registeredProtocols;
|
||||||
|
|
||||||
osg::Object* readObject(DotOsgWrapperMap& dowMap,Input& fr);
|
osg::Object* readObject(DotOsgWrapperMap& dowMap,Input& fr);
|
||||||
|
|
||||||
|
@ -179,26 +179,42 @@ bool osgDB::equalCaseInsensitive(const std::string& lhs,const char* rhs)
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
bool osgDB::containsServerAddress(const std::string& filename)
|
bool osgDB::containsServerAddress(const std::string& filename)
|
||||||
{
|
{
|
||||||
// need to check for http://
|
// need to check for ://
|
||||||
if (filename.size()<7) return false;
|
std::string::size_type pos(filename.find_first_of("://"));
|
||||||
if (filename.compare(0,7,"http://")==0) return true;
|
if (pos == std::string::npos)
|
||||||
return false;
|
return false;
|
||||||
|
std::string proto(filename.substr(0, pos));
|
||||||
|
|
||||||
|
return Registry::instance()->isProtocolRegistered(proto);
|
||||||
|
}
|
||||||
|
|
||||||
|
std::string osgDB::getServerProtocol(const std::string& filename)
|
||||||
|
{
|
||||||
|
std::string::size_type pos(filename.find_first_of("://"));
|
||||||
|
if (pos != std::string::npos)
|
||||||
|
return filename.substr(0,pos);
|
||||||
|
|
||||||
|
return "";
|
||||||
}
|
}
|
||||||
|
|
||||||
std::string osgDB::getServerAddress(const std::string& filename)
|
std::string osgDB::getServerAddress(const std::string& filename)
|
||||||
{
|
{
|
||||||
if (filename.size()>=7 && filename.compare(0,7,"http://")==0)
|
std::string::size_type pos(filename.find_first_of("://"));
|
||||||
|
|
||||||
|
if (pos != std::string::npos)
|
||||||
{
|
{
|
||||||
std::string::size_type pos_slash = filename.find_first_of('/',7);
|
std::string::size_type pos_slash = filename.find_first_of('/',pos+3);
|
||||||
if (pos_slash!=std::string::npos)
|
if (pos_slash!=std::string::npos)
|
||||||
{
|
{
|
||||||
return filename.substr(7,pos_slash-7);
|
return filename.substr(pos+3,pos_slash-pos-3);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
return filename.substr(7,std::string::npos);
|
return filename.substr(pos+3,std::string::npos);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return "";
|
return "";
|
||||||
@ -206,9 +222,11 @@ std::string osgDB::getServerAddress(const std::string& filename)
|
|||||||
|
|
||||||
std::string osgDB::getServerFileName(const std::string& filename)
|
std::string osgDB::getServerFileName(const std::string& filename)
|
||||||
{
|
{
|
||||||
if (filename.size()>=7 && filename.compare(0,7,"http://")==0)
|
std::string::size_type pos(filename.find_first_of("://"));
|
||||||
|
|
||||||
|
if (pos != std::string::npos)
|
||||||
{
|
{
|
||||||
std::string::size_type pos_slash = filename.find_first_of('/',7);
|
std::string::size_type pos_slash = filename.find_first_of('/',pos+3);
|
||||||
if (pos_slash!=std::string::npos)
|
if (pos_slash!=std::string::npos)
|
||||||
{
|
{
|
||||||
return filename.substr(pos_slash+1,std::string::npos);
|
return filename.substr(pos_slash+1,std::string::npos);
|
||||||
|
@ -47,6 +47,7 @@ bool ReaderWriter::acceptsExtension(const std::string& extension) const
|
|||||||
|
|
||||||
void ReaderWriter::supportsProtocol(const std::string& fmt, const std::string& description)
|
void ReaderWriter::supportsProtocol(const std::string& fmt, const std::string& description)
|
||||||
{
|
{
|
||||||
|
Registry::instance()->registerProtocol(fmt);
|
||||||
_supportedProtocols[convertToLowerCase(fmt)] = description;
|
_supportedProtocols[convertToLowerCase(fmt)] = description;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -331,6 +331,9 @@ Registry::Registry()
|
|||||||
addFileExtensionAlias("pgm", "pnm");
|
addFileExtensionAlias("pgm", "pnm");
|
||||||
addFileExtensionAlias("ppm", "pnm");
|
addFileExtensionAlias("ppm", "pnm");
|
||||||
|
|
||||||
|
// register http-protocol, so the curl can handle it, if necessary
|
||||||
|
registerProtocol("http");
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -2092,3 +2095,15 @@ SharedStateManager* Registry::getOrCreateSharedStateManager()
|
|||||||
|
|
||||||
return _sharedStateManager.get();
|
return _sharedStateManager.get();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void Registry::registerProtocol(const std::string& protocol)
|
||||||
|
{
|
||||||
|
_registeredProtocols.insert( convertToLowerCase(protocol) );
|
||||||
|
}
|
||||||
|
|
||||||
|
bool Registry::isProtocolRegistered(const std::string& protocol)
|
||||||
|
{
|
||||||
|
return (_registeredProtocols.find( convertToLowerCase(protocol) ) != _registeredProtocols.end());
|
||||||
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user