From a4eefbe18b0f09bebfdf8901b73facbb55a9ec0f Mon Sep 17 00:00:00 2001 From: lotodore Date: Sun, 18 Feb 2007 13:45:56 +0000 Subject: [PATCH] ClientThread is now created in Session. --- src/gui/guiinterface.h | 4 +- src/gui/qt/guiwrapper.cpp | 4 +- src/gui/qt/guiwrapper.h | 4 +- .../joinnetworkgamedialogimpl.cpp | 12 ++++-- .../joinnetworkgamedialogimpl.h | 9 +++- src/gui/qt/mainwindow/mainwindowimpl.cpp | 1 + src/pokerth.cpp | 2 +- src/session.cpp | 41 ++++++++++++++----- src/session.h | 9 ++-- 9 files changed, 60 insertions(+), 26 deletions(-) diff --git a/src/gui/guiinterface.h b/src/gui/guiinterface.h index fbf818ad..9c5d3c55 100644 --- a/src/gui/guiinterface.h +++ b/src/gui/guiinterface.h @@ -20,7 +20,7 @@ #ifndef GUIINTERFACE_H #define GUIINTERFACE_H -// #include +#include #include class Game; @@ -28,7 +28,7 @@ class Session; class HandInterface; -class GuiInterface{ +class GuiInterface : public ClientCallback { public: virtual ~GuiInterface(); diff --git a/src/gui/qt/guiwrapper.cpp b/src/gui/qt/guiwrapper.cpp index 02eee0e2..472c56a5 100644 --- a/src/gui/qt/guiwrapper.cpp +++ b/src/gui/qt/guiwrapper.cpp @@ -90,5 +90,5 @@ void GuiWrapper::meInAction() const { myW->meInAction(); } void GuiWrapper::logPlayerActionMsg(string playerName, int action, int setValue) { myLog->logPlayerActionMsg(playerName, action, setValue); } void GuiWrapper::logNewGameHandMsg(int gameID, int handID) { myLog->logNewGameHandMsg(gameID, handID); } -void GuiWrapper::showActionConnectToServerDialog(int actionID) { myConnectToServerDialog->refresh(actionID); } -void GuiWrapper::showErrorConnectToServerDialog(int errorID, int osErrorID) { myConnectToServerDialog->error(errorID, osErrorID); } +void GuiWrapper::SignalNetClientSuccess(int actionID) { myConnectToServerDialog->refresh(actionID); } +void GuiWrapper::SignalNetClientError(int errorID, int osErrorID) { myConnectToServerDialog->error(errorID, osErrorID); } diff --git a/src/gui/qt/guiwrapper.h b/src/gui/qt/guiwrapper.h index 23ce17c2..dd97db70 100644 --- a/src/gui/qt/guiwrapper.h +++ b/src/gui/qt/guiwrapper.h @@ -87,8 +87,8 @@ public: void logPlayerActionMsg(std::string playerName, int action, int setValue) ; void logNewGameHandMsg(int gameID, int handID) ; - void showActionConnectToServerDialog(int actionID); - void showErrorConnectToServerDialog(int errorID, int osErrorID); + void SignalNetClientSuccess(int actionID); + void SignalNetClientError(int errorID, int osErrorID); private: diff --git a/src/gui/qt/joinnetworkgamedialog/joinnetworkgamedialogimpl.cpp b/src/gui/qt/joinnetworkgamedialog/joinnetworkgamedialogimpl.cpp index f8cb23cd..2c28b461 100644 --- a/src/gui/qt/joinnetworkgamedialog/joinnetworkgamedialogimpl.cpp +++ b/src/gui/qt/joinnetworkgamedialog/joinnetworkgamedialogimpl.cpp @@ -18,6 +18,7 @@ * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #include "joinnetworkgamedialogimpl.h" +#include "session.h" // #include "configfile.h" joinNetworkGameDialogImpl::joinNetworkGameDialogImpl(QWidget *parent) @@ -30,11 +31,14 @@ joinNetworkGameDialogImpl::joinNetworkGameDialogImpl(QWidget *parent) } +void joinNetworkGameDialogImpl::setSession(Session* s) +{ + mySession = s; +} void joinNetworkGameDialogImpl::startClient() { - ClientThread *myClientThread = new ClientThread(); - myClientThread->Init(lineEdit_ipAddress->text().toStdString(), spinBox_port->value(), checkBox_ipv6->isChecked(), lineEdit_password->text().toStdString()); - myClientThread->Run(); - + // TODO: Check input values! + if (mySession) + mySession->startNetworkClient(lineEdit_ipAddress->text().toUtf8().constData(), spinBox_port->value(), checkBox_ipv6->isChecked(), lineEdit_password->text().toUtf8().constData()); } \ No newline at end of file diff --git a/src/gui/qt/joinnetworkgamedialog/joinnetworkgamedialogimpl.h b/src/gui/qt/joinnetworkgamedialog/joinnetworkgamedialogimpl.h index 03c593f1..54cc15ed 100644 --- a/src/gui/qt/joinnetworkgamedialog/joinnetworkgamedialogimpl.h +++ b/src/gui/qt/joinnetworkgamedialog/joinnetworkgamedialogimpl.h @@ -22,21 +22,26 @@ #include "ui_joinnetworkgamedialog.h" -#include "clientthread.h" - #include #include #include +class Session; class joinNetworkGameDialogImpl: public QDialog, public Ui::joinNetworkGameDialog { Q_OBJECT public: joinNetworkGameDialogImpl(QWidget *parent = 0); + void joinNetworkGameDialogImpl::setSession(Session* s); + public slots: void startClient(); + +private: + + Session *mySession; }; #endif diff --git a/src/gui/qt/mainwindow/mainwindowimpl.cpp b/src/gui/qt/mainwindow/mainwindowimpl.cpp index 98d92267..0531bb67 100755 --- a/src/gui/qt/mainwindow/mainwindowimpl.cpp +++ b/src/gui/qt/mainwindow/mainwindowimpl.cpp @@ -545,6 +545,7 @@ void mainWindowImpl::callAboutPokerthDialog() { void mainWindowImpl::callJoinNetworkGameDialog() { joinNetworkGameDialogImpl *v = new joinNetworkGameDialogImpl(); + v->setSession(mySession); v->exec(); if (v->result() == QDialog::Accepted ) { diff --git a/src/pokerth.cpp b/src/pokerth.cpp index f8cf3266..7c97b9c6 100755 --- a/src/pokerth.cpp +++ b/src/pokerth.cpp @@ -47,8 +47,8 @@ int main( int argc, char **argv ) /////////////////////////////////////////////////// GuiInterface *myGuiInterface = new GuiWrapper(); - Session theFirst(myGuiInterface); + myGuiInterface->setSession(&theFirst); return a.exec(); } diff --git a/src/session.cpp b/src/session.cpp index 95f0ee68..1938a07b 100755 --- a/src/session.cpp +++ b/src/session.cpp @@ -21,26 +21,24 @@ #include "game.h" #include "guiinterface.h" #include "configfile.h" +#include - +#define NET_CLIENT_TERMINATE_TIMEOUT_MSEC 1000 using namespace std; -Session::Session(GuiInterface* g) : actualGame(0), myGui(g) -{ - - actualGameID = 0; - // Session an mainwindowimpl bergeben - myGui->setSession(this); - +Session::Session(GuiInterface *g) +: actualGameID(0), myNetClient(0), actualGame(0), myGui(g) +{ myConfig = new ConfigFile; - - } Session::~Session() { + terminateNetworkClient(); + deleteGame(); + delete myConfig; } @@ -57,3 +55,26 @@ void Session::deleteGame() { actualGame = 0; } + +void Session::startNetworkClient(const string &serverAddress, unsigned serverPort, bool ipv6, const string &pwd) +{ + if (myNetClient || !myGui) + return; // TODO: throw exception + myNetClient = new ClientThread(*myGui); + myNetClient->Init(serverAddress, serverPort, ipv6, pwd); + myNetClient->Run(); +} + +void Session::terminateNetworkClient() +{ + if (!myNetClient) + return; // already terminated + myNetClient->SignalTermination(); + // Give the thread some time to terminate. + if (myNetClient->Join(NET_CLIENT_TERMINATE_TIMEOUT_MSEC)) + { + delete myNetClient; + } + // If termination fails, leave a memory leak to prevent a crash. + myNetClient = 0; +} diff --git a/src/session.h b/src/session.h index 7e760d62..df148df1 100755 --- a/src/session.h +++ b/src/session.h @@ -19,14 +19,12 @@ ***************************************************************************/ #ifndef STDSESSION_H #define STDSESSION_H -#include -#include #include class GuiInterface; class Game; class ConfigFile; - +class ClientThread; class Session{ public: @@ -38,6 +36,9 @@ public: void startGame(int, int, int); void deleteGame(); + void startNetworkClient(const std::string &serverAddress, unsigned serverPort, bool ipv6, const std::string &pwd); + void terminateNetworkClient(); + void setActualGameID(const int& theValue) { actualGameID = theValue; } int getActualGameID() const { return actualGameID; } @@ -47,6 +48,8 @@ private: int actualGameID; + ClientThread *myNetClient; + Game *actualGame; GuiInterface *myGui; ConfigFile *myConfig;