Friendly LWM2M client
Object.cpp
Go to the documentation of this file.
1 #include "Object.h"
2 #include "WppClient.h"
3 
4 namespace wpp {
5 
6 Object::Object(lwm2m_context_t &context) : _context(context) {}
7 
8 Object::Object(lwm2m_context_t &context, const ObjectInfo &info): _context(context), _objInfo(info) {
9  WPP_LOGD(TAG_WPP_OBJ, "Creating object with ID -> %d", (ID_T)info.objID);
10 
11  // Initialising core object representation
13  _lwm2m_object.instanceList = NULL;
14  _lwm2m_object.versionMajor = _objInfo.objVersion.major;
15  _lwm2m_object.versionMinor = _objInfo.objVersion.minor;
16  _lwm2m_object.userData = this;
17 
19  else _lwm2m_object.readFunc = NULL;
21  else _lwm2m_object.discoverFunc = NULL;
23  else _lwm2m_object.writeFunc = NULL;
25  else _lwm2m_object.executeFunc = NULL;
27  else _lwm2m_object.createFunc = NULL;
29  else _lwm2m_object.deleteFunc = NULL;
30 }
31 
33  clear();
34  _lwm2m_object.userData = NULL;
35 }
36 
38  return _objInfo.objID;
39 }
40 
41 lwm2m_object_t& Object::getLwm2mObject() {
42  return _lwm2m_object;
43 }
44 
46  return _objInfo;
47 }
48 
49 lwm2m_context_t& Object::getContext() {
50  return _context;
51 }
52 
54  return *static_cast<wpp::WppClient *>(getContext().userData);
55 }
56 
58  return static_cast<wpp::WppClient *>(getContext().userData)->registry();
59 }
60 
61 void Object::clear() {
62  WPP_LOGD(TAG_WPP_OBJ, "Clearing object with ID -> %d", getObjectID());
63  // Deleting registered instances from core object
64  while (_lwm2m_object.instanceList != NULL) {
65  lwm2m_list_t * instance = (lwm2m_list_t *)_lwm2m_object.instanceList;
66  ID_T id = instance->id;
67 
68  _lwm2m_object.instanceList = _lwm2m_object.instanceList->next;
69  delete instance;
70 
71  // Update server registration
72  lwm2m_update_registration(&getContext(), 0, false, true);
73 
74  auto inst = getInstIter(id);
75  if (inst == _instances.end()) continue;
76 
77  delete *inst;
78  _instances.erase(inst);
79  }
80 }
81 
82 bool Object::remove(ID_T instanceId) {
83  // If user want to delete instance with ID that does not exist, then we can not do it
84  auto inst = getInstIter(instanceId);
85  if (inst == _instances.end()) return false;
86 
87  WPP_LOGD(TAG_WPP_OBJ, "Removing instance %d:%d", getObjectID(), instanceId);
88  // Deleting registered instance from core object
89  lwm2m_list_t *element = NULL;
90  _lwm2m_object.instanceList = LWM2M_LIST_RM(_lwm2m_object.instanceList, instanceId, (lwm2m_list_t **)&element);
91  if (NULL != element) delete element;
92 
93  delete *inst;
94  _instances.erase(inst);
95 
96  // Update server registration
97  lwm2m_update_registration(&getContext(), 0, false, true);
98 
99  return true;
100 }
101 
103  // If user want to access instance with ID that does not exist, then we can not do that
104  auto inst = (instanceID != ID_T_MAX_VAL)? getInstIter(instanceID) : _instances.begin();
105  return inst != _instances.end()? *inst : NULL;
106 }
107 
108 const std::vector<Instance*> & Object::instances() {
109  return _instances;
110 }
111 
113  return _instances.size();
114 }
115 
116 bool Object::isExist(ID_T instanceID) {
117  return getInstIter(instanceID) != _instances.end();
118 }
119 
120 std::vector<Instance*>::iterator Object::getInstIter(ID_T instanceID) {
121  auto finder = [instanceID](const Instance *inst) -> bool { return inst->getInstanceID() == instanceID; };
122  return std::find_if(_instances.begin(), _instances.end(), finder);
123 }
124 
126  // Usually, each subsequent free index will be equal to the number of created objects
127  if (!isExist(_instances.size())) return _instances.size();
128  // If there are no free indexes, we will search for the first free index
129  ID_T id = 0;
130  while (isExist(id) && id != ID_T_MAX_VAL) id++;
131  return id;
132 }
133 
134 /* ------------- Lwm2m core callback ------------- */
135 uint8_t Object::serverRead_clb(lwm2m_context_t * contextP, lwm2m_server_t *server, ID_T instanceId, int * numDataP, lwm2m_data_t ** dataArrayP, lwm2m_object_t * objectP) {
136  Object *obj = static_cast<Object *>(objectP->userData);
137  WPP_LOGD(TAG_WPP_OBJ, "wakaama read %d:%d", obj->getObjectID(), instanceId);
138  if (!obj->isExist(instanceId)) return COAP_404_NOT_FOUND;
139  return obj->instance(instanceId)->readAsServer(server, numDataP, dataArrayP);
140 }
141 
142 uint8_t Object::serverWrite_clb(lwm2m_context_t * contextP, lwm2m_server_t *server, ID_T instanceId, int numData, lwm2m_data_t * dataArray, lwm2m_object_t * objectP, lwm2m_write_type_t writeType) {
143  Object *obj = static_cast<Object *>(objectP->userData);
144  WPP_LOGD(TAG_WPP_OBJ, "wakaama write %d:%d", obj->getObjectID(), instanceId);
145  if (!obj->isExist(instanceId)) return COAP_404_NOT_FOUND;
146  return obj->instance(instanceId)->writeAsServer(server, numData, dataArray, writeType);
147 }
148 
149 uint8_t Object::serverExecute_clb(lwm2m_context_t * contextP, lwm2m_server_t *server, ID_T instanceId, ID_T resId, uint8_t * buffer, int length, lwm2m_object_t * objectP) {
150  Object *obj = static_cast<Object *>(objectP->userData);
151  WPP_LOGD(TAG_WPP_OBJ, "wakaama execute %d:%d", obj->getObjectID(), instanceId);
152  if (!obj->isExist(instanceId)) return COAP_404_NOT_FOUND;
153  return obj->instance(instanceId)->executeAsServer(server, resId, buffer, length);
154 }
155 
156 uint8_t Object::serverDiscover_clb(lwm2m_context_t * contextP, lwm2m_server_t *server, ID_T instanceId, int * numDataP, lwm2m_data_t ** dataArrayP, lwm2m_object_t * objectP) {
157  Object *obj = static_cast<Object *>(objectP->userData);
158  WPP_LOGD(TAG_WPP_OBJ, "wakaama discover %d:%d", obj->getObjectID(), instanceId);
159  if (!obj->isExist(instanceId)) return COAP_404_NOT_FOUND;
160  return obj->instance(instanceId)->discoverAsServer(server, numDataP, dataArrayP);
161 }
162 
163 uint8_t Object::serverCreate_clb(lwm2m_context_t * contextP, lwm2m_server_t *server, ID_T instanceId, int numData, lwm2m_data_t * dataArray, lwm2m_object_t * objectP) {
164  Object *obj = static_cast<Object *>(objectP->userData);
165  WPP_LOGD(TAG_WPP_OBJ, "wakaama create %d:%d", obj->getObjectID(), instanceId);
166  if (!obj->createInstance(instanceId)) return COAP_500_INTERNAL_SERVER_ERROR;
167  // Notify user about creating instance
168  obj->operationNotify(*obj, instanceId, ItemOp::CREATE);
169 
170  uint8_t result = serverWrite_clb(contextP, server, instanceId, numData, dataArray, objectP, LWM2M_WRITE_REPLACE_RESOURCES);
171  if (result != COAP_204_CHANGED) {
172  serverDelete_clb(contextP, server, instanceId, objectP);
173  return result;
174  }
175 
176  return COAP_201_CREATED;
177 }
178 
179 uint8_t Object::serverDelete_clb(lwm2m_context_t * contextP, lwm2m_server_t *server, ID_T instanceId, lwm2m_object_t * objectP) {
180  Object *obj = static_cast<Object *>(objectP->userData);
181  WPP_LOGD(TAG_WPP_OBJ, "wakaama delete %d:%d", obj->getObjectID(), instanceId);
182  if (!obj->isExist(instanceId)) return COAP_404_NOT_FOUND;
183  // Notify user about deleting instance
184  obj->operationNotify(*obj, instanceId, ItemOp::DELETE);
185 
186  return obj->remove(instanceId)? COAP_202_DELETED : COAP_404_NOT_FOUND;
187 }
188 
189 } // namespace wpp
#define TAG_WPP_OBJ
Definition: WppLogs.h:11
#define WPP_LOGD(TAG, FMT,...)
Definition: WppLogs.h:31
#define ID_T_MAX_VAL
Definition: WppTypes.h:16
Instance is interface class that implements manipulation with derived class resources....
Definition: Instance.h:40
uint8_t readAsServer(lwm2m_server_t *server, int *numDataP, lwm2m_data_t **dataArray)
This methods is called by the core when the server wants to read, write, discover,...
Definition: Instance.cpp:423
uint8_t discoverAsServer(lwm2m_server_t *server, int *numDataP, lwm2m_data_t **dataArray)
Definition: Instance.cpp:513
uint8_t executeAsServer(lwm2m_server_t *server, ID_T resId, uint8_t *buffer, int length)
Definition: Instance.cpp:491
uint8_t writeAsServer(lwm2m_server_t *server, int numData, lwm2m_data_t *dataArray, lwm2m_write_type_t writeType)
Definition: Instance.cpp:467
void operationNotify(Object &obj, ID_T instanceId, ItemOp::TYPE type)
Notifies observers about object operations.
Definition: ObjSubject.h:53
The Object class implements manipulation with Instance interface class and its inheritors.
Definition: Object.h:32
Instance * instance(ID_T instanceID=ID_T_MAX_VAL)
Gets an instance of the object.
Definition: Object.cpp:102
static uint8_t serverRead_clb(lwm2m_context_t *contextP, lwm2m_server_t *server, ID_T instanceId, int *numDataP, lwm2m_data_t **dataArrayP, lwm2m_object_t *objectP)
The read callback function for the Lwm2m core.
Definition: Object.cpp:135
size_t instanceCnt()
Gets the number of instances of the object.
Definition: Object.cpp:112
const std::vector< Instance * > & instances()
Gets all instances of the object.
Definition: Object.cpp:108
ObjectInfo _objInfo
Definition: Object.h:249
virtual Instance * createInstance(ID_T instanceID=ID_T_MAX_VAL)=0
Creates an instance of the object.
lwm2m_context_t & _context
Definition: Object.h:247
lwm2m_object_t _lwm2m_object
Definition: Object.h:248
ID_T getFirstAvailableInstanceID()
Gets the first available instance ID.
Definition: Object.cpp:125
lwm2m_object_t & getLwm2mObject()
Gets the lwm2m_object_t object.
Definition: Object.cpp:41
WppRegistry & getRegistry()
Helpfull methods to get registry instances.
Definition: Object.cpp:57
bool remove(ID_T instanceID)
Removes an instance of the object.
Definition: Object.cpp:82
lwm2m_context_t & getContext()
Return context that can be used by derived class.
Definition: Object.cpp:49
static uint8_t serverExecute_clb(lwm2m_context_t *contextP, lwm2m_server_t *server, ID_T instanceId, ID_T resId, uint8_t *buffer, int length, lwm2m_object_t *objectP)
The execute callback function for the Lwm2m core.
Definition: Object.cpp:149
OBJ_ID getObjectID() const
Gets the object ID.
Definition: Object.cpp:37
static uint8_t serverWrite_clb(lwm2m_context_t *contextP, lwm2m_server_t *server, ID_T instanceId, int numData, lwm2m_data_t *dataArray, lwm2m_object_t *objectP, lwm2m_write_type_t writeType)
The write callback function for the Lwm2m core.
Definition: Object.cpp:142
virtual ~Object()
Destroys the Object instance.
Definition: Object.cpp:32
void clear()
Clears the object.
Definition: Object.cpp:61
static uint8_t serverDiscover_clb(lwm2m_context_t *contextP, lwm2m_server_t *server, ID_T instanceId, int *numDataP, lwm2m_data_t **dataArrayP, lwm2m_object_t *objectP)
The discover callback function for the Lwm2m core.
Definition: Object.cpp:156
static uint8_t serverCreate_clb(lwm2m_context_t *contextP, lwm2m_server_t *server, ID_T instanceId, int numData, lwm2m_data_t *dataArray, lwm2m_object_t *objectP)
The create callback function for the Lwm2m core.
Definition: Object.cpp:163
static uint8_t serverDelete_clb(lwm2m_context_t *contextP, lwm2m_server_t *server, ID_T instanceId, lwm2m_object_t *objectP)
The delete callback function for the Lwm2m core.
Definition: Object.cpp:179
WppClient & getClient()
Helpfull methods to get client instances.
Definition: Object.cpp:53
bool isExist(ID_T instanceID)
Checks if an instance exists.
Definition: Object.cpp:116
const ObjectInfo & getObjectInfo() const
Gets the object information.
Definition: Object.cpp:45
std::vector< Instance * >::iterator getInstIter(ID_T instanceID)
Gets the iterator to the instance.
Definition: Object.cpp:120
std::vector< Instance * > _instances
Definition: Object.h:246
Represents a client interface for Wpp library.
Definition: WppClient.h:37
The WppRegistry class represents a registry for managing LWM2M objects.
Definition: WppRegistry.h:53
The WppConnection class represents a connection interface for the Wpp library.
Definition: WppClient.cpp:14
uint16_t ID_T
Definition: WppTypes.h:15
OBJ_ID
Enumeration of object IDs in the Wpp library.
Definition: ObjectID.h:14
bool isCreate() const
Checks if the operation is of type CREATE.
Definition: ItemOp.h:98
bool isExecute() const
Checks if the ItemOp object represents an execute operation.
Definition: ItemOp.h:84
bool isDiscover() const
Checks if the ItemOp object represents a discover operation.
Definition: ItemOp.h:91
bool isWrite() const
Checks if the ItemOp object represents a write operation.
Definition: ItemOp.h:77
bool isRead() const
Checks if the ItemOp object represents a read operation.
Definition: ItemOp.h:70
bool isDelete() const
Checks if the operation is of type DELETE.
Definition: ItemOp.h:105
@ DELETE
Definition: ItemOp.h:36
@ CREATE
Definition: ItemOp.h:35
The ObjectInfo struct represents information about an object in the Wakaama data model.
Definition: ObjectInfo.h:16
Version objVersion
Definition: ObjectInfo.h:20
ItemOp operations
Definition: ObjectInfo.h:24
uint8_t major
Definition: WppTypes.h:123
uint8_t minor
Definition: WppTypes.h:124