Caffa  1.1.0
C++ Application Framework for Embedded Systems with introspection
cafRpcChildArrayFieldAccessor.h
1 // ##################################################################################################
2 //
3 // Caffa
4 // Copyright (C) 3D-Radar AS
5 //
6 // GNU Lesser General Public License Usage
7 // This library is free software; you can redistribute it and/or modify
8 // it under the terms of the GNU Lesser General Public License as published by
9 // the Free Software Foundation; either version 2.1 of the License, or
10 // (at your option) any later version.
11 //
12 // This library is distributed in the hope that it will be useful, but WITHOUT ANY
13 // WARRANTY; without even the implied warranty of MERCHANTABILITY or
14 // FITNESS FOR A PARTICULAR PURPOSE.
15 //
16 // See the GNU Lesser General Public License at <<http://www.gnu.org/licenses/lgpl-2.1.html>>
17 // for more details.
18 //
19 #pragma once
20 
21 #include "cafChildArrayFieldAccessor.h"
22 #include "cafFieldScriptingCapability.h"
23 #include "cafRpcClient.h"
24 
25 #include <limits>
26 
27 namespace caffa::rpc
28 {
30 {
31 public:
32  ChildArrayFieldAccessor( Client* client, caffa::FieldHandle* fieldHandle )
33  : caffa::ChildArrayFieldAccessor( fieldHandle )
34  , m_client( client )
35  {
36  }
37 
38  size_t size() const override
39  {
40  getRemoteObjectsIfNecessary();
41  return m_remoteObjects.size();
42  }
43 
44  void clear() override
45  {
46  m_client->clearChildObjects( m_field->ownerObject(), m_field->keyword() );
47 
48  std::vector<std::shared_ptr<ObjectHandle>> removedObjects;
49  removedObjects.swap( m_remoteObjects );
50  }
51 
52  std::vector<std::shared_ptr<ObjectHandle>> objects() override
53  {
54  getRemoteObjectsIfNecessary();
55  return m_remoteObjects;
56  }
57 
58  std::vector<std::shared_ptr<const ObjectHandle>> objects() const override
59  {
60  getRemoteObjectsIfNecessary();
61 
62  std::vector<std::shared_ptr<const ObjectHandle>> constPtrs;
63  for ( auto objectPtr : m_remoteObjects )
64  {
65  constPtrs.push_back( objectPtr );
66  }
67  return constPtrs;
68  }
69 
70  std::shared_ptr<ObjectHandle> at( size_t index ) const override
71  {
72  getRemoteObjectsIfNecessary();
73 
74  CAFFA_ASSERT( index < m_remoteObjects.size() );
75 
76  return m_remoteObjects[index];
77  }
78 
79  void insert( size_t index, std::shared_ptr<ObjectHandle> pointer ) override
80  {
81  size_t oldSize = m_remoteObjects.size();
82  m_client->insertChildObject( m_field->ownerObject(), m_field->keyword(), index, pointer.get() );
83  m_remoteObjects.insert( m_remoteObjects.begin() + index, pointer );
84  CAFFA_ASSERT( m_remoteObjects.size() == ( oldSize + 1u ) );
85  }
86 
87  void push_back( std::shared_ptr<ObjectHandle> pointer ) override { insert( size(), pointer ); }
88 
89  size_t index( std::shared_ptr<const ObjectHandle> pointer ) const override
90  {
91  getRemoteObjectsIfNecessary();
92  for ( size_t i = 0; i < m_remoteObjects.size(); ++i )
93  {
94  if ( pointer.get() == m_remoteObjects[i].get() )
95  {
96  return i;
97  }
98  }
99  return std::numeric_limits<size_t>::max();
100  }
101  void remove( size_t index ) override
102  {
103  CAFFA_ASSERT( index < size() );
104  m_remoteObjects.erase( m_remoteObjects.begin() + index );
105  m_client->removeChildObject( m_field->ownerObject(), m_field->keyword(), index );
106  }
107 
108  bool hasGetter() const override
109  {
110  auto scriptability = m_field->capability<caffa::FieldScriptingCapability>();
111  return scriptability && scriptability->isReadable();
112  }
113 
114  bool hasSetter() const override
115  {
116  auto scriptability = m_field->capability<caffa::FieldScriptingCapability>();
117  return scriptability && scriptability->isWritable();
118  }
119 
120 private:
121  // TODO: This needs to be more sophisticated. At the moment we get the remote objects no matter what.
122  void getRemoteObjectsIfNecessary() const
123  {
124  m_remoteObjects = m_client->getChildObjects( m_field->ownerObject(), m_field->keyword() );
125  }
126 
127 private:
128  Client* m_client;
129 
130  mutable std::vector<std::shared_ptr<ObjectHandle>> m_remoteObjects;
131 };
132 
133 } // namespace caffa::rpc
Definition: cafRpcChildArrayFieldAccessor.h:29
Definition: cafRpcClient.h:37
bool hasSetter() const override
Definition: cafRpcChildArrayFieldAccessor.h:114
Definition: cafFieldScriptingCapability.h:49
bool hasGetter() const override
Definition: cafRpcChildArrayFieldAccessor.h:108
Base class for all fields, making it possible to handle them generically.
Definition: cafFieldHandle.h:19
Definition: cafChildArrayFieldAccessor.h:29
Definition: cafRestAppService.h:28