← Back to team overview

mira-dev team mailing list archive

[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)
         {