------------------------------------------------------------
revno: 261
committer: Alan Alvarez <aalva...@aliensoft.net>
branch nick: login-system
timestamp: Tue 2011-04-26 12:25:29 -0400
message:
  Some fixes related to lp bug #703339
modified:
  mira-client/include/Application.h
  mira-client/src/gui/qt/ConnectionManagementWidget.cpp
  mira-client/src/gui/qt/LoginDialog.cpp
  mira-client/src/network/asio/AsioClient.cpp
  mira-server/CMakeLists.txt
  mira-server/include/network/Msg.h
  mira-server/include/network/TcpConnection.h
  mira-server/include/network/messages/MsgError.h
  mira-server/include/network/messages/MsgLogin.h
  mira-server/src/main.cpp
  mira-server/src/network/Msg.cpp
  mira-server/src/network/TcpConnection.cpp
  mira-server/src/network/asio/AsioServer.cpp


--
lp:~mira-dev/mira/login-system
https://code.launchpad.net/~mira-dev/mira/login-system

You are subscribed to branch lp:~mira-dev/mira/login-system.
To unsubscribe from this branch go to 
https://code.launchpad.net/~mira-dev/mira/login-system/+edit-subscription
=== modified file 'mira-client/include/Application.h'
--- mira-client/include/Application.h	2010-12-15 23:37:15 +0000
+++ mira-client/include/Application.h	2011-04-26 16:25:29 +0000
@@ -72,7 +72,7 @@
         static void unset_client() 
         { 
             boost::thread(boost::bind(&UtilityManager::notify_offline, m_utility_manager));
-            QMetaObject::invokeMethod(get_gui_application(), "serverConnectionLost", Qt::QueuedConnection);
+            QMetaObject::invokeMethod(get_gui_application(), "serverConnectionLost");
             m_client = NULL;
         }
 

=== modified file 'mira-client/src/gui/qt/ConnectionManagementWidget.cpp'
--- mira-client/src/gui/qt/ConnectionManagementWidget.cpp	2010-12-16 15:44:13 +0000
+++ mira-client/src/gui/qt/ConnectionManagementWidget.cpp	2011-04-26 16:25:29 +0000
@@ -17,6 +17,8 @@
 #include "MiraUtility.h"
 #include "Crypto.h"
 
