mira-dev team mailing list archive
-
mira-dev team
-
Mailing list archive
-
Message #00066
[Branch ~mira-dev/mira/trunk] Rev 210: - Implement feature request from question 111184
------------------------------------------------------------
revno: 210
committer: Alan Alvarez <aalvarez@xxxxxxxxxxxxx>
branch nick: trunk
timestamp: Sun 2010-05-16 20:30:06 -0400
message:
- Implement feature request from question 111184
- create AsioClient::connect() overload for New User requests
- In Split function: make sure start_pos is not std::string::npos before executing compare() to prevent segfault
modified:
mira-client/include/gui/qt/GuiApp.h
mira-client/include/gui/qt/MainWindow.h
mira-client/include/gui/qt/NewUserDialog.h
mira-client/include/network/asio/AsioClient.h
mira-client/include/network/messages/MsgError.h
mira-client/include/network/messages/MsgUserAccepted.h
mira-client/src/gui/qt/GuiApp.cpp
mira-client/src/gui/qt/LoginDialog.cpp
mira-client/src/gui/qt/MainWindow.cpp
mira-client/src/gui/qt/NewUserDialog.cpp
mira-client/src/network/asio/AsioClient.cpp
mira-server/include/tools.h
--
lp:mira/trunk
https://code.launchpad.net/~mira-dev/mira/trunk
Your team Mira Core Development Team is subscribed to branch lp:mira/trunk.
To unsubscribe from this branch go to https://code.launchpad.net/~mira-dev/mira/trunk/+edit-subscription
=== modified file 'mira-client/include/gui/qt/GuiApp.h'
--- mira-client/include/gui/qt/GuiApp.h 2010-05-06 18:25:38 +0000
+++ mira-client/include/gui/qt/GuiApp.h 2010-05-17 00:30:06 +0000
@@ -39,8 +39,6 @@
void trayMessage(const QString& title, const QString& message);
void receiveChatMessage(const std::string& source, const std::string& message);
void setWorkplaceDescription(const std::string& workplace, const std::string& description);
- void userAccepted(const std::string& username);
- void newUserError(const std::string& message);
private slots:
void MiscTrigger();
signals:
=== modified file 'mira-client/include/gui/qt/MainWindow.h'
--- mira-client/include/gui/qt/MainWindow.h 2010-05-06 18:25:38 +0000
+++ mira-client/include/gui/qt/MainWindow.h 2010-05-17 00:30:06 +0000
@@ -7,6 +7,7 @@
#include "ContactDockWidget.h"
#include "NavigationDockWidget.h"
#include "ChatDockWidget.h"
+#include "NewUserDialog.h"
namespace miraclient
{
@@ -32,9 +33,10 @@
void setActiveWorkplace(Workplace * wp,Utility * util = NULL);
void receiveChatMessage(const QString& source, const QString& message);
void addChat(const QString& username);
+ void userAccepted(const std::string& username);
+ void newUserError(const std::string& message);
signals:
-// void contactStateChanged(int contactIndex,int newState);
void serverConnectionTerminated();
protected:
@@ -80,7 +82,9 @@
QMenu * m_helpMenu;
QMenu * m_contactMenu;
- LoginDialog* m_loginDialog;
+ LoginDialog* m_loginDialog;
+ NewUserDialog* m_newUserDialog;
+
};
}//end gui namespace
}//end miraclient namespace
=== modified file 'mira-client/include/gui/qt/NewUserDialog.h'
--- mira-client/include/gui/qt/NewUserDialog.h 2010-05-09 14:28:10 +0000
+++ mira-client/include/gui/qt/NewUserDialog.h 2010-05-17 00:30:06 +0000
@@ -8,6 +8,8 @@
#include <QGroupBox>
#include <QPushButton>
+#include "AsioClient.h"
+
namespace miraclient
{
@@ -24,6 +26,9 @@
void loginFailed(const QString& error_message);
+ public slots:
+ void error(const QString& error);
+
private slots:
void sendCommand();
void cancel();
@@ -41,10 +46,14 @@
QLineEdit *m_lastNameLineEdit;
QLineEdit *m_passwordLineEdit;
QLineEdit *m_password2LineEdit;
-
+ QLineEdit *m_serverLineEdit;
+ QLineEdit *m_portLineEdit;
+ QLabel *m_errorLabel;
QPushButton *m_createButton;
QPushButton *m_cancelButton;
+
+ miraclient::network::asio::AsioClient* m_client;
};
} // namespace gui
=== modified file 'mira-client/include/network/asio/AsioClient.h'
--- mira-client/include/network/asio/AsioClient.h 2010-03-26 22:02:38 +0000
+++ mira-client/include/network/asio/AsioClient.h 2010-05-17 00:30:06 +0000
@@ -46,6 +46,8 @@
virtual ~AsioClient();
void connect(const std::string& hostname, const unsigned int port, const std::string& username, const std::string& password);
+ void connect(const std::string& hostname, const unsigned int port, const std::string& username, const std::string& email,
+ const std::string& password, const std::string& first_name, const std::string& last_name);
size_t input_buffer_size()
{
=== modified file 'mira-client/include/network/messages/MsgError.h'
--- mira-client/include/network/messages/MsgError.h 2010-05-06 18:25:38 +0000
+++ mira-client/include/network/messages/MsgError.h 2010-05-17 00:30:06 +0000
@@ -58,7 +58,7 @@
break;
case Msg::NEW_USER:
- QMetaObject::invokeMethod(Application::get_gui_application(), "newUserError", Qt::QueuedConnection, MIRA_QT_GENERIC_ARG(std::string, m_message.substr(3)));
+ QMetaObject::invokeMethod(Application::get_gui_application()->m_mainWindow, "newUserError", Qt::QueuedConnection, MIRA_QT_GENERIC_ARG(std::string, m_message.substr(3)));
break;
}
}
=== modified file 'mira-client/include/network/messages/MsgUserAccepted.h'
--- mira-client/include/network/messages/MsgUserAccepted.h 2010-05-06 18:25:38 +0000
+++ mira-client/include/network/messages/MsgUserAccepted.h 2010-05-17 00:30:06 +0000
@@ -45,7 +45,7 @@
return;
std::string username = m_message.substr(pos+1);
- QMetaObject::invokeMethod(Application::get_gui_application(), "userAccepted", Qt::QueuedConnection, MIRA_QT_GENERIC_ARG(std::string, username));
+ QMetaObject::invokeMethod(Application::get_gui_application()->m_mainWindow, "userAccepted", Qt::QueuedConnection, MIRA_QT_GENERIC_ARG(std::string, username));
}
};
} // namespace network
=== modified file 'mira-client/src/gui/qt/GuiApp.cpp'
--- mira-client/src/gui/qt/GuiApp.cpp 2010-05-06 18:25:38 +0000
+++ mira-client/src/gui/qt/GuiApp.cpp 2010-05-17 00:30:06 +0000
@@ -258,12 +258,3 @@
workplace_object->setDescription(description);
}
-void GuiApp::userAccepted(const std::string &username)
-{
- QMessageBox::information(m_mainWindow, "New User Accepted", QString("User %1 has been accepted.").arg(username.c_str()));
-}
-
-void GuiApp::newUserError(const std::string& message)
-{
- QMessageBox::critical(m_mainWindow, "Error!", QString("There was an error while attempting to create a new user: \n %1").arg(message.c_str()));
-}
=== modified file 'mira-client/src/gui/qt/LoginDialog.cpp'
--- mira-client/src/gui/qt/LoginDialog.cpp 2010-04-07 23:12:09 +0000
+++ mira-client/src/gui/qt/LoginDialog.cpp 2010-05-17 00:30:06 +0000
@@ -89,6 +89,9 @@
{
boost::thread(boost::bind(&network::asio::AsioClient::connect, client, m_serverLineEdit->text().toStdString(), m_portLineEdit->text().toUInt(),
m_usernameLineEdit->text().toStdString(), m_passwordLineEdit->text().toStdString()));
+
+ Application::set_client(dynamic_cast<network::Client*>(client));
+ MiraUtility::set_client(dynamic_cast<network::Client*>(client));
}
}
=== modified file 'mira-client/src/gui/qt/MainWindow.cpp'
--- mira-client/src/gui/qt/MainWindow.cpp 2010-05-06 18:25:38 +0000
+++ mira-client/src/gui/qt/MainWindow.cpp 2010-05-17 00:30:06 +0000
@@ -12,17 +12,15 @@
#include <QMenuBar>
#include <QMessageBox>
#include <QInputDialog>
+#include <QString>
#include <iostream>
-#include <QString>
-
using namespace miraclient::gui;
-MainWindow::MainWindow()
+MainWindow::MainWindow() : m_newUserDialog(NULL)
{
//ctor
-
setWindowIcon(QIcon(":/images/icon-small.png"));
setWindowTitle(tr(MiraNameStr)+" "+MiraVersionStr);
@@ -34,8 +32,6 @@
createMenus();
createConnections();
LoadSettings();
-
- // m_loginDialog = NULL;
}
MainWindow::~MainWindow()
@@ -133,7 +129,6 @@
m_newUserAction = new QAction(tr("&New User"), this);
m_newUserAction->setShortcut(tr("Ctrl+N"));
m_newUserAction->setToolTip(tr("Create a new User"));
- m_newUserAction->setDisabled(true);
}
void MainWindow::closeEvent(QCloseEvent * event)
@@ -248,7 +243,6 @@
m_loginAction->setDisabled(true);
m_createWorkplaceAction->setEnabled(true);
m_joinWorkplaceAction->setEnabled(true);
- m_newUserAction->setEnabled(true);
}
void MainWindow::loginFailed(const QString& error_message)
@@ -292,6 +286,19 @@
void MainWindow::newUser()
{
- NewUserDialog dialog(this);
- dialog.exec();
+ m_newUserDialog = new NewUserDialog(this);
+ m_newUserDialog->exec();
+ delete m_newUserDialog;
+}
+
+void MainWindow::userAccepted(const std::string &username)
+{
+ m_newUserDialog->accept();
+
+ QMessageBox::information(this, "New User Accepted!", QString("User %1 has been accepted.").arg(username.c_str()));
+}
+
+void MainWindow::newUserError(const std::string& message)
+{
+ m_newUserDialog->error(message.c_str());
}
=== modified file 'mira-client/src/gui/qt/NewUserDialog.cpp'
--- mira-client/src/gui/qt/NewUserDialog.cpp 2010-05-09 14:28:10 +0000
+++ mira-client/src/gui/qt/NewUserDialog.cpp 2010-05-17 00:30:06 +0000
@@ -1,16 +1,19 @@
#include "NewUserDialog.h"
+#include "AsioClient.h"
+#include "Application.h"
#include <QMessageBox>
-#include "Application.h"
#include <QRegExpValidator>
+#include <boost/thread.hpp>
+
namespace miraclient
{
namespace gui
{
-NewUserDialog::NewUserDialog(QWidget* parent)
+NewUserDialog::NewUserDialog(QWidget* parent) : m_serverLineEdit(NULL), m_portLineEdit(NULL), m_client(NULL)
{
setWindowTitle(tr("New User"));
@@ -54,6 +57,19 @@
connect(m_lastNameLineEdit, SIGNAL(textChanged(const QString&)), this, SLOT(checkIfComplete()));
m_formLayout->addRow(tr("&Last Name:"), m_lastNameLineEdit);
+ // Only show server and port option if we're not connected to a server
+ if (Application::get_client() == NULL)
+ {
+ m_serverLineEdit = new QLineEdit(m_newUserGroupBox);
+ connect(m_serverLineEdit, SIGNAL(textChanged(const QString&)), this, SLOT(checkIfComplete()));
+ m_formLayout->addRow(tr("&Server:"), m_serverLineEdit);
+
+ m_portLineEdit = new QLineEdit(m_newUserGroupBox);
+ m_portLineEdit->setValidator(new QRegExpValidator(QRegExp("[\\w]+"), 0));
+ connect(m_portLineEdit, SIGNAL(textChanged(const QString&)), this, SLOT(checkIfComplete()));
+ m_formLayout->addRow(tr("&Port:"), m_portLineEdit);
+ }
+
m_mainLayout->addWidget(m_newUserGroupBox);
m_buttonsLayout = new QFormLayout();
@@ -63,6 +79,8 @@
m_cancelButton = new QPushButton(tr("Cancel"), this);
connect(m_cancelButton, SIGNAL(clicked()), this, SLOT(cancel()));
m_buttonsLayout->addRow(m_createButton, m_cancelButton);
+ m_errorLabel = new QLabel;
+ m_buttonsLayout->addRow(m_errorLabel);
m_buttonsLayout->setFormAlignment(Qt::AlignRight);
m_mainLayout->addItem(m_buttonsLayout);
@@ -71,11 +89,19 @@
void NewUserDialog::checkIfComplete()
{
- if ( m_usernameLineEdit->text().isEmpty() || m_emailLineEdit->text().isEmpty() || m_passwordLineEdit->text().isEmpty() ||
- m_password2LineEdit->text().isEmpty() || m_firstNameLineEdit->text().isEmpty() )
- m_createButton->setDisabled(true);
- else
- m_createButton->setEnabled(true);
+ if (m_serverLineEdit != NULL)
+ {
+ if (m_serverLineEdit->text().isEmpty() || m_portLineEdit->text().isEmpty())
+ m_createButton->setDisabled(true);
+ }
+
+ if (m_usernameLineEdit->text().isEmpty() || m_emailLineEdit->text().isEmpty() || m_passwordLineEdit->text().isEmpty() ||
+ m_password2LineEdit->text().isEmpty() || m_firstNameLineEdit->text().isEmpty() )
+ {
+ m_createButton->setDisabled(true);
+ }
+ else
+ m_createButton->setEnabled(true);
}
void NewUserDialog::cancel()
@@ -87,13 +113,37 @@
{
if (m_passwordLineEdit->text() != m_password2LineEdit->text())
{
- QMessageBox::warning(this, "Passwords don't match", "The Password and confirm Password fields do not match. Make sure you have entered the same password in both fields", QMessageBox::Ok);
+ QMessageBox::warning(this, "Passwords don't match!", "The Password and confirm Password fields do not match. Make sure you have entered the same password in both fields", QMessageBox::Ok);
return;
}
- QString message = QString("NU %1 %2 %3 %4 %5").arg(m_usernameLineEdit->text()).arg(m_emailLineEdit->text()).arg(m_passwordLineEdit->text()).arg(m_firstNameLineEdit->text()).arg(m_lastNameLineEdit->text());
- Application::get_client()->send(message.toStdString());
- accept();
+
+ if (m_serverLineEdit == NULL)
+ {
+ // We're already connected to a server. Just send request
+ QString message = QString("NU %1 %2 %3 %4 %5").arg(m_usernameLineEdit->text()).arg(m_emailLineEdit->text()).arg(m_passwordLineEdit->text()).arg(m_firstNameLineEdit->text()).arg(m_lastNameLineEdit->text());
+ Application::get_client()->send(message.toStdString());
+ }
+ else
+ {
+ m_client = new miraclient::network::asio::AsioClient();
+ if (m_client)
+ {
+ boost::thread(boost::bind(&network::asio::AsioClient::connect, m_client, m_serverLineEdit->text().toStdString(), m_portLineEdit->text().toUInt(),
+ m_usernameLineEdit->text().toStdString(), m_emailLineEdit->text().toStdString(), m_passwordLineEdit->text().toStdString(),
+ m_firstNameLineEdit->text().toStdString(), m_lastNameLineEdit->text().toStdString()));
+ }
+ }
+}
+
+void NewUserDialog::error(const QString& error_message)
+{
+ m_errorLabel->setText("Error: " + error_message);
+ if (m_client != NULL)
+ {
+ m_client->disconnect();
+ m_client = NULL;
+ }
}
} // namespace gui
=== modified file 'mira-client/src/network/asio/AsioClient.cpp'
--- mira-client/src/network/asio/AsioClient.cpp 2010-03-26 22:12:24 +0000
+++ mira-client/src/network/asio/AsioClient.cpp 2010-05-17 00:30:06 +0000
@@ -47,15 +47,13 @@
{
*m_input_buffer = '\0';
m_input_buffer[INPUT_BUFFER_SIZE-1] = '\0';
-
- Application::set_client(dynamic_cast<Client*>(this));
- MiraUtility::set_client(dynamic_cast<Client*>(this));
}
AsioClient::~AsioClient()
{
// TODO: finish processing messages in queue or delete them.
Application::unset_client();
+ MiraUtility::set_client(NULL);
}
void AsioClient::connect(const std::string& hostname, const unsigned int port, const std::string& username, const std::string& password)
@@ -115,6 +113,62 @@
receive();
}
+void AsioClient::connect(const std::string& hostname, const unsigned int port, const std::string& username, const std::string& email, const std::string& password, const std::string& first_name, const std::string& last_name)
+{
+ // Check if hostname is an IP address
+ boost::system::error_code ec;
+ boost::asio::ip::address::from_string(hostname, ec);
+
+ boost::system::error_code l_error = boost::asio::error::host_not_found;
+
+ if (ec)
+ {
+ std::string port_string = IntToString(port);
+ tcp::resolver l_resolver(m_io);
+ tcp::resolver::query l_query(hostname, IntToString(port));
+ boost::system::error_code resolver_error;
+ tcp::resolver::iterator Iter = l_resolver.resolve(l_query, resolver_error);
+ if (!resolver_error)
+ {
+ tcp::resolver::iterator Iter_end;
+ while (l_error && Iter != Iter_end)
+ {
+ std::cout << Iter->endpoint().address().to_string() << std::endl;
+ m_socket.close();
+ m_socket.connect(*Iter++, l_error);
+ }
+ }
+ else
+ {
+ QMetaObject::invokeMethod(Application::get_gui_application()->m_mainWindow, "newUserError", Qt::QueuedConnection, MIRA_QT_GENERIC_ARG(std::string, resolver_error.message()));
+ return;
+ }
+ }
+ else
+ {
+ m_socket.connect(boost::asio::ip::tcp::endpoint(boost::asio::ip::address::from_string(hostname), port), l_error);
+ }
+
+ if (l_error)
+ {
+ QMetaObject::invokeMethod(Application::get_gui_application()->m_mainWindow, "newUserError", Qt::QueuedConnection, MIRA_QT_GENERIC_ARG(std::string, l_error.message()));
+ return;
+ }
+ else
+ {
+ m_remote_server_address = hostname;
+ std::string login_string = "NU ";
+ login_string += username + " ";
+ login_string += email + " ";
+ login_string += password + " ";
+ login_string += first_name + " ";
+ login_string += last_name + " ";
+ send(login_string);
+ }
+
+ receive();
+}
+
void AsioClient::receive()
{
do
@@ -125,7 +179,9 @@
if (l_error)
{
- delete this;
+ if (Application::get_client() != NULL)
+ delete this;
+
return;
}
=== modified file 'mira-server/include/tools.h'
--- mira-server/include/tools.h 2009-10-22 15:38:41 +0000
+++ mira-server/include/tools.h 2010-05-17 00:30:06 +0000
@@ -41,7 +41,10 @@
{
//Skip delimiters, postion of first non-delimiter
start_pos = str.find_first_not_of(delimiter, end_pos);
-
+
+ if (start_pos == std::string::npos)
+ break;
+
//If the non-delimiter is double quote then skipp till the delimiter after the next double quote.
if(str.compare(start_pos, 1, "\"") == 0)
{