From 78d71d2cad6f243c6ff31d41380b8c5b58407de5 Mon Sep 17 00:00:00 2001 From: Kirill Volinsky Date: Thu, 17 May 2012 17:37:22 +0000 Subject: added some plugins git-svn-id: http://svn.miranda-ng.org/main/trunk@20 1316c22d-e87f-b044-9b9b-93d7a3e3ba9c --- plugins/FavContacts/src/cserver.cpp | 82 +++++++++++++++++++++++++++++++++++++ 1 file changed, 82 insertions(+) create mode 100644 plugins/FavContacts/src/cserver.cpp (limited to 'plugins/FavContacts/src/cserver.cpp') diff --git a/plugins/FavContacts/src/cserver.cpp b/plugins/FavContacts/src/cserver.cpp new file mode 100644 index 0000000000..957d1a6048 --- /dev/null +++ b/plugins/FavContacts/src/cserver.cpp @@ -0,0 +1,82 @@ +#include +#include +#include + +#include "csocket.h" +#include "cserver.h" + +void CServer::Start(int port, IConnectionProcessorFactory *connectionProcessorFactory, bool background) +{ + m_socket = socket(AF_INET, SOCK_STREAM, 0); + if (m_socket == INVALID_SOCKET) return; + + sockaddr_in addr = {0}; + addr.sin_family = AF_INET; + addr.sin_addr.s_addr = htonl(INADDR_LOOPBACK); + addr.sin_port = htons((WORD)port); + if (bind(m_socket, (sockaddr *)&addr, sizeof(addr)) == SOCKET_ERROR) + { + closesocket(m_socket); + m_socket = INVALID_SOCKET; + return; + } + + listen(m_socket, SOMAXCONN); + + m_connectionProcessorFactory = connectionProcessorFactory; + + if (background) + { + CreateThread(NULL, 0, + GlobalConnectionAcceptThread, + this, + 0, NULL); + } else + { + ConnectionAcceptThread(); + } +} + +void CServer::Stop() +{ + shutdown(m_socket, SD_BOTH); + closesocket(m_socket); +} + +DWORD CServer::ConnectionAcceptThread() +{ + while (1) + { + SOCKET s = accept(m_socket, NULL, NULL); + if (s == INVALID_SOCKET) break; + + CreateThread(NULL, 0, + GlobalConnectionProcessThread, + new GlobalConnectionProcessThreadArgs(this, s), + 0, NULL); + } + return 0; +} + +DWORD CServer::ConnectionProcessThread(SOCKET s) +{ + CSocket sock(s); + IConnectionProcessor *processor = m_connectionProcessorFactory->Create(&sock); + processor->ProcessConnection(); + delete processor; + return 0; +} + +DWORD WINAPI CServer::GlobalConnectionAcceptThread(void *arg) +{ + CServer *server = (CServer *)arg; + return server->ConnectionAcceptThread(); +} + +DWORD WINAPI CServer::GlobalConnectionProcessThread(void *arg) +{ + GlobalConnectionProcessThreadArgs *args = (GlobalConnectionProcessThreadArgs *)arg; + DWORD result = args->m_server->ConnectionProcessThread(args->m_socket); + delete args; + return result; +} -- cgit v1.2.3