mbed Connector Interface simplification API on top of mbed-client

Fork of mbedConnectorInterfaceV3 by Doug Anson

NOTE:

This repo has been replaced with https://github.com/ARMmbed/mbedConnectorInterface. No further updates will occur with this repo. Please use the github repo instead. Thanks!

Revision:
27:b8aaf7dc7023
Parent:
24:c92984bede9c
Child:
33:1d0b855df5a5
diff -r d7b009313e3b -r b8aaf7dc7023 source/DynamicResource.cpp
--- a/source/DynamicResource.cpp	Sun Jun 12 03:18:25 2016 +0000
+++ b/source/DynamicResource.cpp	Tue Jun 14 04:01:34 2016 +0000
@@ -42,9 +42,10 @@
 #define DEFAULT_CONTENT_FORMAT 0
 
 // default constructor
-DynamicResource::DynamicResource(const Logger *logger,const char *obj_name,const char *res_name,const char *res_type,uint8_t res_mask,const bool observable) : Resource<string>(logger,string(obj_name),string(res_name),string(""))
+DynamicResource::DynamicResource(const Logger *logger,const char *obj_name,const char *res_name,const char *res_type,uint8_t res_mask,const bool observable,const ResourceType type) : Resource<string>(logger,string(obj_name),string(res_name),string(""))
 {
     this->m_res_type = string(res_type);
+    this->m_type = type;
     this->m_observable = observable;
     this->m_res_mask = res_mask;
     this->m_obs_number = 0;
@@ -52,14 +53,15 @@
     this->m_observer = NULL;
     this->m_maxage = DEFAULT_MAXAGE;
     this->m_content_format = DEFAULT_CONTENT_FORMAT;
-    this->m_object = NULL;
-    this->m_op_processor = NULL;
+    this->m_ep = NULL;
+    this->m_res = NULL;
 }
 
 // constructor (input initial value)
-DynamicResource::DynamicResource(const Logger *logger,const char *obj_name,const char *res_name,const char *res_type,const string value,uint8_t res_mask,const bool observable) : Resource<string>(logger,string(obj_name),string(res_name),value)
+DynamicResource::DynamicResource(const Logger *logger,const char *obj_name,const char *res_name,const char *res_type,const string value,uint8_t res_mask,const bool observable,const ResourceType type) : Resource<string>(logger,string(obj_name),string(res_name),value)
 {
     this->m_res_type = string(res_type);
+    this->m_type = type;
     this->m_observable = observable;
     this->m_res_mask = res_mask;
     this->m_obs_number = 0;
@@ -67,14 +69,15 @@
     this->m_observer = NULL;
     this->m_maxage = DEFAULT_MAXAGE;
     this->m_content_format = DEFAULT_CONTENT_FORMAT;
-    this->m_object = NULL;
-    this->m_op_processor = NULL;
+    this->m_ep = NULL;
+    this->m_res = NULL;
 }
 
 // constructor (strings)
-DynamicResource::DynamicResource(const Logger *logger,const string obj_name,const string res_name,const string res_type,const string value,uint8_t res_mask,const bool observable) : Resource<string>(logger,obj_name,res_name,value)
+DynamicResource::DynamicResource(const Logger *logger,const string obj_name,const string res_name,const string res_type,const string value,uint8_t res_mask,const bool observable,const ResourceType type) : Resource<string>(logger,obj_name,res_name,value)
 {
     this->m_res_type = res_type;
+    this->m_type = type;
     this->m_observable = observable;
     this->m_res_mask = res_mask;
     this->m_obs_number = 0;
@@ -82,14 +85,15 @@
     this->m_observer = NULL;
     this->m_maxage = DEFAULT_MAXAGE;
     this->m_content_format = DEFAULT_CONTENT_FORMAT;
-    this->m_object = NULL;
-    this->m_op_processor = NULL;
+    this->m_ep = NULL;
+    this->m_res = NULL;
 }
 
 // copy constructor
 DynamicResource::DynamicResource(const DynamicResource &resource) : Resource<string>((const Resource<string> &)resource)
 {
     this->m_res_type = resource.m_res_type;
+    this->m_type = resource.m_type;
     this->m_observable = resource.m_observable;
     this->m_res_mask = resource.m_res_mask;
     this->m_obs_number = resource.m_obs_number;
@@ -97,8 +101,8 @@
     this->m_observer = resource.m_observer;
     this->m_maxage = resource.m_maxage;
     this->m_content_format = resource.m_content_format;
-    this->m_object = resource.m_object;
-    this->m_op_processor = resource.m_op_processor;
+    this->m_ep = resource.m_ep;
+    this->m_res = resource.m_res;
 }
 
 // destructor
@@ -106,79 +110,55 @@
 }
 
 // bind CoAP Resource...
