Subversion Repositories Scribus

Rev

Rev 1551 | Rev 1596 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
1549 subik 1
#include "pluginmanager.h"
1551 fschmid 2
#include "pluginmanager.moc"
1549 subik 3
#include <dlfcn.h>
4
#include <qdir.h>
5
#include "scribus.h"
6
#include "menumanager.h"
7
#include "scraction.h"
8
#include "splash.h"
9
#include "mpalette.h"
10
#include "tree.h"
1552 subik 11
#include "prefsfile.h"
1549 subik 12
 
13
extern ScribusApp *ScApp;
1552 subik 14
extern PrefsFile *prefsFile;
1549 subik 15
 
16
 
17
PluginManager::PluginManager()
18
{
19
        dllInput = "";
20
        dllReturn = "";
1552 subik 21
        prefs = prefsFile->getPluginContext("pluginmanager");
1549 subik 22
}
23
 
24
PluginManager::~PluginManager()
25
{
26
}
27
 
28
void PluginManager::initPlugs()
29
{
1552 subik 30
        QString name = "";
1549 subik 31
        int id = 0;
1552 subik 32
//      int type = 0;
33
//      int menuid = 0;
1549 subik 34
        struct PluginData pda;
35
#if defined(__hpux)
1552 subik 36
        QDir dirList(PLUGINDIR, "*.sl*", QDir::Name, QDir::Files | QDir::Executable | QDir::NoSymLinks);
1549 subik 37
#else
1552 subik 38
        QDir dirList(PLUGINDIR, "*.so*", QDir::Name, QDir::Files | QDir::Executable | QDir::NoSymLinks);
1549 subik 39
#endif
1552 subik 40
        if ((dirList.exists()) && (dirList.count() != 0))
1549 subik 41
        {
42
                ScApp->scrMenuMgr->addMenuSeparator("Extras");
1552 subik 43
                for (uint dc = 0; dc < dirList.count(); ++dc)
1549 subik 44
                {
1552 subik 45
                        pda.index = 0;
46
                        pda.pluginFile = "";
47
                        //pda.name = "";
48
                        //pda.type = 0;
49
                        pda.menuID = 0;
50
                        pda.pluginFile = dirList[dc];
51
                        pda.loadPlugin = prefs->getBool(dirList[dc], true);
52
 
53
                        if (DLLname(dirList[dc], &pda.name, &pda.type, &pda.index, &id, &pda.actName, &pda.actKeySequence, &pda.actMenu, &pda.actMenuAfterName, &pda.actEnabledOnStartup, pda.loadPlugin))
1549 subik 54
                        {
1552 subik 55
                                if (pda.loadPlugin)
1549 subik 56
                                {
1552 subik 57
                                        if (pda.type == Persistent || pda.type == Standard || pda.type == Import)
58
                                        {
59
                                                //Add in ScrAction based plugin linkage
60
                                                //Insert DLL Action into Dictionary with values from plugin interface
61
                                                ScApp->scrActions.insert(pda.actName, new ScrAction(ScrAction::DLL, QIconSet(), pda.name, QKeySequence(pda.actKeySequence), ScApp, pda.actName, id));
1549 subik 62
 
1552 subik 63
                                                if (ScApp->scrActions[pda.actName])
64
                                                {
65
                                                        ScApp->scrActions[pda.actName]->setEnabled(pda.actEnabledOnStartup);
66
                                                        //Connect DLL Action's activated signal with ID to Scribus DLL loader
67
                                                        connect( ScApp->scrActions[pda.actName], SIGNAL(activatedData(int)) , ScApp->pluginManager, SLOT(callDLLBySlot(int)) );
68
                                                        //Get the menu manager to add the DLL's menu item to the right menu, after the chosen existing item
69
                                                        if (QString(pda.actMenuAfterName).length()==0)
70
                                                                ScApp->scrMenuMgr->addMenuItem(ScApp->scrActions[pda.actName], pda.actMenu);
71
                                                        else
72
                                                                ScApp->scrMenuMgr->addMenuItemAfter(ScApp->scrActions[pda.actName], pda.actMenu, pda.actMenuAfterName);
73
                                                }
1549 subik 74
                                        }
1552 subik 75
                                        else
76
                                                qDebug(tr(QString("Old type plugins are not supported anymore")), "plugin manager");
77
                                } // load
1549 subik 78
                                pluginMap.insert(id, pda);
79
                                if (ScApp->splashScreen != NULL)
1552 subik 80
                                        ScApp->splashScreen->setStatus(tr(QString("Loading: %1").arg(pda.name), "plugin manager"));
1549 subik 81
                        }
82
                }
83
        }
84
}
85
 
