diff options
-rw-r--r-- | client-qt/udm-client-qt/download_add_widget.cpp | 40 | ||||
-rw-r--r-- | client-qt/udm-client-qt/download_add_widget.h | 2 | ||||
-rw-r--r-- | client-qt/udm-client-qt/marked_class.h | 19 | ||||
-rw-r--r-- | client-qt/udm-client-qt/udm_main.cpp | 36 | ||||
-rw-r--r-- | client-qt/udm-client-qt/udm_main.h | 1 | ||||
-rw-r--r-- | protocol/udm.proto | 3 | ||||
-rw-r--r-- | server/include/server_session.h | 4 | ||||
-rw-r--r-- | server/src/server_session.cpp | 18 |
8 files changed, 114 insertions, 9 deletions
diff --git a/client-qt/udm-client-qt/download_add_widget.cpp b/client-qt/udm-client-qt/download_add_widget.cpp index 813ac7a..366c7d6 100644 --- a/client-qt/udm-client-qt/download_add_widget.cpp +++ b/client-qt/udm-client-qt/download_add_widget.cpp @@ -76,6 +76,16 @@ download_add_widget::download_add_widget(std::list<module_info> &modules_, QWidg void download_add_widget::combo_modules_currentIndexChanged(QString module) { + current_module = module; + { + int rows = layout_settings->rowCount(), columns = layout_settings->columnCount(); + for(int i = 0; i < rows; i++) + { + for(int ii = 0; ii < columns; ii ++) + delete layout_settings->itemAtPosition(i, ii); + } + } + for (QLayoutItem *item = layout_settings->takeAt(0); item != 0; item = layout_settings->takeAt(0)) delete item; @@ -98,6 +108,7 @@ void download_add_widget::combo_modules_currentIndexChanged(QString module) { marked_class<QLineEdit> *edit = new marked_class<QLineEdit>; edit->set_mark(ui.id()); + edit->set_type(widget_type_e::QLineEdit_t); layout_settings->addWidget(edit, row, 2); } break; @@ -105,6 +116,7 @@ void download_add_widget::combo_modules_currentIndexChanged(QString module) { marked_class<QSpinBox> *edit = new marked_class<QSpinBox>; edit->set_mark(ui.id()); + edit->set_type(widget_type_e::QSpinBox_t); layout_settings->addWidget(edit, row, 2); } break; @@ -120,7 +132,33 @@ void download_add_widget::combo_modules_currentIndexChanged(QString module) void download_add_widget::btn_ok_clicked() { - + int rows = layout_settings->rowCount(); + std::map<int, std::string> settings; + for (int i = 0; i < rows; ++i) + { + QWidget *w_ = layout_settings->itemAtPosition(i, 2)->widget(); + marked_class<QWidget> *w = static_cast<marked_class<QWidget> *>(w_); + switch(w->get_type()) + { + case widget_type_e::QLineEdit_t: + { + marked_class<QLineEdit> *l = static_cast<marked_class<QLineEdit> *>(w_); + settings[l->get_mark()] = l->text().toStdString(); + } + break; + case widget_type_e::QSpinBox_t: + { + marked_class<QSpinBox> *l = static_cast<marked_class<QSpinBox> *>(w_); + settings[l->get_mark()] = l->text().toStdString(); + } + break; + default: + break; + } + } + emit got_download_settings(current_module.toStdString(), settings); + close(); + deleteLater(); } void download_add_widget::btn_cancel_clicked() diff --git a/client-qt/udm-client-qt/download_add_widget.h b/client-qt/udm-client-qt/download_add_widget.h index 744a9de..c291cce 100644 --- a/client-qt/udm-client-qt/download_add_widget.h +++ b/client-qt/udm-client-qt/download_add_widget.h @@ -36,6 +36,7 @@ public: explicit download_add_widget(std::list<module_info> &modules, QWidget *parent = 0); signals: + void got_download_settings(std::string module_name, std::map<int, std::string>); public slots: protected slots: @@ -45,6 +46,7 @@ protected slots: private: std::list<module_info> &modules; QGridLayout *layout_settings; + QString current_module; }; #endif // DOWNLOAD_ADD_WIDGET_H diff --git a/client-qt/udm-client-qt/marked_class.h b/client-qt/udm-client-qt/marked_class.h index de5bd96..f3fef9c 100644 --- a/client-qt/udm-client-qt/marked_class.h +++ b/client-qt/udm-client-qt/marked_class.h @@ -23,6 +23,14 @@ #ifndef MARKED_CLASS #define MARKED_CLASS +enum widget_type_e +{ + wrong_type_t = -1, + QLineEdit_t = 0, + QSpinBox_t +}; + + template <typename BASE> class marked_class : public BASE { @@ -37,8 +45,19 @@ public: return mark; } + void set_type(widget_type_e t) + { + type = t; + } + widget_type_e get_type() + { + return type; + } + + private: int mark = -1; + widget_type_e type = wrong_type_t; }; #endif // MARKED_CLASS diff --git a/client-qt/udm-client-qt/udm_main.cpp b/client-qt/udm-client-qt/udm_main.cpp index ca5b397..e6ba87c 100644 --- a/client-qt/udm-client-qt/udm_main.cpp +++ b/client-qt/udm-client-qt/udm_main.cpp @@ -121,6 +121,7 @@ void udm_main::client_pre_connect_init() { if(thread_client_session) { + thread_client_session->quit(); delete thread_client_session; thread_client_session = nullptr; } @@ -173,7 +174,7 @@ void udm_main::server_message_received(server_msg msg) if(msg.auth_reply().status()) { auth_token = msg.auth_reply().auth_token(); - //TODO: update client status + btn_add->setEnabled(true); //we can add downloads now lbl_state->setText(tr("State") + ": " + tr("Connected") + ", " + tr("Authenticated")); //request modules and settings here { @@ -231,12 +232,16 @@ void udm_main::server_message_received(server_msg msg) void udm_main::create_buttons() { btn_start = new QPushButton(this); + btn_start->setEnabled(false); connect(btn_start, SIGNAL(clicked(bool)), this, SLOT(btn_start_clicked())); btn_stop = new QPushButton(this); + btn_stop->setEnabled(false); connect(btn_stop, SIGNAL(clicked(bool)), this, SLOT(btn_stop_clicked())); btn_del = new QPushButton(this); + btn_del->setEnabled(false); connect(btn_del, SIGNAL(clicked(bool)), this, SLOT(btn_del_clicked())); btn_add = new QPushButton(this); + btn_add->setEnabled(false); connect(btn_add, SIGNAL(clicked(bool)), this, SLOT(btn_add_clicked())); button_bar = new QToolBar(this); button_bar->setSizePolicy(QSizePolicy::Minimum, QSizePolicy::Minimum); @@ -276,10 +281,29 @@ void udm_main::btn_stop_clicked() void udm_main::btn_add_clicked() { download_add_widget *w = new download_add_widget(modules); - //TODO: connect slots/signals here + connect(w, SIGNAL(got_download_settings(std::string, std::map<int,std::string>)), this, SLOT(got_download_settings(std::string, std::map<int,std::string>))); w->show(); } +void udm_main::got_download_settings(std::string module_name, std::map<int, std::string> settings) +{ + if(!settings.empty()) + { + client_msg msg; + msg.set_auth_token(auth_token); + msg.set_type(CLIENT_MSG_TYPE::CLIENT_DOWNLOAD_ADD); + client_download_add_request *r = msg.mutable_download_add_request(); + r->set_module_name(module_name); + for(auto i : settings) + { + int_string_pair *p = r->add_params(); + p->set_id(i.first); + p->set_value(i.second); + } + session->send_message(msg); + } +} + void udm_main::btn_del_clicked() { @@ -294,6 +318,10 @@ void udm_main::client_connected(bool success, QString error_text) msg.setText(tr("client connection error with error:") + error_text); msg.exec(); lbl_state->setText(tr("State") + ": " + tr("Connection error")); + btn_add->setEnabled(false); + btn_del->setEnabled(false); + btn_start->setEnabled(false); + btn_stop->setEnabled(false); } else { @@ -306,5 +334,9 @@ void udm_main::client_connected(bool success, QString error_text) void udm_main::client_disconnected() { + btn_add->setEnabled(false); + btn_del->setEnabled(false); + btn_start->setEnabled(false); + btn_stop->setEnabled(false); lbl_state->setText(tr("State") + ": " + tr("Disconnected")); } diff --git a/client-qt/udm-client-qt/udm_main.h b/client-qt/udm-client-qt/udm_main.h index eede952..d3e07be 100644 --- a/client-qt/udm-client-qt/udm_main.h +++ b/client-qt/udm-client-qt/udm_main.h @@ -62,6 +62,7 @@ public slots: void server_message_received(server_msg msg); void client_connected(bool success, QString error_text); void client_disconnected(); + void got_download_settings(std::string module_name, std::map<int, std::string>); protected slots: void btn_start_clicked(); diff --git a/protocol/udm.proto b/protocol/udm.proto index 120fc9e..c1f1909 100644 --- a/protocol/udm.proto +++ b/protocol/udm.proto @@ -97,7 +97,8 @@ message download_ui_unsubscription_info { //dowloads proto part begin message client_download_add_request { - repeated string_pair params = 1; + required string module_name = 1; + repeated int_string_pair params = 2; } message client_download_start_request { diff --git a/server/include/server_session.h b/server/include/server_session.h index 01a8c4b..07e8fcd 100644 --- a/server/include/server_session.h +++ b/server/include/server_session.h @@ -42,11 +42,13 @@ class server_session virtual ~server_session(); protected: private: + //net void handle_read(const boost::system::error_code& error, size_t bytes_transferred); void handle_write(const boost::system::error_code& error); void handle_write_no_read(const boost::system::error_code& error); void handle_handshake(const boost::system::error_code& error); - void handle_command(client_msg *msg); + bool handle_command(client_msg *msg); + char *recv_data_; socket_wraper *socket_; diff --git a/server/src/server_session.cpp b/server/src/server_session.cpp index ca4df5a..1a3c08c 100644 --- a/server/src/server_session.cpp +++ b/server/src/server_session.cpp @@ -100,7 +100,12 @@ void server_session::handle_read(const boost::system::error_code& error, size_t { //parsed = true; BOOST_LOG_TRIVIAL(trace)<<"received message:\n"<<msg.DebugString(); - handle_command(&msg); + if(!handle_command(&msg)) + { + //cannot handle command, delete session + delete this; + return; + } recv_data_ = new char[4]; boost::asio::async_read(*socket_, boost::asio::buffer(recv_data_, 4), boost::bind(&server_session::handle_read, this, boost::asio::placeholders::error, boost::asio::placeholders::bytes_transferred)); } @@ -118,6 +123,9 @@ void server_session::handle_read(const boost::system::error_code& error, size_t } } +//helper functions +//TODO: simplify + void add_runtime_module_setting(const std::pair<std::string, setting_s> &s, module_info *mi) { setting *msi = mi->add_settings(); @@ -259,13 +267,12 @@ void add_download_content_menu_element(module_download_menu_element_info_s &elem } -void server_session::handle_command(client_msg *msg) +bool server_session::handle_command(client_msg *msg) { if(msg->type() != CLIENT_MSG_TYPE::CLIENT_AUTH_REQUEST && clients.find(msg->auth_token()) == clients.end()) { BOOST_LOG_TRIVIAL(error)<<"unauthorized client trying to execute command"; - delete this; //unauthorized client, delete session - return; + return false; } switch(msg->type()) { @@ -440,11 +447,14 @@ void server_session::handle_command(client_msg *msg) d->set_name(ds.name); } send_message(&msg); + return true; } break; default: + return false; break; } + return true; } void server_session::send_message(server_msg *msg) |