summaryrefslogtreecommitdiff
path: root/src/components/transport_manager/src/tcp
diff options
context:
space:
mode:
authorjacobkeeler <jacob.keeler@livioradio.com>2017-06-19 13:54:59 -0400
committerjacobkeeler <jacob.keeler@livioradio.com>2017-06-21 14:20:53 -0400
commit0ad8a66ea67a5bd8c4a7c3d0ac606a07f4ff73ea (patch)
tree39f5e37279a3a8fdc2ff52e73ce7a815bd08c1d5 /src/components/transport_manager/src/tcp
parent0fdd32f58dbedf7e175d5ab8b3e04b4edd3d9526 (diff)
parent22a014b3746b28d2b8a3a4049c60bb76db6a0861 (diff)
downloadsdl_core-0ad8a66ea67a5bd8c4a7c3d0ac606a07f4ff73ea.tar.gz
Merge branch 'develop'
Diffstat (limited to 'src/components/transport_manager/src/tcp')
-rw-r--r--src/components/transport_manager/src/tcp/tcp_client_listener.cc15
-rw-r--r--src/components/transport_manager/src/tcp/tcp_connection_factory.cc25
-rw-r--r--src/components/transport_manager/src/tcp/tcp_server_originated_socket_connection.cc111
-rw-r--r--src/components/transport_manager/src/tcp/tcp_socket_connection.cc71
-rw-r--r--src/components/transport_manager/src/tcp/tcp_transport_adapter.cc6
5 files changed, 143 insertions, 85 deletions
diff --git a/src/components/transport_manager/src/tcp/tcp_client_listener.cc b/src/components/transport_manager/src/tcp/tcp_client_listener.cc
index 6458310da8..52a566c5ff 100644
--- a/src/components/transport_manager/src/tcp/tcp_client_listener.cc
+++ b/src/components/transport_manager/src/tcp/tcp_client_listener.cc
@@ -1,6 +1,6 @@
/*
*
- * Copyright (c) 2013, Ford Motor Company
+ * Copyright (c) 2017, Ford Motor Company
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
@@ -53,6 +53,7 @@
#include <sstream>
#include "utils/logger.h"
+#include "utils/make_shared.h"
#include "utils/threads/thread.h"
#include "transport_manager/transport_adapter/transport_adapter_controller.h"
#include "transport_manager/tcp/tcp_device.h"
@@ -241,12 +242,16 @@ void TcpClientListener::Loop() {
const ApplicationHandle app_handle =
tcp_device->AddIncomingApplication(connection_fd);
- TcpSocketConnection* connection(new TcpSocketConnection(
- device->unique_device_id(), app_handle, controller_));
+ utils::SharedPtr<TcpSocketConnection> connection =
+ utils::MakeShared<TcpSocketConnection>(
+ device->unique_device_id(), app_handle, controller_);
+ controller_->ConnectionCreated(
+ connection, device->unique_device_id(), app_handle);
connection->set_socket(connection_fd);
const TransportAdapter::Error error = connection->Start();
- if (error != TransportAdapter::OK) {
- delete connection;
+ if (TransportAdapter::OK != error) {
+ LOG4CXX_ERROR(logger_,
+ "TCP connection::Start() failed with error: " << error);
}
}
}
diff --git a/src/components/transport_manager/src/tcp/tcp_connection_factory.cc b/src/components/transport_manager/src/tcp/tcp_connection_factory.cc
index 5b1e9af6cb..114425076a 100644
--- a/src/components/transport_manager/src/tcp/tcp_connection_factory.cc
+++ b/src/components/transport_manager/src/tcp/tcp_connection_factory.cc
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2015, Ford Motor Company
+ * Copyright (c) 2017, Ford Motor Company
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
@@ -30,10 +30,12 @@
* POSSIBILITY OF SUCH DAMAGE.
*/
+#include "transport_manager/transport_adapter/transport_adapter_controller.h"
#include "transport_manager/tcp/tcp_connection_factory.h"
-#include "transport_manager/tcp/tcp_socket_connection.h"
+#include "transport_manager/tcp/tcp_server_originated_socket_connection.h"
#include "utils/logger.h"
+#include "utils/make_shared.h"
namespace transport_manager {
namespace transport_adapter {
@@ -54,16 +56,17 @@ TransportAdapter::Error TcpConnectionFactory::CreateConnection(
LOG4CXX_DEBUG(logger_,
"DeviceUID: " << &device_uid
<< ", ApplicationHandle: " << &app_handle);
- TcpServerOiginatedSocketConnection* connection(
- new TcpServerOiginatedSocketConnection(
- device_uid, app_handle, controller_));
- if (connection->Start() == TransportAdapter::OK) {
- LOG4CXX_DEBUG(logger_, "TCP connection initialised");
- return TransportAdapter::OK;
- } else {
- LOG4CXX_ERROR(logger_, "Could not initialise TCP connection");
- return TransportAdapter::FAIL;
+ utils::SharedPtr<TcpServerOriginatedSocketConnection> connection =
+ utils::MakeShared<TcpServerOriginatedSocketConnection>(
+ device_uid, app_handle, controller_);
+ controller_->ConnectionCreated(connection, device_uid, app_handle);
+ const TransportAdapter::Error error = connection->Start();
+ if (TransportAdapter::OK != error) {
+ LOG4CXX_ERROR(logger_,
+ "TCP ServerOriginated connection::Start() failed with error: "
+ << error);
}
+ return error;
}
void TcpConnectionFactory::Terminate() {}
diff --git a/src/components/transport_manager/src/tcp/tcp_server_originated_socket_connection.cc b/src/components/transport_manager/src/tcp/tcp_server_originated_socket_connection.cc
new file mode 100644
index 0000000000..516f2d3ec4
--- /dev/null
+++ b/src/components/transport_manager/src/tcp/tcp_server_originated_socket_connection.cc
@@ -0,0 +1,111 @@
+/*
+ *
+ * Copyright (c) 2017, Ford Motor Company
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * Redistributions of source code must retain the above copyright notice, this
+ * list of conditions and the following disclaimer.
+ *
+ * Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following
+ * disclaimer in the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * Neither the name of the Ford Motor Company nor the names of its contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include "transport_manager/tcp/tcp_server_originated_socket_connection.h"
+#include "transport_manager/tcp/tcp_device.h"
+#include "transport_manager/transport_adapter/transport_adapter_controller.h"
+#include "utils/logger.h"
+
+namespace transport_manager {
+namespace transport_adapter {
+
+CREATE_LOGGERPTR_GLOBAL(logger_, "TransportManager")
+
+TcpServerOriginatedSocketConnection::TcpServerOriginatedSocketConnection(
+ const DeviceUID& device_uid,
+ const ApplicationHandle& app_handle,
+ TransportAdapterController* controller)
+ : ThreadedSocketConnection(device_uid, app_handle, controller) {}
+
+TcpServerOriginatedSocketConnection::~TcpServerOriginatedSocketConnection() {
+ StopAndJoinThread();
+}
+
+bool TcpServerOriginatedSocketConnection::Establish(ConnectError** error) {
+ LOG4CXX_AUTO_TRACE(logger_);
+ DCHECK(error);
+ LOG4CXX_DEBUG(logger_, "error " << error);
+ DeviceSptr device = controller()->FindDevice(device_handle());
+ if (!device.valid()) {
+ LOG4CXX_ERROR(logger_, "Device " << device_handle() << " not found");
+ *error = new ConnectError();
+ return false;
+ }
+ TcpDevice* tcp_device = static_cast<TcpDevice*>(device.get());
+
+ const int port = tcp_device->GetApplicationPort(application_handle());
+ if (-1 == port) {
+ LOG4CXX_ERROR(logger_,
+ "Application port for " << application_handle()
+ << " not found");
+ *error = new ConnectError();
+ return false;
+ }
+
+ if (IsConnectionTerminated()) {
+ LOG4CXX_ERROR(
+ logger_,
+ "Connection is already terminated. Socket will not be created");
+ *error = new ConnectError();
+ return false;
+ }
+
+ const int socket = ::socket(AF_INET, SOCK_STREAM, 0);
+ if (socket < 0) {
+ LOG4CXX_ERROR(logger_, "Failed to create socket");
+ *error = new ConnectError();
+ return false;
+ }
+
+ struct sockaddr_in addr = {0};
+ addr.sin_family = AF_INET;
+ addr.sin_addr.s_addr = tcp_device->in_addr();
+ addr.sin_port = htons(port);
+
+ LOG4CXX_DEBUG(logger_,
+ "Connecting " << inet_ntoa(addr.sin_addr) << ":" << port);
+ set_socket(socket);
+ if (::connect(get_socket(), (struct sockaddr*)&addr, sizeof(addr)) < 0) {
+ LOG4CXX_ERROR(logger_,
+ "Failed to connect for application " << application_handle()
+ << ", error " << errno);
+ *error = new ConnectError();
+ ShutdownAndCloseSocket();
+ return false;
+ }
+
+ return true;
+}
+
+} // namespace transport_adapter
+} // namespace transport_manager
diff --git a/src/components/transport_manager/src/tcp/tcp_socket_connection.cc b/src/components/transport_manager/src/tcp/tcp_socket_connection.cc
index acab9f555f..a2ef38f3cb 100644
--- a/src/components/transport_manager/src/tcp/tcp_socket_connection.cc
+++ b/src/components/transport_manager/src/tcp/tcp_socket_connection.cc
@@ -1,6 +1,6 @@
/*
*
- * Copyright (c) 2013, Ford Motor Company
+ * Copyright (c) 2017, Ford Motor Company
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
@@ -32,16 +32,9 @@
*/
#include "transport_manager/tcp/tcp_socket_connection.h"
-
-#include <memory.h>
-#include <signal.h>
-#include <errno.h>
-#include <unistd.h>
-
-#include "utils/logger.h"
-#include "utils/threads/thread.h"
#include "transport_manager/tcp/tcp_device.h"
#include "transport_manager/transport_adapter/transport_adapter_controller.h"
+#include "utils/logger.h"
namespace transport_manager {
namespace transport_adapter {
@@ -53,65 +46,11 @@ TcpSocketConnection::TcpSocketConnection(const DeviceUID& device_uid,
TransportAdapterController* controller)
: ThreadedSocketConnection(device_uid, app_handle, controller) {}
-TcpSocketConnection::~TcpSocketConnection() {}
-
-bool TcpSocketConnection::Establish(ConnectError** error) {
- return true;
+TcpSocketConnection::~TcpSocketConnection() {
+ StopAndJoinThread();
}
-TcpServerOiginatedSocketConnection::TcpServerOiginatedSocketConnection(
- const DeviceUID& device_uid,
- const ApplicationHandle& app_handle,
- TransportAdapterController* controller)
- : ThreadedSocketConnection(device_uid, app_handle, controller) {}
-
-TcpServerOiginatedSocketConnection::~TcpServerOiginatedSocketConnection() {}
-
-bool TcpServerOiginatedSocketConnection::Establish(ConnectError** error) {
- LOG4CXX_AUTO_TRACE(logger_);
- DCHECK(error);
- LOG4CXX_DEBUG(logger_, "error " << error);
- DeviceSptr device = controller()->FindDevice(device_handle());
- if (!device.valid()) {
- LOG4CXX_ERROR(logger_, "Device " << device_handle() << " not found");
- *error = new ConnectError();
- return false;
- }
- TcpDevice* tcp_device = static_cast<TcpDevice*>(device.get());
-
- const int port = tcp_device->GetApplicationPort(application_handle());
- if (-1 == port) {
- LOG4CXX_ERROR(logger_,
- "Application port for " << application_handle()
- << " not found");
- *error = new ConnectError();
- return false;
- }
-
- const int socket = ::socket(AF_INET, SOCK_STREAM, 0);
- if (socket < 0) {
- LOG4CXX_ERROR(logger_, "Failed to create socket");
- *error = new ConnectError();
- return false;
- }
-
- struct sockaddr_in addr = {0};
- addr.sin_family = AF_INET;
- addr.sin_addr.s_addr = tcp_device->in_addr();
- addr.sin_port = htons(port);
-
- LOG4CXX_DEBUG(logger_,
- "Connecting " << inet_ntoa(addr.sin_addr) << ":" << port);
- if (::connect(socket, (struct sockaddr*)&addr, sizeof(addr)) < 0) {
- LOG4CXX_ERROR(logger_,
- "Failed to connect for application " << application_handle()
- << ", error " << errno);
- *error = new ConnectError();
- ::close(socket);
- return false;
- }
-
- set_socket(socket);
+bool TcpSocketConnection::Establish(ConnectError** error) {
return true;
}
diff --git a/src/components/transport_manager/src/tcp/tcp_transport_adapter.cc b/src/components/transport_manager/src/tcp/tcp_transport_adapter.cc
index a389deb517..0e9e63263b 100644
--- a/src/components/transport_manager/src/tcp/tcp_transport_adapter.cc
+++ b/src/components/transport_manager/src/tcp/tcp_transport_adapter.cc
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2013, Ford Motor Company
+ * Copyright (c) 2017, Ford Motor Company
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
@@ -110,7 +110,7 @@ void TcpTransportAdapter::Store() const {
}
}
tcp_adapter_dictionary["devices"] = devices_dictionary;
- Json::Value& dictionary = last_state().dictionary;
+ Json::Value& dictionary = last_state().get_dictionary();
dictionary["TransportManager"]["TcpAdapter"] = tcp_adapter_dictionary;
}
@@ -118,7 +118,7 @@ bool TcpTransportAdapter::Restore() {
LOG4CXX_AUTO_TRACE(logger_);
bool errors_occurred = false;
const Json::Value tcp_adapter_dictionary =
- last_state().dictionary["TransportManager"]["TcpAdapter"];
+ last_state().get_dictionary()["TransportManager"]["TcpAdapter"];
const Json::Value devices_dictionary = tcp_adapter_dictionary["devices"];
for (Json::Value::const_iterator i = devices_dictionary.begin();
i != devices_dictionary.end();