86
void PluginManager::callDLLBySlot(int pluginID)
87
{
88
        //Run old type 2 Import pre call code
1552 subik 89
        if (pluginMap[pluginID].type == 7)
1549 subik 90
        {
91
                if (ScApp->HaveDoc)
92
                        ScApp->doc->OpenNodes = ScApp->outlinePalette->buildReopenVals();
93
        }
94
 
95
        callDLL(pluginID);
96
 
97
        //Run old type 2 Import post call code
1552 subik 98
        if (pluginMap[pluginID].type == 7)
1549 subik 99
        {
100
                if (ScApp->HaveDoc)
101
                {
102
                        ScApp->outlinePalette->BuildTree(ScApp->doc);
103
                        ScApp->outlinePalette->reopenTree(ScApp->doc->OpenNodes);
104
                        ScApp->propertiesPalette->updateCList();
105
                }
106
        }
107
}
108
 
109
void PluginManager::callDLL(int pluginID)
110
{
111
        void *mo;
112
        const char *error;
113
        struct PluginData pda;
114
        pda = pluginMap[pluginID];
115
        typedef void (*sdem)(QWidget *d, ScribusApp *plug);
116
        sdem demo;
117
        QString plugDir = PLUGINDIR;
1552 subik 118
        if (pda.type != 4 && pda.type !=5)
1549 subik 119
        {
1552 subik 120
                plugDir += pda.pluginFile;
1549 subik 121
                mo = dlopen(plugDir, RTLD_LAZY | RTLD_GLOBAL);
122
                if (!mo)
123
                {
1552 subik 124
                        qDebug(tr("Can't find Plug-in"), "plugin manager");
1549 subik 125
                        return;
126
                }
127
        }
128
        else
1552 subik 129
                mo = pda.index;
1549 subik 130
        dlerror();
1552 subik 131
        demo = (sdem)dlsym(mo, "run");
1549 subik 132
        if ((error = dlerror()) != NULL)
133
        {
1552 subik 134
                qDebug(tr(QString("Can't find Symbol (%1)").arg(error)), "plugin manager");
1549 subik 135
                dlclose(mo);
136
                return;
137
        }
138
        (*demo)(ScApp, ScApp);
139
        // FIXME: how is the menu organized? (*demo)(ScApp->scrActions[pluginMap[pluginID].actName], ScApp);
1552 subik 140
        if (pda.type != 4 && pda.type != 5)
1549 subik 141
                dlclose(mo);
142
        if (ScApp->HaveDoc)
143
                ScApp->view->DrawNew();
144
}
145
 
146
bool PluginManager::DLLexists(int pluginID)
147
{
148
        return pluginMap.contains(pluginID);
149
}
150
 
151
// used anywhere?
152
void PluginManager::callDLLbyMenu(int pluginID)
153
{
154
        QMap<int, PluginData>::Iterator it;
155
        struct PluginData pda;
156
        for (it = pluginMap.begin(); it != pluginMap.end(); ++it)
157
        {
1552 subik 158
                if (it.data().menuID == pluginID)
1549 subik 159
                {
160
                        callDLL(it.key());
161
                        break;
162
                }
163
        }
164
}
165
 
