Bug 111234 - konversation hangs on command /list
Summary: konversation hangs on command /list
Status: RESOLVED FIXED
Alias: None
Product: konversation
Classification: Applications
Component: general (show other bugs)
Version: unspecified
Platform: unspecified Linux
: NOR normal
Target Milestone: ---
Assignee: Konversation Developers
URL:
Keywords:
Depends on:
Blocks:
 
Reported: 2005-08-21 19:34 UTC by Jos van den Oever
Modified: 2005-08-21 23:57 UTC (History)
0 users

See Also:
Latest Commit:
Version Fixed In:
Sentry Crash Report:


Attachments

Note You need to log in before you can comment on or make changes to this bug.
Description Jos van den Oever 2005-08-21 19:34:51 UTC
Version:           0.18 #3016 (using KDE 3.4.2 Level "b" , SUSE 10.0)
Compiler:          Target: i586-suse-linux
OS:                Linux (i686) release 2.6.13-rc6-git7-3-default

when issuing the command /list on konversation the program starts to retrieve the HUGE list of entries. It would be better if it would simply intercept the command and open the channel list window
Comment 1 Jos van den Oever 2005-08-21 19:39:59 UTC
because the list is displayed unfiltered and causes the cpu to go 100% and the ui to become unusable for a long time (> 5 minutes on my machine)

Comment 2 Peter Simonsson 2005-08-21 23:57:06 UTC
SVN commit 451824 by psn:

* Make /list open the channel list panel
* Fix notice to handle IDENTIFY-MSG correctly

BUG:111234


 M  +5 -0      channellistpanel.cpp  
 M  +5 -3      channellistpanel.h  
 M  +5 -0      inputfilter.cpp  
 M  +24 -9     konversationmainwindow.cpp  
 M  +1 -1      konversationmainwindow.h  
 M  +14 -0     outputfilter.cpp  
 M  +3 -1      server.cpp  
 M  +2 -1      server.h  


--- trunk/extragear/network/konversation/src/channellistpanel.cpp #451823:451824
@@ -509,4 +509,9 @@
     emit updateInfo(info);
 }
 
+void ChannelListPanel::setFilter(const QString& filter)
+{
+    filterInput->setText(filter);
+}
+
 #include "channellistpanel.moc"
