summaryrefslogtreecommitdiffstats
path: root/ksim/library/pluginloader.h
blob: f101973b854e5b66bb5e8b6d100b9387ff42492c (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
/*  ksim - a system monitor for kde
 *
 *  Copyright (C) 2001  Robbie Ward <linuxphreak@gmx.co.uk>
 *
 *  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 option) 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.
 */

#ifndef PLUGINLOADER_H
#define PLUGINLOADER_H

#include "pluginglobal.h"
#include <qobject.h>

#include <kdemacros.h>

namespace KSim
{
  class KDE_EXPORT PluginInfo
  {
    friend class PluginLoader;
    public:
      ~PluginInfo();

      /**
       * @return the name of the plugin
       */
      const QString &name() const;
      /**
       * @return the library name of the plugin
       */
      QCString libName(bool includePrefix = false) const;
      /**
       * @return the location of the desktop file
       */
      const QString &location() const;

    private:
      PluginInfo();

      QString m_name;
      QString m_location;
      QCString m_libName;

      class Private;
      Private *d;
  };

  /**
   * Provides a loader for the plugins
   * @author Robbie Ward <linuxphreak@gmx.co.uk>
   */
  class KDE_EXPORT PluginLoader : public QObject
  {
    Q_OBJECT
    friend class MainView;
    public:
      enum SearchType { Name = 0, DesktopFile, LibName };
      enum ErrorCode { EmptyLibName = -3, LibNotFound = -2,
          UnSymbols = -1, LibLoaded = 0 };

      /**
       * @return a reference to the instance
       */
      static PluginLoader &self();
      /**
       * loads a plugin, example:
       * <pre>
       *   KDesktopFile deskfile("/home/user/foo.desktop");
       *   KSim::PluginLoader::self().loadPlugin(deskFile);
       * </pre>
       * you can then use @ref pluginList() to access the plugin, view,
       * config page and plugin information
       * @param file is the desktop file of the lib
       * @return true if the plugin is successfully loaded
       */
      bool loadPlugin(const KDesktopFile &file);
      /**
       * unloads a loaded plugin and removes plugin entries from pluginList()
       */
      bool unloadPlugin(const QCString &name);
      /**
       * unloads all loaded plugins
       */
      void unloadAllPlugins();
      /**
       * convenience function
       *
       * returns true if info is loaded
       */
      bool isLoaded(const KSim::Plugin &info) const;
      /**
       * returns true if library is loaded
       */
      bool isLoaded(const QCString &library) const;
      /**
       * finds the plugins desktopfile and returns information
       * on the plugin
       * @return a KSim::PluginInfo object
       * @see KSim::PluginInfo
       */
      KSim::PluginInfo findPluginInfo(const QString &name,
         SearchType type = DesktopFile) const;
      /**
       * looks through the list of loaded plugins and returns
       * the one that matches libName, or returns
       * KSim::Plugin::null if a plugin could not be found.
       *
       * if libName does not start with "ksim_" then the function
       * will prepend this automatically.
       * @return a KSim::Plugin object
       * @see KSim::Plugin
       */
      KSim::Plugin &find(const QCString &libName);
      /**
       * convenience function, see the above function for details.
       */
      const KSim::Plugin &find(const QCString &libName) const;
      /**
       * equivalent to find(info.libName());
       */
      KSim::Plugin &find(const KSim::PluginInfo &info);
      /**
       * convenience function, see the above function for details.
       */
      const KSim::Plugin &find(const KSim::PluginInfo &info) const;
      /**
       * provides plugin(), view(), config page and plugin information
       * @see KSim::Plugin KSim::PluginList
       */
      const KSim::PluginList &pluginList() const;
      /**
       * Overloaded member function, This behaves essentially like
       * the above function
       */
      KSim::PluginList &pluginList();
      /**
       * @return a reference to the last plugin loaded (or a null plugin
       * if the plugin was unable to load)
       */
      const KSim::Plugin &plugin() const;
      /**
       * Overloaded member function, This behaves essentially like
       * the above function
       */
      KSim::Plugin &plugin();

    signals:
      void pluginLoaded(const KSim::Plugin &);

    protected:
      /**
       * constructor for PluginLoader, use self() to get an instance
       */
      PluginLoader();
      ~PluginLoader();

    private:
      PluginLoader(const PluginLoader &);
      PluginLoader &operator=(const PluginLoader &);
      /**
       * Deletes the instance and cleans up after itself
       */
      static void cleanup();
      ErrorCode createPlugin(const KDesktopFile &file);

      class Private;
      Private *d;
      static PluginLoader *m_instance;
  };
}
#endif