Files
OpenSceneGraph/src/osgPlugins/RestHttpDevice/ReaderWriterRestHttpDevice.cpp
2013-06-19 17:25:55 +00:00

127 lines
6.1 KiB
C++

/* -*-c++-*- OpenSceneGraph - Copyright (C) 1998-2008 Robert Osfield
*
* This library is open source and may be redistributed and/or modified under
* the terms of the OpenSceneGraph Public License (OSGPL) version 0.0 or
* (at your option) any later version. The full license is in LICENSE file
* included with this distribution, and on the openscenegraph.org website.
*
* This library 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. See the
* OpenSceneGraph Public License for more details.
*/
/* README:
*
* This code is loosely based on the QTKit implementation of Eric Wing, I removed
* some parts and added other parts.
*
* What's new:
* - it can handle URLs currently http and rtsp
* - it supports OS X's CoreVideo-technology, this will render the movie-frames
* into a bunch of textures. If you load your movie via readImageFile you'll
* get the standard behaviour, an ImageStream, where the data gets updated on
* every new video-frame. This may be slow.
* To get CoreVideo, you'll need to use readObjectFile and cast the result (if any)
* to an osg::Texture and use that as your video-texture. If you need access to the
* imagestream, just cast getImage to an image-stream. Please note, the data-
* property of the image-stream does NOT store the current frame, instead it's empty.
*
*/
#include <osgDB/Registry>
#include <osgDB/FileNameUtils>
#include <osgDB/FileUtils>
#include "RestHttpDevice.hpp"
class ReaderWriterRestHttp : public osgDB::ReaderWriter
{
public:
ReaderWriterRestHttp()
{
supportsExtension("resthttp", "Virtual Device Integration via a HTTP-Server and a REST-interface");
supportsOption("documentRoot", "document root of asset files to server via the http-server");
supportsOption("serverAddress", "server address to listen for incoming requests");
supportsOption("serverPort", "server port to listen for incoming requests");
supportsOption("documentRegisteredHandlers", "dump a documentation of all registered REST-handler to the console");
}
virtual const char* className() const { return "Rest/HTTP Virtual Device Integration plugin"; }
virtual ReadResult readObject(const std::string& file, const osgDB::ReaderWriter::Options* options =NULL) const
{
if (osgDB::getFileExtension(file) == "resthttp")
{
std::string document_root = options ? options->getPluginStringData("documentRoot") : "htdocs/";
std::string server_address = options ? options->getPluginStringData("serverAddress") : "localhost";
std::string server_port = options ? options->getPluginStringData("serverPort") : "8080";
// supported file-name scheme to get address, port and document-root: <server-address>:<server-port>/<document-root>
// example: '192.168.1.1:88888/var/www/htdocs'
std::string file_wo_ext = osgDB::getNameLessAllExtensions(file);
if ((file_wo_ext.find('/') != std::string::npos) && (file_wo_ext.find(':') != std::string::npos)) {
std::string server_part = file_wo_ext.substr(0, file_wo_ext.find('/'));
document_root = file_wo_ext.substr(file_wo_ext.find('/'));
server_address = server_part.substr(0,server_part.find(':'));
server_port = server_part.substr(server_part.find(':') + 1);
}
try
{
osg::ref_ptr<RestHttpDevice> device = new RestHttpDevice(server_address, server_port, document_root);
device->addRequestHandler(new SendKeystrokeRequestHandler("/slide/first", osgGA::GUIEventAdapter::KEY_Home));
device->addRequestHandler(new SendKeystrokeRequestHandler("/slide/last", osgGA::GUIEventAdapter::KEY_End));
device->addRequestHandler(new SendKeystrokeRequestHandler("/slide/next", osgGA::GUIEventAdapter::KEY_Right));
device->addRequestHandler(new SendKeystrokeRequestHandler("/slide/previous", osgGA::GUIEventAdapter::KEY_Left));
device->addRequestHandler(new SendKeystrokeRequestHandler("/layer/next", osgGA::GUIEventAdapter::KEY_Down));
device->addRequestHandler(new SendKeystrokeRequestHandler("/layer/previous", osgGA::GUIEventAdapter::KEY_Up));
device->addRequestHandler(new SendKeystrokeRequestHandler("/slideorlayer/next", osgGA::GUIEventAdapter::KEY_Page_Down));
device->addRequestHandler(new SendKeystrokeRequestHandler("/slideorlayer/previous", osgGA::GUIEventAdapter::KEY_Page_Up));
device->addRequestHandler(new SendKeystrokeRequestHandler("/unpause", 'o'));
device->addRequestHandler(new SendKeystrokeRequestHandler("/pause", 'p'));
if (options && (options->getPluginStringData("documentRegisteredHandlers") == "true"))
{
std::cout << *device << std::endl;
}
return device.release();
}
catch(std::exception& e)
{
OSG_WARN << "ReaderWriterRestHttpDevice : could not create http-server! Reason: " << e.what() << std::endl;
return ReadResult::ERROR_IN_READING_FILE;
}
catch(...)
{
OSG_WARN << "ReaderWriterRestHttpDevice : could not create http-server, unknown excpetion thrown " << std::endl;
return ReadResult::ERROR_IN_READING_FILE;
}
}
return ReadResult::FILE_NOT_HANDLED;
}
};
// now register with Registry to instantiate the above
// reader/writer.
REGISTER_OSGPLUGIN(resthttp, ReaderWriterRestHttp)