--- trunk/extragear/network/konversation/src/channellistpanel.h #451823:451824
@@ -33,14 +33,14 @@
 {
     Q_OBJECT
 
-        public:
+    public:
         ChannelListPanel(QWidget* parent);
         ~ChannelListPanel();
 
         virtual bool closeYourself();
         virtual void emitUpdateInfo();
 
-        signals:
+    signals:
         void refreshChannelList();
         void joinChannel(const QString& channelName);
         void adjustMinValue(int num);
@@ -52,9 +52,11 @@
         void addToChannelList(const QString& channel,int users,const QString& topic);
 
         virtual void appendInputText(const QString&);
+        void setFilter(const QString& filter);
 
+        void applyFilterClicked();
+
     protected slots:
-        void applyFilterClicked();
         void refreshList();
         void updateDisplay();                     // will be called by a timer to update regularly
         void saveList();
--- trunk/extragear/network/konversation/src/inputfilter.cpp #451823:451824
@@ -372,6 +372,11 @@
     {
         if(!isIgnore(prefix,Ignore::Notice))
         {
+            if(server->identifyMsg())
+            {
+                trailing = trailing.mid(1);
+            }
+
             // Channel notice?
             if(isAChannel(parameterList[0]))
             {
--- trunk/extragear/network/konversation/src/konversationmainwindow.cpp #451823:451824
@@ -657,28 +657,43 @@
     konsolePanel->deleteLater();
 }
 
-void KonversationMainWindow::openChannelList()
+void KonversationMainWindow::openChannelList(const QString& filter, bool getList)
 {
     if(frontServer)
     {
-        ChannelListPanel* panel=frontServer->getChannelListPanel();
+        ChannelListPanel* panel = frontServer->getChannelListPanel();
+
         if(panel)
         {
             getViewContainer()->showPage(panel);
         }
         else
         {
-            int ret = KMessageBox::warningContinueCancel(this,i18n("Using this function may result in a lot "
-                "of network traffic. If your connection is not fast "
-                "enough, it is possible that your client will be "
-                "disconnected by the server."), i18n("Channel List Warning"),
-                KStdGuiItem::cont(), "ChannelListWarning");
+            int ret = KMessageBox::Continue;
 
-            if(ret == KMessageBox::Continue)
+            if(filter.isEmpty())
             {
-                frontServer->addChannelListPanel();
+                ret = KMessageBox::warningContinueCancel(this,i18n("Using this function may result in a lot "
+                      "of network traffic. If your connection is not fast "
+                      "enough, it is possible that your client will be "
+                      "disconnected by the server."), i18n("Channel List Warning"),
+                      KStdGuiItem::cont(), "ChannelListWarning");
             }
+
+            if(ret != KMessageBox::Continue)
+            {
+                return;
+            }
+
+            panel = frontServer->addChannelListPanel();
         }
+
+        panel->setFilter(filter);
+
+        if(getList)
+        {
+            panel->applyFilterClicked();
+        }
     }
     else
     {
--- trunk/extragear/network/konversation/src/konversationmainwindow.h #451823:451824
@@ -115,6 +115,7 @@
         void addUrlCatcher();
         void addDccChat(const QString& myNick,const QString& nick,const QString& numericalIp,const QStringList& arguments,bool listen);
         void insertRememberLine();
+        void openChannelList(const QString& filter = QString::null, bool getList = false);
 
         void resetLag();
         void updateLag(Server* lagServer,int msec);
@@ -140,7 +141,6 @@
         void openPreferences();
         void openKeyBindings();
         void openQuickConnectDialog();
-        void openChannelList();
         void openNotify();
         void openLogfile();
         void openNicksOnlinePanel();
--- trunk/extragear/network/konversation/src/outputfilter.cpp #451823:451824
@@ -1,3 +1,5 @@
+// -*- mode: c++; c-file-style: "bsd"; c-basic-offset: 4; tabs-width: 4; indent-tabs-mode: nil -*-
+
 /*
   This program is free software; you can redistribute it and/or modify
   it under the terms of the GNU General Public License as published by
@@ -177,6 +179,7 @@
             else if(command == "ignore")  result = parseIgnore(parameter);
             else if(command == "quote")   result = parseQuote(parameter);
             else if(command == "say")     result = parseSay(parameter);
+            else if(command == "list")    result = parseList(parameter);
 
             else if(command == "names")   result = parseNames(parameter);
             else if(command == "raw")     result = parseRaw(parameter);
@@ -1455,6 +1458,17 @@
         return result;
     }
 
+    OutputFilterResult OutputFilter::parseList(const QString& parameter)
+    {
+        OutputFilterResult result;
+
+        m_server->getMainWindow()->openChannelList(parameter, true);
+
+        return result;
+    }
 }
 
 #include "outputfilter.moc"
+
+// kate: space-indent on; tab-width 4; indent-width 4; mixed-indent off; replace-tabs on;
+// vim: set et sw=4 ts=4 cino=l1,cs,U1:
--- trunk/extragear/network/konversation/src/server.cpp #451823:451824
@@ -3035,7 +3035,7 @@
     }
 }
 
-void Server::addChannelListPanel()
+ChannelListPanel* Server::addChannelListPanel()
 {
     if(!channelListPanel)
     {
@@ -3045,6 +3045,8 @@
         connect(channelListPanel, SIGNAL(joinChannel(const QString&)), this, SLOT(sendJoinCommand(const QString&)));
         connect(this, SIGNAL(serverOnline(bool)), channelListPanel, SLOT(serverOnline(bool)));
     }
+
+    return channelListPanel;
 }
 
 void Server::addToChannelList(const QString& channel, int users, const QString& topic)
--- trunk/extragear/network/konversation/src/server.h #451823:451824
@@ -343,6 +343,8 @@
 
         bool identifyMsg() const { return m_identifyMsg; }
 
+        ChannelListPanel* addChannelListPanel();
+
     signals:
         void nicknameChanged(const QString&);
         void serverLag(Server* server,int msec);  /// will be connected to KonversationMainWindow::updateLag()
@@ -416,7 +418,6 @@
         void requestUserhost(const QString& nicks);
         void addRawLog(bool show);
         void closeRawLog();
-        void addChannelListPanel();
         void addToChannelList(const QString& channel, int users, const QString& topic);
         void closeChannelListPanel();
         void updateChannelQuickButtons();