+using namespace miraclient;
+
 ConnectionManagementWidget::ConnectionManagementWidget() : QFrame(), m_settings(miraclient::Application::get_settings())
 {
     setStyleSheet("ConnectionManagementWidget { background-color: white; margin-top: 25px }");
@@ -209,7 +211,12 @@
     miraclient::network::asio::AsioClient* client = new miraclient::network::asio::AsioClient();
     if (client)
     {
+
         miraclient::Application::mode = miraclient::Application::ONLINE;
+        if (miraclient::Application::get_client() == NULL)
+        {
+            miraclient::Application::unset_client();
+        }
         miraclient::Application::set_client(dynamic_cast<miraclient::network::Client*>(client));
         MiraUtility::set_client(dynamic_cast<miraclient::network::Client*>(client));
         miraclient::Application::user_info.server_key = item->text().toStdString();
@@ -220,7 +227,9 @@
 
 void ConnectionManagementWidget::loginFailed()
 {
-    miraclient::Application::get_client()->disconnect();
+    Application::ClientType* client = Application::get_client();
+    if (client != NULL)
+        client->disconnect();
 }
 
 void ConnectionManagementWidget::offlineConnectClicked()

=== modified file 'mira-client/src/gui/qt/LoginDialog.cpp'
--- mira-client/src/gui/qt/LoginDialog.cpp	2010-07-15 18:34:43 +0000
+++ mira-client/src/gui/qt/LoginDialog.cpp	2011-04-26 16:25:29 +0000
@@ -102,5 +102,5 @@
 void LoginDialog::loginFailed(const QString& error_message)
 {
     m_errorLabel->setText("Failed to connect to server: " + error_message);
-    Application::get_client()->disconnect();
+    // Application::get_client()->disconnect();
 }

=== modified file 'mira-client/src/network/asio/AsioClient.cpp'
--- mira-client/src/network/asio/AsioClient.cpp	2010-08-13 17:47:14 +0000
+++ mira-client/src/network/asio/AsioClient.cpp	2011-04-26 16:25:29 +0000
@@ -55,6 +55,15 @@
     // TODO: finish processing messages in queue or delete them.
     Application::unset_client();
     MiraUtility::set_client(NULL);
+
+    // Send LO (Logout) message to server
+    if (m_socket.is_open())
+    {
+        send("LO");
+        m_socket.close();
+    }
+
+    std::cout << "closed connection" << std::endl;
 }
 
 void AsioClient::connect(const std::string& hostname, const unsigned int port, const std::string& username, const std::string& password)

=== modified file 'mira-server/CMakeLists.txt'
--- mira-server/CMakeLists.txt	2010-08-23 23:05:06 +0000
+++ mira-server/CMakeLists.txt	2011-04-26 16:25:29 +0000
@@ -32,6 +32,7 @@
         "include/network/messages/MsgListUtilities.h"
         "include/network/messages/MsgListWorkplaces.h"
         "include/network/messages/MsgLogin.h"
+        "include/network/messages/MsgLogout.h"
         "include/network/messages/MsgMessage.h"
         "include/network/messages/MsgNewGroup.h"
         "include/network/messages/MsgNewUser.h"

=== modified file 'mira-server/include/network/Msg.h'
--- mira-server/include/network/Msg.h	2010-08-23 23:05:06 +0000
+++ mira-server/include/network/Msg.h	2011-04-26 16:25:29 +0000
@@ -71,6 +71,7 @@
             NEW_USER,
             USER_ACCEPTED,
             LOGIN,
+            LOGOUT,
             LOGIN_SUCCESS,
             MESSAGE,
             PRIVATE_MESSAGE,

=== modified file 'mira-server/include/network/TcpConnection.h'
--- mira-server/include/network/TcpConnection.h	2009-10-31 20:09:42 +0000
+++ mira-server/include/network/TcpConnection.h	2011-04-26 16:25:29 +0000
@@ -156,6 +156,7 @@
              std::queue<std::string*>  m_message_queue;
       static ThreadPool                m_thread_pool;
              boost::mutex              m_output_buffer_mutex;
+             boost::mutex              m_socket_destruction_mutex;
 };
 
 } // namespace network

=== modified file 'mira-server/include/network/messages/MsgError.h'
--- mira-server/include/network/messages/MsgError.h	2010-08-24 20:10:25 +0000
+++ mira-server/include/network/messages/MsgError.h	2011-04-26 16:25:29 +0000
@@ -40,7 +40,7 @@
         virtual void run() 
         {
             std::cout << "Error UserID(" << m_source_connection->get_user_id() << "): " << m_message;
-        };
+        }
 
         ~MsgError ()
          {

=== modified file 'mira-server/include/network/messages/MsgLogin.h'
--- mira-server/include/network/messages/MsgLogin.h	2010-07-06 14:11:32 +0000
+++ mira-server/include/network/messages/MsgLogin.h	2011-04-26 16:25:29 +0000
@@ -95,13 +95,15 @@
                 else
                 {
                     m_source_connection->send("E L Bad Credentials");
+                    delete m_source_connection;
                 }
             }   
             else
             { 
                 m_source_connection->send("E L Invalid Format");
+                delete m_source_connection;
             }    
-        };
+        }
 
         ~MsgLogin() {}
 

=== modified file 'mira-server/src/main.cpp'
--- mira-server/src/main.cpp	2010-08-23 23:05:06 +0000
+++ mira-server/src/main.cpp	2011-04-26 16:25:29 +0000
@@ -207,6 +207,7 @@
     Msg::add_token(Msg::LIST_MEMBERS, "LM");
     Msg::add_token(Msg::USER_STATUS, "US");
     Msg::add_token(Msg::PART_GROUP, "PG");
+    Msg::add_token(Msg::LOGOUT, "LO");
     // TODO: Need to add rest of messages.
 
     unsigned short thread_count = Application::get_configuration().GetConfigurationAsInt("NETWORK_THREAD_COUNT");

