1
//=============================================================================
3
// File : kvi_moduleextension.cpp
4
// Creation date : Tue Sep 10 01:16:25 2002 GMT by Szymon Stefanek
6
// This file is part of the KVirc irc client distribution
7
// Copyright (C) 2002-2008 Szymon Stefanek (pragma at kvirc dot net)
9
// This program is FREE software. You can redistribute it and/or
10
// modify it under the terms of the GNU General Public License
11
// as published by the Free Software Foundation; either version 2
12
// of the License, or (at your opinion) any later version.
14
// This program is distributed in the HOPE that it will be USEFUL,
15
// but WITHOUT ANY WARRANTY; without even the implied warranty of
16
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
17
// See the GNU General Public License for more details.
19
// You should have received a copy of the GNU General Public License
20
// along with this program. If not, write to the Free Software Foundation,
21
// Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
23
//=============================================================================
25
#define _KVI_MODULEEXTENSION_CPP_
27
#include "kvi_moduleextension.h"
28
#include "kvi_module.h"
29
#include "kvi_modulemanager.h"
32
// created and destroyed in kvi_app.cpp
33
KVIRC_API KviModuleExtensionManager * g_pModuleExtensionManager = 0;
36
KviModuleExtensionDescriptor::KviModuleExtensionDescriptor(KviModule * m,const KviStr &szType,const KviStr &szName,const QString &szVisibleName,KviModuleExtensionAllocRoutine r,const QPixmap &pix)
38
m_iId = KviApp::getGloballyUniqueId();
43
m_szVisibleName = szVisibleName;
45
m_pObjectList = new KviPointerList<KviModuleExtension>;
46
m_pObjectList->setAutoDelete(false);
47
if(pix.isNull())m_pIcon = 0;
48
else m_pIcon = new QPixmap(pix);
51
KviModuleExtensionDescriptor::~KviModuleExtensionDescriptor()
53
while(KviModuleExtension * e = m_pObjectList->first())e->die();
55
if(m_pIcon)delete m_pIcon;
58
void KviModuleExtensionDescriptor::setIcon(const QPixmap &pix)
60
if(m_pIcon)delete m_pIcon;
61
if(pix.isNull())m_pIcon = 0;
62
else m_pIcon = new QPixmap(pix);
65
KviModuleExtension * KviModuleExtensionDescriptor::allocate(KviWindow * pWnd,KviPointerHashTable<QString,QVariant> * pParams,void * pSpecial)
67
KviModuleExtensionAllocStruct s;
71
s.pSpecial = pSpecial;
72
return m_allocRoutine(&s);
76
void KviModuleExtensionDescriptor::registerObject(KviModuleExtension * e)
78
m_pObjectList->append(e);
81
void KviModuleExtensionDescriptor::unregisterObject(KviModuleExtension * e)
83
m_pObjectList->removeRef(e);
87
KviModuleExtensionManager::KviModuleExtensionManager()
89
m_pExtensionDict = new KviPointerHashTable<const char *,KviModuleExtensionDescriptorList>(17,false);
90
m_pExtensionDict->setAutoDelete(true);
93
KviModuleExtensionManager::~KviModuleExtensionManager()
95
delete m_pExtensionDict;
98
KviModuleExtensionDescriptorList * KviModuleExtensionManager::getExtensionList(const KviStr &szType)
100
g_pModuleManager->loadModulesByCaps(szType.ptr());
101
return m_pExtensionDict->find(szType.ptr());
104
KviModuleExtensionDescriptor * KviModuleExtensionManager::registerExtension(KviModule * m,const KviStr &szType,const KviStr &szName,const QString &szVisibleName,KviModuleExtensionAllocRoutine r,const QPixmap &icon)
106
KviModuleExtensionDescriptor * d = new KviModuleExtensionDescriptor(m,szType,szName,szVisibleName,r,icon);
107
KviModuleExtensionDescriptorList * l = m_pExtensionDict->find(szType.ptr());
110
l = new KviModuleExtensionDescriptorList();
111
l->setAutoDelete(false);
112
m_pExtensionDict->insert(szType.ptr(),l);
118
void KviModuleExtensionManager::unregisterExtensionsByModule(KviModule * m)
120
KviPointerHashTableIterator<const char *,KviModuleExtensionDescriptorList> it(*m_pExtensionDict);
121
KviPointerList<KviStr> dying;
122
dying.setAutoDelete(true);
123
while(KviModuleExtensionDescriptorList * l = it.current())
125
KviPointerList<KviModuleExtensionDescriptor> dying2;
126
dying2.setAutoDelete(true);
128
for(KviModuleExtensionDescriptor * d = l->first();d;d = l->next())
130
if(d->module() == m)dying2.append(d);
133
for(KviModuleExtensionDescriptor * de = dying2.first();de;de = dying2.next())
138
if(l->isEmpty())dying.append(new KviStr(it.currentKey()));
141
for(KviStr * li = dying.first();li;li = dying.next())
143
m_pExtensionDict->remove(li->ptr());
147
KviModuleExtensionDescriptorList * KviModuleExtensionManager::allocateExtensionGetDescriptorList(const KviStr &szType,const QString &preloadModule)
149
if(!preloadModule.isEmpty())
151
KviModule * m = g_pModuleManager->getModule(preloadModule);
152
(void)m; // get rid of the unused warning :D
155
KviModuleExtensionDescriptorList * l = m_pExtensionDict->find(szType.ptr());
158
// retry : it might have been unloaded
159
g_pModuleManager->loadModulesByCaps(szType.ptr());
160
l = m_pExtensionDict->find(szType.ptr());
166
KviModuleExtensionDescriptor * KviModuleExtensionManager::findExtensionDescriptor(const KviStr &szType,const KviStr &szName)
168
KviModuleExtensionDescriptorList * l = m_pExtensionDict->find(szType.ptr());
171
for(KviModuleExtensionDescriptor * d = l->first();d;d = l->next())
173
if(d->name().equalsCI(szName))return d;
179
KviModuleExtension * KviModuleExtensionManager::allocateExtension(const KviStr &szType,const KviStr &szName,KviWindow * pWnd,KviPointerHashTable<QString,QVariant> * pParams,void * pSpecial,const QString &preloadModule)
181
KviModuleExtensionDescriptorList * l = allocateExtensionGetDescriptorList(szType,preloadModule);
184
KviModuleExtensionDescriptor * d;
186
for(d = l->first();d;d = l->next())
188
if(d->name().equalsCI(szName))return d->allocate(pWnd,pParams,pSpecial);
191
// uhm... not there ?
192
g_pModuleManager->loadModulesByCaps(szType.ptr());
193
// try again after loading the modules
194
// l = m_pExtensionDict->find(szType.ptr()); <--- this shouldn't change!
195
for(d = l->first();d;d = l->next())
197
if(d->name().equalsCI(szName))return d->allocate(pWnd,pParams,pSpecial);
200
// no way : no such extension
206
KviModuleExtension * KviModuleExtensionManager::allocateExtension(const KviStr &szType,int id,KviWindow * pWnd,KviPointerHashTable<QString,QVariant> * pParams,void * pSpecial,const QString &preloadModule)
208
KviModuleExtensionDescriptorList * l = allocateExtensionGetDescriptorList(szType,preloadModule);
211
KviModuleExtensionDescriptor * d;
212
for(d = l->first();d;d = l->next())
214
if(d->id() == id)return d->allocate(pWnd,pParams,pSpecial);
217
// uhm... not there ?
218
g_pModuleManager->loadModulesByCaps(szType.ptr());
219
// try again after loading the modules
220
// l = m_pExtensionDict->find(szType.ptr()); <--- this shouldn't change!
221
for(d = l->first();d;d = l->next())
223
if(d->id() == id)return d->allocate(pWnd,pParams,pSpecial);
225
// no way : no such extension
231
KviModuleExtension::KviModuleExtension(KviModuleExtensionDescriptor * d)
235
m_pDescriptor->registerObject(this);
238
KviModuleExtension::~KviModuleExtension()
240
m_pDescriptor->unregisterObject(this);