1 #ifndef _STATEFS_PROVIDER_HPP_
2 #define _STATEFS_PROVIDER_HPP_
6 #include <cor/util.hpp>
21 virtual ::statefs_node *get_node() =0;
22 virtual ::statefs_node
const* get_node()
const =0;
24 virtual std::string get_name()
const =0;
25 virtual void release() =0;
32 virtual ::statefs_branch *get_branch() =0;
33 virtual ::statefs_branch
const* get_branch()
const =0;
63 return cor::member_container(n, &T::node);
69 template <
typename NodeT>
74 {
return node_from(static_cast<NodeT*>(
this)); }
76 {
return node_from(static_cast<NodeT const*>(
this)); }
78 virtual ::statefs_node *get_node() {
return node_cast(); }
79 virtual ::statefs_node
const* get_node()
const {
return node_cast(); }
81 virtual std::string get_name()
const {
return node_cast()->
name; }
86 memcpy(node_cast(), &node_template,
sizeof(
statefs_node));
87 node_cast()->
name = strdup(name);
88 node_cast()->
release = &release_bridge;
92 free(const_cast<char*>(node_cast()->name));
99 static_cast<ANode*
>(
self)->release();
103 template <
typename T>
109 template <
typename T>
117 return &v->root.branch;
122 return &v->root.branch;
125 template <
typename BranchT>
128 template <
typename T>
131 T *t = cor::member_container(src, &T::branch);
135 template <
typename T>
138 T
const* t = cor::member_container(src, &T::branch);
143 BranchWrapper<statefs_provider> *branch_to<statefs_provider>(
statefs_branch *);
146 BranchWrapper<statefs_provider>
const* branch_to<statefs_provider>(
statefs_branch const*);
148 template <
typename BranchT>
149 class BranchWrapper :
public NodeWrapper<BranchT>
154 {
return branch_from(static_cast<BranchT*>(
this)); }
156 {
return branch_from(static_cast<BranchT const*>(
this)); }
162 : NodeWrapper<BranchT>(name, node_template)
169 return branch_to<BranchT>(src);
172 static BranchWrapper<BranchT>
const* self_cast(
statefs_branch const* src)
174 return branch_to<BranchT>(src);
183 typedef std::shared_ptr<ANode> child_ptr;
186 typedef std::map<std::string, child_ptr> storage_type;
187 typedef storage_type::const_iterator iter_type;
193 child_ptr insert(child_ptr child);
194 child_ptr insert(
ANode *child);
200 statefs_handle_t first()
const;
201 void next(statefs_handle_t*)
const;
202 bool release(statefs_handle_t)
const;
209 template <
class BranchT>
221 auto self = self_cast(branch);
222 return self->BranchStorage::find(name);
227 auto self = self_cast(branch);
228 return self->BranchStorage::get(h);
233 auto self = self_cast(branch);
234 return self->BranchStorage::first();
237 static void child_next(
statefs_branch const* branch, statefs_handle_t *h)
239 auto self = self_cast(branch);
240 return self->BranchStorage::next(h);
243 static bool child_release(
statefs_branch const* branch, statefs_handle_t h)
245 auto self = self_cast(branch);
246 return self->BranchStorage::release(h);
255 return static_cast<Branch const*
>
256 (base_type::self_cast(branch));
261 :
base_type(name, node_template, branch_template)
286 virtual int read(
char *dst, statefs_size_t len, statefs_off_t off) =0;
287 virtual int write(
char const*, statefs_size_t, statefs_off_t) =0;
296 virtual int getattr()
const =0;
297 virtual statefs_ssize_t size()
const =0;
301 virtual void disconnect() =0;
307 template <
typename T,
typename HandleT>
312 : prop_(p), handle_(h) {}
314 virtual int read(
char *dst, statefs_size_t len, statefs_off_t off)
316 return prop_->read(handle_.get(), dst, len, off);
319 virtual int write(
char const *src, statefs_size_t len, statefs_off_t off)
321 return prop_->write(handle_.get(), src, len, off);
325 std::shared_ptr<T> prop_;
326 std::unique_ptr<HandleT> handle_;
329 template <
typename T,
typename HandleT>
331 (std::shared_ptr<T> p, HandleT *h)
336 template <
typename T>
340 template <
typename ... Args>
343 , impl_(
new T(
this, args...))
346 virtual ~APropertyOwner() {}
348 virtual int getattr()
const {
return impl_->getattr(); }
349 virtual statefs_ssize_t size()
const {
return impl_->size(); }
352 virtual bool connect(::
statefs_slot *s) {
return impl_->connect(s); }
353 virtual void disconnect() {
return impl_->disconnect(); }
355 virtual void release() {
return impl_->release(); }
358 std::shared_ptr<T> impl_;
361 template <
typename T,
typename HandleT>
365 template <
typename ... Args>
370 template <
typename ... Args>
371 BasicPropertyOwner(std::string
const &name, Args&& ...args)
377 return statefs::mk_prop_accessor(this->impl_,
new HandleT());
380 std::shared_ptr<T> get_impl() {
return this->impl_; }
402 void event(statefs_event);
413 static int read(statefs_handle_t h,
char *dst, statefs_size_t len, statefs_off_t off);
414 static int write(statefs_handle_t,
char const*, statefs_size_t, statefs_off_t);
415 static void close(statefs_handle_t);
467 #endif // _STATEFS_PROVIDER_HPP_