1552 subik 166
bool PluginManager::DLLname(QString name, QString *pluginName, PluginType *type, void **index, int *idNr, QString *actName, QString *actKeySequence, QString *actMenu, QString *actMenuAfterName, bool *actEnabledOnStartup, bool loadPlugin)
1549 subik 167
{
168
        void *mo;
169
        const char *error;
170
        typedef QString (*sdem0)();
1552 subik 171
        typedef PluginType (*sdem1)();
1549 subik 172
        typedef void (*sdem2)(QWidget *d, ScribusApp *plug);
173
        typedef bool (*sdem3)();
1552 subik 174
        typedef int (*sdemID)();
1549 subik 175
        sdem0 demo;
176
        sdem1 demo1;
177
        sdem2 demo2;
178
        sdem3 demo3;
1552 subik 179
        sdemID plugID;
1549 subik 180
        QString plugName = PLUGINDIR;
181
        plugName += name;
182
        mo = dlopen(plugName, RTLD_LAZY | RTLD_GLOBAL);
183
        if (!mo)
184
        {
1552 subik 185
                qDebug(tr(QString("Error: %1").arg(dlerror())), "plugin manager");
1549 subik 186
                return false;
187
        }
188
        dlerror();
1552 subik 189
        demo = (sdem0)dlsym(mo, "name");
1549 subik 190
        if ((error = dlerror()) != NULL)
191
        {
192
                dlclose(mo);
193
                return false;
194
        }
1552 subik 195
        *pluginName = (*demo)();
1549 subik 196
        dlerror();
1552 subik 197
        demo1 = (sdem1)dlsym(mo, "type");
1549 subik 198
        if ((error = dlerror()) != NULL)
199
        {
200
                dlclose(mo);
201
                return false;
202
        }
1552 subik 203
        *type = (*demo1)();
204
        *index = mo;
205
        plugID = (sdemID)dlsym(mo, "ID");
1549 subik 206
        if ((error = dlerror()) != NULL)
207
        {
208
                dlclose(mo);
209
                return false;
210
        }
1552 subik 211
        *idNr = (*plugID)();
1549 subik 212
        //ScrAction based plugins
1552 subik 213
        if (*type == Persistent || *type == Standard || *type == Import)
1549 subik 214
        {
215
                demo = (sdem0)dlsym(mo, "actionName");
216
                if ((error = dlerror()) != NULL)
217
                {
218
                        dlclose(mo);
219
                        return false;
220
                }
221
                *actName = (*demo)();
222
                dlerror();
223
                demo = (sdem0)dlsym(mo, "actionKeySequence");
224
                if ((error = dlerror()) != NULL)
225
                {
226
                        dlclose(mo);
227
                        return false;
228
                }
229
                *actKeySequence = (*demo)();
230
                dlerror();
231
                demo = (sdem0)dlsym(mo, "actionMenu");
232
                if ((error = dlerror()) != NULL)
233
                {
234
                        dlclose(mo);
235
                        return false;
236
                }
237
                *actMenu = (*demo)();
238
                dlerror();
239
                demo = (sdem0)dlsym(mo, "actionMenuAfterName");
240
                if ((error = dlerror()) != NULL)
241
                {
242
                        dlclose(mo);
243
                        return false;
244
                }
245
                *actMenuAfterName = (*demo)();
246
                dlerror();
247
                demo3 = (sdem3)dlsym(mo, "actionEnabledOnStartup");
248
                if ((error = dlerror()) != NULL)
249
                {
250
                        dlclose(mo);
251
                        return false;
252
                }
253
                *actEnabledOnStartup = (*demo3)();
254
        }
255
        else
256
        {
257
                *actName = QString::null;
258
                *actKeySequence = QString::null;
259
                *actMenu = QString::null;
260
                *actMenuAfterName = QString::null;
261
                *actEnabledOnStartup = false;
262
        }
1552 subik 263
        if (*type != Persistent && *type!= Type5)
1549 subik 264
                dlclose(mo);
265
        else
266
        {
267
                dlerror();
1552 subik 268
                demo2 = (sdem2)dlsym(mo, "initPlug");
1549 subik 269
                if ((error = dlerror()) != NULL)
270
                {
271
                        dlclose(mo);
272
                        return false;
273
                }
274
                (*demo2)(ScApp, ScApp);
275
                // FIXME: how is the menu organized? (*demo2)(ScApp->scrActions[pluginMap[idNr]], ScApp);
276
        }
277
 
1552 subik 278
        if (!loadPlugin || loadPlugin != 1)
279
                finalizePlug((int)plugID);
280
 
1549 subik 281
        return true;
282
}
283
 
284
void PluginManager::finalizePlugs()
285
{
1552 subik 286
        for (QMap<int, PluginData>::Iterator it = pluginMap.begin(); it != pluginMap.end(); ++it)
287
                finalizePlug(it.key());
288
}
289
 
290
void PluginManager::finalizePlug(int pluginID)
291
{
1549 subik 292
        const char *error;
293
        struct PluginData pda;
294
        typedef void (*sdem2)();
295
        sdem2 demo2;
1552 subik 296
        PluginData plug = pluginMap[pluginID];
297
        if (plug.type == Persistent || plug.type == Type5)
1549 subik 298
        {
1552 subik 299
                dlerror();
300
                demo2 = (sdem2)dlsym(plug.index, "cleanUpPlug");
301
                if ((error = dlerror()) != NULL)
1549 subik 302
                {
1552 subik 303
                        dlclose(plug.index);
1549 subik 304
                }
1552 subik 305
                else
306
                        (*demo2)();
1549 subik 307
        }
308
}
1552 subik 309
 
310
QString PluginManager::getPluginType(PluginType aType)
311
{
312
        switch(aType)
313
        {
314
                case Persistent:
315
                        return tr("Persistent", "plugin manager");
316
                        break;
317
                case Import:
318
                        return tr("Import", "plugin manager");
319
                        break;
320
                case Standard:
321
                        return tr("Standard", "plugin manager");
322
                        break;
323
                default:
324
                        return tr("Unknown", "plugin manager");
325
        }
326
}