diff --git a/src/net/asioreceivebuffer.h b/src/net/asioreceivebuffer.h
new file mode 100644
index 00000000..8427311b
--- /dev/null
+++ b/src/net/asioreceivebuffer.h
@@ -0,0 +1,62 @@
+/*****************************************************************************
+ * PokerTH - The open source texas holdem engine *
+ * Copyright (C) 2006-2013 Felix Hammer, Florian Thauer, Lothar May *
+ * *
+ * This program is free software: you can redistribute it and/or modify *
+ * it under the terms of the GNU Affero General Public License as *
+ * published by the Free Software Foundation, either version 3 of the *
+ * License, or (at your option) any later version. *
+ * *
+ * This program is distributed in the hope that it will be useful, *
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of *
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
+ * GNU Affero General Public License for more details. *
+ * *
+ * You should have received a copy of the GNU Affero General Public License *
+ * along with this program. If not, see . *
+ * *
+ * *
+ * Additional permission under GNU AGPL version 3 section 7 *
+ * *
+ * If you modify this program, or any covered work, by linking or *
+ * combining it with the OpenSSL project's OpenSSL library (or a *
+ * modified version of that library), containing parts covered by the *
+ * terms of the OpenSSL or SSLeay licenses, the authors of PokerTH *
+ * (Felix Hammer, Florian Thauer, Lothar May) grant you additional *
+ * permission to convey the resulting work. *
+ * Corresponding Source for a non-source form of such a combination *
+ * shall include the source code for the parts of OpenSSL used as well *
+ * as that of the covered work. *
+ *****************************************************************************/
+/* ASIO standard socket receive buffer. */
+
+#ifndef _ASIORECEIVEBUFFER_H_
+#define _ASIORECEIVEBUFFER_H_
+
+#include
+
+// MUST be larger than MAX_PACKET_SIZE
+#define RECV_BUF_SIZE 5 * MAX_PACKET_SIZE
+
+class AsioReceiveBuffer : public ReceiveBuffer
+{
+public:
+ AsioReceiveBuffer();
+
+ virtual void StartAsyncRead(boost::shared_ptr session);
+ virtual void HandleRead(boost::shared_ptr session, const boost::system::error_code &error, size_t bytesRead);
+ virtual void HandleMessage(boost::shared_ptr session, const std::string &msg);
+
+protected:
+
+ void ScanPackets(boost::shared_ptr session);
+ void ProcessPackets(boost::shared_ptr session);
+
+
+private:
+ NetPacketList receivedPackets;
+ char recvBuf[RECV_BUF_SIZE];
+ size_t recvBufUsed;
+};
+
+#endif
diff --git a/src/net/asiosendbuffer.h b/src/net/asiosendbuffer.h
new file mode 100644
index 00000000..d0eceff0
--- /dev/null
+++ b/src/net/asiosendbuffer.h
@@ -0,0 +1,101 @@
+/*****************************************************************************
+ * PokerTH - The open source texas holdem engine *
+ * Copyright (C) 2006-2013 Felix Hammer, Florian Thauer, Lothar May *
+ * *
+ * This program is free software: you can redistribute it and/or modify *
+ * it under the terms of the GNU Affero General Public License as *
+ * published by the Free Software Foundation, either version 3 of the *
+ * License, or (at your option) any later version. *
+ * *
+ * This program is distributed in the hope that it will be useful, *
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of *
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
+ * GNU Affero General Public License for more details. *
+ * *
+ * You should have received a copy of the GNU Affero General Public License *
+ * along with this program. If not, see . *
+ * *
+ * *
+ * Additional permission under GNU AGPL version 3 section 7 *
+ * *
+ * If you modify this program, or any covered work, by linking or *
+ * combining it with the OpenSSL project's OpenSSL library (or a *
+ * modified version of that library), containing parts covered by the *
+ * terms of the OpenSSL or SSLeay licenses, the authors of PokerTH *
+ * (Felix Hammer, Florian Thauer, Lothar May) grant you additional *
+ * permission to convey the resulting work. *
+ * Corresponding Source for a non-source form of such a combination *
+ * shall include the source code for the parts of OpenSSL used as well *
+ * as that of the covered work. *
+ *****************************************************************************/
+/* Buffer for sending network data. */
+
+#ifndef _ASIOSENDBUFFER_H_
+#define _ASIOSENDBUFFER_H_
+
+#include
+#include
+
+
+#define SEND_BUF_FIRST_ALLOC_CHUNKSIZE 4096
+#define MAX_SEND_BUF_SIZE SEND_BUF_FIRST_ALLOC_CHUNKSIZE * 256
+
+
+class AsioSendBuffer : public SendBuffer
+{
+public:
+ AsioSendBuffer();
+ virtual ~AsioSendBuffer();
+
+ inline size_t GetSendBufLeft() const {
+ int bytesLeft = (int)(sendBufAllocated - sendBufUsed);
+ return bytesLeft < 0 ? (size_t)0 : (size_t)bytesLeft;
+ }
+
+ inline size_t GetAllocated() const {
+ return sendBufAllocated;
+ }
+
+ inline bool ReallocSendBuf() {
+ bool retVal = false;
+ size_t allocAmount = sendBufAllocated * 2;
+ if (0 == allocAmount) {
+ allocAmount = (size_t)SEND_BUF_FIRST_ALLOC_CHUNKSIZE;
+ }
+ if (allocAmount <= MAX_SEND_BUF_SIZE) {
+ char *tempBuf = (char *)std::realloc(sendBuf, allocAmount);
+ if (tempBuf) {
+ sendBuf = tempBuf;
+ sendBufAllocated = allocAmount;
+ retVal = true;
+ }
+ }
+ return retVal;
+ }
+
+ inline void AppendToSendBufWithoutCheck(const char *data, size_t size) {
+ std::memcpy(sendBuf + sendBufUsed, data, size);
+ sendBufUsed += size;
+ }
+
+ virtual void SetCloseAfterSend();
+
+ virtual void AsyncSendNextPacket(boost::shared_ptr session);
+ void AsyncSendNextPacket(boost::shared_ptr socket);
+ virtual void InternalStorePacket(boost::shared_ptr session, boost::shared_ptr packet);
+ int EncodeToBuf(boost::shared_ptr session, const void *data, size_t size);
+
+ virtual void HandleWrite(boost::shared_ptr socket, const boost::system::error_code &error);
+
+private:
+ char *sendBuf;
+ char *curWriteBuf;
+ size_t sendBufAllocated;
+ size_t sendBufUsed;
+ size_t curWriteBufAllocated;
+ size_t curWriteBufUsed;
+ bool closeAfterSend;
+};
+
+#endif
+
diff --git a/src/net/common/asioreceivebuffer.cpp b/src/net/common/asioreceivebuffer.cpp
new file mode 100644
index 00000000..c4f85beb
--- /dev/null
+++ b/src/net/common/asioreceivebuffer.cpp
@@ -0,0 +1,150 @@
+/*****************************************************************************
+ * PokerTH - The open source texas holdem engine *
+ * Copyright (C) 2006-2012 Felix Hammer, Florian Thauer, Lothar May *
+ * *
+ * This program is free software: you can redistribute it and/or modify *
+ * it under the terms of the GNU Affero General Public License as *
+ * published by the Free Software Foundation, either version 3 of the *
+ * License, or (at your option) any later version. *
+ * *
+ * This program is distributed in the hope that it will be useful, *
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of *
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
+ * GNU Affero General Public License for more details. *
+ * *
+ * You should have received a copy of the GNU Affero General Public License *
+ * along with this program. If not, see . *
+ * *
+ * *
+ * Additional permission under GNU AGPL version 3 section 7 *
+ * *
+ * If you modify this program, or any covered work, by linking or *
+ * combining it with the OpenSSL project's OpenSSL library (or a *
+ * modified version of that library), containing parts covered by the *
+ * terms of the OpenSSL or SSLeay licenses, the authors of PokerTH *
+ * (Felix Hammer, Florian Thauer, Lothar May) grant you additional *
+ * permission to convey the resulting work. *
+ * Corresponding Source for a non-source form of such a combination *
+ * shall include the source code for the parts of OpenSSL used as well *
+ * as that of the covered work. *
+ *****************************************************************************/
+
+#include
+#include
+
+#include
+#include
+#include
+#include
+
+using namespace std;
+
+AsioReceiveBuffer::AsioReceiveBuffer()
+ : recvBufUsed(0)
+{
+ recvBuf[0] = 0;
+}
+
+void
+AsioReceiveBuffer::StartAsyncRead(boost::shared_ptr session)
+{
+ session->GetAsioSocket()->async_read_some(
+ boost::asio::buffer(recvBuf + recvBufUsed, RECV_BUF_SIZE - recvBufUsed),
+ boost::bind(
+ &ReceiveBuffer::HandleRead,
+ shared_from_this(),
+ session,
+ boost::asio::placeholders::error,
+ boost::asio::placeholders::bytes_transferred));
+}
+
+void
+AsioReceiveBuffer::HandleRead(boost::shared_ptr session, const boost::system::error_code &error, size_t bytesRead)
+{
+ if (error != boost::asio::error::operation_aborted) {
+ try {
+ if (!error) {
+ recvBufUsed += bytesRead;
+ ScanPackets(session);
+ ProcessPackets(session);
+ StartAsyncRead(session);
+ } else if (error == boost::asio::error::interrupted || error == boost::asio::error::try_again) {
+ LOG_ERROR("Session " << session->GetId() << " - recv interrupted: " << error);
+ StartAsyncRead(session);
+ } else {
+ LOG_ERROR("Session " << session->GetId() << " - Connection closed: " << error);
+ // On error: Close this session.
+ session->Close();
+ }
+ } catch (const exception &e) {
+ LOG_ERROR("Session " << session->GetId() << " - unhandled exception in HandleRead: " << e.what());
+ throw;
+ }
+ }
+}
+
+void
+AsioReceiveBuffer::HandleMessage(boost::shared_ptr /*session*/, const string &/*msg*/)
+{
+ LOG_ERROR("AsioReceiveBuffer::HandleMessage should never be called because TCP I/O is not message based.");
+}
+
+void
+AsioReceiveBuffer::ScanPackets(boost::shared_ptr session)
+{
+ bool dataAvailable = true;
+ do {
+ boost::shared_ptr tmpPacket;
+ // This is necessary, because we use TCP.
+ // Packets may be received in multiple chunks or
+ // several packets may be received at once.
+ if (recvBufUsed >= NET_HEADER_SIZE) {
+ // Read the size of the packet (first 4 bytes in network byte order).
+ uint32_t nativeVal;
+ memcpy(&nativeVal, &recvBuf[0], sizeof(uint32_t));
+ size_t packetSize = ntohl(nativeVal);
+ if (packetSize > MAX_PACKET_SIZE) {
+ recvBufUsed = 0;
+ LOG_ERROR("Session " << session->GetId() << " - Invalid packet size: " << packetSize);
+ } else if (recvBufUsed >= packetSize + NET_HEADER_SIZE) {
+ try {
+ tmpPacket = NetPacket::Create(&recvBuf[NET_HEADER_SIZE], packetSize);
+ if (tmpPacket) {
+ recvBufUsed -= (packetSize + NET_HEADER_SIZE);
+ if (recvBufUsed) {
+ memmove(recvBuf, recvBuf + packetSize + NET_HEADER_SIZE, recvBufUsed);
+ }
+ }
+ } catch (const exception &e) {
+ // Reset buffer on error.
+ recvBufUsed = 0;
+ LOG_ERROR("Session " << session->GetId() << " - " << e.what());
+ }
+ }
+ }
+ if (tmpPacket) {
+ if (validator.IsValidPacket(*tmpPacket)) {
+ receivedPackets.push_back(tmpPacket);
+ } else {
+ LOG_ERROR("Session " << session->GetId() << " - Invalid packet: " << tmpPacket->GetMsg()->messagetype());
+ }
+ } else {
+ dataAvailable = false;
+ }
+ } while(dataAvailable);
+}
+
+void
+AsioReceiveBuffer::ProcessPackets(boost::shared_ptr session)
+{
+ while (!receivedPackets.empty()) {
+ boost::shared_ptr p = receivedPackets.front();
+ receivedPackets.pop_front();
+ session->HandlePacket(p);
+ }
+ if (recvBufUsed >= RECV_BUF_SIZE) {
+ LOG_ERROR("Session " << session->GetId() << " - Receive buf full: " << recvBufUsed);
+ recvBufUsed = 0;
+ }
+}
+
diff --git a/src/net/common/asiosendbuffer.cpp b/src/net/common/asiosendbuffer.cpp
new file mode 100644
index 00000000..8d30ff5a
--- /dev/null
+++ b/src/net/common/asiosendbuffer.cpp
@@ -0,0 +1,126 @@
+/*****************************************************************************
+ * PokerTH - The open source texas holdem engine *
+ * Copyright (C) 2006-2013 Felix Hammer, Florian Thauer, Lothar May *
+ * *
+ * This program is free software: you can redistribute it and/or modify *
+ * it under the terms of the GNU Affero General Public License as *
+ * published by the Free Software Foundation, either version 3 of the *
+ * License, or (at your option) any later version. *
+ * *
+ * This program is distributed in the hope that it will be useful, *
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of *
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
+ * GNU Affero General Public License for more details. *
+ * *
+ * You should have received a copy of the GNU Affero General Public License *
+ * along with this program. If not, see . *
+ * *
+ * *
+ * Additional permission under GNU AGPL version 3 section 7 *
+ * *
+ * If you modify this program, or any covered work, by linking or *
+ * combining it with the OpenSSL project's OpenSSL library (or a *
+ * modified version of that library), containing parts covered by the *
+ * terms of the OpenSSL or SSLeay licenses, the authors of PokerTH *
+ * (Felix Hammer, Florian Thauer, Lothar May) grant you additional *
+ * permission to convey the resulting work. *
+ * Corresponding Source for a non-source form of such a combination *
+ * shall include the source code for the parts of OpenSSL used as well *
+ * as that of the covered work. *
+ *****************************************************************************/
+
+#include
+#include
+
+#include
+#include
+#include
+#include
+
+using namespace std;
+
+
+AsioSendBuffer::AsioSendBuffer()
+ : sendBuf(NULL), curWriteBuf(NULL), sendBufAllocated(0), sendBufUsed(0),
+ curWriteBufAllocated(0), curWriteBufUsed(0), closeAfterSend(false)
+{
+}
+
+AsioSendBuffer::~AsioSendBuffer()
+{
+ free(sendBuf);
+ free(curWriteBuf);
+}
+
+void
+AsioSendBuffer::SetCloseAfterSend()
+{
+ closeAfterSend = true;
+}
+
+void
+AsioSendBuffer::HandleWrite(boost::shared_ptr socket, const boost::system::error_code &error)
+{
+ if (!error) {
+ // Successfully sent the data.
+ boost::mutex::scoped_lock lock(dataMutex);
+ curWriteBufUsed = 0;
+ // Send more data, if available.
+ AsyncSendNextPacket(socket);
+ }
+}
+
+void
+AsioSendBuffer::AsyncSendNextPacket(boost::shared_ptr session)
+{
+ AsyncSendNextPacket(session->GetAsioSocket());
+}
+
+void
+AsioSendBuffer::AsyncSendNextPacket(boost::shared_ptr socket)
+{
+ if (!curWriteBufUsed) {
+ // Swap buffers and send data.
+ boost::swap(curWriteBuf, sendBuf);
+ boost::swap(curWriteBufAllocated, sendBufAllocated);
+ boost::swap(curWriteBufUsed, sendBufUsed);
+ if (curWriteBufUsed) {
+ boost::asio::async_write(
+ *socket,
+ boost::asio::buffer(curWriteBuf, curWriteBufUsed),
+ boost::bind(&SendBuffer::HandleWrite,
+ shared_from_this(),
+ socket,
+ boost::asio::placeholders::error));
+ } else if (closeAfterSend) {
+ socket->close();
+ }
+ }
+}
+
+void
+AsioSendBuffer::InternalStorePacket(boost::shared_ptr session, boost::shared_ptr packet)
+{
+ uint32_t packetSize = packet->GetMsg()->ByteSize();
+ google::protobuf::uint8 *buf = new google::protobuf::uint8[packetSize + NET_HEADER_SIZE];
+ *((uint32_t *)buf) = htonl(packetSize);
+ packet->GetMsg()->SerializeWithCachedSizesToArray(&buf[NET_HEADER_SIZE]);
+ EncodeToBuf(session, buf, packetSize + NET_HEADER_SIZE);
+ delete[] buf;
+}
+
+int
+AsioSendBuffer::EncodeToBuf(boost::shared_ptr /*session*/, const void *data, size_t size)
+{
+ // Realloc buffer if necessary.
+ while (GetSendBufLeft() < size) {
+ if (!ReallocSendBuf()) {
+ return -1;
+ }
+ }
+
+ AppendToSendBufWithoutCheck((const char*)data, size);
+
+ return 0;
+}
+
diff --git a/src/net/common/serveracceptinterface.cpp b/src/net/common/serveracceptinterface.cpp
new file mode 100644
index 00000000..6a449939
--- /dev/null
+++ b/src/net/common/serveracceptinterface.cpp
@@ -0,0 +1,39 @@
+/*****************************************************************************
+ * PokerTH - The open source texas holdem engine *
+ * Copyright (C) 2006-2013 Felix Hammer, Florian Thauer, Lothar May *
+ * *
+ * This program is free software: you can redistribute it and/or modify *
+ * it under the terms of the GNU Affero General Public License as *
+ * published by the Free Software Foundation, either version 3 of the *
+ * License, or (at your option) any later version. *
+ * *
+ * This program is distributed in the hope that it will be useful, *
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of *
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
+ * GNU Affero General Public License for more details. *
+ * *
+ * You should have received a copy of the GNU Affero General Public License *
+ * along with this program. If not, see . *
+ * *
+ * *
+ * Additional permission under GNU AGPL version 3 section 7 *
+ * *
+ * If you modify this program, or any covered work, by linking or *
+ * combining it with the OpenSSL project's OpenSSL library (or a *
+ * modified version of that library), containing parts covered by the *
+ * terms of the OpenSSL or SSLeay licenses, the authors of PokerTH *
+ * (Felix Hammer, Florian Thauer, Lothar May) grant you additional *
+ * permission to convey the resulting work. *
+ * Corresponding Source for a non-source form of such a combination *
+ * shall include the source code for the parts of OpenSSL used as well *
+ * as that of the covered work. *
+ *****************************************************************************/
+
+#include
+
+
+ServerAcceptInterface::~ServerAcceptInterface()
+{
+}
+
+
diff --git a/src/net/common/serveracceptwebhelper.cpp b/src/net/common/serveracceptwebhelper.cpp
new file mode 100644
index 00000000..aac05908
--- /dev/null
+++ b/src/net/common/serveracceptwebhelper.cpp
@@ -0,0 +1,116 @@
+/*****************************************************************************
+ * PokerTH - The open source texas holdem engine *
+ * Copyright (C) 2006-2013 Felix Hammer, Florian Thauer, Lothar May *
+ * *
+ * This program is free software: you can redistribute it and/or modify *
+ * it under the terms of the GNU Affero General Public License as *
+ * published by the Free Software Foundation, either version 3 of the *
+ * License, or (at your option) any later version. *
+ * *
+ * This program is distributed in the hope that it will be useful, *
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of *
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
+ * GNU Affero General Public License for more details. *
+ * *
+ * You should have received a copy of the GNU Affero General Public License *
+ * along with this program. If not, see . *
+ * *
+ * *
+ * Additional permission under GNU AGPL version 3 section 7 *
+ * *
+ * If you modify this program, or any covered work, by linking or *
+ * combining it with the OpenSSL project's OpenSSL library (or a *
+ * modified version of that library), containing parts covered by the *
+ * terms of the OpenSSL or SSLeay licenses, the authors of PokerTH *
+ * (Felix Hammer, Florian Thauer, Lothar May) grant you additional *
+ * permission to convey the resulting work. *
+ * Corresponding Source for a non-source form of such a combination *
+ * shall include the source code for the parts of OpenSSL used as well *
+ * as that of the covered work. *
+ *****************************************************************************/
+
+#include
+#include
+#include
+#include
+
+using namespace std;
+
+ServerAcceptWebHelper::ServerAcceptWebHelper(ServerCallback &serverCallback, boost::shared_ptr ioService)
+ : m_serverCallback(serverCallback), m_ioService(ioService)
+{
+ m_webSocketServer.reset(new server);
+}
+
+void
+ServerAcceptWebHelper::Listen(unsigned serverPort, bool /*ipv6*/, const std::string &/*logDir*/, boost::shared_ptr lobbyThread)
+{
+ m_lobbyThread = lobbyThread;
+
+ // Set logging settings
+#ifdef QT_NO_DEBUG
+ m_webSocketServer->clear_access_channels(websocketpp::log::alevel::all);
+#else
+ m_webSocketServer->set_access_channels(websocketpp::log::alevel::all);
+#endif
+
+ m_webSocketServer->init_asio(m_ioService.get());
+
+ m_webSocketServer->set_validate_handler(boost::bind(boost::mem_fn(&ServerAcceptWebHelper::validate), this, _1));
+ m_webSocketServer->set_open_handler(boost::bind(boost::mem_fn(&ServerAcceptWebHelper::on_open), this, _1));
+ m_webSocketServer->set_close_handler(boost::bind(boost::mem_fn(&ServerAcceptWebHelper::on_close), this, _1));
+ m_webSocketServer->set_message_handler(boost::bind(boost::mem_fn(&ServerAcceptWebHelper::on_message), this, _1, _2));
+
+ m_webSocketServer->listen(serverPort);
+ m_webSocketServer->start_accept();
+}
+
+void
+ServerAcceptWebHelper::Close()
+{
+}
+
+bool
+ServerAcceptWebHelper::validate(websocketpp::connection_hdl hdl)
+{
+ return true;
+}
+
+void
+ServerAcceptWebHelper::on_open(websocketpp::connection_hdl hdl)
+{
+ boost::shared_ptr webData(new WebSocketData);
+ webData->webSocketServer = m_webSocketServer;
+ webData->webHandle = hdl;
+ boost::shared_ptr sessionData(new SessionData(webData, m_lobbyThread->GetNextSessionId(), m_lobbyThread->GetSessionDataCallback(), *m_ioService, 0));
+ m_sessionMap.insert(make_pair(hdl, sessionData));
+ m_lobbyThread->AddConnection(sessionData);
+}
+
+void
+ServerAcceptWebHelper::on_close(websocketpp::connection_hdl hdl)
+{
+ SessionMap::iterator pos = m_sessionMap.find(hdl);
+ if (pos != m_sessionMap.end()) {
+ boost::shared_ptr tmpSession = pos->second.lock();
+ if (tmpSession) {
+ tmpSession->Close();
+ }
+ m_sessionMap.erase(pos);
+ }
+}
+
+void
+ServerAcceptWebHelper::on_message(websocketpp::connection_hdl hdl, server::message_ptr msg)
+{
+ if (msg->get_opcode() == websocketpp::frame::opcode::BINARY) {
+ SessionMap::iterator pos = m_sessionMap.find(hdl);
+ if (pos != m_sessionMap.end()) {
+ boost::shared_ptr tmpSession = pos->second.lock();
+ if (tmpSession) {
+ tmpSession->GetReceiveBuffer().HandleMessage(tmpSession, msg->get_payload());
+ }
+ }
+ }
+}
+
diff --git a/src/net/common/webreceivebuffer.cpp b/src/net/common/webreceivebuffer.cpp
new file mode 100644
index 00000000..e2b0fc0a
--- /dev/null
+++ b/src/net/common/webreceivebuffer.cpp
@@ -0,0 +1,72 @@
+/*****************************************************************************
+ * PokerTH - The open source texas holdem engine *
+ * Copyright (C) 2006-2013 Felix Hammer, Florian Thauer, Lothar May *
+ * *
+ * This program is free software: you can redistribute it and/or modify *
+ * it under the terms of the GNU Affero General Public License as *
+ * published by the Free Software Foundation, either version 3 of the *
+ * License, or (at your option) any later version. *
+ * *
+ * This program is distributed in the hope that it will be useful, *
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of *
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
+ * GNU Affero General Public License for more details. *
+ * *
+ * You should have received a copy of the GNU Affero General Public License *
+ * along with this program. If not, see . *
+ * *
+ * *
+ * Additional permission under GNU AGPL version 3 section 7 *
+ * *
+ * If you modify this program, or any covered work, by linking or *
+ * combining it with the OpenSSL project's OpenSSL library (or a *
+ * modified version of that library), containing parts covered by the *
+ * terms of the OpenSSL or SSLeay licenses, the authors of PokerTH *
+ * (Felix Hammer, Florian Thauer, Lothar May) grant you additional *
+ * permission to convey the resulting work. *
+ * Corresponding Source for a non-source form of such a combination *
+ * shall include the source code for the parts of OpenSSL used as well *
+ * as that of the covered work. *
+ *****************************************************************************/
+
+#include
+#include
+#include
+
+using namespace std;
+
+
+WebReceiveBuffer::WebReceiveBuffer()
+{
+}
+
+void
+WebReceiveBuffer::StartAsyncRead(boost::shared_ptr session)
+{
+ // Nothing to do. This is handled internally by websocketpp.
+}
+
+void
+WebReceiveBuffer::HandleRead(boost::shared_ptr /*session*/, const boost::system::error_code &/*error*/, size_t /*bytesRead*/)
+{
+ LOG_ERROR("WebReceiveBuffer::HandleRead should never be called because Websocket I/O is message based.");
+}
+
+void
+WebReceiveBuffer::HandleMessage(boost::shared_ptr session, const string &msg)
+{
+ boost::shared_ptr tmpPacket;
+ try {
+ tmpPacket = NetPacket::Create(msg.c_str(), msg.size());
+ if (!validator.IsValidPacket(*tmpPacket)) {
+ LOG_ERROR("Session " << session->GetId() << " - Invalid packet: " << tmpPacket->GetMsg()->messagetype());
+ tmpPacket.reset();
+ }
+ } catch (const exception &e) {
+ LOG_ERROR("Session " << session->GetId() << " - " << e.what());
+ }
+ if (tmpPacket) {
+ session->HandlePacket(tmpPacket);
+ }
+}
+
diff --git a/src/net/common/websendbuffer.cpp b/src/net/common/websendbuffer.cpp
new file mode 100644
index 00000000..c3489132
--- /dev/null
+++ b/src/net/common/websendbuffer.cpp
@@ -0,0 +1,75 @@
+/*****************************************************************************
+ * PokerTH - The open source texas holdem engine *
+ * Copyright (C) 2006-2012 Felix Hammer, Florian Thauer, Lothar May *
+ * *
+ * This program is free software: you can redistribute it and/or modify *
+ * it under the terms of the GNU Affero General Public License as *
+ * published by the Free Software Foundation, either version 3 of the *
+ * License, or (at your option) any later version. *
+ * *
+ * This program is distributed in the hope that it will be useful, *
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of *
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
+ * GNU Affero General Public License for more details. *
+ * *
+ * You should have received a copy of the GNU Affero General Public License *
+ * along with this program. If not, see . *
+ * *
+ * *
+ * Additional permission under GNU AGPL version 3 section 7 *
+ * *
+ * If you modify this program, or any covered work, by linking or *
+ * combining it with the OpenSSL project's OpenSSL library (or a *
+ * modified version of that library), containing parts covered by the *
+ * terms of the OpenSSL or SSLeay licenses, the authors of PokerTH *
+ * (Felix Hammer, Florian Thauer, Lothar May) grant you additional *
+ * permission to convey the resulting work. *
+ * Corresponding Source for a non-source form of such a combination *
+ * shall include the source code for the parts of OpenSSL used as well *
+ * as that of the covered work. *
+ *****************************************************************************/
+
+#include
+#include
+#include
+
+using namespace std;
+
+
+WebSendBuffer::WebSendBuffer(boost::shared_ptr webData)
+ : closeAfterSend(false), m_webData(webData)
+{
+}
+
+void
+WebSendBuffer::SetCloseAfterSend()
+{
+ closeAfterSend = true;
+}
+
+void
+WebSendBuffer::HandleWrite(boost::shared_ptr /*socket*/, const boost::system::error_code &/*error*/)
+{
+}
+
+void
+WebSendBuffer::AsyncSendNextPacket(boost::shared_ptr session)
+{
+ if (closeAfterSend) {
+ boost::system::error_code ec;
+ m_webData->webSocketServer->close(m_webData->webHandle, websocketpp::close::status::normal, "PokerTH server closed the connection.", ec);
+ }
+}
+
+void
+WebSendBuffer::InternalStorePacket(boost::shared_ptr session, boost::shared_ptr packet)
+{
+ uint32_t packetSize = packet->GetMsg()->ByteSize();
+ google::protobuf::uint8 *buf = new google::protobuf::uint8[packetSize];
+ packet->GetMsg()->SerializeWithCachedSizesToArray(buf);
+
+ m_webData->webSocketServer->send(m_webData->webHandle, string((const char *)buf, packetSize), websocketpp::frame::opcode::BINARY);
+
+ delete[] buf;
+}
+
diff --git a/src/net/serveracceptinterface.h b/src/net/serveracceptinterface.h
new file mode 100644
index 00000000..34f4d200
--- /dev/null
+++ b/src/net/serveracceptinterface.h
@@ -0,0 +1,53 @@
+/*****************************************************************************
+ * PokerTH - The open source texas holdem engine *
+ * Copyright (C) 2006-2013 Felix Hammer, Florian Thauer, Lothar May *
+ * *
+ * This program is free software: you can redistribute it and/or modify *
+ * it under the terms of the GNU Affero General Public License as *
+ * published by the Free Software Foundation, either version 3 of the *
+ * License, or (at your option) any later version. *
+ * *
+ * This program is distributed in the hope that it will be useful, *
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of *
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
+ * GNU Affero General Public License for more details. *
+ * *
+ * You should have received a copy of the GNU Affero General Public License *
+ * along with this program. If not, see . *
+ * *
+ * *
+ * Additional permission under GNU AGPL version 3 section 7 *
+ * *
+ * If you modify this program, or any covered work, by linking or *
+ * combining it with the OpenSSL project's OpenSSL library (or a *
+ * modified version of that library), containing parts covered by the *
+ * terms of the OpenSSL or SSLeay licenses, the authors of PokerTH *
+ * (Felix Hammer, Florian Thauer, Lothar May) grant you additional *
+ * permission to convey the resulting work. *
+ * Corresponding Source for a non-source form of such a combination *
+ * shall include the source code for the parts of OpenSSL used as well *
+ * as that of the covered work. *
+ *****************************************************************************/
+/* Network server helper interface to accept connections. */
+
+#ifndef _SERVERACCEPINTERFACE_H_
+#define _SERVERACCEPINTERFACE_H_
+
+#include
+#include
+
+class ServerLobbyThread;
+
+class ServerAcceptInterface
+{
+public:
+ virtual ~ServerAcceptInterface();
+
+ virtual void Listen(unsigned serverPort, bool ipv6, const std::string &logDir,
+ boost::shared_ptr lobbyThread) = 0;
+
+ virtual void Close() = 0;
+};
+
+
+#endif
diff --git a/src/net/serveracceptwebhelper.h b/src/net/serveracceptwebhelper.h
new file mode 100644
index 00000000..3f7d91e7
--- /dev/null
+++ b/src/net/serveracceptwebhelper.h
@@ -0,0 +1,68 @@
+/*****************************************************************************
+ * PokerTH - The open source texas holdem engine *
+ * Copyright (C) 2006-2013 Felix Hammer, Florian Thauer, Lothar May *
+ * *
+ * This program is free software: you can redistribute it and/or modify *
+ * it under the terms of the GNU Affero General Public License as *
+ * published by the Free Software Foundation, either version 3 of the *
+ * License, or (at your option) any later version. *
+ * *
+ * This program is distributed in the hope that it will be useful, *
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of *
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
+ * GNU Affero General Public License for more details. *
+ * *
+ * You should have received a copy of the GNU Affero General Public License *
+ * along with this program. If not, see . *
+ * *
+ * *
+ * Additional permission under GNU AGPL version 3 section 7 *
+ * *
+ * If you modify this program, or any covered work, by linking or *
+ * combining it with the OpenSSL project's OpenSSL library (or a *
+ * modified version of that library), containing parts covered by the *
+ * terms of the OpenSSL or SSLeay licenses, the authors of PokerTH *
+ * (Felix Hammer, Florian Thauer, Lothar May) grant you additional *
+ * permission to convey the resulting work. *
+ * Corresponding Source for a non-source form of such a combination *
+ * shall include the source code for the parts of OpenSSL used as well *
+ * as that of the covered work. *
+ *****************************************************************************/
+/* Network server helper to accept websocket connections. */
+
+#ifndef _SERVERACCEPTWEBHELPER_H_
+#define _SERVERACCEPTWEBHELPER_H_
+
+#include
+#include
+#include
+
+class ServerAcceptWebHelper : public ServerAcceptInterface
+{
+public:
+ ServerAcceptWebHelper(ServerCallback &serverCallback, boost::shared_ptr ioService);
+
+ virtual void Listen(unsigned serverPort, bool ipv6, const std::string &logDir,
+ boost::shared_ptr lobbyThread);
+
+ virtual void Close();
+
+protected:
+
+ typedef std::map > SessionMap;
+
+ bool validate(websocketpp::connection_hdl hdl);
+ void on_open(websocketpp::connection_hdl hdl);
+ void on_close(websocketpp::connection_hdl hdl);
+ void on_message(websocketpp::connection_hdl hdl, server::message_ptr msg);
+
+private:
+ boost::shared_ptr m_ioService;
+ ServerCallback &m_serverCallback;
+ boost::shared_ptr m_webSocketServer;
+ SessionMap m_sessionMap;
+
+ boost::shared_ptr m_lobbyThread;
+};
+
+#endif
diff --git a/src/net/webreceivebuffer.h b/src/net/webreceivebuffer.h
new file mode 100644
index 00000000..eb9ce77e
--- /dev/null
+++ b/src/net/webreceivebuffer.h
@@ -0,0 +1,48 @@
+/*****************************************************************************
+ * PokerTH - The open source texas holdem engine *
+ * Copyright (C) 2006-2013 Felix Hammer, Florian Thauer, Lothar May *
+ * *
+ * This program is free software: you can redistribute it and/or modify *
+ * it under the terms of the GNU Affero General Public License as *
+ * published by the Free Software Foundation, either version 3 of the *
+ * License, or (at your option) any later version. *
+ * *
+ * This program is distributed in the hope that it will be useful, *
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of *
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
+ * GNU Affero General Public License for more details. *
+ * *
+ * You should have received a copy of the GNU Affero General Public License *
+ * along with this program. If not, see . *
+ * *
+ * *
+ * Additional permission under GNU AGPL version 3 section 7 *
+ * *
+ * If you modify this program, or any covered work, by linking or *
+ * combining it with the OpenSSL project's OpenSSL library (or a *
+ * modified version of that library), containing parts covered by the *
+ * terms of the OpenSSL or SSLeay licenses, the authors of PokerTH *
+ * (Felix Hammer, Florian Thauer, Lothar May) grant you additional *
+ * permission to convey the resulting work. *
+ * Corresponding Source for a non-source form of such a combination *
+ * shall include the source code for the parts of OpenSSL used as well *
+ * as that of the covered work. *
+ *****************************************************************************/
+/* Websocket receive buffer. */
+
+#ifndef _WEBRECEIVEBUFFER_H_
+#define _WEBRECEIVEBUFFER_H_
+
+#include
+
+class WebReceiveBuffer : public ReceiveBuffer
+{
+public:
+ WebReceiveBuffer();
+
+ virtual void StartAsyncRead(boost::shared_ptr session);
+ virtual void HandleRead(boost::shared_ptr session, const boost::system::error_code &error, size_t bytesRead);
+ virtual void HandleMessage(boost::shared_ptr session, const std::string &msg);
+};
+
+#endif
diff --git a/src/net/websendbuffer.h b/src/net/websendbuffer.h
new file mode 100644
index 00000000..e3005d50
--- /dev/null
+++ b/src/net/websendbuffer.h
@@ -0,0 +1,59 @@
+/*****************************************************************************
+ * PokerTH - The open source texas holdem engine *
+ * Copyright (C) 2006-2013 Felix Hammer, Florian Thauer, Lothar May *
+ * *
+ * This program is free software: you can redistribute it and/or modify *
+ * it under the terms of the GNU Affero General Public License as *
+ * published by the Free Software Foundation, either version 3 of the *
+ * License, or (at your option) any later version. *
+ * *
+ * This program is distributed in the hope that it will be useful, *
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of *
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
+ * GNU Affero General Public License for more details. *
+ * *
+ * You should have received a copy of the GNU Affero General Public License *
+ * along with this program. If not, see . *
+ * *
+ * *
+ * Additional permission under GNU AGPL version 3 section 7 *
+ * *
+ * If you modify this program, or any covered work, by linking or *
+ * combining it with the OpenSSL project's OpenSSL library (or a *
+ * modified version of that library), containing parts covered by the *
+ * terms of the OpenSSL or SSLeay licenses, the authors of PokerTH *
+ * (Felix Hammer, Florian Thauer, Lothar May) grant you additional *
+ * permission to convey the resulting work. *
+ * Corresponding Source for a non-source form of such a combination *
+ * shall include the source code for the parts of OpenSSL used as well *
+ * as that of the covered work. *
+ *****************************************************************************/
+/* Buffer for sending network data through a websocket. */
+
+#ifndef _WEBSENDBUFFER_H_
+#define _WEBSENDBUFFER_H_
+
+#include
+#include
+
+struct WebSocketData;
+
+class WebSendBuffer : public SendBuffer
+{
+public:
+ WebSendBuffer(boost::shared_ptr webData);
+
+ virtual void SetCloseAfterSend();
+
+ virtual void AsyncSendNextPacket(boost::shared_ptr session);
+ virtual void InternalStorePacket(boost::shared_ptr session, boost::shared_ptr packet);
+
+ virtual void HandleWrite(boost::shared_ptr socket, const boost::system::error_code &error);
+
+private:
+ bool closeAfterSend;
+ boost::shared_ptr m_webData;
+};
+
+#endif
+
diff --git a/src/net/websocket_defs.h b/src/net/websocket_defs.h
new file mode 100644
index 00000000..4bcb4752
--- /dev/null
+++ b/src/net/websocket_defs.h
@@ -0,0 +1,41 @@
+/*****************************************************************************
+ * PokerTH - The open source texas holdem engine *
+ * Copyright (C) 2006-2013 Felix Hammer, Florian Thauer, Lothar May *
+ * *
+ * This program is free software: you can redistribute it and/or modify *
+ * it under the terms of the GNU Affero General Public License as *
+ * published by the Free Software Foundation, either version 3 of the *
+ * License, or (at your option) any later version. *
+ * *
+ * This program is distributed in the hope that it will be useful, *
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of *
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
+ * GNU Affero General Public License for more details. *
+ * *
+ * You should have received a copy of the GNU Affero General Public License *
+ * along with this program. If not, see . *
+ * *
+ * *
+ * Additional permission under GNU AGPL version 3 section 7 *
+ * *
+ * If you modify this program, or any covered work, by linking or *
+ * combining it with the OpenSSL project's OpenSSL library (or a *
+ * modified version of that library), containing parts covered by the *
+ * terms of the OpenSSL or SSLeay licenses, the authors of PokerTH *
+ * (Felix Hammer, Florian Thauer, Lothar May) grant you additional *
+ * permission to convey the resulting work. *
+ * Corresponding Source for a non-source form of such a combination *
+ * shall include the source code for the parts of OpenSSL used as well *
+ * as that of the covered work. *
+ *****************************************************************************/
+/* Definitions and includes for websocketpp. */
+
+#ifndef _WEBSOCKET_DEFS_H_
+#define _WEBSOCKET_DEFS_H_
+
+#include
+#include
+
+typedef websocketpp::server server;
+
+#endif
diff --git a/src/net/websocketdata.h b/src/net/websocketdata.h
new file mode 100644
index 00000000..005b924b
--- /dev/null
+++ b/src/net/websocketdata.h
@@ -0,0 +1,45 @@
+/*****************************************************************************
+ * PokerTH - The open source texas holdem engine *
+ * Copyright (C) 2006-2013 Felix Hammer, Florian Thauer, Lothar May *
+ * *
+ * This program is free software: you can redistribute it and/or modify *
+ * it under the terms of the GNU Affero General Public License as *
+ * published by the Free Software Foundation, either version 3 of the *
+ * License, or (at your option) any later version. *
+ * *
+ * This program is distributed in the hope that it will be useful, *
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of *
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
+ * GNU Affero General Public License for more details. *
+ * *
+ * You should have received a copy of the GNU Affero General Public License *
+ * along with this program. If not, see . *
+ * *
+ * *
+ * Additional permission under GNU AGPL version 3 section 7 *
+ * *
+ * If you modify this program, or any covered work, by linking or *
+ * combining it with the OpenSSL project's OpenSSL library (or a *
+ * modified version of that library), containing parts covered by the *
+ * terms of the OpenSSL or SSLeay licenses, the authors of PokerTH *
+ * (Felix Hammer, Florian Thauer, Lothar May) grant you additional *
+ * permission to convey the resulting work. *
+ * Corresponding Source for a non-source form of such a combination *
+ * shall include the source code for the parts of OpenSSL used as well *
+ * as that of the covered work. *
+ *****************************************************************************/
+/* Structure for web socket data for a session. */
+
+#ifndef _WEBSOCKETDATA_H_
+#define _WEBSOCKETDATA_H_
+
+#include
+
+
+struct WebSocketData
+{
+ boost::shared_ptr webSocketServer;
+ websocketpp::connection_hdl webHandle;
+};
+
+#endif