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:
Robert Osfield 2009-03-10 12:21:13 +00:00
parent 199067d150
commit b5a15fb5b4
5 changed files with 56 additions and 11 deletions

View File

@ -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);

View File

@ -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);

View File

@ -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);

View File

@ -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;
} }

View File

@ -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());
}