-M2MObject *DynamicResource::bind(void *p) {
-	if (p != NULL) {
-		this->m_object = M2MInterfaceFactory::create_object(this->getObjName().c_str());
-        if (this->m_object != NULL) {
-            this->m_obj_instance = this->m_object->create_object_instance();
-            if (this->m_obj_instance != NULL) {
-            		this->m_res = this->m_obj_instance->create_dynamic_resource(this->getResName().c_str(),this->m_res_type.c_str(),M2MResourceInstance::STRING,this->m_observable);
-            		if (this->m_res != NULL) {   
-            			// perform an initial get() to initialize our data value
-            			this->setValue(this->get());
-            			
-            			// now record the data value         			
-            			if (this->getDataWrapper() != NULL) {
-            				// wrap the data...
-							this->getDataWrapper()->wrap((uint8_t *)this->getValue().c_str(),(int)this->getValue().size());
-            				this->m_res->set_operation((M2MBase::Operation)this->m_res_mask);
-            				this->m_res->set_value( this->getDataWrapper()->get(),(uint8_t)this->getDataWrapper()->length());
-            				this->logger()->log("%s: [%s] value: [%s] bound (observable: %d)",this->m_res_type.c_str(),this->getFullName().c_str(),this->getDataWrapper()->get(),this->m_observable);
-            				this->m_op_processor = (void *)p;
-        				}
-        				else {
-        					// do not wrap the data...
-            				this->m_res->set_operation((M2MBase::Operation)this->m_res_mask);
-            				this->m_res->set_value((uint8_t *)this->getValue().c_str(),(uint8_t)this->getValue().size());
-             				this->logger()->log("%s: [%s] value: [%s] bound (observable: %d)",this->m_res_type.c_str(),this->getFullName().c_str(),this->getValue().c_str(),this->m_observable);
-             				this->m_op_processor = (void *)p;
-        				}
-        				
-						// For POST-enabled  RESOURCES (only...), we must add a callback
-        				if ((this->m_res_mask & M2MBase::POST_ALLOWED)  != 0) { 
-        					// add a callback for the execute function...we will just direct through process()...
-        					//this->logger()->log("DynamicResource::bind(): Setting up POST execute callback function");
-        					this->m_res->set_execute_function(execute_callback(this, &DynamicResource::process_resource_post));
-        				}
-
-// DISABLE for now...
-#if 0        				 
-        				// For DELETE-enabled  RESOURCES (only...), we must add a callback
-        				if ((this->m_res_mask & M2MBase::DELETE_ALLOWED)  != 0) { 
-        					// add a callback for the execute function...we will just direct through process()...
-        					//this->logger()->log("DynamicResource::bind(): Setting up DELETE execute callback function");
-        					this->m_res->set_execute_function(execute_callback(this, &DynamicResource::process_resource_delete));
-        				}
-#endif        		
-					}
-        			else {
-        				// create_dynamic_resource() failed
-        				this->logger()->log("%s: Unable to create dynamic resource...",this->m_res_type.c_str());
-             			delete this->m_object;
-             			this->m_object = NULL;
-        			}
-             }
-             else {
-             		// create_object_instance() failed...
-             		this->logger()->log("%s: Unable to create object instance...",this->m_res_type.c_str());
-             		delete this->m_object;
-             		this->m_object = NULL;
-             }
-       }
-       else {
-       		// create_object() failed
-       		this->logger()->log("%s: Unable to create object...",this->m_res_type.c_str());
-       }
+void DynamicResource::bind(void *ep) {
+	if (ep != NULL) {
+		// cast
+		Connector::Endpoint *endpoint = (Connector::Endpoint *)ep;
+		
+		// get our ObjectInstanceManager
+		ObjectInstanceManager *oim = endpoint->getObjectInstanceManager();
+		
+		// Create our Resource
+		this->m_res = (M2MResource *)oim->createDynamicResourceInstance((char *)this->getObjName().c_str(),(char *)this->getResName().c_str(),(char *)this->m_res_type.c_str(),(int)this->m_type,this->m_observable);
+		if (this->m_res != NULL) {   
+			// perform an initial get() to initialize our data value
+			this->setValue(this->get());
+			
+			// now record the data value         			
+			if (this->getDataWrapper() != NULL) {
+				// wrap the data...
+				this->getDataWrapper()->wrap((uint8_t *)this->getValue().c_str(),(int)this->getValue().size());
+				this->m_res->set_operation((M2MBase::Operation)this->m_res_mask);
+				this->m_res->set_value( this->getDataWrapper()->get(),(uint8_t)this->getDataWrapper()->length());
+				this->logger()->log("%s: [%s] value: [%s] bound (observable: %d)",this->m_res_type.c_str(),this->getFullName().c_str(),this->getDataWrapper()->get(),this->m_observable);
+			}
+			else {
+				// do not wrap the data...
+				this->m_res->set_operation((M2MBase::Operation)this->m_res_mask);
+				this->m_res->set_value((uint8_t *)this->getValue().c_str(),(uint8_t)this->getValue().size());
+ 				this->logger()->log("%s: [%s] value: [%s] bound (observable: %d)",this->m_res_type.c_str(),this->getFullName().c_str(),this->getValue().c_str(),this->m_observable);
+			}
+			
+			// set our endpoint instance
+			this->m_ep = (void *)ep;
+			
+			// For POST-enabled  RESOURCES (only...), we must add a callback
+			if ((this->m_res_mask & M2MBase::POST_ALLOWED)  != 0) { 
+				// add a callback for the execute function...we will just direct through process()...
+				//this->logger()->log("DynamicResource::bind(): Setting up POST execute callback function");
+				this->m_res->set_execute_function(execute_callback(this, &DynamicResource::process_resource_post));
+			}    		
+		}		
 	}
 	else {
-      	 this->logger()->log("%s: NULL value parameter in bind() request...",this->m_res_type.c_str());
+		// no instance pointer to our endpoint
+      	this->logger()->log("%s: NULL endpoint instance pointer in bind() request...",this->m_res_type.c_str());
     }
-    return this->m_object;
 }
 
 // get our M2MBase representation
-M2MBase *DynamicResource::getResource() {
-	return (M2MBase *)this->m_res;
+M2MResource *DynamicResource::getResource() {
+	return this->m_res;
 }
 
 // process inbound mbed-client POST message for a Resource
@@ -188,13 +168,6 @@
 		(void)this->process(M2MBase::POST_ALLOWED,this->m_res->base_type(),args);
 }
 
-// process inbound mbed-client DELETE message for a Resource
-void DynamicResource::process_resource_delete(void *args) {
-		// just call process() for DELETE and Resources...
-		//this->logger()->log("DynamicResource::process_resource_delete(): calling process(DELETE)");
-		(void)this->process(M2MBase::DELETE_ALLOWED,this->m_res->base_type(),args);
-}
-
 // process inbound mbed-client message
 uint8_t DynamicResource::process(M2MBase::Operation op,M2MBase::BaseType type,void *args) {
 #if defined (HAS_EXECUTE_PARAMS)
@@ -334,6 +307,14 @@
     return status;
 }
 
+// default GET (does nothing)
+string DynamicResource::get()
+{
+    // not used by default
+    this->logger()->log("DynamicResource::get() invoked (NOOP)");
+    return string("");
+}
+
 // default PUT (does nothing)
 void DynamicResource::put(const string value)
 {
@@ -377,7 +358,7 @@
     this->m_maxage = maxage;
 }
 
-// convenience method to get the URI from its buffer field...
+// convert the CoAP data pointer to a string type
 string DynamicResource::coapDataToString(uint8_t *coap_data_ptr,int coap_data_ptr_length)
 {
     if (coap_data_ptr != NULL && coap_data_ptr_length > 0) {
@@ -398,6 +379,53 @@
     return string("");
 }
 
+// convert the CoAP data pointer to an integer type
+int DynamicResource::coapDataToInteger(uint8_t *coap_data_ptr,int coap_data_ptr_length) {
+	int value = 0;
+	if (coap_data_ptr != NULL && coap_data_ptr_length > 0) {
+        if (this->getDataWrapper() != NULL) {
+            // unwrap the data...
+            this->getDataWrapper()->unwrap(coap_data_ptr,coap_data_ptr_length);
+            //value = (int)this->getDataWrapper()->get();                  // assumes data is null terminated in DataWrapper...
+        }
+        else {
+            // no unwrap of the data...
+            //value = (int)coap_data_ptr;
+        }
+    }
+    return value;
+}
+
+// convert the CoAP data pointer to a float type
+float DynamicResource::coapDataToFloat(uint8_t *coap_data_ptr,int coap_data_ptr_length) {
+	float value = 0.0;
+	if (coap_data_ptr != NULL && coap_data_ptr_length > 0) {
+        if (this->getDataWrapper() != NULL) {
+            // unwrap the data...
+            this->getDataWrapper()->unwrap(coap_data_ptr,coap_data_ptr_length);
+            //value = (float)this->getDataWrapper()->get();                  // assumes data is null terminated in DataWrapper...
+        }
+        else {
+            // no unwrap of the data...
+            //value = (float)coap_data_ptr;
+        }
+    }
+    return value;
+}
+
+// convert the CoAP data pointer to an opaque type
+void *DynamicResource::coapDataToOpaque(uint8_t *coap_data_ptr,int coap_data_ptr_length) {
+	if (coap_data_ptr != NULL && coap_data_ptr_length > 0) {
+        if (this->getDataWrapper() != NULL) {
+            // unwrap the data...
+            this->getDataWrapper()->unwrap(coap_data_ptr,coap_data_ptr_length);
+            char *buf = (char *)this->getDataWrapper()->get();                  // assumes data is null terminated in DataWrapper...
+            return (void *)buf;
+        }
+    }
+    return (void *)coap_data_ptr;
+}
+
 // Determine if we are connected or not
 bool DynamicResource::isConnected() {
 	bool is_connected = false;