hooked up GUI and networking, first release candidate
This commit is contained in:
		@@ -7,6 +7,9 @@ set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -pedantic -pthread")
 | 
				
			|||||||
find_package(Boost COMPONENTS system REQUIRED)
 | 
					find_package(Boost COMPONENTS system REQUIRED)
 | 
				
			||||||
include_directories(${Boost_INCLUDE_DIR})
 | 
					include_directories(${Boost_INCLUDE_DIR})
 | 
				
			||||||
 | 
					
 | 
				
			||||||
set(SOURCE_FILES commandline_chat.cpp chat_messages.hpp chat_networking.hpp)
 | 
					find_package(Qt5Widgets)
 | 
				
			||||||
 | 
					set(CMAKE_AUTOMOC ON)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					set(SOURCE_FILES gui_chat.cpp chat_window.hpp chat_messages.hpp chat_networking.hpp check_policy.hpp)
 | 
				
			||||||
add_executable(cpp11NHF2_chat ${SOURCE_FILES})
 | 
					add_executable(cpp11NHF2_chat ${SOURCE_FILES})
 | 
				
			||||||
target_link_libraries(cpp11NHF2_chat ${Boost_LIBRARIES})
 | 
					target_link_libraries(cpp11NHF2_chat ${Boost_LIBRARIES} Qt5::Widgets)
 | 
				
			||||||
@@ -3,9 +3,31 @@
 | 
				
			|||||||
#include <QGridLayout>
 | 
					#include <QGridLayout>
 | 
				
			||||||
#include <QLineEdit>
 | 
					#include <QLineEdit>
 | 
				
			||||||
#include <QListWidget>
 | 
					#include <QListWidget>
 | 
				
			||||||
 | 
					#include <boost/asio.hpp>
 | 
				
			||||||
 | 
					#include <thread>
 | 
				
			||||||
 | 
					#include "chat_networking.hpp"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					struct receive_policy_ignore
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    static void message_do_what(const chat::chat_message& msg) {}
 | 
				
			||||||
 | 
					    static void handshake_do_what(const chat::chat_message& msg) {}
 | 
				
			||||||
 | 
					    static void serverdirection_do_what(const chat::chat_message& msg) {}
 | 
				
			||||||
 | 
					    static void login_do_what(const chat::chat_message& msg) {}
 | 
				
			||||||
 | 
					    static void logout_do_what(const chat::chat_message& msg) {}
 | 
				
			||||||
 | 
					    static void invalid_msg_do_what(const chat::chat_message& msg)
 | 
				
			||||||
 | 
					    { throw std::runtime_error("Invalid message received!"); }
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					struct send_policy_ignore
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    /* this is handled in the gui: QLineEdit.setMaxLength() */
 | 
				
			||||||
 | 
					    static bool check_msg_length(const chat::chat_message& msg)
 | 
				
			||||||
 | 
					    { return true; }
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
class chat_window : public QWidget
 | 
					class chat_window : public QWidget
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    Q_OBJECT
 | 
					    Q_OBJECT
 | 
				
			||||||
@@ -15,15 +37,47 @@ class chat_window : public QWidget
 | 
				
			|||||||
    QListWidget* _people;
 | 
					    QListWidget* _people;
 | 
				
			||||||
    QLineEdit* _msg;
 | 
					    QLineEdit* _msg;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    boost::asio::io_service _ios;
 | 
				
			||||||
 | 
					    boost::asio::ip::tcp::resolver::query _query;
 | 
				
			||||||
 | 
					    chat::client_network_manager<receive_policy_ignore, send_policy_ignore> _cnm;
 | 
				
			||||||
 | 
					    std::thread _iosthread;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
public:
 | 
					public:
 | 
				
			||||||
    explicit chat_window(QWidget* parent = 0)
 | 
					    explicit chat_window(QWidget* parent = 0)
 | 
				
			||||||
    :QWidget(parent)
 | 
					    :QWidget(parent), _ios(), _query("infoc.eet.bme.hu", "8888"),
 | 
				
			||||||
    { setupUi(); }
 | 
					     _cnm(_ios, boost::asio::ip::tcp::resolver(_ios).resolve(_query), "BATMAN"),
 | 
				
			||||||
 | 
					     _iosthread([this]{ _ios.run(); })
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        _cnm.subscribe(std::bind(&chat_window::receive_handler, this, std::placeholders::_1));
 | 
				
			||||||
 | 
					        setupUi();
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    void receive_handler(chat::chat_message msg)
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        switch (msg.get_header())
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            case chat::message::MESSAGE:
 | 
				
			||||||
 | 
					            case chat::message::SERVER_DIRECTION:
 | 
				
			||||||
 | 
					                _chat->addItem(msg.get_content().c_str());
 | 
				
			||||||
 | 
					                break;
 | 
				
			||||||
 | 
					            case chat::message::LOGIN:
 | 
				
			||||||
 | 
					                _people->addItem(msg.get_content().c_str());
 | 
				
			||||||
 | 
					                break;
 | 
				
			||||||
 | 
					            case chat::message::LOGOUT:
 | 
				
			||||||
 | 
					                auto list = _people->findItems(msg.get_content().c_str(), Qt::MatchExactly);
 | 
				
			||||||
 | 
					                if (list.size() > 0)
 | 
				
			||||||
 | 
					                    delete list[0];
 | 
				
			||||||
 | 
					                break;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
public slots:
 | 
					public slots:
 | 
				
			||||||
    void return_handler()
 | 
					    void return_handler()
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
        _chat->addItem(_msg->text());
 | 
					        _chat->addItem(_msg->text());
 | 
				
			||||||
 | 
					        _cnm.send(chat::chat_message(chat::message::MESSAGE, _msg->text().toStdString()));
 | 
				
			||||||
        _msg->clear();
 | 
					        _msg->clear();
 | 
				
			||||||
    };
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -38,6 +92,7 @@ private:
 | 
				
			|||||||
        _people = new QListWidget();
 | 
					        _people = new QListWidget();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        _msg = new QLineEdit();
 | 
					        _msg = new QLineEdit();
 | 
				
			||||||
 | 
					        _msg->setMaxLength(220);
 | 
				
			||||||
        connect(_msg, &QLineEdit::returnPressed, this, &chat_window::return_handler);
 | 
					        connect(_msg, &QLineEdit::returnPressed, this, &chat_window::return_handler);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        _layout->addWidget(_chat, 0, 0, 1, 1);
 | 
					        _layout->addWidget(_chat, 0, 0, 1, 1);
 | 
				
			||||||
@@ -46,4 +101,10 @@ private:
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
        this->setLayout(_layout);
 | 
					        this->setLayout(_layout);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    void closeEvent(QCloseEvent* event)
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        _cnm.close_connection();
 | 
				
			||||||
 | 
					        _iosthread.join();
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
							
								
								
									
										13
									
								
								gui_chat.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										13
									
								
								gui_chat.cpp
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,13 @@
 | 
				
			|||||||
 | 
					#include <QApplication>
 | 
				
			||||||
 | 
					#include "chat_window.hpp"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					int main(int argc, char* argv[])
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    QApplication a(argc, argv);
 | 
				
			||||||
 | 
					    chat_window w;
 | 
				
			||||||
 | 
					    w.show();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    return a.exec();
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
		Reference in New Issue
	
	Block a user