Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
m2mbase.h
00001 /* 00002 * Copyright (c) 2015 ARM Limited. All rights reserved. 00003 * SPDX-License-Identifier: Apache-2.0 00004 * Licensed under the Apache License, Version 2.0 (the License); you may 00005 * not use this file except in compliance with the License. 00006 * You may obtain a copy of the License at 00007 * 00008 * http://www.apache.org/licenses/LICENSE-2.0 00009 * 00010 * Unless required by applicable law or agreed to in writing, software 00011 * distributed under the License is distributed on an AS IS BASIS, WITHOUT 00012 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 00013 * See the License for the specific language governing permissions and 00014 * limitations under the License. 00015 */ 00016 #ifndef M2M_BASE_H 00017 #define M2M_BASE_H 00018 00019 // Support for std args 00020 #include <stdint.h> 00021 #include "mbed-client/m2mconfig.h" 00022 #include "mbed-client/m2mreportobserver.h" 00023 #include "mbed-client/functionpointer.h" 00024 #include "mbed-client/m2mstringbuffer.h" 00025 #ifdef ENABLE_ASYNC_REST_RESPONSE 00026 #include "mbed-client/coap_response.h" 00027 #endif 00028 #include "nsdl-c/sn_nsdl.h" 00029 #include "sn_coap_header.h" 00030 #include "nsdl-c/sn_nsdl_lib.h" 00031 00032 //FORWARD DECLARATION 00033 struct sn_coap_hdr_; 00034 typedef sn_coap_hdr_ sn_coap_hdr_s; 00035 struct nsdl_s; 00036 struct sn_nsdl_addr_; 00037 typedef sn_nsdl_addr_ sn_nsdl_addr_s; 00038 00039 typedef FP1<void, const char*> value_updated_callback; 00040 typedef void(*value_updated_callback2) (const char* object_name); 00041 class M2MObservationHandler; 00042 class M2MReportHandler; 00043 00044 class M2MObjectInstance; 00045 class M2MObject; 00046 class M2MResource; 00047 class M2MEndpoint; 00048 00049 00050 /*! \file m2mbase.h 00051 * \brief M2MBase. 00052 * This class is the base class based on which all LWM2M object models 00053 * can be created. 00054 * 00055 * This serves as a base class for Objects, ObjectInstances and Resources. 00056 */ 00057 00058 /*! \class M2MBase 00059 * \brief The base class based on which all LwM2M object models can be created. 00060 * 00061 * It serves as the base class for Objects, ObjectInstances and Resources. 00062 */ 00063 class M2MBase : public M2MReportObserver { 00064 00065 public: 00066 00067 /** 00068 * \brief Enum to define the type of object. 00069 */ 00070 typedef enum { 00071 Object = 0x0, 00072 Resource = 0x1, 00073 ObjectInstance = 0x2, 00074 ResourceInstance = 0x3 00075 #ifdef MBED_CLOUD_CLIENT_EDGE_EXTENSION 00076 ,ObjectDirectory = 0x4 00077 #endif 00078 } BaseType; 00079 00080 /** 00081 * \brief Enum to define observation level. 00082 */ 00083 typedef enum { 00084 None = 0x0, 00085 R_Attribute = 0x01, 00086 OI_Attribute = 0x02, 00087 OIR_Attribute = 0x03, 00088 O_Attribute = 0x04, 00089 OR_Attribute = 0x05, 00090 OOI_Attribute = 0x06, 00091 OOIR_Attribute = 0x07 00092 } Observation; 00093 00094 00095 /** 00096 * \brief Enum defining a resource type. 00097 */ 00098 typedef enum { 00099 Static, 00100 Dynamic, 00101 Directory 00102 }Mode; 00103 00104 /** 00105 * \brief Enum defining a resource data type. 00106 */ 00107 typedef enum { 00108 STRING, 00109 INTEGER, 00110 FLOAT, 00111 BOOLEAN, 00112 OPAQUE, 00113 TIME, 00114 OBJLINK 00115 }DataType; 00116 00117 /** 00118 * \brief Enum defining an operation that can be 00119 * supported by a given resource. 00120 */ 00121 typedef enum { 00122 NOT_ALLOWED = 0x00, 00123 GET_ALLOWED = 0x01, 00124 PUT_ALLOWED = 0x02, 00125 GET_PUT_ALLOWED = 0x03, 00126 POST_ALLOWED = 0x04, 00127 GET_POST_ALLOWED = 0x05, 00128 PUT_POST_ALLOWED = 0x06, 00129 GET_PUT_POST_ALLOWED = 0x07, 00130 DELETE_ALLOWED = 0x08, 00131 GET_DELETE_ALLOWED = 0x09, 00132 PUT_DELETE_ALLOWED = 0x0A, 00133 GET_PUT_DELETE_ALLOWED = 0x0B, 00134 POST_DELETE_ALLOWED = 0x0C, 00135 GET_POST_DELETE_ALLOWED = 0x0D, 00136 PUT_POST_DELETE_ALLOWED = 0x0E, 00137 GET_PUT_POST_DELETE_ALLOWED = 0x0F 00138 }Operation; 00139 00140 /** 00141 * \brief Enum defining an status codes that can happen when 00142 * sending confirmable message. 00143 */ 00144 typedef enum { 00145 MESSAGE_STATUS_INIT = 0, // Initial state. 00146 MESSAGE_STATUS_BUILD_ERROR, // CoAP message building fails. 00147 MESSAGE_STATUS_RESEND_QUEUE_FULL, // CoAP resend queue full. 00148 MESSAGE_STATUS_SENT, // Message sent to the server but ACK not yet received. 00149 MESSAGE_STATUS_DELIVERED, // Received ACK from server. 00150 MESSAGE_STATUS_SEND_FAILED, // Message sending failed. 00151 MESSAGE_STATUS_SUBSCRIBED, // Server has started the observation 00152 MESSAGE_STATUS_UNSUBSCRIBED, // Server has stopped the observation (RESET message or GET with observe 1) 00153 MESSAGE_STATUS_REJECTED // Server has rejected the response 00154 } MessageDeliveryStatus; 00155 00156 typedef enum { 00157 NOTIFICATION = 0, 00158 DELAYED_POST_RESPONSE, 00159 BLOCK_SUBSCRIBE, 00160 PING, 00161 #ifdef ENABLE_ASYNC_REST_RESPONSE 00162 DELAYED_RESPONSE, 00163 #endif // ENABLE_ASYNC_REST_RESPONSE 00164 } MessageType; 00165 00166 enum MaxPathSize { 00167 MAX_NAME_SIZE = 64, 00168 MAX_INSTANCE_SIZE = 5, 00169 00170 MAX_PATH_SIZE = ((MAX_NAME_SIZE * 2) + (MAX_INSTANCE_SIZE * 2) + 3 + 1), 00171 MAX_PATH_SIZE_2 = ((MAX_NAME_SIZE * 2) + MAX_INSTANCE_SIZE + 2 + 1), 00172 MAX_PATH_SIZE_3 = (MAX_NAME_SIZE + (MAX_INSTANCE_SIZE * 2) + 2 + 1), 00173 MAX_PATH_SIZE_4 = (MAX_NAME_SIZE + MAX_INSTANCE_SIZE + 1 + 1) 00174 }; 00175 00176 // The setter for this callback (set_notification_delivery_status_cb()) is in m2m_deprecated 00177 // category, but it can not be used here as then the GCC will scream for the declaration of 00178 // setter, not just from references of it. 00179 typedef void(*notification_delivery_status_cb) (const M2MBase& base, 00180 const NotificationDeliveryStatus status, 00181 void *client_args); 00182 00183 typedef void(*message_delivery_status_cb) (const M2MBase& base, 00184 const MessageDeliveryStatus status, 00185 const MessageType type, 00186 void *client_args); 00187 00188 #ifdef ENABLE_ASYNC_REST_RESPONSE 00189 /** 00190 * \brief Type definition for an asynchronous CoAP request callback function. 00191 * \param operation The operation, for example M2MBase::PUT_ALLOWED. 00192 * \param token The token. Client needs to copy this if it cannot respond immediately. 00193 * \param token_len The length of the token. 00194 * \param buffer The payload of the request. Client needs to copy this if it cannot respond immediately. 00195 * \param buffer_size The size of the payload. 00196 * \param client_args Some pointer given by client when requesting asynchronus request callback using 00197 * set_async_coap_request_cb. 00198 */ 00199 typedef void (*handle_async_coap_request_cb)(const M2MBase &base, 00200 M2MBase::Operation operation, 00201 const uint8_t *token, 00202 const uint8_t token_len, 00203 const uint8_t *buffer, 00204 size_t buffer_size, 00205 void *client_args); 00206 #endif // ENABLE_ASYNC_REST_RESPONSE 00207 00208 /*! \brief LwM2M parameters. 00209 */ 00210 typedef struct lwm2m_parameters { 00211 //add multiple_instances 00212 uint32_t max_age; // todo: add flag 00213 /*! \union identifier 00214 * \brief Parameter identifier. 00215 */ 00216 union { 00217 char* name; //for backwards compatibility 00218 uint16_t instance_id; // XXX: this is not properly aligned now, need to reorder these after the elimination is done 00219 } identifier; 00220 sn_nsdl_dynamic_resource_parameters_s *dynamic_resource_params; 00221 BaseType base_type : 3; 00222 M2MBase::DataType data_type : 3; 00223 bool multiple_instance; 00224 bool free_on_delete; /**< \brief true if struct is dynamically allocated and it 00225 and its members (name) are to be freed on destructor. 00226 \note The `sn_nsdl_dynamic_resource_parameters_s` has 00227 its own similar, independent flag. 00228 00229 \note This also serves as a read-only flag. */ 00230 bool identifier_int_type; 00231 bool read_write_callback_set; /**< \brief If set, all the read and write operations are handled in callbacks 00232 and the resource value is not stored anymore in M2MResourceBase. */ 00233 } lwm2m_parameters_s; 00234 00235 protected: 00236 00237 // Prevents the use of default constructor. 00238 M2MBase(); 00239 00240 // Prevents the use of assignment operator. 00241 M2MBase& operator=( const M2MBase& /*other*/ ); 00242 00243 // Prevents the use of copy constructor 00244 M2MBase( const M2MBase& /*other*/ ); 00245 00246 /** 00247 * \brief Constructor 00248 * \param name Name of the object created. 00249 * \param mode Type of the resource. 00250 * \param resource_type Textual information of resource. 00251 * \param path Path of the object like 3/0/1 00252 * \param external_blockwise_store If true CoAP blocks are passed to application through callbacks 00253 * otherwise handled in mbed-client-c. 00254 */ 00255 M2MBase(const String &name, 00256 M2MBase::Mode mode, 00257 #ifndef DISABLE_RESOURCE_TYPE 00258 const String &resource_type, 00259 #endif 00260 char *path, 00261 bool external_blockwise_store, 00262 bool multiple_instance, 00263 M2MBase::DataType type = M2MBase::OBJLINK); 00264 00265 M2MBase(const lwm2m_parameters_s* s); 00266 00267 public: 00268 00269 /** 00270 * \brief Destructor 00271 */ 00272 virtual ~M2MBase(); 00273 00274 /** 00275 * \brief Sets the operation type for an object. 00276 * \param operation The operation to be set. 00277 */ 00278 void set_operation(M2MBase::Operation operation); 00279 00280 #if !defined(MEMORY_OPTIMIZED_API) || defined(RESOURCE_ATTRIBUTES_LIST) 00281 /** 00282 * \brief Sets the interface description of the object. 00283 * \param description The description to be set. 00284 */ 00285 #if !defined(DISABLE_INTERFACE_DESCRIPTION) || defined(RESOURCE_ATTRIBUTES_LIST) 00286 void set_interface_description(const String &description); 00287 00288 /** 00289 * \brief Sets the interface description of the object. 00290 * \param description The description to be set. 00291 */ 00292 void set_interface_description(const char *description); 00293 00294 /** 00295 * \brief Returns the interface description of the object. 00296 * \return The interface description of the object. 00297 */ 00298 const char* interface_description() const; 00299 #endif 00300 #if !defined(DISABLE_RESOURCE_TYPE) || defined(RESOURCE_ATTRIBUTES_LIST) 00301 /** 00302 * \brief Sets the resource type of the object. 00303 * \param resource_type The resource type to be set. 00304 */ 00305 virtual void set_resource_type(const String &resource_type); 00306 00307 /** 00308 * \brief Sets the resource type of the object. 00309 * \param resource_type The resource type to be set. 00310 */ 00311 virtual void set_resource_type(const char *resource_type); 00312 00313 /** 00314 * \brief Returns the resource type of the object. 00315 * \return The resource type of the object. 00316 */ 00317 const char* resource_type() const; 00318 #endif 00319 #endif 00320 00321 /** 00322 * \brief Sets the CoAP content type of the object. 00323 * \param content_type The content type to be set based on 00324 * CoAP specifications. 00325 */ 00326 void set_coap_content_type(const uint16_t content_type); 00327 00328 /** 00329 * \brief Sets the observable mode for the object. 00330 * \param observable A value for the observation. 00331 */ 00332 void set_observable(bool observable); 00333 00334 /** 00335 * \brief Sets the object to be auto-observable. 00336 * 00337 * \note This is not a standard CoAP or LWM2M feature and it only works in mbed Cloud. 00338 * \note This must be called before registration process, since this info must be in a registration message. 00339 * \note Auto-observable will take higher precedence if both observable methods are set. 00340 * 00341 * \param auto_observable Is auto-obs feature enabled or not. 00342 */ 00343 void set_auto_observable(bool auto_observable); 00344 00345 /** 00346 * \brief Adds the observation level for the object. 00347 * \param observation_level The level of observation. 00348 */ 00349 virtual void add_observation_level(M2MBase::Observation observation_level); 00350 00351 /** 00352 * \brief Removes the observation level for the object. 00353 * \param observation_level The level of observation. 00354 */ 00355 virtual void remove_observation_level(M2MBase::Observation observation_level); 00356 00357 /** 00358 * \brief Sets the object under observation. 00359 * \param observed The value for observation. When true, starts observing. When false, the ongoing observation is cancelled. 00360 * \param handler A handler object for sending 00361 * observation callbacks. 00362 */ 00363 void set_under_observation(bool observed, 00364 M2MObservationHandler *handler); 00365 /** 00366 * \brief Returns the Observation Handler object. 00367 * \return M2MObservationHandler object. 00368 */ 00369 virtual M2MObservationHandler* observation_handler() const = 0; 00370 00371 /** 00372 * \brief Sets the observation handler 00373 * \param handler Observation handler 00374 */ 00375 virtual void set_observation_handler(M2MObservationHandler *handler) = 0; 00376 00377 /** 00378 * \brief Sets the instance ID of the object. 00379 * \param instance_id The instance ID of the object. 00380 */ 00381 void set_instance_id(const uint16_t instance_id); 00382 00383 /** 00384 * \brief Sets the max age for the resource value to be cached. 00385 * \param max_age The max age in seconds. 00386 */ 00387 void set_max_age(const uint32_t max_age); 00388 00389 /** 00390 * \brief Returns the object type. 00391 * \return The base type of the object. 00392 */ 00393 M2MBase::BaseType base_type() const; 00394 00395 /** 00396 * \brief Returns the operation type of the object. 00397 * \return The supported operation on the object. 00398 */ 00399 M2MBase::Operation operation() const; 00400 00401 /** 00402 * \brief Returns the object name. 00403 * \return The name of the object. 00404 */ 00405 const char* name() const; 00406 00407 /** 00408 * \brief Returns the object name in integer. 00409 * \return The name of the object in integer. 00410 */ 00411 int32_t name_id() const; 00412 00413 /** 00414 * \brief Returns the object's instance ID. 00415 * \returns The instance ID of the object. 00416 */ 00417 uint16_t instance_id() const; 00418 00419 /** 00420 * \brief Returns the path of the object. 00421 * \return The path of the object (eg. 3/0/1). 00422 */ 00423 const char* uri_path() const; 00424 00425 /** 00426 * \brief Returns the CoAP content type of the object. 00427 * \return The CoAP content type of the object. 00428 */ 00429 uint16_t coap_content_type() const; 00430 00431 /** 00432 * \brief Returns the observation status of the object. 00433 * \return True if observable, else false. 00434 */ 00435 bool is_observable() const; 00436 00437 /** 00438 * \brief Returns the auto observation status of the object. 00439 * \return True if observable, else false. 00440 */ 00441 bool is_auto_observable() const; 00442 00443 /** 00444 * \brief Returns the observation level of the object. 00445 * \return The observation level of the object. 00446 */ 00447 M2MBase::Observation observation_level() const; 00448 00449 /** 00450 * \brief Returns the mode of the resource. 00451 * \return The mode of the resource. 00452 */ 00453 Mode mode() const; 00454 00455 /** 00456 * \brief Returns the observation number. 00457 * \return The observation number of the object. 00458 */ 00459 uint16_t observation_number() const; 00460 00461 /** 00462 * \brief Returns the max age for the resource value to be cached. 00463 * \return The maax age in seconds. 00464 */ 00465 uint32_t max_age() const; 00466 00467 /** 00468 * \brief Parses the received query for the notification 00469 * attribute. 00470 * \param query The query that needs to be parsed. 00471 * \return True if required attributes are present, else false. 00472 */ 00473 virtual bool handle_observation_attribute(const char *query); 00474 00475 /** 00476 * \brief Handles GET request for the registered objects. 00477 * \param nsdl An NSDL handler for the CoAP library. 00478 * \param received_coap_header The received CoAP message from the server. 00479 * \param observation_handler A handler object for sending 00480 * observation callbacks. 00481 * \return sn_coap_hdr_s The message that needs to be sent to server. 00482 */ 00483 virtual sn_coap_hdr_s* handle_get_request(nsdl_s *nsdl, 00484 sn_coap_hdr_s *received_coap_header, 00485 M2MObservationHandler *observation_handler = NULL); 00486 /** 00487 * \brief Handles PUT request for the registered objects. 00488 * \param nsdl An NSDL handler for the CoAP library. 00489 * \param received_coap_header The received CoAP message from the server. 00490 * \param observation_handler A handler object for sending 00491 * observation callbacks. 00492 * \param execute_value_updated True executes the "value_updated" callback. 00493 * \return sn_coap_hdr_s The message that needs to be sent to server. 00494 */ 00495 virtual sn_coap_hdr_s* handle_put_request(nsdl_s *nsdl, 00496 sn_coap_hdr_s *received_coap_header, 00497 M2MObservationHandler *observation_handler, 00498 bool &execute_value_updated); 00499 00500 /** 00501 * \brief Handles GET request for the registered objects. 00502 * \param nsdl An NSDL handler for the CoAP library. 00503 * \param received_coap_header The received CoAP message from the server. 00504 * \param observation_handler A handler object for sending 00505 * observation callbacks. 00506 * \param execute_value_updated True executes the "value_updated" callback. 00507 * \return sn_coap_hdr_s The message that needs to be sent to server. 00508 */ 00509 virtual sn_coap_hdr_s* handle_post_request(nsdl_s *nsdl, 00510 sn_coap_hdr_s *received_coap_header, 00511 M2MObservationHandler *observation_handler, 00512 bool &execute_value_updated, 00513 sn_nsdl_addr_s *address = NULL); 00514 00515 /** 00516 * \brief Executes the function that is set in "set_notification_delivery_status_cb". 00517 * Note: the setter for this callback is marked as m2m_deprecated, but there is no point 00518 * having it here, as then the code will always give warnings. This simply must be there 00519 * until the set_notification_delivery_status_cb() is removed. 00520 */ 00521 void send_notification_delivery_status(const M2MBase& object, const NotificationDeliveryStatus status); 00522 00523 /** 00524 * \brief Executes the function that is set in "set_message_delivery_status_cb". 00525 */ 00526 void send_message_delivery_status(const M2MBase& object, const MessageDeliveryStatus status, const MessageType type); 00527 00528 /** 00529 * \brief Sets whether this resource is published to server or not. 00530 * \param register_uri True sets the resource as part of registration message. 00531 */ 00532 void set_register_uri(bool register_uri); 00533 00534 /** 00535 * \brief Returns whether this resource is published to server or not. 00536 * \return True if the resource is a part of the registration message, else false. 00537 */ 00538 bool register_uri(); 00539 00540 /** 00541 * @brief Returns whether this resource is under observation or not. 00542 * @return True if the resource is under observation, else false, 00543 */ 00544 bool is_under_observation() const; 00545 00546 /** 00547 * @brief Sets the function that is executed when this 00548 * object receives a PUT or POST command. 00549 * @param callback The function pointer that is called. 00550 * @return True, if callback could be set, false otherwise. 00551 */ 00552 bool set_value_updated_function(value_updated_callback callback); 00553 00554 /** 00555 * @brief Sets the function that is executed when this 00556 * object receives a PUT or POST command. 00557 * @param callback The function pointer that is called. 00558 * @return True, if callback could be set, false otherwise. 00559 */ 00560 bool set_value_updated_function(value_updated_callback2 callback); 00561 00562 /** 00563 * @brief Returns whether a callback function is set or not. 00564 * @return True if the callback function is set, else false. 00565 */ 00566 bool is_value_updated_function_set() const; 00567 00568 /** 00569 * @brief Calls the function that is set in the "set_value_updated_function". 00570 * @param name The name of the object. 00571 */ 00572 void execute_value_updated(const String& name); 00573 00574 /** 00575 * @brief Returns length of the object name. 00576 * @return Length of the object name. 00577 */ 00578 size_t resource_name_length() const; 00579 00580 /** 00581 * @brief Returns the resource information. 00582 * @return Resource information. 00583 */ 00584 sn_nsdl_dynamic_resource_parameters_s* get_nsdl_resource() const; 00585 00586 /** 00587 * @brief Returns the resource structure. 00588 * @return Resource structure. 00589 */ 00590 M2MBase::lwm2m_parameters_s* get_lwm2m_parameters() const; 00591 00592 #ifdef ENABLE_ASYNC_REST_RESPONSE 00593 /** 00594 * \brief A trigger to send the async response for the CoAP request. 00595 * \param code The code for the response, for example: 'COAP_RESPONSE_CHANGED'. 00596 * \param payload Payload for the resource. 00597 * \param payload_len Length of the payload. 00598 * \param token Token for the incoming CoAP request. 00599 * \param token_len Token length for the incoming CoAP request. 00600 * \return True if a response is sent, else False. 00601 */ 00602 bool send_async_response_with_code(const uint8_t *payload, 00603 size_t payload_len, 00604 const uint8_t* token, 00605 const uint8_t token_len, 00606 coap_response_code_e code = COAP_RESPONSE_CHANGED); 00607 00608 /** 00609 * @brief Sets the function that is executed when CoAP request arrives. 00610 * Callback is not called if the request are invalid, for example content-type is not matching. 00611 * In that case the error response is sent by the client itself. 00612 * @param callback The function pointer that is called. 00613 * @param client_args The argument which is passed to the callback function. 00614 */ 00615 bool set_async_coap_request_cb(handle_async_coap_request_cb callback, void *client_args); 00616 00617 #endif //ENABLE_ASYNC_REST_RESPONSE 00618 00619 /** 00620 * @brief Returns the notification message id. 00621 * @return Message id. 00622 */ 00623 uint16_t get_notification_msgid() const m2m_deprecated; 00624 00625 /** 00626 * @brief Sets the notification message id. 00627 * This is used to map RESET and EMPTY ACK messages. 00628 * @param msgid The message id. 00629 */ 00630 void set_notification_msgid(uint16_t msgid) m2m_deprecated; 00631 00632 /** 00633 * @brief Sets the function that is executed when notification message state changes. 00634 * @param callback The function pointer that is called. 00635 * @param client_args The argument which is passed to the callback function. 00636 */ 00637 bool set_notification_delivery_status_cb(notification_delivery_status_cb callback, void *client_args) m2m_deprecated; 00638 00639 /** 00640 * @brief Sets the function that is executed when message state changes. 00641 * Currently this is used to track notifications and delayed response delivery statuses. 00642 * @param callback The function pointer that is called. 00643 * @param client_args The argument which is passed to the callback function. 00644 */ 00645 bool set_message_delivery_status_cb(message_delivery_status_cb callback, void *client_args); 00646 00647 #ifdef MBED_CLOUD_CLIENT_EDGE_EXTENSION 00648 static char* create_path(const M2MEndpoint &parent, const char *name); 00649 #endif 00650 static char* create_path(const M2MObject &parent, const char *name); 00651 static char* create_path(const M2MObject &parent, uint16_t object_instance); 00652 static char* create_path(const M2MResource &parent, uint16_t resource_instance); 00653 static char* create_path(const M2MResource &parent, const char *name); 00654 static char* create_path(const M2MObjectInstance &parent, const char *name); 00655 00656 #ifdef MBED_CLOUD_CLIENT_EDGE_EXTENSION 00657 00658 /** 00659 * @brief The data is set deleted and it needs to be updated into Device Management. 00660 * Current implementation maintains the deleted state only in M2MEndpoint. 00661 * The deleted state is `false` for every other M2M class. 00662 */ 00663 virtual void set_deleted(); 00664 00665 00666 /** 00667 * @brief The deleted state check function. 00668 * @return True if the deleted state is set, else false. 00669 */ 00670 virtual bool is_deleted(); 00671 00672 #endif // MBED_CLOUD_CLIENT_EDGE_EXTENSION 00673 00674 protected: // from M2MReportObserver 00675 00676 virtual bool observation_to_be_sent(const m2m::Vector<uint16_t> &changed_instance_ids, 00677 uint16_t obs_number, 00678 bool send_object = false); 00679 00680 /** 00681 * \brief Sets the base type for an object. 00682 * \param type The base type of the object. 00683 */ 00684 void set_base_type(M2MBase::BaseType type); 00685 00686 /** 00687 * \brief Memory allocation required for libCoap. 00688 * \param size The size of memory to be reserved. 00689 */ 00690 static void* memory_alloc(uint32_t size); 00691 00692 /** 00693 * \brief Memory free functions required for libCoap. 00694 * \param ptr The object whose memory needs to be freed. 00695 */ 00696 static void memory_free(void *ptr); 00697 00698 /** 00699 * \brief Allocate and make a copy of given zero terminated string. This 00700 * is functionally equivalent with strdup(). 00701 * \param source The source string to copy, may not be NULL. 00702 */ 00703 static char* alloc_string_copy(const char* source); 00704 00705 /** 00706 * \brief Allocate (size + 1) amount of memory, copy size bytes into 00707 * it and add zero termination. 00708 * \param source The source string to copy, may not be NULL. 00709 * \param size The size of memory to be reserved. 00710 */ 00711 static uint8_t* alloc_string_copy(const uint8_t* source, uint32_t size); 00712 00713 /** 00714 * \brief Allocate (size) amount of memory, copy size bytes into it. 00715 * \param source The source buffer to copy, may not be NULL. 00716 * \param size The size of memory to be reserved. 00717 */ 00718 static uint8_t* alloc_copy(const uint8_t* source, uint32_t size); 00719 00720 // validate string length to be [min_length..max_length] 00721 static bool validate_string_length(const String &string, size_t min_length, size_t max_length); 00722 static bool validate_string_length(const char* string, size_t min_length, size_t max_length); 00723 00724 /** 00725 * \brief Create Report Handler object. 00726 * \return M2MReportHandler object. 00727 */ 00728 M2MReportHandler* create_report_handler(); 00729 00730 /** 00731 * \brief Returns the Report Handler object. 00732 * \return M2MReportHandler object. 00733 */ 00734 M2MReportHandler* report_handler() const; 00735 00736 static bool build_path(StringBuffer<MAX_PATH_SIZE> &buffer, const char *s1, uint16_t i1, const char *s2, uint16_t i2); 00737 00738 static bool build_path(StringBuffer<MAX_PATH_SIZE_2> &buffer, const char *s1, uint16_t i1, const char *s2); 00739 00740 static bool build_path(StringBuffer<MAX_PATH_SIZE_3> &buffer, const char *s1, uint16_t i1, uint16_t i2); 00741 00742 static bool build_path(StringBuffer<MAX_PATH_SIZE_4> &buffer, const char *s1, uint16_t i1); 00743 00744 static char* stringdup(const char* s); 00745 00746 /** 00747 * \brief Delete the resource structures owned by this object. Note: this needs 00748 * to be called separately from each subclass' destructor as this method uses a 00749 * virtual method and the call needs to be done at same class which has the 00750 * implementation of the pure virtual method. 00751 */ 00752 void free_resources(); 00753 00754 /** 00755 * \brief Returns notification send status. 00756 * \return Notification status. 00757 */ 00758 NotificationDeliveryStatus get_notification_delivery_status() const m2m_deprecated; 00759 00760 /** 00761 * \brief Clears the notification send status to initial state. 00762 */ 00763 void clear_notification_delivery_status() m2m_deprecated; 00764 00765 /** 00766 * \brief Provides the observation token of the object. 00767 * \param[out] token A pointer to the value of the token. 00768 * \param[out] token_length The length of the token pointer. 00769 */ 00770 void get_observation_token(uint8_t *token, uint8_t &token_length) const; 00771 00772 /** 00773 * \brief Sets the observation token value. 00774 * \param token A pointer to the token of the resource. 00775 * \param length The length of the token pointer. 00776 */ 00777 void set_observation_token(const uint8_t *token, 00778 const uint8_t length); 00779 00780 /** 00781 * \brief The data has changed and it needs to be updated into Mbed Cloud. 00782 * Current implementation maintains the changed state only in M2MEndpoint. If any of the changes in an 00783 * object changes the M2M registration structure, the information is propagated to M2MEndpoint using 00784 * this interface. 00785 */ 00786 virtual void set_changed(); 00787 00788 /** 00789 * \brief Returns the owner object. Can return NULL if the object has no parent. 00790 */ 00791 virtual M2MBase *get_parent() const; 00792 00793 /** 00794 * \brief Checks whether blockwise is needed to send resource value to server. 00795 * \param nsdl An NSDL handler for the CoAP library. 00796 * \param payload_len Length of the CoAP payload. 00797 * \return True if blockwise transfer is needed, else false. 00798 */ 00799 static bool is_blockwise_needed(const nsdl_s *nsdl, uint32_t payload_len); 00800 00801 /** 00802 * \brief Handles subscription request. 00803 * \param nsdl An NSDL handler for the CoAP library. 00804 * \param received_coap_header The received CoAP message from the server. 00805 * \param coap_response The CoAP response to be sent to server. 00806 * \param observation_handler A handler object for sending 00807 * observation callbacks. 00808 */ 00809 void handle_observation(nsdl_s *nsdl, 00810 const sn_coap_hdr_s &received_coap_header, 00811 sn_coap_hdr_s &coap_response, 00812 M2MObservationHandler *observation_handler, 00813 sn_coap_msg_code_e &response_code); 00814 00815 /** 00816 * \brief Start the observation. 00817 * \param received_coap_header An NSDL handler for the CoAP library. 00818 * \param observation_handler A handler object for sending 00819 * observation callbacks. 00820 */ 00821 void start_observation(const sn_coap_hdr_s &received_coap_header, M2MObservationHandler *observation_handler); 00822 00823 #ifdef ENABLE_ASYNC_REST_RESPONSE 00824 00825 /** 00826 * @brief Executes the callback set in 'set_async_coap_request_cb'. 00827 * @param coap_request CoAP request containing the requesting payload and payload size. 00828 * @param operation Operation mode to be passed to the application. 00829 * @param handled Caller to know whether callback is processed or not. 00830 */ 00831 void call_async_coap_request_callback(sn_coap_hdr_s *coap_request, 00832 M2MBase::Operation operation, 00833 bool &handled); 00834 00835 /** 00836 * @brief Returns whether asynchronous callback is set or not. 00837 * @return True if set otherwise False. 00838 */ 00839 bool is_async_coap_request_callback_set(); 00840 00841 #endif //ENABLE_ASYNC_REST_RESPONSE 00842 00843 private: 00844 static bool is_integer(const String &value); 00845 00846 static bool is_integer(const char *value); 00847 00848 static char* create_path_base(const M2MBase &parent, const char *name); 00849 00850 lwm2m_parameters_s *_sn_resource; 00851 M2MReportHandler *_report_handler; // TODO: can be broken down to smaller classes with inheritance. 00852 00853 friend class Test_M2MBase; 00854 friend class Test_M2MObject; 00855 friend class M2MNsdlInterface; 00856 friend class M2MInterfaceFactory; 00857 friend class M2MObject; 00858 }; 00859 00860 #endif // M2M_BASE_H
Generated on Mon Aug 29 2022 19:53:39 by
