From kde-commits Thu Jul 01 13:27:22 2010 From: Gary Cramblitt Date: Thu, 01 Jul 2010 13:27:22 +0000 To: kde-commits Subject: [Konversation] 9e64833: Switch from QDicts to QMaps to support Message-Id: <20100701132722.7A8F2BB55BC () projects ! kde ! org> X-MARC-Message: https://marc.info/?l=kde-commits&m=127800057322211 commit 9e6483346903f938a5897c26aa63a84283683ae2 Author: Gary Cramblitt Date: Mon Mar 8 22:03:20 2004 +0000 Switch from QDicts to QMaps to support locale-aware sorting. Uncomment define USE_NICKINFO in server.h if you want to play with this. svn path=/trunk/kdeextragear-2/konversation/; revision=294551 diff --git a/konversation/nickinfo.h b/konversation/nickinfo.h index 6e4a6dc..fb4f35b 100644 --- a/konversation/nickinfo.h +++ b/konversation/nickinfo.h @@ -21,6 +21,7 @@ #include #include +#include class Server; @@ -31,7 +32,7 @@ class Server; let Server know that the object has been modified. */ -class NickInfo +class NickInfo : public KShared { public: NickInfo(const QString& nick, Server* server); diff --git a/konversation/nicksonline.cpp b/konversation/nicksonline.cpp index 1e6ec1f..def42db 100644 --- a/konversation/nicksonline.cpp +++ b/konversation/nicksonline.cpp @@ -36,6 +36,9 @@ NicksOnline::NicksOnline(QWidget* parent): ChatWindow(parent) setType(ChatWindow::NicksOnline); nickListView=new KListView(this); + + // TODO: Need to derive from KListView and override sort() method in order to sort in + // locale-aware order. #ifdef USE_NICKINFO nickListView->addColumn(i18n("Server/Nickname/Channel")); @@ -47,7 +50,7 @@ NicksOnline::NicksOnline(QWidget* parent): ChatWindow(parent) nickListView->setFullWidth(true); nickListView->setRootIsDecorated(false); #endif - + setMargin(KDialog::marginHint()); setSpacing(KDialog::spacingHint()); @@ -93,7 +96,7 @@ QListViewItem* NicksOnline::findItemChild(const QListViewItem* parent, const QSt } #ifdef USE_NICKINFO -void NicksOnline::updateServerOnlineList(Server* server, bool changed) +void NicksOnline::updateServerOnlineList(Server* server, bool) { bool whoisRequested = false; bool newServerRoot = false; @@ -115,12 +118,13 @@ void NicksOnline::updateServerOnlineList(Server* server, bool changed) QIconSet currentLeds = leds.getGreenLed(false); QPixmap joinedLed = currentLeds.pixmap(QIconSet::Automatic, QIconSet::Active, QIconSet::On); // List online nicknames. - const NickInfoList* nickInfoList = server->getNicksOnline(); - NickInfoListIterator itOnline(*nickInfoList); - NickInfo* nickInfo; - for ( ; (nickInfo=itOnline.current()) ; ++itOnline) + const NickInfoMap* nickInfoList = server->getNicksOnline(); + NickInfoMap::ConstIterator itOnline; + NickInfoPtr nickInfo; + for ( itOnline = nickInfoList->begin(); itOnline != nickInfoList->end() ; ++itOnline) { - QString lcNickName = itOnline.currentKey(); + QString lcNickName = itOnline.key(); + nickInfo = itOnline.data(); nickname = nickInfo->getNickname(); // Construct additional information string for nick. QString nickAdditionalInfo; @@ -161,7 +165,7 @@ void NicksOnline::updateServerOnlineList(Server* server, bool changed) { // Known channels where nickname is online and mode in each channel. QString channelName = channelList[index]; - ChannelNick* channelNick = server->getChannelNick(channelName, lcNickName); + ChannelNickPtr channelNick = server->getChannelNick(channelName, lcNickName); unsigned int nickModeWord = channelNick->mode; QString nickMode; if (nickModeWord & 1) nickMode = nickMode + i18n(" Voice"); @@ -200,16 +204,17 @@ void NicksOnline::updateServerOnlineList(Server* server, bool changed) while (child) { nextChild = child->nextSibling(); - if (!nickInfoList->find(child->text(0))) delete child; + if (!nickInfoList->contains(LocaleString(child->text(0).lower()))) delete child; child = nextChild; } // List offline nicknames. QListViewItem* offlineRoot = findItemChild(serverRoot, i18n("Offline")); if (!offlineRoot) offlineRoot = new KListViewItem(serverRoot, i18n("Offline")); nickInfoList = server->getNicksOffline(); - NickInfoListIterator itOffline(*nickInfoList); - for ( ; (nickInfo=itOffline.current()) ; ++itOffline) + NickInfoMap::ConstIterator itOffline; + for ( itOffline = nickInfoList->begin(); itOffline != nickInfoList->end() ; ++itOffline) { + nickInfo = itOffline.data(); nickname = nickInfo->getNickname(); if (!findItemChild(offlineRoot, nickname)) { @@ -221,7 +226,7 @@ void NicksOnline::updateServerOnlineList(Server* server, bool changed) while (child) { nextChild = child->nextSibling(); - if (!nickInfoList->find(child->text(0))) delete child; + if (!nickInfoList->contains(LocaleString(child->text(0).lower()))) delete child; child = nextChild; } // Expand server if newly added to list. @@ -259,15 +264,17 @@ void NicksOnline::timerFired() refreshAllServerOnlineLists(); } -void NicksOnline::setOnlineList(const QString& serverName,const QStringList& list,bool changed) -{ #ifdef USE_NICKINFO +void NicksOnline::setOnlineList(const QString& serverName,const QStringList&,bool changed) +{ // Get the server object corresponding to the server name. KonversationApplication *konvApp=static_cast(KApplication::kApplication()); Server* server = konvApp->getServerByName(serverName); updateServerOnlineList(server, changed); +} #else - +void NicksOnline::setOnlineList(const QString& serverName,const QStringList& list,bool changed) +{ QListViewItem* serverRoot=nickListView->findItem(serverName,0); // If server is not in our list, or if the list changed, then display the new list. if ( (serverRoot == 0) || changed) @@ -283,8 +290,8 @@ void NicksOnline::setOnlineList(const QString& serverName,const QStringList& lis newServerRoot->setOpen(true); } } -#endif } +#endif void NicksOnline::processDoubleClick(QListViewItem* item) { diff --git a/konversation/server.cpp b/konversation/server.cpp index 5f0c3a1..11ca41c 100644 --- a/konversation/server.cpp +++ b/konversation/server.cpp @@ -215,23 +215,16 @@ Server::~Server() if(resolver.running()) resolver.exit(); #endif - // Delete all the NickInfos. - allNicks.setAutoDelete(TRUE); + // Delete all the NickInfos and ChannelNick structures. allNicks.clear(); - // Delete all the ChannelNick structures. - ChannelNickList* members; - ChannelMembershipListIterator joinedChannelIterator(joinedChannels); - for( ; (members=joinedChannelIterator.current()); ++joinedChannelIterator ) - { - members->setAutoDelete(TRUE); - members->clear(); - } - ChannelMembershipListIterator unjoinedChannelIterator(joinedChannels); - for( ; (members=unjoinedChannelIterator.current()); ++unjoinedChannelIterator ) - { - members->setAutoDelete(TRUE); - members->clear(); - } + ChannelMembershipMap::Iterator it; + for ( it = joinedChannels.begin(); it != joinedChannels.end(); ++it ) delete it.data(); + joinedChannels.clear(); + for ( it = unjoinedChannels.begin(); it != unjoinedChannels.end(); ++it ) delete it.data(); + unjoinedChannels.clear(); + nicknamesOnline.clear(); + nicknamesOffline.clear(); + queryNicks.clear(); // notify KonversationApplication that this server is gone emit deleted(this); @@ -549,7 +542,7 @@ void Server::notifyResponse(const QString& nicksOnline) unsigned int index; for(index=0;indexgetNickname(), watchLowerList); @@ -582,7 +575,7 @@ void Server::notifyResponse(const QString& nicksOnline) // TODO: It would be better to do this on startup and whenever user changes preferences. for(index=0;indexfind(lcNickname); + if (channelNickMap->contains(lcNickname)) + return (*channelNickMap)[lcNickname]; + else + return 0; } else { @@ -958,11 +967,11 @@ ChannelNick* Server::getChannelNick(const QString& channelName, const QString& n // is in the watch list, adds the channel and nick to the unjoinedChannels list. // If mode != 99, sets the mode for the nick in the channel. // Returns the NickInfo object if nick is on any lists, otherwise 0. -NickInfo* Server::setChannelNick(const QString& channelName, const QString& nickname, unsigned int mode) +NickInfoPtr Server::setChannelNick(const QString& channelName, const QString& nickname, unsigned int mode) { QString lcNickname = nickname.lower(); // If already on a list, update mode. - ChannelNick* channelNick = getChannelNick(channelName, lcNickname); + ChannelNickPtr channelNick = getChannelNick(channelName, lcNickname); if (channelNick) { if (mode != 99) channelNick->mode = mode; @@ -986,27 +995,25 @@ NickInfo* Server::setChannelNick(const QString& channelName, const QString& nick // Returns a list of all the channels (joined or unjoined) that a nick is in. QStringList Server::getNickChannels(QString& nickname) { - QString lcNickname = nickname.lower(); + LocaleString lcNickname = nickname.lower(); QStringList channellist; - ChannelNickList* members; - ChannelMembershipListIterator joinedChannelIterator(joinedChannels); - for( ; (members=joinedChannelIterator.current()); ++joinedChannelIterator ) + ChannelMembershipMap::Iterator channel; + for( channel = joinedChannels.begin(); channel != joinedChannels.end(); ++channel ) { - if (members->find(lcNickname)) channellist.append(joinedChannelIterator.currentKey()); + if (channel.data()->contains(lcNickname)) channellist.append(channel.key()); } - ChannelMembershipListIterator unjoinedChannelIterator(unjoinedChannels); - for( ; (members=unjoinedChannelIterator.current()); ++unjoinedChannelIterator ) + for( channel = unjoinedChannels.begin(); channel != unjoinedChannels.end(); ++channel ) { - if (members->find(lcNickname)) channellist.append(unjoinedChannelIterator.currentKey()); + if (channel.data()->contains(lcNickname)) channellist.append(channel.key()); } return channellist; } // Returns a list of the nicks on the watch list that are online. -const NickInfoList* Server::getNicksOnline() { return &nicknamesOnline; } +const NickInfoMap* Server::getNicksOnline() { return &nicknamesOnline; } // Returns a list of the nicks on the watch list that are offline. -const NickInfoList* Server::getNicksOffline() { return &nicknamesOffline; } +const NickInfoMap* Server::getNicksOffline() { return &nicknamesOffline; } QString Server::getIp() { @@ -1043,13 +1050,8 @@ void Server::addQuery(const QString& nickname,const QString& hostmask) #ifdef USE_NICKINFO // Update NickInfo. - QString lcNickname = nickname.lower(); - NickInfo* nickInfo = getNickInfo(nickname); - if (!nickInfo) - { - nickInfo = new NickInfo(nickname, this); - allNicks.insert(lcNickname, nickInfo); - } + LocaleString lcNickname = nickname.lower(); + NickInfoPtr nickInfo = obtainNickInfo(nickname); if ((nickInfo->getHostmask() != hostmask) && !hostmask.isEmpty()) { nickInfo->setHostmask(hostmask); @@ -1073,7 +1075,7 @@ void Server::closeQuery(const QString &name) #ifdef USE_NICKINFO // Update NickInfo. - queryNicks.remove(name.lower()); + queryNicks.remove(LocaleString(name.lower())); #endif } @@ -1430,7 +1432,7 @@ void Server::joinChannel(const QString &name, const QString &hostmask, const QSt #ifdef USE_NICKINFO // Move channel from unjoined (if present) to joined list and add our own nickname to the joined list. - NickInfo* nickInfo = addNickToJoinedChannelsList(name, getNickname(), 99); + NickInfoPtr nickInfo = addNickToJoinedChannelsList(name, getNickname(), 99); if ((nickInfo->getHostmask() != hostmask) && !hostmask.isEmpty()) { nickInfo->setHostmask(hostmask); @@ -1457,8 +1459,8 @@ void Server::updateChannelMode(const QString &nick, const QString &channelName, #ifdef USE_NICKINFO // Compute new mode for the recipient. unsigned int nickMode = 0; - ChannelNick* channelNick=getChannelNick(channelName, parameter); - if (channelNick) nickMode=channelNick->mode; + ChannelNickPtr channelNick = getChannelNick(channelName, parameter); + if (channelNick) nickMode = channelNick->mode; // TODO: What is mode character for owner? QString userModes="vho?a"; // voice halfop op owner admin int modePos = userModes.find(mode); @@ -1588,8 +1590,8 @@ void Server::addPendingNickList(const QString& channelName,const QStringList& ni { for(unsigned int i=0;ifind(lcNickname); - if (!channelNick) + // Add NickInfo to channel list if not already in the list. + ChannelNickPtr channelNick; + if (!channel->contains(lcNickname)) { - channelNick = new ChannelNick; + channelNick = ChannelNickPtr(new ChannelNick); channelNick->nickInfo = nickInfo; channelNick->mode = 0; - members->insert(lcNickname, channelNick); + channel->insert(lcNickname, channelNick); doChannelMembersChangedSignal = true; } + channelNick = (*channel)[lcNickname]; // Move from the Offline to Online lists. - if (nicknamesOffline.find(lcNickname) != 0) + if (nicknamesOffline.contains(lcNickname)) { - nicknamesOffline.remove(lcNickname); nicknamesOnline.insert(lcNickname, nickInfo); + nicknamesOffline.remove(lcNickname); doWatchedNickChangedSignal = true; } // Set the mode for the nick in this channel. @@ -1670,7 +1669,7 @@ NickInfo* Server::addNickToJoinedChannelsList(const QString& channelName, const return nickInfo; } #else -NickInfo* Server::addNickToJoinedChannelsList(const QString&, const QString&, unsigned int) { return 0; } +NickInfoPtr Server::addNickToJoinedChannelsList(const QString&, const QString&, unsigned int) { return 0; } #endif // Adds a nickname to the unjoinedChannels list. @@ -1680,53 +1679,52 @@ NickInfo* Server::addNickToJoinedChannelsList(const QString&, const QString&, un // If mode != 99 sets the mode for this nick in this channel. // Returns the NickInfo for the nickname. #ifdef USE_NICKINFO -NickInfo* Server::addNickToUnjoinedChannelsList(const QString& channelName, const QString& nickname, unsigned int mode) +NickInfoPtr Server::addNickToUnjoinedChannelsList(const QString& channelName, const QString& nickname, unsigned int mode) { bool doChannelUnjoinedSignal = false; bool doWatchedNickChangedSignal = false; bool doChannelMembersChangedSignal = false; bool doChannelNickChangedSignal = false; - QString lcNickname = nickname.lower(); + LocaleString lcNickname = nickname.lower(); // Create NickInfo if not already created. - NickInfo* nickInfo = getNickInfo(lcNickname); - if (!nickInfo) - { - nickInfo = new NickInfo(nickname, this); - allNicks.insert(lcNickname, nickInfo); - } + NickInfoPtr nickInfo = obtainNickInfo(nickname); // Move the channel from joined list (if present) to unjoined list. - QString lcChannelName = channelName.lower(); - ChannelNickList* members = joinedChannels.find(lcChannelName); - if (members) + LocaleString lcChannelName = channelName.lower(); + ChannelNickMapPtr channel; + if (joinedChannels.contains(lcChannelName)) { + channel = joinedChannels[lcChannelName]; joinedChannels.remove(lcChannelName); - unjoinedChannels.insert(lcChannelName, members); + unjoinedChannels.insert(lcChannelName, channel); doChannelUnjoinedSignal = true; } else { // Create a new list in the unjoined channels if not already present. - members = unjoinedChannels.find(lcChannelName); - if (!members) + if (!unjoinedChannels.contains(lcChannelName)) { - members = new ChannelNickList; - unjoinedChannels.insert(lcChannelName, members); + channel = new ChannelNickMap; + unjoinedChannels.insert(lcChannelName, channel); doChannelUnjoinedSignal = true; } + else + channel = unjoinedChannels[lcChannelName]; } // Add NickInfo to unjoinedChannels list if not already in the list. - ChannelNick* channelNick = members->find(lcNickname); - if (!channelNick) + ChannelNickPtr channelNick; + if (!channel->contains(lcNickname)) { - channelNick = new ChannelNick; + channelNick = ChannelNickPtr(new ChannelNick); channelNick->nickInfo = nickInfo; channelNick->mode = 0; - members->insert(lcNickname, channelNick); + channel->insert(lcNickname, channelNick); doChannelMembersChangedSignal = true; } + channelNick = (*channel)[lcNickname]; // Move from the Offline to Online lists. - if (nicknamesOffline.find(lcNickname) != 0) + if (nicknamesOffline.contains(lcNickname)) { + nickInfo = nicknamesOffline[lcNickname]; nicknamesOffline.remove(lcNickname); nicknamesOnline.insert(lcNickname, nickInfo); doWatchedNickChangedSignal = true; @@ -1747,26 +1745,21 @@ NickInfo* Server::addNickToUnjoinedChannelsList(const QString& channelName, cons return nickInfo; } #else -NickInfo* Server::addNickToUnjoinedChannelsList(const QString&, const QString&, unsigned int) { return 0; } +NickInfoPtr Server::addNickToUnjoinedChannelsList(const QString&, const QString&, unsigned int) { return 0; } #endif // Adds a nickname to the Online list, removing it from the Offline list, if present. // Returns the NickInfo of the nickname. // Creates new NickInfo if necessary. #ifdef USE_NICKINFO -NickInfo* Server::addNickToOnlineList(const QString& nickname) +NickInfoPtr Server::addNickToOnlineList(const QString& nickname) { bool doSignal = false; - QString lcNickname = nickname.lower(); + LocaleString lcNickname = nickname.lower(); nicknamesOffline.remove(lcNickname); - NickInfo* nickInfo = getNickInfo(lcNickname); - if (nicknamesOnline.find(lcNickname) == 0) + NickInfoPtr nickInfo = obtainNickInfo(nickname); + if (!nicknamesOnline.contains(lcNickname)) { - if (!nickInfo) - { - nickInfo = new NickInfo(nickname, this); - allNicks.insert(lcNickname, nickInfo); - } nicknamesOnline.insert(lcNickname, nickInfo); doSignal = true; } @@ -1774,7 +1767,7 @@ NickInfo* Server::addNickToOnlineList(const QString& nickname) if (doSignal) emit watchedNickChanged(this, nickInfo, true); } #else -NickInfo* Server::addNickToOnlineList(const QString&) { return 0; } +NickInfoPtr Server::addNickToOnlineList(const QString&) { return 0; } #endif // Adds a nickname to the Offline list provided it is on the watch list, @@ -1783,21 +1776,17 @@ NickInfo* Server::addNickToOnlineList(const QString&) { return 0; } // Returns the NickInfo of the nickname or 0 if deleted altogether. // Creates new NickInfo if necessary. #ifdef USE_NICKINFO -NickInfo* Server::addNickToOfflineList(const QString& nickname, const QStringList& watchList) +NickInfoPtr Server::addNickToOfflineList(const QString& nickname, const QStringList& watchList) { bool doSignal = false; - QString lcNickname = nickname.lower(); + LocaleString lcNickname = nickname.lower(); nicknamesOnline.remove(lcNickname); - NickInfo* nickInfo = getNickInfo(lcNickname); + NickInfoPtr nickInfo; if (watchList.find(lcNickname) != watchList.end()) { - if (nicknamesOffline.find(lcNickname) == 0) + nickInfo = obtainNickInfo(nickname); + if (!nicknamesOffline.contains(lcNickname)) { - if (!nickInfo) - { - nickInfo = new NickInfo(nickname, this); - allNicks.insert(lcNickname, nickInfo); - } nicknamesOffline.insert(lcNickname, nickInfo); doSignal = true; } @@ -1818,7 +1807,7 @@ NickInfo* Server::addNickToOfflineList(const QString& nickname, const QStringLis return nickInfo; } #else -NickInfo* Server::addNickToOfflineList(const QString&, const QStringList&) { return 0; } +NickInfoPtr Server::addNickToOfflineList(const QString&, const QStringList&) { return 0; } #endif // Remove nickname from a channel (on joined or unjoined lists). @@ -1828,40 +1817,40 @@ void Server::removeChannelNick(const QString& channelName, const QString& nickna { bool doSignal = false; bool joined = false; - QString lcChannelName = channelName.lower(); - QString lcNickname = nickname.lower(); - ChannelNick* channelNick; - ChannelNickList* channelNickList = joinedChannels.find(lcChannelName); - if (channelNickList) + LocaleString lcChannelName = channelName.lower(); + LocaleString lcNickname = nickname.lower(); + ChannelNickMapPtr channel; + if (joinedChannels.contains(lcChannelName)) { - channelNick = channelNickList->find(lcNickname); - delete channelNick; - channelNickList->remove(lcNickname); - doSignal = true; - joined = true; - // TODO: If channel is now empty, delete it? + channel = joinedChannels[lcChannelName]; + if (channel->contains(lcNickname)) + { + channel->remove(lcNickname); + doSignal = true; + joined = true; + // TODO: If channel is now empty, delete it? + } } else { - channelNickList = unjoinedChannels.find(lcChannelName); - if (channelNickList) + if (unjoinedChannels.contains(lcChannelName)) { - channelNick = channelNickList->find(lcNickname); - delete channelNick; - channelNickList->remove(lcNickname); - doSignal = true; - joined = false; - // TODO: If channel is now empty, delete it? + channel = unjoinedChannels[lcChannelName]; + if (channel->contains(lcNickname)) + { + channel->remove(lcNickname); + doSignal = true; + joined = false; + // TODO: If channel is now empty, delete it? + } } // If nickname is no longer on any list, delete it altogether. QStringList nickChannels = getNickChannels(lcNickname); if (nickChannels.isEmpty()) { - if ((nicknamesOnline.find(lcNickname) == 0) && (nicknamesOffline.find(lcNickname) == 0) && (queryNicks.find(lcNickname) == 0)) + if (!nicknamesOnline.contains(lcNickname) && !nicknamesOffline.contains(lcNickname) && !queryNicks.contains(lcNickname)) { - NickInfo* nickInfo = getNickInfo(lcNickname); allNicks.remove(lcNickname); - delete nickInfo; } } } @@ -1879,18 +1868,20 @@ void Server::removeJoinedChannel(const QString& channelName) bool doSignal = false; QString watchList = KonversationApplication::preferences.getNotifyString(); QStringList watchListLower = QStringList::split(' ', watchList.lower()); - QString lcChannelName = channelName.lower(); + LocaleString lcChannelName = channelName.lower(); // Move the channel nick list from the joined to unjoined lists. - ChannelNickList* channelNickList = joinedChannels.take(lcChannelName); - if (channelNickList) + ChannelNickMapPtr channel; + ChannelNickMap::Iterator member; + if (joinedChannels.contains(lcChannelName)) { - unjoinedChannels.insert(lcChannelName, channelNickList); + channel = joinedChannels[lcChannelName]; + joinedChannels.remove(lcChannelName); + unjoinedChannels.insert(lcChannelName, channel); // Remove nicks not on the watch list. - ChannelNickListIterator it(*channelNickList); bool allDeleted = true; - for ( ; (it.current()) ;++it ) + for ( member = channel->begin(); member != channel->end() ;++member ) { - QString lcNickname = it.currentKey(); + LocaleString lcNickname = member.key(); if (watchListLower.find(lcNickname) == watchListLower.end()) { // Remove the nickname from the unjoined channel. If nickname is no longer @@ -1903,8 +1894,12 @@ void Server::removeJoinedChannel(const QString& channelName) } } // If all were deleted, remove the channel from the unjoined list. - // TODO: Remove this if removeChannelNick is changed to take care of this. - if (allDeleted) unjoinedChannels.remove(lcChannelName); + if (allDeleted) + { + channel = unjoinedChannels[lcChannelName]; + unjoinedChannels.remove(lcChannelName); + delete channel; // recover memory! + } } if (doSignal) emit channelJoinedOrUnjoined(this, channelName, false); } @@ -1916,40 +1911,41 @@ void Server::removeJoinedChannel(const QString&) {} // Renames a nickname in all NickInfo lists. // Returns pointer to the NickInfo object or 0 if nick not found. #ifdef USE_NICKINFO -NickInfo* Server::renameNickInfo(const QString& nickname, const QString& newname) +NickInfoPtr Server::renameNickInfo(const QString& nickname, const QString& newname) { - NickInfo* nickInfo = getNickInfo(nickname); + NickInfoPtr nickInfo = getNickInfo(nickname); if (nickInfo) { // Rename nickname in the NickInfo object. nickInfo->setNickname(newname); // Rename key in the joined and unjoined lists. - QString lcNickname = nickname.lower(); - QString lcNewname = newname.lower(); + LocaleString lcNickname = nickname.lower(); + LocaleString lcNewname = newname.lower(); QStringList nickChannels = getNickChannels(lcNickname); for (unsigned int index=0;index(channelNickList)->take(lcNickname); - const_cast(channelNickList)->remove(lcNickname); - const_cast(channelNickList)->insert(lcNewname, channelNick); + const ChannelNickMapPtr channel = getChannelMembers(nickChannels[index]); + ChannelNickPtr member = (*channel)[lcNickname]; + const_cast(channel)->remove(lcNickname); + const_cast(channel)->insert(lcNewname, member); } // Rename key in the Online, Offline, and Query lists. - NickInfo* nickInfo = nicknamesOnline.find(lcNickname); - if (nickInfo) + NickInfoPtr nickInfo; + if (nicknamesOnline.contains(lcNickname)) { + nickInfo = nicknamesOnline[lcNickname]; nicknamesOnline.remove(lcNickname); nicknamesOnline.insert(lcNewname, nickInfo); } - nickInfo = nicknamesOffline.find(lcNickname); - if (nickInfo) + if (nicknamesOffline.contains(lcNickname)) { + nickInfo = nicknamesOffline[lcNickname]; nicknamesOffline.remove(lcNickname); nicknamesOffline.insert(lcNewname, nickInfo); } - nickInfo = queryNicks.find(lcNickname); - if (nickInfo) + if (queryNicks.contains(lcNickname)) { + nickInfo = queryNicks[lcNickname]; queryNicks.remove(lcNickname); queryNicks.insert(lcNewname, nickInfo); } @@ -1959,7 +1955,7 @@ NickInfo* Server::renameNickInfo(const QString& nickname, const QString& newname return nickInfo; } #else -NickInfo* Server::renameNickInfo(const QString&, const QString&) { return 0; } +NickInfoPtr Server::renameNickInfo(const QString&, const QString&) { return 0; } #endif void Server::noMorePendingNicks(const QString& channelName) @@ -1981,7 +1977,7 @@ void Server::addNickToChannel(const QString &channelName,const QString &nickname (op ? 4 : 0)+ (halfop ? 2 : 0)+ (voice ? 1 : 0); - NickInfo* nickInfo = addNickToJoinedChannelsList(channelName, nickname, mode); + NickInfoPtr nickInfo = addNickToJoinedChannelsList(channelName, nickname, mode); if ((nickInfo->getHostmask() != hostmask) && !hostmask.isEmpty()) { nickInfo->setHostmask(hostmask); @@ -2007,7 +2003,7 @@ void Server::nickJoinsChannel(const QString &channelName, const QString &nicknam #ifdef USE_NICKINFO // Update NickInfo. - NickInfo* nickInfo = addNickToJoinedChannelsList(channelName, nickname, 99); + NickInfoPtr nickInfo = addNickToJoinedChannelsList(channelName, nickname, 99); if ((nickInfo->getHostmask() != hostmask) && !hostmask.isEmpty()) { nickInfo->setHostmask(hostmask); @@ -2033,7 +2029,7 @@ void Server::addHostmaskToNick(const QString& sourceNick, const QString& sourceH #ifdef USE_NICKINFO // Update NickInfo. - NickInfo* nickInfo=getNickInfo(sourceNick); + NickInfoPtr nickInfo=getNickInfo(sourceNick); if (nickInfo) { if ((nickInfo->getHostmask() != sourceHostmask) && !sourceHostmask.isEmpty()) @@ -2126,7 +2122,7 @@ void Server::renameNick(const QString &nickname, const QString &newNick) void Server::userhost(const QString& nick,const QString& hostmask,bool away,bool /* ircOp */) { addHostmaskToNick(nick,hostmask); - NickInfo* nickInfo = getNickInfo(nick); + NickInfoPtr nickInfo = getNickInfo(nick); if (nickInfo) { if (nickInfo->isAway() != away) diff --git a/konversation/server.h b/konversation/server.h index fa52490..c7887c4 100644 --- a/konversation/server.h +++ b/konversation/server.h @@ -18,6 +18,7 @@ #include #include #include +#include #include "inputfilter.h" #include "outputfilter.h" @@ -42,20 +43,49 @@ class KonversationMainWindow; class RawLog; class ChannelListPanel; -// A NickInfoList is a list of NickInfo objects, indexed by lowercase nickname. -typedef QDict NickInfoList; +// A LocaleString is used as a key to a QMap. Unlike QString, it sorts the QMap +// in localeAware order. +class LocaleString : public QString +{ + public: + LocaleString() : QString() {}; + LocaleString(const QString& s) : QString(s) {} + LocaleString(const LocaleString& s) : QString(s) {} + LocaleString& operator=(const QString& s) { + QString::operator=(s); + return *this; } + LocaleString& operator=(const LocaleString& s) { + QString::operator=(s); + return *this; } + inline bool operator<( const QString &s1) { return (localeAwareCompare(s1) < 0); } + inline bool operator<( const char *s1) { return (localeAwareCompare(s1) < 0); } + inline bool operator<( QChar c) { return (localeAwareCompare(c) < 0); } + inline bool operator<( char ch) { return (localeAwareCompare(&ch) < 0); } +}; +// A NickInfoPtr is a pointer to a NickInfo object. Since it is a KSharedPtr, the NickInfo +// object is automatically destroyed when all references are destroyed. +typedef KSharedPtr NickInfoPtr; +// A NickInfoMap is a list of NickInfo objects, indexed and sorted by lowercase nickname. +typedef QMap NickInfoMap; // A ChannelNick is a user mode and pointer to a NickInfo. -typedef struct ChannelNick { unsigned int mode; NickInfo* nickInfo; } ChannelNick; -// A ChannelNickList is a list of ChannelNicks, indexed by lowercase nickname. -typedef QDict ChannelNickList; -// A ChannelMembershipList is a list of ChannelNickLists, indexed by lowercase channel name. -typedef QDict ChannelMembershipList; -// An iterator for a NickInfoList. -typedef QDictIterator NickInfoListIterator; -// An interator for a ChannelNickList. -typedef QDictIterator ChannelNickListIterator; -// An iterator for a ChannelMembershipList. -typedef QDictIterator ChannelMembershipListIterator; +class ChannelNick : public KShared +{ + public: + ChannelNick() : mode(0), nickInfo(0) {} + ChannelNick(unsigned int m, NickInfoPtr ni) : mode(m), nickInfo(ni) {} + unsigned int mode; + NickInfoPtr nickInfo; +}; +// A ChannelNickPtr is a pointer to a ChannelNick. Since it is a KSharedPtr, the ChannelNick +// object is automatically destroyed when all references are destroyed. +typedef KSharedPtr ChannelNickPtr; +// A ChannelNickMap is a list of ChannelNick pointers, indexed and sorted by lowercase nickname. +typedef QMap ChannelNickMap; +// A ChannelNickMapPtr is a pointer to a ChannelNickMap. Since the combination of a channel and a nick +// is unique, don't bother with KSharedPtr. +typedef ChannelNickMap* ChannelNickMapPtr; +// A ChannelMembershipMap is a list of ChannelNickMap pointers, indexed and sorted by lowercase channel name. +typedef QMap ChannelMembershipMap; class Server : public QObject { @@ -153,39 +183,39 @@ class Server : public QObject QString getNumericalIp(); // Given a nickname, returns NickInfo object. 0 if not found. - NickInfo* getNickInfo(const QString& nickname); + NickInfoPtr getNickInfo(const QString& nickname); // Given a nickname, returns an existing NickInfo object, or creates a new NickInfo object. // Returns pointer to the found or created NickInfo object. - NickInfo* obtainNickInfo(const QString& nickname); + NickInfoPtr obtainNickInfo(const QString& nickname); // Anyone who changes the contents of a NickInfo should call this method to let server // know that it has changed. - void nickInfoUpdated(const NickInfo* nickInfo); + void nickInfoUpdated(const NickInfoPtr nickInfo); // Returns the list of members for a channel in the joinedChannels list. // 0 if channel is not in the joinedChannels list. // Using code must not alter the list. - const ChannelNickList* getJoinedChannelMembers(const QString& channelName) const; + const ChannelNickMapPtr getJoinedChannelMembers(const QString& channelName) const; // Returns the list of members for a channel in the unjoinedChannels list. // 0 if channel is not in the unjoinedChannels list. // Using code must not alter the list. - const ChannelNickList* getUnjoinedChannelMembers(const QString& channelName) const; + const ChannelNickMapPtr getUnjoinedChannelMembers(const QString& channelName) const; // Searches the Joined and Unjoined lists for the given channel and returns the member list. // 0 if channel is not in either list. // Using code must not alter the list. - const ChannelNickList* getChannelMembers(const QString& channelName) const; + const ChannelNickMapPtr getChannelMembers(const QString& channelName) const; // Returns a list of all the channels (joined or unjoined) that a nick is in. QStringList getNickChannels(QString& nickname); // Returns pointer to the ChannelNick (mode and pointer to NickInfo) for a given channel and nickname. // 0 if not found. - ChannelNick* getChannelNick(const QString& channelName, const QString& nickname); + ChannelNickPtr getChannelNick(const QString& channelName, const QString& nickname); // Updates a nickname in a channel. If not on the joined or unjoined lists, and nick // is in the watch list, adds the channel and nick to the unjoinedChannels list. // If mode != 99, sets the mode for the nick in the channel. // Returns the NickInfo object if nick is on any lists, otherwise 0. - NickInfo* setChannelNick(const QString& channelName, const QString& nickname, unsigned int mode = 99); + NickInfoPtr setChannelNick(const QString& channelName, const QString& nickname, unsigned int mode = 99); // Returns a list of the nicks on the watch list that are online. - const NickInfoList* getNicksOnline(); + const NickInfoMap* getNicksOnline(); // Returns a list of the nicks on the watch list that are offline. - const NickInfoList* getNicksOffline(); + const NickInfoMap* getNicksOffline(); signals: void nicknameChanged(const QString&); @@ -202,9 +232,9 @@ class Server : public QObject void serverOnline(bool state); // will be connected to all server dependant tabs // Note that these signals haven't been implemented yet. // Fires when the information in a NickInfo object changes. - void nickInfoChanged(Server* server, const NickInfo* nickInfo); + void nickInfoChanged(Server* server, const NickInfoPtr nickInfo); // Fires when the mode of a nick in a channel changes. - void channelNickChanged(Server* server, const ChannelNick* channelNick); + void channelNickChanged(Server* server, const ChannelNickPtr channelNick); // Fires when a nick leaves or joins a channel. Based on joined flag, receiver could // call getJoinedChannelMembers or getUnjoinedChannelMembers, or just // getChannelMembers to get a list of all the nicks now in the channel. @@ -215,7 +245,7 @@ class Server : public QObject // possible the channel does not exist in any list anymore. void channelJoinedOrUnjoined(Server* server, const QString& channelName, bool joined); // Fires when a nick on the watch list goes online or offline. - void watchedNickChanged(Server* server, const NickInfo* nickInfo, bool online); + void watchedNickChanged(Server* server, const NickInfoPtr nickInfo, bool online); public slots: void connectToIRCServer(); @@ -301,23 +331,23 @@ class Server : public QObject // If needed, moves the nickname from the Offline to Online lists. // If mode != 99 sets the mode for this nick in this channel. // Returns the NickInfo for the nickname. - NickInfo* addNickToJoinedChannelsList(const QString& channelName, const QString& nickname, unsigned int mode = 99); + NickInfoPtr addNickToJoinedChannelsList(const QString& channelName, const QString& nickname, unsigned int mode = 99); // Adds a nickname to the unjoinedChannels list. // Creates new NickInfo if necessary. // If needed, moves the channel from the joined list to the unjoined list. // If needed, moves the nickname from the Offline to the Online list. // If mode != 99 sets the mode for this nick in this channel. // Returns the NickInfo for the nickname. - NickInfo* addNickToUnjoinedChannelsList(const QString& channelName, const QString& nickname, unsigned int mode = 99); + NickInfoPtr addNickToUnjoinedChannelsList(const QString& channelName, const QString& nickname, unsigned int mode = 99); // Adds a nickname to the Online list, removing it from the Offline list, if present. // Returns the NickInfo of the nickname. // Creates new NickInfo if necessary. - NickInfo* addNickToOnlineList(const QString& nickname); + NickInfoPtr addNickToOnlineList(const QString& nickname); // Adds a nickname to the Offline list provided it is on the watch list, // removing it from the Online list, if present. // Returns the NickInfo of the nickname or 0 if deleted altogether. // Creates new NickInfo if necessary. - NickInfo* addNickToOfflineList(const QString& nickname, const QStringList& watchList); + NickInfoPtr addNickToOfflineList(const QString& nickname, const QStringList& watchList); // Remove nickname from a channel (on joined or unjoined lists). // Delete the nickname altogether if no longer on any lists. void removeChannelNick(const QString& channelName, const QString& nickname); @@ -326,7 +356,7 @@ class Server : public QObject void removeJoinedChannel(const QString& channelName); // Renames a nickname in all NickInfo lists. // Returns pointer to the NickInfo object or 0 if nick not found. - NickInfo* renameNickInfo(const QString& nickname, const QString& newname); + NickInfoPtr renameNickInfo(const QString& nickname, const QString& newname); unsigned int completeQueryPosition; unsigned int tryNickNumber; @@ -395,19 +425,19 @@ class Server : public QObject QString nonAwayNick; // All nicks known to this server. Note this is NOT a list of all nicks on the server. - NickInfoList allNicks; + NickInfoMap allNicks; // List of membership lists for joined channels. A "joined" channel is a channel that user has joined, i.e., // a tab appears for the channel in the main window. - ChannelMembershipList joinedChannels; + ChannelMembershipMap joinedChannels; // List of membership lists for unjoined channels. These come from WHOIS responses. Note that this is NOT // a list of all channels on the server, just those we are interested in because of nicks in the Nick Watch List. - ChannelMembershipList unjoinedChannels; + ChannelMembershipMap unjoinedChannels; // List of nicks in the Nick Watch List that are online. - NickInfoList nicknamesOnline; + NickInfoMap nicknamesOnline; // List of nicks in the Nick Watch List that are not online. - NickInfoList nicknamesOffline; + NickInfoMap nicknamesOffline; // List of nicks in Queries. - NickInfoList queryNicks; + NickInfoMap queryNicks; }; #endif