From b6923b8d38625cc85ec1c833d6337e92440a8466 Mon Sep 17 00:00:00 2001 From: lotodore Date: Fri, 16 Feb 2007 00:03:30 +0000 Subject: [PATCH] First rough outline of the network client thread. More to be done soon. --- src/core/thread.cpp | 7 ++++ src/core/thread.h | 3 ++ src/net/clientthread.h | 47 ++++++++++++++++++++++ src/net/common/clientthread.cpp | 70 +++++++++++++++++++++++++++++++++ 4 files changed, 127 insertions(+) create mode 100644 src/net/clientthread.h create mode 100644 src/net/common/clientthread.cpp diff --git a/src/core/thread.cpp b/src/core/thread.cpp index 3d37c580..63c7e4b6 100644 --- a/src/core/thread.cpp +++ b/src/core/thread.cpp @@ -111,3 +111,10 @@ Thread::ShouldTerminate() const return lock.locked(); } +bool +Thread::IsRunning() const +{ + boost::mutex::scoped_lock threadLock(m_threadObjMutex); + return (m_threadObj.get() != NULL); +} + diff --git a/src/core/thread.h b/src/core/thread.h index c8127568..b7e70838 100644 --- a/src/core/thread.h +++ b/src/core/thread.h @@ -50,6 +50,9 @@ protected: // Checks whether termination has been requested. bool ShouldTerminate() const; + // Checks whether the thread is running. + bool IsRunning() const; + private: // Flag specifying whether the application code within the diff --git a/src/net/clientthread.h b/src/net/clientthread.h new file mode 100644 index 00000000..f3e51331 --- /dev/null +++ b/src/net/clientthread.h @@ -0,0 +1,47 @@ +/*************************************************************************** + * Copyright (C) 2007 by Lothar May * + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 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 General Public License for more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with this program; if not, write to the * + * Free Software Foundation, Inc., * + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * + ***************************************************************************/ +/* Network client thread. */ + +#include +#include +#include + +class ClientData; + +class ClientThread : public Thread +{ +public: + ClientThread(); + virtual ~ClientThread(); + + // Set the parameters. Does not do any error checking. + // Error checking will be done during connect + // (i.e. after starting the thread). + void Init(const std::string &serverAddress, unsigned serverPort, bool ipv6, const std::string &pwd); + +protected: + + // Main function of the thread. + virtual void Main(); + +private: + + std::auto_ptr m_data; +}; + diff --git a/src/net/common/clientthread.cpp b/src/net/common/clientthread.cpp new file mode 100644 index 00000000..9c3d8bc9 --- /dev/null +++ b/src/net/common/clientthread.cpp @@ -0,0 +1,70 @@ +/*************************************************************************** + * Copyright (C) 2007 by Lothar May * + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 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 General Public License for more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with this program; if not, write to the * + * Free Software Foundation, Inc., * + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * + ***************************************************************************/ + +#include +#include + +using namespace std; + +class ClientData +{ +public: + ClientData() + : sockfd(INVALID_SOCKET), addrFamily(AF_INET), serverPort(0) {} + int GetServerAddrSize() const + { + return addrFamily == AF_INET6 ? sizeof(sockaddr_in6) : sizeof(sockaddr_in); + } + + SOCKET sockfd; + int addrFamily; + string serverAddr; + unsigned serverPort; + string password; +}; + +ClientThread::ClientThread() +{ + m_data.reset(new ClientData); +} + +ClientThread::~ClientThread() +{ +} + +void +ClientThread::Init(const string &serverAddress, unsigned serverPort, bool ipv6, const string &pwd) +{ + if (IsRunning()) + return; // TODO: throw exception + m_data->addrFamily = ipv6 ? AF_INET6 : AF_INET; + m_data->serverAddr = serverAddress; + m_data->serverPort = serverPort; + m_data->password = pwd; +} + +void +ClientThread::Main() +{ + while (!this->ShouldTerminate()) + { + // TODO. + } +} +