Combine two ctors into one.
[grantlee:grantlee.git] / templates / lib / pluginpointer_p.h
1 /*
2   This file is part of the Grantlee template system.
3
4   Copyright (c) 2010 Stephen Kelly <steveire@gmail.com>
5
6   This library is free software; you can redistribute it and/or
7   modify it under the terms of the GNU Lesser General Public
8   License as published by the Free Software Foundation; either version
9   2.1 of the Licence, or (at your option) any later version.
10
11   This library is distributed in the hope that it will be useful,
12   but WITHOUT ANY WARRANTY; without even the implied warranty of
13   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14   Lesser General Public License for more details.
15
16   You should have received a copy of the GNU Lesser General Public
17   License along with this library.  If not, see <http://www.gnu.org/licenses/>.
18
19 */
20
21 #ifndef GRANTLEE_PLUGINPOINTER_H
22 #define GRANTLEE_PLUGINPOINTER_H
23
24 #include <QtCore/QPluginLoader>
25 #include <QtCore/QSharedPointer>
26
27 namespace Grantlee
28 {
29
30 void _deleter( QPluginLoader *loader )
31 {
32   loader->unload();
33   delete loader;
34 }
35
36 /**
37   @brief A smart pointer for handling plugins.
38
39   @author Stephen Kelly <steveire@gmail.com>
40 */
41 template <typename PluginType>
42 class PluginPointer
43 {
44   class _Dummy;
45 public:
46   // This allows returning 0 from a function returning a PluginType*
47   PluginPointer( _Dummy* = 0 )
48     : m_plugin( 0 )
49   {
50
51   }
52
53   PluginPointer( const QString &fileName )
54     : m_object( 0 ), m_plugin( 0 )
55   {
56     m_pluginLoader = QSharedPointer<QPluginLoader>( new QPluginLoader( fileName ), _deleter );
57
58     m_object = m_pluginLoader->instance();
59     if ( !m_object )
60       return;
61
62     m_plugin = qobject_cast<PluginType*>( m_object );
63   }
64
65   QString errorString() {
66     return m_pluginLoader->errorString();
67   }
68
69   QObject* object() {
70     return m_object;
71   }
72
73   PluginType* operator->() {
74     return m_plugin;
75   }
76
77   operator bool() {
78     return m_plugin ? true : false;
79   }
80
81   PluginType* data() const {
82     return m_plugin;
83   }
84
85 private:
86   QObject *m_object;
87   PluginType *m_plugin;
88   QSharedPointer<QPluginLoader> m_pluginLoader;
89 };
90
91 }
92
93 #endif