file_server.hpp
Go to the documentation of this file.
1 /*
2  * Copyright (C) 2015 Pavel Kirienko <pavel.kirienko@gmail.com>
3  */
4 
5 #ifndef UAVCAN_PROTOCOL_FILE_SERVER_HPP_INCLUDED
6 #define UAVCAN_PROTOCOL_FILE_SERVER_HPP_INCLUDED
7 
9 #include <uavcan/debug.hpp>
12 // UAVCAN types
13 #include <uavcan/protocol/file/GetInfo.hpp>
14 #include <uavcan/protocol/file/GetDirectoryEntryInfo.hpp>
15 #include <uavcan/protocol/file/Read.hpp>
16 #include <uavcan/protocol/file/Write.hpp>
17 #include <uavcan/protocol/file/Delete.hpp>
18 
19 namespace uavcan
20 {
27 {
28 public:
29  typedef protocol::file::Path::FieldTypes::path Path;
30  typedef protocol::file::EntryType EntryType;
31  typedef protocol::file::Error Error;
32 
36  enum { ReadSize = protocol::file::Read::Response::FieldTypes::data::MaxSize };
37 
41  static char getPathSeparator() { return static_cast<char>(protocol::file::Path::SEPARATOR); }
42 
49  virtual int16_t getInfo(const Path& path, uint64_t& out_size, EntryType& out_type) = 0;
50 
58  virtual int16_t read(const Path& path, const uint64_t offset, uint8_t* out_buffer, uint16_t& inout_size) = 0;
59 
60  // Methods below are optional.
61 
67  virtual int16_t write(const Path& path, const uint64_t offset, const uint8_t* buffer, const uint16_t size)
68  {
69  (void)path;
70  (void)offset;
71  (void)buffer;
72  (void)size;
73  return Error::NOT_IMPLEMENTED;
74  }
75 
81  virtual int16_t remove(const Path& path)
82  {
83  (void)path;
84  return Error::NOT_IMPLEMENTED;
85  }
86 
93  virtual int16_t getDirectoryEntryInfo(const Path& directory_path, const uint32_t entry_index,
94  EntryType& out_type, Path& out_entry_full_path)
95  {
96  (void)directory_path;
97  (void)entry_index;
98  (void)out_type;
99  (void)out_entry_full_path;
100  return Error::NOT_IMPLEMENTED;
101  }
102 
103  virtual ~IFileServerBackend() { }
104 };
105 
113 {
114  typedef MethodBinder<BasicFileServer*,
115  void (BasicFileServer::*)(const protocol::file::GetInfo::Request&, protocol::file::GetInfo::Response&)>
117 
118  typedef MethodBinder<BasicFileServer*,
119  void (BasicFileServer::*)(const protocol::file::Read::Request&, protocol::file::Read::Response&)>
121 
124 
125  void handleGetInfo(const protocol::file::GetInfo::Request& req, protocol::file::GetInfo::Response& resp)
126  {
127  resp.error.value = backend_.getInfo(req.path.path, resp.size, resp.entry_type);
128  }
129 
130  void handleRead(const protocol::file::Read::Request& req, protocol::file::Read::Response& resp)
131  {
132  uint16_t inout_size = resp.data.capacity();
133 
134  resp.data.resize(inout_size);
135 
136  resp.error.value = backend_.read(req.path.path, req.offset, resp.data.begin(), inout_size);
137 
138  if (resp.error.value != protocol::file::Error::OK)
139  {
140  inout_size = 0;
141  }
142 
143  if (inout_size > resp.data.capacity())
144  {
145  UAVCAN_ASSERT(0);
146  resp.error.value = protocol::file::Error::UNKNOWN_ERROR;
147  }
148  else
149  {
150  resp.data.resize(inout_size);
151  }
152  }
153 
154 protected:
156 
157 public:
160  , read_srv_(node)
161  , backend_(backend)
162  { }
163 
164  int start()
165  {
167  if (res < 0)
168  {
169  return res;
170  }
171 
173  if (res < 0)
174  {
175  return res;
176  }
177 
178  return 0;
179  }
180 };
181 
191 class FileServer : protected BasicFileServer
192 {
193  typedef MethodBinder<FileServer*,
194  void (FileServer::*)(const protocol::file::Write::Request&, protocol::file::Write::Response&)>
196 
197  typedef MethodBinder<FileServer*,
198  void (FileServer::*)(const protocol::file::Delete::Request&, protocol::file::Delete::Response&)>
200 
201  typedef MethodBinder<FileServer*,
202  void (FileServer::*)(const protocol::file::GetDirectoryEntryInfo::Request&,
203  protocol::file::GetDirectoryEntryInfo::Response&)>
205 
209 
210  void handleWrite(const protocol::file::Write::Request& req, protocol::file::Write::Response& resp)
211  {
212  resp.error.value = backend_.write(req.path.path, req.offset, req.data.begin(), req.data.size());
213  }
214 
215  void handleDelete(const protocol::file::Delete::Request& req, protocol::file::Delete::Response& resp)
216  {
217  resp.error.value = backend_.remove(req.path.path);
218  }
219 
220  void handleGetDirectoryEntryInfo(const protocol::file::GetDirectoryEntryInfo::Request& req,
221  protocol::file::GetDirectoryEntryInfo::Response& resp)
222  {
223  resp.error.value = backend_.getDirectoryEntryInfo(req.directory_path.path, req.entry_index,
224  resp.entry_type, resp.entry_full_path.path);
225  }
226 
227 public:
229  : BasicFileServer(node, backend)
230  , write_srv_(node)
231  , delete_srv_(node)
233  { }
234 
235  int start()
236  {
237  int res = BasicFileServer::start();
238  if (res < 0)
239  {
240  return res;
241  }
242 
243  res = write_srv_.start(WriteCallback(this, &FileServer::handleWrite));
244  if (res < 0)
245  {
246  return res;
247  }
248 
250  if (res < 0)
251  {
252  return res;
253  }
254 
255  res = get_directory_entry_info_srv_.start(
257  if (res < 0)
258  {
259  return res;
260  }
261 
262  return 0;
263  }
264 };
265 
266 }
267 
268 #endif // Include guard
uavcan::IFileServerBackend::EntryType
protocol::file::EntryType EntryType
Definition: file_server.hpp:30
uavcan::IFileServerBackend::read
virtual int16_t read(const Path &path, const uint64_t offset, uint8_t *out_buffer, uint16_t &inout_size)=0
uavcan::IFileServerBackend::~IFileServerBackend
virtual ~IFileServerBackend()
Definition: file_server.hpp:103
uavcan::uint64_t
std::uint64_t uint64_t
Definition: std.hpp:27
debug.hpp
uavcan::FileServer::write_srv_
ServiceServer< protocol::file::Write, WriteCallback > write_srv_
Definition: file_server.hpp:206
uavcan::uint32_t
std::uint32_t uint32_t
Definition: std.hpp:26
uavcan::FileServer
Definition: file_server.hpp:191
uavcan::FileServer::start
int start()
Definition: file_server.hpp:235
uavcan::BasicFileServer::GetInfoCallback
MethodBinder< BasicFileServer *, void(BasicFileServer::*)(const protocol::file::GetInfo::Request &, protocol::file::GetInfo::Response &)> GetInfoCallback
Definition: file_server.hpp:116
uavcan::IFileServerBackend::getInfo
virtual int16_t getInfo(const Path &path, uint64_t &out_size, EntryType &out_type)=0
uavcan::BasicFileServer::read_srv_
ServiceServer< protocol::file::Read, ReadCallback > read_srv_
Definition: file_server.hpp:123
uavcan::IFileServerBackend::write
virtual int16_t write(const Path &path, const uint64_t offset, const uint8_t *buffer, const uint16_t size)
Definition: file_server.hpp:67
uavcan::IFileServerBackend::Error
protocol::file::Error Error
Definition: file_server.hpp:31
uavcan::BasicFileServer::backend_
IFileServerBackend & backend_
Derived types can use it.
Definition: file_server.hpp:155
uavcan::uint16_t
std::uint16_t uint16_t
Definition: std.hpp:25
uavcan::int16_t
std::int16_t int16_t
Definition: std.hpp:30
uavcan::FileServer::get_directory_entry_info_srv_
ServiceServer< protocol::file::GetDirectoryEntryInfo, GetDirectoryEntryInfoCallback > get_directory_entry_info_srv_
Definition: file_server.hpp:208
uavcan::ServiceServer
Definition: service_server.hpp:90
uavcan::FileServer::handleWrite
void handleWrite(const protocol::file::Write::Request &req, protocol::file::Write::Response &resp)
Definition: file_server.hpp:210
uavcan::uint8_t
std::uint8_t uint8_t
Definition: std.hpp:24
uavcan::IFileServerBackend::Path
protocol::file::Path::FieldTypes::path Path
Definition: file_server.hpp:29
uavcan::FileServer::delete_srv_
ServiceServer< protocol::file::Delete, DeleteCallback > delete_srv_
Definition: file_server.hpp:207
uavcan::FileServer::handleDelete
void handleDelete(const protocol::file::Delete::Request &req, protocol::file::Delete::Response &resp)
Definition: file_server.hpp:215
uavcan::BasicFileServer::handleRead
void handleRead(const protocol::file::Read::Request &req, protocol::file::Read::Response &resp)
Definition: file_server.hpp:130
UAVCAN_EXPORT
#define UAVCAN_EXPORT
Definition: libuavcan/libuavcan/include/uavcan/build_config.hpp:108
uavcan::FileServer::GetDirectoryEntryInfoCallback
MethodBinder< FileServer *, void(FileServer::*)(const protocol::file::GetDirectoryEntryInfo::Request &, protocol::file::GetDirectoryEntryInfo::Response &)> GetDirectoryEntryInfoCallback
Definition: file_server.hpp:204
uavcan::IFileServerBackend::getPathSeparator
static char getPathSeparator()
Definition: file_server.hpp:41
method_binder.hpp
uavcan::INode
Definition: abstract_node.hpp:19
uavcan::IFileServerBackend::remove
virtual int16_t remove(const Path &path)
Definition: file_server.hpp:81
uavcan::BasicFileServer::start
int start()
Definition: file_server.hpp:164
build_config.hpp
uavcan::BasicFileServer::BasicFileServer
BasicFileServer(INode &node, IFileServerBackend &backend)
Definition: file_server.hpp:158
uavcan::MethodBinder
Definition: method_binder.hpp:20
uavcan::BasicFileServer::get_info_srv_
ServiceServer< protocol::file::GetInfo, GetInfoCallback > get_info_srv_
Definition: file_server.hpp:122
uavcan::FileServer::WriteCallback
MethodBinder< FileServer *, void(FileServer::*)(const protocol::file::Write::Request &, protocol::file::Write::Response &)> WriteCallback
Definition: file_server.hpp:195
uavcan::BasicFileServer::ReadCallback
MethodBinder< BasicFileServer *, void(BasicFileServer::*)(const protocol::file::Read::Request &, protocol::file::Read::Response &)> ReadCallback
Definition: file_server.hpp:120
uavcan::BasicFileServer::handleGetInfo
void handleGetInfo(const protocol::file::GetInfo::Request &req, protocol::file::GetInfo::Response &resp)
Definition: file_server.hpp:125
uavcan::BasicFileServer
Definition: file_server.hpp:112
pyuavcan_v0.introspect.node
node
Definition: introspect.py:398
uavcan::FileServer::DeleteCallback
MethodBinder< FileServer *, void(FileServer::*)(const protocol::file::Delete::Request &, protocol::file::Delete::Response &)> DeleteCallback
Definition: file_server.hpp:199
uavcan
Definition: libuavcan/libuavcan/include/uavcan/build_config.hpp:204
uavcan::FileServer::handleGetDirectoryEntryInfo
void handleGetDirectoryEntryInfo(const protocol::file::GetDirectoryEntryInfo::Request &req, protocol::file::GetDirectoryEntryInfo::Response &resp)
Definition: file_server.hpp:220
service_server.hpp
uavcan::IFileServerBackend
Definition: file_server.hpp:26
uavcan::FileServer::FileServer
FileServer(INode &node, IFileServerBackend &backend)
Definition: file_server.hpp:228
uavcan::IFileServerBackend::getDirectoryEntryInfo
virtual int16_t getDirectoryEntryInfo(const Path &directory_path, const uint32_t entry_index, EntryType &out_type, Path &out_entry_full_path)
Definition: file_server.hpp:93
UAVCAN_ASSERT
#define UAVCAN_ASSERT(x)
Definition: libuavcan/libuavcan/include/uavcan/build_config.hpp:184


uavcan_communicator
Author(s):
autogenerated on Fri Dec 13 2024 03:10:02