Friendly LWM2M client
ResourceContainer.h
Go to the documentation of this file.
1 #ifndef WPP_RESOURCE_CONTAINER_H
2 #define WPP_RESOURCE_CONTAINER_H
3 
4 #include <vector>
5 
6 #include "Resource.h"
7 #include "ItemOp.h"
8 #include "WppTypes.h"
9 #include "WppLogs.h"
10 
11 namespace wpp {
12 
14 public:
15  ResourceContainer() = default;
16  virtual ~ResourceContainer() = default;
17 
22  bool isSingle(ID_T resId);
23 
28  bool isMultiple(ID_T resId);
29 
35  bool isExist(ID_T resId);
36 
44  bool isExist(ID_T resId, ID_T resInstId);
45 
52  size_t instCount(ID_T resId);
53 
60  std::vector<ID_T> instIds(ID_T resId);
61 
68  ID_T newInstId(ID_T resId);
69 
78  template<typename T>
79  bool set(ID_T resId, const T &value);
80 
90  template<typename T>
91  bool set(ID_T resId, ID_T resInstId, const T &value);
92 
101  template<typename T>
102  bool set(ID_T resId, T &&value);
103 
113  template<typename T>
114  bool set(ID_T resId, ID_T resInstId, T &&value);
115 
131  template<typename T>
132  const T& get(ID_T resId, ID_T resInstId = SINGLE_INSTANCE_ID);
133 
147  template<typename T>
148  bool add(ID_T resId, const T &value);
149 
163  template<typename T>
164  bool add(ID_T resId, T &&value);
165 
173  bool removeRes(ID_T resId, ID_T resInstId);
174 
180  bool clearRes(ID_T resId);
181 
182 protected:
186  void setupResources(const std::vector<Resource> &resources);
187  void setupResources(std::vector<Resource> &&resources);
188 
195  Resource * resource(ID_T resId);
196 
200  std::vector<Resource> & resources();
201 
207  virtual void resourceOperationNotifier(ItemOp::TYPE type, ID_T resId, ID_T resInstId) = 0;
208 
209 private:
210  std::vector<Resource> _resources;
211 };
212 
213 /* ---------- Implementation of template methods ----------*/
214 template<typename T>
215 bool ResourceContainer::set(ID_T resId, const T &value) {
216  return set(resId, SINGLE_INSTANCE_ID, value);
217 }
218 
219 template<typename T>
220 bool ResourceContainer::set(ID_T resId, ID_T resInstId, const T &value) {
221  auto res = resource(resId);
222  if (res == NULL) {
223  WPP_LOGW(TAG_WPP_RES_CON, "Resource[%d] not found", resId);
224  return false;
225  }
226  if (!res->set(value, resInstId)) {
227  WPP_LOGW(TAG_WPP_RES_CON, "Resource[%d] operation failed", resId);
228  return false;
229  }
230  resourceOperationNotifier(ItemOp::WRITE, resId, res->isSingle()? ID_T_MAX_VAL : resInstId);
231  return true;
232 }
233 
234 template<typename T>
235 bool ResourceContainer::set(ID_T resId, T &&value) {
236  return set(resId, SINGLE_INSTANCE_ID, std::move(value));
237 }
238 
239 template<typename T>
240 bool ResourceContainer::set(ID_T resId, ID_T resInstId, T &&value) {
241  auto res = resource(resId);
242  if (res == NULL) {
243  WPP_LOGW(TAG_WPP_RES_CON, "Resource[%d] not found", resId);
244  return false;
245  }
246  if (!res->set(std::move(value), resInstId)) {
247  WPP_LOGW(TAG_WPP_RES_CON, "Resource[%d] operation failed", resId);
248  return false;
249  }
250  resourceOperationNotifier(ItemOp::WRITE, resId, res->isSingle()? ID_T_MAX_VAL : resInstId);
251  return true;
252 }
253 
254 template<typename T>
255 const T& ResourceContainer::get(ID_T resId, ID_T resInstId) {
256  auto res = resource(resId);
257  if (res == NULL) {
258  WPP_LOGE(TAG_WPP_RES, "Resource[%d] does not exist", resId);
259  // TODO: It is workaround for the case when resource is not found
260  // This behavior is better than returning NULL, but it is not the best solution
261  // Return empty value if the data type is not valid or the instance does not exist
262  static T empty;
263  return empty;
264  }
265  return res->get<T>(resInstId);
266 }
267 
268 template<typename T>
269 bool ResourceContainer::add(ID_T resId, const T &value) {
270  auto res = resource(resId);
271  if (res == NULL) {
272  WPP_LOGW(TAG_WPP_RES_CON, "Resource[%d] not found", resId);
273  return false;
274  }
275  if (res->isSingle()) {
276  WPP_LOGE(TAG_WPP_RES_CON, "Resource[%d] is SINGLE", resId);
277  return false;
278  }
279 
280  ID_T newId = res->newInstId();
281  if (newId == ID_T_MAX_VAL) {
282  WPP_LOGW(TAG_WPP_RES_CON, "Resource[%d] new instance ID not found", resId);
283  return false;
284  }
285  if (!res->set(value, newId)) {
286  WPP_LOGW(TAG_WPP_RES_CON, "Resource[%d] operation failed", resId);
287  return false;
288  }
290  return true;
291 }
292 
293 template<typename T>
294 bool ResourceContainer::add(ID_T resId, T &&value) {
295  auto res = resource(resId);
296  if (res == NULL) {
297  WPP_LOGW(TAG_WPP_RES_CON, "Resource[%d] not found", resId);
298  return false;
299  }
300  if (res->isSingle()) {
301  WPP_LOGE(TAG_WPP_RES_CON, "Resource[%d] is SINGLE", resId);
302  return false;
303  }
304 
305  ID_T newId = res->newInstId();
306  if (newId == ID_T_MAX_VAL) {
307  WPP_LOGW(TAG_WPP_RES_CON, "Resource[%d] new instance ID not found", resId);
308  return false;
309  }
310  WPP_LOGD(TAG_WPP_RES_CON, "Resource[%d] new instance ID: %d", resId, newId);
311  if (!res->set(std::move(value), newId)) {
312  WPP_LOGW(TAG_WPP_RES_CON, "Resource[%d] operation failed", resId);
313  return false;
314  }
316  return true;
317 }
318 
319 } /* namespace wpp */
320 
321 #endif // WPP_RESOURCE_CONTAINER_H
#define TAG_WPP_RES
Definition: WppLogs.h:13
#define TAG_WPP_RES_CON
Definition: WppLogs.h:14
#define WPP_LOGE(TAG, FMT,...)
Definition: WppLogs.h:49
#define WPP_LOGW(TAG, FMT,...)
Definition: WppLogs.h:43
#define WPP_LOGD(TAG, FMT,...)
Definition: WppLogs.h:31
#define SINGLE_INSTANCE_ID
Definition: WppTypes.h:13
#define ID_T_MAX_VAL
Definition: WppTypes.h:16
void setupResources(const std::vector< Resource > &resources)
This methods setup resources list.
virtual ~ResourceContainer()=default
Resource * resource(ID_T resId)
This method return resource ptr if it exists. If resources does not exist then return NULL.
std::vector< ID_T > instIds(ID_T resId)
Returns vector with available ids of resource instances.
std::vector< Resource > & resources()
This method return list with all resources that has been defined.
size_t instCount(ID_T resId)
Get the number of resource instances.
virtual void resourceOperationNotifier(ItemOp::TYPE type, ID_T resId, ID_T resInstId)=0
This method must be implemented by the derived class, and handle information about resource operation...
bool removeRes(ID_T resId, ID_T resInstId)
Remove resource instance if resource is MULTIPLE and instance exists, if the resource is SINGLE remov...
bool clearRes(ID_T resId)
Remove all instances.
bool add(ID_T resId, const T &value)
Add new instance with data value by copy for the MULTIPLE resource.
bool isMultiple(ID_T resId)
Check if the resource is MULTIPLE.
ID_T newInstId(ID_T resId)
Find first available instance ID that is not used.
bool isExist(ID_T resId)
Check if the instance ID is exist.
bool isSingle(ID_T resId)
Check if the resource is SINGLE.
bool set(ID_T resId, const T &value)
Set data value by copy for the resource.
const T & get(ID_T resId, ID_T resInstId=SINGLE_INSTANCE_ID)
The Resource class in the wpp namespace is a comprehensive and flexible class designed to handle diff...
Definition: Resource.h:49
The WppConnection class represents a connection interface for the Wpp library.
Definition: WppClient.cpp:14
uint16_t ID_T
Definition: WppTypes.h:15
TYPE
Enum representing the different types of operations.
Definition: ItemOp.h:29