Aikido
ResourceServer.hpp
Go to the documentation of this file.
1 #ifndef AIKIDO_RVIZ_RESOURCESERVER_HPP_
2 #define AIKIDO_RVIZ_RESOURCESERVER_HPP_
3 
4 #include <mutex>
5 #include <unordered_map>
6 
7 #include <dart/dynamics/dynamics.hpp>
8 #include <microhttpd.h>
9 
10 namespace aikido {
11 namespace rviz {
12 
14 {
15  BinaryResource() : mSize(0), mData(nullptr)
16  {
17  }
18 
19  virtual ~BinaryResource()
20  {
21  if (mData)
22  {
23  delete[] mData;
24  }
25  }
26 
27  std::string mPath;
28  std::size_t mSize;
29  char* mData;
30 };
31 
33 {
34  virtual ~TextureResource() = default;
35 };
36 
37 typedef std::shared_ptr<TextureResource> TextureResourcePtr;
38 
40 {
41  virtual ~MeshResource() = default;
42 
43  std::unordered_map<std::string, TextureResourcePtr> mTextures;
44 };
45 
47 {
48  std::shared_ptr<BinaryResource> resource;
49 };
50 
52 {
53 public:
55  ResourceServer(const ResourceServer& other) = delete;
56  ResourceServer& operator=(const ResourceServer& other) = delete;
57 
58  virtual ~ResourceServer();
59 
60  bool isRunning() const;
61  unsigned short getPort() const;
62 
63  bool start(unsigned short port = 0);
64  bool stop();
65 
66  std::string addMesh(const aiScene& scene, const std::string& scenePath);
67 
68 private:
69  typedef std::shared_ptr<MeshResource> MeshResourcePtr;
70  typedef std::shared_ptr<BinaryResource> ResourcePtr;
71  typedef std::weak_ptr<BinaryResource> WeakResourcePtr;
72 
73  struct MHD_Daemon* mDaemon;
74  std::string mHost;
75  unsigned short mPort;
76 
77  mutable std::mutex mMutex;
78  std::unordered_map<aiScene const*, MeshResourcePtr> mScenes;
79  std::unordered_map<std::string, WeakResourcePtr> mResources;
80 
81  static bool hasBuggyAssimp();
82 
83  static int queueHttpError(
84  struct MHD_Connection* connection,
85  unsigned int code,
86  const std::string& message);
87 
88  // This must match MHD_ContentReaderCallback (i.e. ssize_t and size_t rather
89  // than std::size_t).
90  static ssize_t resourceReaderCallback(
91  void* cls, uint64_t pos, char* buf, size_t max);
92 
93  static void resourceReaderFreeCallback(void* cls);
94 
95  static int processConnection(
96  void* cls,
97  struct MHD_Connection* connection,
98  const char* url,
99  const char* method,
100  const char* version,
101  const char* upload_data,
102  std::size_t* upload_data_size,
103  void** ptr);
104 
105  std::string getMeshURI(const MeshResourcePtr& meshResource) const;
106 };
107 
108 } // namespace rviz
109 } // namespace aikido
110 
111 #endif
aikido::rviz::BinaryResource::BinaryResource
BinaryResource()
Definition: ResourceServer.hpp:15
aikido::rviz::ResourceServer::MeshResourcePtr
std::shared_ptr< MeshResource > MeshResourcePtr
Definition: ResourceServer.hpp:69
aikido::rviz::ResourceServer
Definition: ResourceServer.hpp:51
aikido::rviz::ResourceServer::~ResourceServer
virtual ~ResourceServer()
aikido::rviz::ResourceServer::ResourcePtr
std::shared_ptr< BinaryResource > ResourcePtr
Definition: ResourceServer.hpp:70
aikido
Format of serialized trajectory in YAML.
Definition: algorithm.hpp:4
aikido::rviz::ResourceServer::resourceReaderCallback
static ssize_t resourceReaderCallback(void *cls, uint64_t pos, char *buf, size_t max)
aikido::rviz::TextureResource
Definition: ResourceServer.hpp:32
aikido::rviz::ResourceServer::addMesh
std::string addMesh(const aiScene &scene, const std::string &scenePath)
aikido::rviz::ResourceServer::resourceReaderFreeCallback
static void resourceReaderFreeCallback(void *cls)
aikido::rviz::ResourceServer::isRunning
bool isRunning() const
aikido::rviz::MeshResource::mTextures
std::unordered_map< std::string, TextureResourcePtr > mTextures
Definition: ResourceServer.hpp:43
aikido::rviz::ResourceRequest
Definition: ResourceServer.hpp:46
aikido::rviz::ResourceServer::mScenes
std::unordered_map< aiScene const *, MeshResourcePtr > mScenes
Definition: ResourceServer.hpp:78
aikido::rviz::BinaryResource::mSize
std::size_t mSize
Definition: ResourceServer.hpp:28
aikido::rviz::TextureResourcePtr
std::shared_ptr< TextureResource > TextureResourcePtr
Definition: ResourceServer.hpp:37
aikido::rviz::ResourceServer::ResourceServer
ResourceServer()
aikido::rviz::ResourceServer::queueHttpError
static int queueHttpError(struct MHD_Connection *connection, unsigned int code, const std::string &message)
aikido::rviz::ResourceServer::mHost
std::string mHost
Definition: ResourceServer.hpp:74
aikido::rviz::ResourceServer::processConnection
static int processConnection(void *cls, struct MHD_Connection *connection, const char *url, const char *method, const char *version, const char *upload_data, std::size_t *upload_data_size, void **ptr)
aikido::rviz::ResourceServer::mResources
std::unordered_map< std::string, WeakResourcePtr > mResources
Definition: ResourceServer.hpp:79
aikido::rviz::BinaryResource::mPath
std::string mPath
Definition: ResourceServer.hpp:27
aikido::rviz::BinaryResource
Definition: ResourceServer.hpp:13
aikido::rviz::ResourceServer::start
bool start(unsigned short port=0)
aikido::rviz::ResourceServer::mDaemon
struct MHD_Daemon * mDaemon
Definition: ResourceServer.hpp:73
aikido::rviz::ResourceServer::hasBuggyAssimp
static bool hasBuggyAssimp()
aikido::rviz::ResourceServer::getMeshURI
std::string getMeshURI(const MeshResourcePtr &meshResource) const
aikido::rviz::ResourceServer::getPort
unsigned short getPort() const
aikido::rviz::BinaryResource::mData
char * mData
Definition: ResourceServer.hpp:29
aikido::rviz::ResourceRequest::resource
std::shared_ptr< BinaryResource > resource
Definition: ResourceServer.hpp:48
aikido::rviz::ResourceServer::WeakResourcePtr
std::weak_ptr< BinaryResource > WeakResourcePtr
Definition: ResourceServer.hpp:71
aikido::rviz::ResourceServer::mPort
unsigned short mPort
Definition: ResourceServer.hpp:75
aikido::rviz::TextureResource::~TextureResource
virtual ~TextureResource()=default
aikido::rviz::MeshResource
Definition: ResourceServer.hpp:39
aikido::rviz::ResourceServer::mMutex
std::mutex mMutex
Definition: ResourceServer.hpp:77
aikido::rviz::ResourceServer::stop
bool stop()
aikido::rviz::BinaryResource::~BinaryResource
virtual ~BinaryResource()
Definition: ResourceServer.hpp:19
aikido::rviz::MeshResource::~MeshResource
virtual ~MeshResource()=default
aikido::rviz::ResourceServer::operator=
ResourceServer & operator=(const ResourceServer &other)=delete