aboutsummaryrefslogtreecommitdiffstats
path: root/src/kvilib/ext/KviRegisteredChannelDataBase.cpp
diff options
context:
space:
mode:
authorGravatar Elvio Basello2010-12-29 02:53:29 +0000
committerGravatar Elvio Basello2010-12-29 02:53:29 +0000
commitf0a08c4ec0dd3cf649133bfb1f4b5606522d8159 (patch)
tree54615daa64460d60276ccfad90fdf1bcb3fb1956 /src/kvilib/ext/KviRegisteredChannelDataBase.cpp
parentyet more splitting (diff)
downloadKVIrc-f0a08c4ec0dd3cf649133bfb1f4b5606522d8159.tar.gz
KVIrc-f0a08c4ec0dd3cf649133bfb1f4b5606522d8159.tar.bz2
KVIrc-f0a08c4ec0dd3cf649133bfb1f4b5606522d8159.zip
yet more splitting
git-svn-id: https://svn.kvirc.de/svn/trunk/kvirc@5253 17fca916-40b9-46aa-a4ea-0a15b648b75c
Diffstat (limited to 'src/kvilib/ext/KviRegisteredChannelDataBase.cpp')
-rw-r--r--src/kvilib/ext/KviRegisteredChannelDataBase.cpp187
1 files changed, 187 insertions, 0 deletions
diff --git a/src/kvilib/ext/KviRegisteredChannelDataBase.cpp b/src/kvilib/ext/KviRegisteredChannelDataBase.cpp
new file mode 100644
index 000000000..1353c093c
--- /dev/null
+++ b/src/kvilib/ext/KviRegisteredChannelDataBase.cpp
@@ -0,0 +1,187 @@
+//=============================================================================
+//
+// File : KviRegisteredChannelDataBase.cpp
+// Creation date : Wed Dec 29 2010 03:28:05 CEST by Elvio Basello
+//
+// This file is part of the KVirc irc client distribution
+// Copyright (C) 2010 Elvio Basello (hellvis69 at gmail dot com)
+//
+// 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 the Free Software Foundation; either version 2
+// of the License, or (at your opinion) any later version.
+//
+// This program is distributed in the HOPE that it will be USEFUL,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+// See the GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with this program. If not, write to the Free Software Foundation,
+// Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+//
+//=============================================================================
+
+#include "KviRegisteredChannelDataBase.h"
+#include "KviConfigurationFile.h"
+
+KviRegisteredChannelDataBase::KviRegisteredChannelDataBase()
+{
+ m_pChannelDict = new QHash<QString,KviRegisteredChannelList *>();
+}
+
+KviRegisteredChannelDataBase::~KviRegisteredChannelDataBase()
+{
+ qDeleteAll(*m_pChannelDict);
+ delete m_pChannelDict;
+}
+
+void KviRegisteredChannelDataBase::load(const QString &filename)
+{
+ KviConfigurationFile cfg(filename,KviConfigurationFile::Read);
+
+ qDeleteAll(*m_pChannelDict);
+ m_pChannelDict->clear();
+
+ KviConfigurationFileIterator it(*(cfg.dict()));
+
+ while(KviConfigurationFileGroup * d = it.current())
+ {
+ QString szMask = it.currentKey();
+ QString szChan = KviQString::leftToLast(szMask,QChar('@'),false);
+ KviQString::cutToLast(szMask,QChar('@'),true);
+ KviRegisteredChannel * c = new KviRegisteredChannel(szChan,szMask);
+ add(c);
+ KviConfigurationFileGroupIterator sit(*d);
+ while(QString * s = sit.current())
+ {
+ c->setProperty(sit.currentKey(),*s);
+ ++sit;
+ }
+ ++it;
+ }
+}
+
+void KviRegisteredChannelDataBase::save(const QString &filename)
+{
+ KviConfigurationFile cfg(filename,KviConfigurationFile::Write);
+ cfg.clear();
+ cfg.preserveEmptyGroups(true);
+
+ for(QHash<QString,KviRegisteredChannelList *>::Iterator it = m_pChannelDict->begin();it != m_pChannelDict->end();++it)
+ {
+ KviRegisteredChannelList * l = it.value();
+ KVI_ASSERT(l);
+
+ for(KviRegisteredChannel * c = l->first();c;c = l->next())
+ {
+ QString szGroup = QString::fromUtf8("%1@%2").arg(c->name(),c->netMask());
+ cfg.setGroup(szGroup);
+
+ QHash<QString,QString> * pPropertyDict = c->propertyDict();
+ KVI_ASSERT(pPropertyDict);
+
+ for(QHash<QString,QString>::Iterator it2 = pPropertyDict->begin();it2 != pPropertyDict->end();++it2)
+ cfg.writeEntry(it2.key(),it2.value());
+ }
+ }
+}
+
+KviRegisteredChannel * KviRegisteredChannelDataBase::find(const QString &name,const QString &net)
+{
+ KviRegisteredChannelList * l = m_pChannelDict->value(name);
+
+ if(!l)
+ return 0;
+
+ for(KviRegisteredChannel * c = l->first();c;c = l->next())
+ {
+ if(KviQString::matchWildExpressions(c->netMask(),net))
+ return c;
+ }
+
+ return 0;
+}
+
+KviRegisteredChannel * KviRegisteredChannelDataBase::findExact(const QString &name,const QString &netmask)
+{
+ KviRegisteredChannelList * l = m_pChannelDict->value(name);
+
+ if(!l)
+ return 0;
+
+ for(KviRegisteredChannel * c = l->first();c;c = l->next())
+ {
+ if(KviQString::equalCI(c->netMask(),netmask))
+ return c;
+ }
+
+ return 0;
+}
+
+void KviRegisteredChannelDataBase::remove(KviRegisteredChannel * c)
+{
+ KVI_TRACE_FUNCTION;
+ KviRegisteredChannelList * l = m_pChannelDict->value(c->name());
+ if(!l)return;
+ for(KviRegisteredChannel * ch = l->first();ch;ch = l->next())
+ {
+ if(ch == c)
+ {
+ if(l->count() <= 1)
+ {
+ m_pChannelDict->remove(c->name());
+ delete l; // will kill the channel too
+ } else {
+ l->removeRef(c);
+ }
+ return;
+ }
+ }
+}
+
+
+void KviRegisteredChannelDataBase::add(KviRegisteredChannel * c)
+{
+ KviRegisteredChannel * old = findExact(c->name(),c->netMask());
+
+ if(old)
+ {
+ // merge properties
+ QHash<QString,QString> * pPropertyDict = old->propertyDict();
+ KVI_ASSERT(pPropertyDict);
+
+ for(QHash<QString,QString>::Iterator it = pPropertyDict->begin();it != pPropertyDict->end();++it)
+ {
+ if(!c->property(it.key()).isEmpty())
+ c->setProperty(it.key(),it.value());
+ }
+
+ remove(old);
+ }
+
+ KviRegisteredChannelList * l = m_pChannelDict->value(c->name());
+ if(!l)
+ {
+ l = new KviRegisteredChannelList();
+ l->setAutoDelete(true);
+ m_pChannelDict->insert(c->name(),l);
+ }
+
+ // insert where there are less wildcards
+ int o = c->netMask().count(QChar('*'));
+
+ int idx = 0;
+ for(KviRegisteredChannel * rc = l->first();rc;rc = l->next())
+ {
+ if(rc->netMask().count(QChar('*')) > o)
+ {
+ // the existing has more wildcards, insert here!
+ l->insert(idx,c);
+ return;
+ }
+ idx++;
+ }
+
+ l->append(c);
+}