summaryrefslogtreecommitdiffstats
path: root/src/kvilib/ext/kvi_regchan.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/kvilib/ext/kvi_regchan.cpp')
-rw-r--r--src/kvilib/ext/kvi_regchan.cpp181
1 files changed, 181 insertions, 0 deletions
diff --git a/src/kvilib/ext/kvi_regchan.cpp b/src/kvilib/ext/kvi_regchan.cpp
new file mode 100644
index 00000000..a26c5969
--- /dev/null
+++ b/src/kvilib/ext/kvi_regchan.cpp
@@ -0,0 +1,181 @@
+//=============================================================================
+//
+// File : kvi_regchan.cpp
+// Creation date : Sat Jun 29 01:01:16 2002 GMT by Szymon Stefanek
+//
+// This file is part of the KVirc irc client distribution
+// Copyright (C) 2001-2007 Szymon Stefanek (pragma at kvirc dot net)
+//
+// 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.
+//
+//=============================================================================
+
+#define __KVILIB__
+
+#include "kvi_regchan.h"
+#include "kvi_config.h"
+#include "kvi_qstring.h"
+
+KviRegisteredChannel::KviRegisteredChannel(const KviStr &name,const KviStr &netmask)
+{
+ m_szName = name;
+ m_szNetMask = netmask;
+ m_pPropertyDict = new KviPointerHashTable<const char *,KviStr>(7,false,true);
+ m_pPropertyDict->setAutoDelete(true);
+}
+
+KviRegisteredChannel::~KviRegisteredChannel()
+{
+ delete m_pPropertyDict;
+}
+
+
+
+KviRegisteredChannelDataBase::KviRegisteredChannelDataBase()
+{
+ m_pChannelDict = new KviPointerHashTable<const char *,KviRegisteredChannelList>(17,false,true);
+ m_pChannelDict->setAutoDelete(true);
+}
+
+KviRegisteredChannelDataBase::~KviRegisteredChannelDataBase()
+{
+ delete m_pChannelDict;
+}
+
+void KviRegisteredChannelDataBase::load(const char * filename)
+{
+ KviConfig cfg(filename,KviConfig::Read);
+ m_pChannelDict->clear();
+ KviConfigIterator it(*(cfg.dict()));
+ while(KviConfigGroup * d = it.current())
+ {
+ KviStr szMask = it.currentKey();
+ KviStr szChan = szMask.leftToLast('@');
+ szMask.cutToLast('@');
+ KviRegisteredChannel * c = new KviRegisteredChannel(szChan,szMask);
+ add(c);
+ KviConfigGroupIterator sit(*d);
+ while(QString * s = sit.current())
+ {
+ c->setProperty(KviQString::toUtf8(sit.currentKey()).data(),new KviStr(*s));
+ ++sit;
+ }
+ ++it;
+ }
+}
+
+void KviRegisteredChannelDataBase::save(const char * filename)
+{
+ KviConfig cfg(filename,KviConfig::Write);
+ cfg.clear();
+
+ KviPointerHashTableIterator<const char *,KviRegisteredChannelList> it(*m_pChannelDict);
+ while(KviRegisteredChannelList * l = it.current())
+ {
+ for(KviRegisteredChannel * c = l->first();c;c = l->next())
+ {
+ KviStr szGrp(KviStr::Format,"%s@%s",c->name().ptr(),c->netMask().ptr());
+ cfg.setGroup(szGrp.ptr());
+ KviPointerHashTableIterator<const char *,KviStr> pit(*(c->propertyDict()));
+ while(KviStr * s = pit.current())
+ {
+ cfg.writeEntry(pit.currentKey(),s->ptr());
+ ++pit;
+ }
+ }
+ ++it;
+ }
+}
+
+KviRegisteredChannel * KviRegisteredChannelDataBase::find(const char * name,const char * net)
+{
+ KviRegisteredChannelList * l = m_pChannelDict->find(name);
+ if(!l)return 0;
+ for(KviRegisteredChannel * c = l->first();c;c = l->next())
+ {
+ if(kvi_matchString(c->netMask().ptr(),net))return c;
+ }
+
+ return 0;
+}
+
+KviRegisteredChannel * KviRegisteredChannelDataBase::findExact(const char * name,const char * netmask)
+{
+ KviRegisteredChannelList * l = m_pChannelDict->find(name);
+ if(!l)return 0;
+ for(KviRegisteredChannel * c = l->first();c;c = l->next())
+ {
+ if(kvi_strEqualCI(c->netMask().ptr(),netmask))return c;
+ }
+ return 0;
+}
+
+void KviRegisteredChannelDataBase::remove(KviRegisteredChannel * c)
+{
+ KviRegisteredChannelList * l = m_pChannelDict->find(c->name().ptr());
+ if(!l)return;
+ for(KviRegisteredChannel * ch = l->first();ch;ch = l->next())
+ {
+ if(ch == c)
+ {
+ if(l->count() <= 1)
+ {
+ m_pChannelDict->remove(c->name().ptr());
+ } else {
+ l->removeRef(c);
+ }
+ return;
+ }
+ }
+}
+
+
+void KviRegisteredChannelDataBase::add(KviRegisteredChannel * c)
+{
+ KviRegisteredChannel * old = findExact(c->name().ptr(),c->netMask().ptr());
+ if(old)
+ {
+ KviPointerHashTableIterator<const char *,KviStr> pit(*(old->propertyDict()));
+ while(KviStr *s = pit.current())
+ {
+ if(!c->property(pit.currentKey()))
+ c->setProperty(pit.currentKey(),new KviStr(*s));
+ ++pit;
+ }
+ remove(old);
+ }
+ KviRegisteredChannelList * l = m_pChannelDict->find(c->name().ptr());
+ if(!l)
+ {
+ l = new KviRegisteredChannelList;
+ l->setAutoDelete(true);
+ m_pChannelDict->insert(c->name().ptr(),l);
+ }
+ // insert where there are less wildcards
+ int o = c->netMask().occurences('*');
+ int idx = 0;
+ for(KviRegisteredChannel * rc = l->first();rc;rc = l->next())
+ {
+ if(rc->netMask().occurences('*') > o)
+ {
+ // the existing has more wildcards , insert here!
+ l->insert(idx,c);
+ return;
+ }
+ idx++;
+ }
+ l->append(c);
+}
+