2011-01-17 Yi Shen <yi.4.shen@nokia.com>
[WebKit-https.git] / Source / WebKit / qt / WebCoreSupport / QtPlatformPlugin.cpp
1 /*
2  * Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies)
3  *
4  * This library is free software; you can redistribute it and/or
5  * modify it under the terms of the GNU Library General Public
6  * License as published by the Free Software Foundation; either
7  * version 2 of the License, or (at your option) any later version.
8  *
9  * This library is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
12  * Library General Public License for more details.
13  *
14  * You should have received a copy of the GNU Library General Public License
15  * along with this library; see the file COPYING.LIB.  If not, write to
16  * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
17  * Boston, MA 02110-1301, USA.
18  *
19  */
20
21 #include "config.h"
22 #include "QtPlatformPlugin.h"
23
24 #include "qwebkitplatformplugin.h"
25
26 #include <QCoreApplication>
27 #include <QDir>
28 #include <QPluginLoader>
29
30 namespace WebCore {
31
32 bool QtPlatformPlugin::load(const QString& file)
33 {
34     m_loader.setFileName(file);
35     if (!m_loader.load())
36         return false;
37
38     QObject* obj = m_loader.instance();
39     if (obj) {
40         m_plugin = qobject_cast<QWebKitPlatformPlugin*>(obj);
41         if (m_plugin)
42             return true;
43     }
44
45     m_loader.unload();
46     return false;
47 }
48
49 bool QtPlatformPlugin::load()
50 {
51     const QLatin1String suffix("/webkit/");
52     const QStringList paths = QCoreApplication::libraryPaths();
53
54     for (int i = 0; i < paths.count(); ++i) {
55         const QDir dir(paths[i] + suffix);
56         if (!dir.exists())
57             continue;
58         const QStringList files = dir.entryList(QDir::Files);
59         for (int j = 0; j < files.count(); ++j) {
60             if (load(dir.absoluteFilePath(files.at(j))))
61                 return true;
62         }
63     }
64     return false;
65 }
66
67 QtPlatformPlugin::~QtPlatformPlugin()
68 {
69     m_loader.unload();
70 }
71
72 bool QtPlatformPlugin::loadStaticallyLinkedPlugin()
73 {
74     QObjectList objs = QPluginLoader::staticInstances();
75     for (int i = 0; i < objs.size(); ++i) {
76         m_plugin = qobject_cast<QWebKitPlatformPlugin*>(objs[i]);
77         if (m_plugin)
78             return true;
79     }
80     return false;
81 }
82
83 QWebKitPlatformPlugin* QtPlatformPlugin::plugin()
84 {
85     if (m_loaded)
86         return m_plugin;
87     m_loaded = true;
88
89     if (loadStaticallyLinkedPlugin())
90         return m_plugin;
91
92     // Plugin path is stored in a static variable to avoid searching for the plugin
93     // more then once.
94     static QString pluginPath;
95
96     if (pluginPath.isNull()) {
97         if (load())
98             pluginPath = m_loader.fileName();
99     } else
100         load(pluginPath);
101
102     return m_plugin;
103 }
104
105 QWebSelectMethod* QtPlatformPlugin::createSelectInputMethod()
106 {
107     QWebKitPlatformPlugin* p = plugin();
108     return p ? static_cast<QWebSelectMethod*>(p->createExtension(QWebKitPlatformPlugin::MultipleSelections)) : 0;
109 }
110
111
112 QWebNotificationPresenter* QtPlatformPlugin::createNotificationPresenter()
113 {
114     QWebKitPlatformPlugin* p = plugin();
115     return p ? static_cast<QWebNotificationPresenter*>(p->createExtension(QWebKitPlatformPlugin::Notifications)) : 0;
116 }
117
118 QWebHapticFeedbackPlayer* QtPlatformPlugin::createHapticFeedbackPlayer()
119 {
120     QWebKitPlatformPlugin* p = plugin();
121     return p ? static_cast<QWebHapticFeedbackPlayer*>(p->createExtension(QWebKitPlatformPlugin::Haptics)) : 0;
122 }
123
124 QWebTouchModifier* QtPlatformPlugin::createTouchModifier()
125 {
126     QWebKitPlatformPlugin* p = plugin();
127     return p ? static_cast<QWebTouchModifier*>(p->createExtension(QWebKitPlatformPlugin::TouchInteraction)) : 0;
128 }
129
130 #if ENABLE(VIDEO) && ENABLE(QT_MULTIMEDIA)
131 QWebFullScreenVideoHandler* QtPlatformPlugin::createFullScreenVideoHandler()
132 {
133     QWebKitPlatformPlugin* p = plugin();
134     return p ? static_cast<QWebFullScreenVideoHandler*>(p->createExtension(QWebKitPlatformPlugin::FullScreenVideoPlayer)) : 0;
135 }
136 #endif
137
138 }