=== modified file 'mira-server/src/network/Msg.cpp'
--- mira-server/src/network/Msg.cpp	2010-08-23 23:05:06 +0000
+++ mira-server/src/network/Msg.cpp	2011-04-26 16:25:29 +0000
@@ -38,6 +38,7 @@
 #include "MsgListUtilities.h"
 #include "MsgListMembers.h"
 #include "MsgPartGroup.h"
+#include "MsgLogout.h"
 //#include "MsgPong.h"
 
 
@@ -81,6 +82,14 @@
     Msg* msg = NULL;
     switch(get_token(token_string))
     {
+        case UTILITY:
+             msg = new MsgUtility(source_connection, *message);
+             break;
+
+        case LOGOUT:
+             msg = new MsgLogout(source_connection, *message);
+             break;
+
         case LOGIN:
              msg = new MsgLogin(source_connection, *message);
              break;
@@ -125,10 +134,6 @@
              break;
              */
 
-        case UTILITY:
-             msg = new MsgUtility(source_connection, *message);
-             break;
-
         case LIST_WORKPLACES:
              msg = new MsgListWorkplaces(source_connection, *message);
              break;

=== modified file 'mira-server/src/network/TcpConnection.cpp'
--- mira-server/src/network/TcpConnection.cpp	2010-04-29 16:31:45 +0000
+++ mira-server/src/network/TcpConnection.cpp	2011-04-26 16:25:29 +0000
@@ -21,6 +21,7 @@
 #include <iostream>
 #include <cstring>
 #include <string>
+#include <boost/thread/mutex.hpp>
 
 #include "ThreadPool.h"
 #include "TcpConnection.h"
@@ -44,6 +45,11 @@
 
 TcpConnection::~TcpConnection()
 {
+    m_socket_destruction_mutex.try_lock();
+
+    // Remove this connection from connection list
+    Application::get_server().remove_connection(m_user_id);
+
     if(is_logged_in())
     {
         Application::get_server().remove_connection(m_user_id);
@@ -59,9 +65,14 @@
     for (unsigned int i = 0;  i < size; ++i, m_message_queue.pop())
         delete m_message_queue.front();
 
-    cout << "dropping connection" << endl;
+    if (m_socket != 0)
+    {
+        cout << "dropping connection" << endl;
+        close_socket(m_socket);
+        m_socket = 0;
+    }
 
-    close_socket(m_socket);
+    m_socket_destruction_mutex.unlock();
 }
 
 void TcpConnection::add_to_output_buffer(const char* msg, unsigned int size)
@@ -96,9 +107,15 @@
 
 void TcpConnection::handle_read(size_t bytes_transferred)
 {
-    if (!bytes_transferred)
+    if (!bytes_transferred) // Remote host closed connection
     {
-        delete this;
+        // If we can't acquire lock, that means this object is already being destructed
+        // Perhaps we closed the connection as well, so just return.
+        if (m_socket != 0 && m_socket_destruction_mutex.try_lock())
+        {
+            delete this;
+        }
+
         return;
     }
 
@@ -165,7 +182,7 @@
 
     // User needs to login before doing anything else
     //Except, for now, NU(new user) don't have to login for creating new account.
-    if((token.compare("NU") != 0) && (token.compare("L") != 0) && (!is_logged_in()))
+    if( (!is_logged_in()) && (token.compare("NU") != 0) && (token.compare("L") != 0) )
     {
         send("E Need To Login");
         delete this;

=== modified file 'mira-server/src/network/asio/AsioServer.cpp'
--- mira-server/src/network/asio/AsioServer.cpp	2010-08-13 17:47:14 +0000
+++ mira-server/src/network/asio/AsioServer.cpp	2011-04-26 16:25:29 +0000
@@ -114,6 +114,7 @@
      SocketType* l_socket = static_cast<SocketType*>(socket);
      l_socket->close();
      delete l_socket;
+     l_socket = 0;
 }
 
 void AsioServer::run()

------------------------------------------------------------------------------
WhatsUp Gold - Download Free Network Management Software
The most intuitive, comprehensive, and cost-effective network 
management toolset available today.  Delivers lowest initial 
acquisition cost and overall TCO of any competing solution.
http://p.sf.net/sfu/whatsupgold-sd
_______________________________________________
Mira-development mailing list
Mira-development@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/mira-development

Reply via email to