summaryrefslogtreecommitdiffstats
path: root/src/Net/ClientConnection.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/Net/ClientConnection.cpp')
-rw-r--r--src/Net/ClientConnection.cpp87
1 files changed, 12 insertions, 75 deletions
diff --git a/src/Net/ClientConnection.cpp b/src/Net/ClientConnection.cpp
index 087d95f..9cdf796 100644
--- a/src/Net/ClientConnection.cpp
+++ b/src/Net/ClientConnection.cpp
@@ -18,99 +18,36 @@
*/
#include "ClientConnection.h"
-#include "FdManager.h"
-#include "IPAddress.h"
-#include <boost/thread/locks.hpp>
-
-#include <cstring>
-#include <cerrno>
-#include <sys/socket.h>
-#include <fcntl.h>
+#include <Common/Logger.h>
namespace Mad {
namespace Net {
-// TODO Error handling
-void ClientConnection::connectionHeaderReceiveHandler(const void *data, unsigned long length) {
- if(length != sizeof(ConnectionHeader))
- // Error... disconnect
- return;
-
- const ConnectionHeader *header = (const ConnectionHeader*)(data);
-
- if(header->m != 'M' || header->a != 'A' || header->d != 'D')
- // Error... disconnect
+void ClientConnection::handleConnect(const boost::system::error_code& error) {
+ if(error) {
+ // TODO Error handling
+ doDisconnect();
return;
+ }
- if(header->protVerMin != 1)
- // Unsupported protocol... disconnect
- return;
-
- enterReceiveLoop();
-}
-
-void ClientConnection::connectionHeader() {
- ConnectionHeader header = {'M', 'A', 'D', daemon ? 'D' : 'C', 0, 1, 1, 1};
+ boost::lock_guard<boost::shared_mutex> lock(connectionLock);
- rawSend((uint8_t*)&header, sizeof(header));
- rawReceive(sizeof(ConnectionHeader), boost::bind(&ClientConnection::connectionHeaderReceiveHandler, this, _1, _2));
+ socket.async_handshake(boost::asio::ssl::stream_base::client, boost::bind(&ClientConnection::handleHandshake, this, boost::asio::placeholders::error));
}
-void ClientConnection::connect(const IPAddress &address, bool daemon0) throw(Exception) {
- boost::unique_lock<boost::shared_mutex> lock(stateLock);
-
- daemon = daemon0;
+void ClientConnection::connect(const boost::asio::ip::tcp::endpoint &address) throw(Exception) {
+ boost::lock_guard<boost::shared_mutex> lock(connectionLock);
if(_isConnected()) {
return;
// TODO Error
}
- sock = socket(PF_INET, SOCK_STREAM, 0);
- if(sock < 0) {
- throw Exception("socket()", Exception::INTERNAL_ERRNO, errno);
- }
-
- if(peer)
- delete peer;
- peer = new IPAddress(address);
-
- if(::connect(sock, peer->getSockAddr(), peer->getSockAddrLength()) < 0) {
- close(sock);
- delete peer;
- peer = 0;
-
- throw Exception("connect()", Exception::INTERNAL_ERRNO, errno);
- }
-
- // Set non-blocking flag
- int flags = fcntl(sock, F_GETFL, 0);
-
- if(flags < 0) {
- close(sock);
-
- throw Exception("fcntl()", Exception::INTERNAL_ERRNO, errno);
- }
-
- fcntl(sock, F_SETFL, flags | O_NONBLOCK);
-
- // Don't linger
- struct linger linger = {1, 0};
- setsockopt(sock, SOL_SOCKET, SO_LINGER, &linger, sizeof(linger));
-
- gnutls_init(&session, GNUTLS_CLIENT);
- gnutls_set_default_priority(session);
- gnutls_credentials_set(session, GNUTLS_CRD_CERTIFICATE, x509_cred);
- gnutls_transport_set_ptr(session, (gnutls_transport_ptr_t)sock);
-
- FdManager::get()->registerFd(sock, boost::bind(&ClientConnection::sendReceive, this, _1));
-
+ peer = address;
state = CONNECT;
- lock.unlock();
-
- updateEvents();
+ socket.lowest_layer().async_connect(address, boost::bind(&ClientConnection::handleConnect, this, boost::asio::placeholders::error));
}
}