mbedConnectorInterface back port from mbedOS v3 using mbed-client C++ call interface

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers OptionsBuilder.cpp Source File

OptionsBuilder.cpp

Go to the documentation of this file.
00001 /**
00002  * @file    OptionsBuilder.cpp
00003  * @brief   mbed CoAP OptionsBuilder class implementation
00004  * @author  Doug Anson/Chris Paola
00005  * @version 1.0
00006  * @see
00007  *
00008  * Copyright (c) 2014
00009  *
00010  * Licensed under the Apache License, Version 2.0 (the "License");
00011  * you may not use this file except in compliance with the License.
00012  * You may obtain a copy of the License at
00013  *
00014  *     http://www.apache.org/licenses/LICENSE-2.0
00015  *
00016  * Unless required by applicable law or agreed to in writing, software
00017  * distributed under the License is distributed on an "AS IS" BASIS,
00018  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
00019  * See the License for the specific language governing permissions and
00020  * limitations under the License.
00021  */
00022 
00023 #include "mbed-connector-interface/OptionsBuilder.h"
00024 
00025 // external included configuration file for the endpoint...
00026 #include "mbed-connector-interface/configuration.h"
00027 
00028 // ResourceObserver support
00029 #include "mbed-connector-interface/ThreadedResourceObserver.h"
00030 #include "mbed-connector-interface/TickerResourceObserver.h"
00031 
00032 // DEBUG
00033 #ifndef NDEBUG
00034 #define DEBUG_OUT(...) { printf(__VA_ARGS__); }
00035 #else
00036 #define DEBUG_OUT(...) /* nothing */
00037 #endif
00038 
00039 // Connector namespace
00040 namespace Connector {
00041 
00042 // Constructor
00043 OptionsBuilder::OptionsBuilder()
00044 {
00045     this->m_domain                   = NSP_DOMAIN;
00046     this->m_endpoint_type        = NSP_ENDPOINT_TYPE;
00047     this->m_node_name            = NODE_NAME;
00048     this->m_reg_update_period = REG_UPDATE_PERIOD_MS;
00049     this->m_lifetime                     = REG_LIFETIME_SEC;
00050     this->m_connector_url        = string(CONNECTOR_URL);
00051     this->m_device_resources.clear();
00052     this->m_static_resources.clear();
00053     this->m_dynamic_resources.clear();
00054     this->m_resource_observers.clear();
00055 }
00056 
00057 // Copy Constructor
00058 OptionsBuilder::OptionsBuilder(const OptionsBuilder &ob)  : Options(ob)
00059 {
00060     this->m_domain = ob.m_domain;
00061     this->m_endpoint_type = ob.m_endpoint_type;
00062     this->m_node_name = ob.m_node_name;
00063     this->m_reg_update_period = ob.m_reg_update_period;
00064     this->m_lifetime = ob.m_lifetime; 
00065     this->m_connector_url  = ob.m_connector_url;  
00066     this->m_device_resources = ob.m_device_resources;
00067     this->m_static_resources = ob.m_static_resources;
00068     this->m_dynamic_resources = ob.m_dynamic_resources;
00069     this->m_resource_observers = ob.m_resource_observers;
00070 }
00071 
00072 // Destructor
00073 OptionsBuilder::~OptionsBuilder()
00074 {
00075     this->m_device_resources.clear();
00076     this->m_static_resources.clear();
00077     this->m_dynamic_resources.clear();
00078     this->m_resource_observers.clear();
00079 }
00080 
00081 // set lifetime
00082 OptionsBuilder &OptionsBuilder::setLifetime(int lifetime)
00083 {
00084     this->m_lifetime = lifetime;
00085     return *this;
00086 }
00087 
00088 // set domain
00089 OptionsBuilder &OptionsBuilder::setDomain(const char *domain)
00090 {
00091     this->m_domain = string(domain);
00092     return *this;
00093 }
00094 
00095 // set endpoint nodename
00096 OptionsBuilder &OptionsBuilder::setEndpointNodename(const char *node_name)
00097 {
00098     this->m_node_name = string(node_name);
00099     return *this;
00100 }
00101 
00102 // set lifetime
00103 OptionsBuilder &OptionsBuilder::setEndpointType(const char *endpoint_type)
00104 {
00105     this->m_endpoint_type = string(endpoint_type);
00106     return *this;
00107 }
00108 
00109 // set mbed registration update period
00110 OptionsBuilder &OptionsBuilder::setRegUpdatePeriod(const int reg_update_period)
00111 {
00112     this->m_reg_update_period = reg_update_period;
00113     return *this;
00114 }
00115 
00116 // set Connector URL
00117 OptionsBuilder &OptionsBuilder::setConnectorURL(const char *connector_url)
00118 {
00119     if (connector_url != NULL) {
00120         this->m_connector_url  = string(connector_url);
00121     }
00122     return *this;
00123 }
00124 
00125 // add a device resource
00126 OptionsBuilder &OptionsBuilder::addResource(const DeviceResource *resource) {
00127     if (resource != NULL) {
00128         ((DeviceResource *)resource)->setOptions(this);
00129         this->m_device_resources.push_back((DeviceResource *)resource);
00130     }
00131     return *this;
00132 }
00133 
00134 // add static resource
00135 OptionsBuilder &OptionsBuilder::addResource(const StaticResource *resource)
00136 {
00137     if (resource != NULL) {
00138         ((StaticResource *)resource)->setOptions(this);
00139         this->m_static_resources.push_back((StaticResource *)resource);
00140     }
00141     return *this;
00142 }
00143 
00144 // add dynamic resource
00145 OptionsBuilder &OptionsBuilder::addResource(const DynamicResource *resource)
00146 {
00147     // ensure that the boolean isn't mistaken by the compiler for the obs period...
00148     return this->addResource(resource,OBS_PERIOD_MS,!(((DynamicResource *)resource)->implementsObservation()));
00149 }
00150 
00151 // add dynamic resource
00152 OptionsBuilder &OptionsBuilder::addResource(const DynamicResource *resource,const int sleep_time)
00153 {
00154     // ensure that the boolean isn't mistaken by the compiler for the obs period...
00155     return this->addResource(resource,sleep_time,!(((DynamicResource *)resource)->implementsObservation()));
00156 }
00157 
00158 // add dynamic resource
00159 OptionsBuilder &OptionsBuilder::addResource(const DynamicResource *resource,const bool use_observer)
00160 {
00161     // ensure that the boolean isn't mistaken by the compiler for the obs period...
00162     return this->addResource(resource,OBS_PERIOD_MS,use_observer);
00163 }
00164 
00165 // add dynamic resource
00166 OptionsBuilder &OptionsBuilder::addResource(const DynamicResource *resource,const int sleep_time,const bool use_observer)
00167 {
00168     if (resource != NULL) {
00169         this->m_dynamic_resources.push_back((DynamicResource *)resource);
00170         ((DynamicResource *)resource)->setOptions(this);
00171         ((DynamicResource *)resource)->setEndpoint((const void *)this->getEndpoint());
00172         if (((DynamicResource *)resource)->isObservable() == true && use_observer == true) {
00173 #ifdef CONNECTOR_USING_THREADS
00174             ThreadedResourceObserver *observer = new ThreadedResourceObserver((DynamicResource *)resource,(int)sleep_time);
00175 #else
00176             TickerResourceObserver *observer = new TickerResourceObserver((DynamicResource *)resource,(int)sleep_time);
00177 #endif
00178             this->m_resource_observers.push_back(observer);
00179 
00180             // immedate observation enablement option
00181             if (this->immedateObservationEnabled()) {
00182                 observer->beginObservation();
00183             }
00184         }
00185     }
00186     return *this;
00187 }
00188 
00189 // set WiFi SSID
00190 OptionsBuilder &OptionsBuilder::setWiFiSSID(char *ssid)
00191 {
00192     this->m_wifi_ssid = string(ssid);
00193     return *this;
00194 }
00195 
00196 // set WiFi AuthType
00197 OptionsBuilder &OptionsBuilder::setWiFiAuthType(WiFiAuthTypes auth_type)
00198 {
00199     this->m_wifi_auth_type = auth_type;
00200     return *this;
00201 }
00202 
00203 // set WiFi AuthKey
00204 OptionsBuilder &OptionsBuilder::setWiFiAuthKey(char *auth_key)
00205 {
00206     this->m_wifi_auth_key = string(auth_key);
00207     return *this;
00208 }
00209 
00210 // set 802.15.4 Pre Shared Key
00211 OptionsBuilder &OptionsBuilder::setPreSharedKey(unsigned char psk[16])
00212 {
00213     memset(this->m_psk,0,16);
00214     for(int i=0;i<16;++i) {
00215         this->m_psk[i] = psk[i];
00216     }
00217     return *this;
00218 }
00219 
00220 // set 802.15.4 Pre Shared Key Identity
00221 OptionsBuilder &OptionsBuilder::setPreSharedKeyIdentity(unsigned char psk_identity[2])
00222 {
00223     memset(this->m_psk_identity,0,2);
00224     for(int i=0;i<2;++i) {
00225         this->m_psk_identity[i] = psk_identity[i];
00226     }
00227     return *this;
00228 }
00229 
00230 // set 802.15.4 Mesh Type
00231 OptionsBuilder &OptionsBuilder::setMeshType(MeshTypes mesh_type)
00232 {
00233     this->m_mesh_type = mesh_type;
00234     return *this;
00235 }
00236 
00237 // set the CoAP Connection Type
00238 OptionsBuilder &OptionsBuilder::setCoAPConnectionType(CoAPConnectionTypes coap_connection_type)
00239 {
00240     this->m_coap_connection_type = coap_connection_type;
00241     return *this;
00242 }
00243 
00244 // set the IP Address Type
00245 OptionsBuilder &OptionsBuilder::setIPAddressType(IPAddressTypes ip_address_type)
00246 {
00247     this->m_ip_address_type = ip_address_type;
00248     return *this;
00249 }
00250 
00251 // build out our immutable self
00252 Options *OptionsBuilder::build()
00253 {
00254     return (Options *)this;
00255 }
00256 
00257 // Enable/Disable immediate observationing
00258 OptionsBuilder &OptionsBuilder::setImmedateObservationEnabled(bool enable) {
00259     this->m_enable_immediate_observation = enable;
00260     return *this;
00261 }
00262 
00263 // Enable/Disable GET-based control of observations
00264 OptionsBuilder &OptionsBuilder::setEnableGETObservationControl(bool enable) {
00265     this->m_enable_get_obs_control = enable;
00266     return *this;
00267 }
00268 
00269 // set the server certificate
00270 OptionsBuilder &OptionsBuilder::setServerCertificate(uint8_t cert[],int cert_size) {
00271     memset(this->m_server_cert,0,MAX_SERVER_CERT_LENGTH);
00272     int length = cert_size;
00273     if (length > MAX_SERVER_CERT_LENGTH) {
00274         length = MAX_SERVER_CERT_LENGTH;
00275         DEBUG_OUT("WARNING: Truncated Server Certificate: orig: %d bytes (trunc: %d bytes)\r\n",cert_size,length);
00276     }
00277     memcpy(this->m_server_cert,cert,length);
00278     this->m_server_cert_length = length;
00279     return *this;
00280 }
00281 
00282 // set the client certificate
00283 OptionsBuilder &OptionsBuilder::setClientCertificate(uint8_t cert[],int cert_size) {
00284     memset(this->m_client_cert,0,MAX_CLIENT_CERT_LENGTH);
00285     int length = cert_size;
00286     if (length > MAX_CLIENT_CERT_LENGTH) {
00287         length = MAX_CLIENT_CERT_LENGTH;
00288         DEBUG_OUT("WARNING: Truncated Client Certificate: orig: %d bytes (trunc: %d bytes)\r\n",cert_size,length);
00289     }
00290     memcpy(this->m_client_cert,cert,length);
00291     this->m_client_cert_length = length;
00292     return *this;
00293 }
00294 
00295 // set the client key
00296 OptionsBuilder &OptionsBuilder::setClientKey(uint8_t key[],int key_size) {
00297     memset(this->m_client_key,0,MAX_CLIENT_KEY_LENGTH);
00298     int length = key_size;
00299     if (length > MAX_CLIENT_KEY_LENGTH) {
00300         length = MAX_CLIENT_KEY_LENGTH;
00301         DEBUG_OUT("WARNING: Truncated Client Key: orig: %d bytes (trunc: %d bytes)\r\n",key_size,length);
00302     }
00303     memcpy(this->m_client_key,key,length);
00304     this->m_client_key_length = length;
00305     return *this;
00306 }
00307 
00308 // set our endpoint
00309 void OptionsBuilder::setEndpoint(void *endpoint) {
00310     this->m_endpoint = endpoint;
00311 }
00312 
00313 } // namespace Connector