Sebastián Pastor / EtheriosCloudConnector
Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers connector_tcp_close.h Source File

connector_tcp_close.h

00001 /*
00002  * Copyright (c) 2013 Digi International Inc.,
00003  * All rights not expressly granted are reserved.
00004  *
00005  * This Source Code Form is subject to the terms of the Mozilla Public
00006  * License, v. 2.0. If a copy of the MPL was not distributed with this file,
00007  * You can obtain one at http://mozilla.org/MPL/2.0/.
00008  *
00009  * Digi International Inc. 11001 Bren Road East, Minnetonka, MN 55343
00010  * =======================================================================
00011  */
00012 static connector_status_t layer_remove_facilities(connector_data_t * const connector_ptr, connector_supported_facility_cb_index_t cb_index);
00013 
00014 #if (defined CONNECTOR_DEBUG)
00015 
00016 static char const * close_status_to_string(connector_close_status_t const value)
00017 {
00018     char const * result = NULL;
00019     switch (value)
00020     {
00021         enum_to_case(connector_close_status_cloud_disconnected);
00022         enum_to_case(connector_close_status_cloud_redirected);
00023         enum_to_case(connector_close_status_device_terminated);
00024         enum_to_case(connector_close_status_device_stopped);
00025         enum_to_case(connector_close_status_no_keepalive);
00026         enum_to_case(connector_close_status_abort);
00027         enum_to_case(connector_close_status_device_error);
00028 
00029         default:
00030         {
00031             connector_debug_printf("Unknown close status %d\n", value);
00032         }
00033     }
00034     return result;
00035 }
00036 #else
00037 
00038 #define close_status_to_string(value)       NULL
00039 #endif
00040 
00041 static connector_status_t tcp_close_cloud(connector_data_t * const connector_ptr)
00042 {
00043     connector_status_t result = connector_idle;
00044     connector_close_status_t close_status = edp_get_close_status(connector_ptr);
00045 
00046     if (edp_get_edp_state(connector_ptr) != edp_communication_connect_to_cloud)
00047     {
00048         connector_callback_status_t status;
00049         connector_request_id_t request_id;
00050 
00051         connector_network_close_t close_data;
00052 
00053         close_data.handle = connector_ptr->edp_data.network_handle;
00054         close_data.status = edp_get_close_status(connector_ptr);
00055         close_data.reconnect = connector_true;
00056 
00057         connector_debug_printf("tcp_close_cloud: status = %s\n", close_status_to_string(close_data.status));
00058         request_id.network_request = connector_request_id_network_close;
00059 
00060         status = connector_callback(connector_ptr->callback, connector_class_id_network_tcp, request_id, &close_data);
00061         ASSERT(status != connector_callback_unrecognized);
00062         switch (status)
00063         {
00064         case connector_callback_busy:
00065             result = connector_pending;
00066             goto done;
00067 
00068         case connector_callback_continue:
00069             result = connector_working;
00070             break;
00071 
00072         default:
00073             result = connector_abort;
00074             close_status = connector_close_status_abort;
00075             break;
00076         }
00077 
00078 
00079         {
00080                 connector_ptr->edp_data.stop.auto_connect = close_data.reconnect;
00081                 edp_set_active_state(connector_ptr, connector_transport_idle);
00082 
00083                 tcp_send_complete_callback(connector_ptr, connector_abort);
00084 
00085         }
00086         edp_set_edp_state(connector_ptr, edp_communication_connect_to_cloud);
00087 
00088         layer_remove_facilities(connector_ptr, facility_callback_cleanup);
00089 
00090         edp_reset_initial_data(connector_ptr);
00091     }
00092     else
00093         edp_set_active_state(connector_ptr, connector_transport_idle);
00094 
00095     switch (close_status)
00096     {
00097         case connector_close_status_device_terminated:
00098         case connector_close_status_abort:
00099         {
00100             /*
00101               * Terminated by connector_dispatch call
00102               * Free all memory.
00103               */
00104             connector_status_t const status = layer_remove_facilities(connector_ptr, facility_callback_delete);
00105             if (status != connector_working && status != connector_idle)
00106             {
00107                 connector_debug_printf("tcp_close_cloud: layer_remove_facilities failed %d\n", result);
00108             }
00109             edp_set_active_state(connector_ptr, connector_transport_terminate);
00110             result = (close_status == connector_close_status_device_terminated) ? connector_device_terminated : connector_abort;
00111             goto done;
00112         }
00113         default:
00114             break;
00115     }
00116 
00117 done:
00118     return result;
00119 }
00120 
00121 static connector_status_t edp_close_process(connector_data_t * const connector_ptr)
00122 {
00123     connector_status_t result;
00124 
00125     result = tcp_close_cloud(connector_ptr);
00126 
00127     return result;
00128 }
00129