WebCore:
[WebKit-https.git] / WebCore / plugins / gtk / PluginPackageGtk.cpp
1 /*
2  * Copyright (C) 2006, 2007 Apple Inc.  All rights reserved.
3  * Copyright (C) 2008 Collabora Ltd. All rights reserved.
4  * Copyright (C) 2008 Nuanti Ltd.
5  * Copyright (C) 2008 Novell Inc. All rights reserved.
6  *
7  * Redistribution and use in source and binary forms, with or without
8  * modification, are permitted provided that the following conditions
9  * are met:
10  * 1. Redistributions of source code must retain the above copyright
11  *    notice, this list of conditions and the following disclaimer.
12  * 2. Redistributions in binary form must reproduce the above copyright
13  *    notice, this list of conditions and the following disclaimer in the
14  *    documentation and/or other materials provided with the distribution.
15  *
16  * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
17  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
18  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
19  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE COMPUTER, INC. OR
20  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
21  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
22  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
23  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
24  * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
26  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
27  */
28
29 #include "config.h"
30 #include "PluginPackage.h"
31
32 #include <gio/gio.h>
33 #include <stdio.h>
34
35 #include "CString.h"
36 #include "GOwnPtr.h"
37 #include "MIMETypeRegistry.h"
38 #include "NotImplemented.h"
39 #include "npruntime_impl.h"
40 #include "PluginDebug.h"
41
42 namespace WebCore {
43
44 bool PluginPackage::fetchInfo()
45 {
46 #if defined(XP_UNIX)
47     if (!load())
48         return false;
49
50     NP_GetMIMEDescriptionFuncPtr NP_GetMIMEDescription = 0;
51     NPP_GetValueProcPtr NPP_GetValue = 0;
52
53     g_module_symbol(m_module, "NP_GetMIMEDescription", (void**)&NP_GetMIMEDescription);
54     g_module_symbol(m_module, "NP_GetValue", (void**)&NPP_GetValue);
55
56     if (!NP_GetMIMEDescription || !NPP_GetValue)
57         return false;
58
59     char* buffer = 0;
60     NPError err = NPP_GetValue(0, NPPVpluginNameString, &buffer);
61     if (err == NPERR_NO_ERROR)
62         m_name = buffer;
63
64     buffer = 0;
65     err = NPP_GetValue(0, NPPVpluginDescriptionString, &buffer);
66     if (err == NPERR_NO_ERROR) {
67         m_description = buffer;
68         determineModuleVersionFromDescription();
69     }
70
71     const gchar* types = NP_GetMIMEDescription();
72     gchar** mimeDescs = g_strsplit(types, ";", -1);
73     for (int i = 0; mimeDescs[i] && mimeDescs[i][0]; i++) {
74         gchar** mimeData = g_strsplit(mimeDescs[i], ":", 3);
75         if (g_strv_length(mimeData) < 3) {
76             g_strfreev(mimeData);
77             continue;
78         }
79
80         String description = String::fromUTF8(mimeData[2]);
81         gchar** extensions = g_strsplit(mimeData[1], ",", -1);
82
83         Vector<String> extVector;
84         for (int j = 0; extensions[j]; j++)
85             extVector.append(String::fromUTF8(extensions[j]));
86
87         determineQuirks(mimeData[0]);
88         m_mimeToExtensions.add(mimeData[0], extVector);
89         m_mimeToDescriptions.add(mimeData[0], description);
90
91         g_strfreev(extensions);
92         g_strfreev(mimeData);
93     }
94     g_strfreev(mimeDescs);
95
96     return true;
97 #else
98     notImplemented();
99     return false;
100 #endif
101 }
102
103 bool PluginPackage::load()
104 {
105     if (m_isLoaded) {
106         m_loadCount++;
107         return true;
108     }
109
110     GOwnPtr<gchar> finalPath(g_strdup(m_path.utf8().data()));
111     while (g_file_test(finalPath.get(), G_FILE_TEST_IS_SYMLINK)) {
112         GOwnPtr<GFile> file(g_file_new_for_path(finalPath.get()));
113         GOwnPtr<gchar> linkPath(g_file_read_link(finalPath.get(), 0));
114
115         GOwnPtr<GFile> resolvedFile(g_file_resolve_relative_path(file.get(), linkPath.get()));
116         finalPath.set(g_file_get_path(resolvedFile.get()));
117     }
118
119     m_module = g_module_open(finalPath.get(), G_MODULE_BIND_LOCAL);
120
121     if (!m_module) {
122         LOG(Plugins,"Module Load Failed :%s, Error:%s\n", (m_path.utf8()).data(), g_module_error());
123         return false;
124     }
125
126     m_isLoaded = true;
127
128     NP_InitializeFuncPtr NP_Initialize = 0;
129     m_NPP_Shutdown = 0;
130
131     NPError npErr;
132
133     g_module_symbol(m_module, "NP_Initialize", (void**)&NP_Initialize);
134     g_module_symbol(m_module, "NP_Shutdown", (void**)&m_NPP_Shutdown);
135
136     if (!NP_Initialize || !m_NPP_Shutdown)
137         goto abort;
138
139     memset(&m_pluginFuncs, 0, sizeof(m_pluginFuncs));
140     m_pluginFuncs.size = sizeof(m_pluginFuncs);
141
142     initializeBrowserFuncs();
143
144 #if defined(XP_UNIX)
145     npErr = NP_Initialize(&m_browserFuncs, &m_pluginFuncs);
146 #else
147     npErr = NP_Initialize(&m_browserFuncs);
148 #endif
149     if (npErr != NPERR_NO_ERROR)
150         goto abort;
151
152     m_loadCount++;
153     return true;
154
155 abort:
156     unloadWithoutShutdown();
157     return false;
158 }
159
160 }