Branch data Line data Source code
1 : : /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2 : : /*
3 : : * This file is part of the LibreOffice project.
4 : : *
5 : : * This Source Code Form is subject to the terms of the Mozilla Public
6 : : * License, v. 2.0. If a copy of the MPL was not distributed with this
7 : : * file, You can obtain one at http://mozilla.org/MPL/2.0/.
8 : : *
9 : : * This file incorporates work covered by the following license notice:
10 : : *
11 : : * Licensed to the Apache Software Foundation (ASF) under one or more
12 : : * contributor license agreements. See the NOTICE file distributed
13 : : * with this work for additional information regarding copyright
14 : : * ownership. The ASF licenses this file to you under the Apache
15 : : * License, Version 2.0 (the "License"); you may not use this file
16 : : * except in compliance with the License. You may obtain a copy of
17 : : * the License at http://www.apache.org/licenses/LICENSE-2.0 .
18 : : */
19 : :
20 : :
21 : : #include "osl/file.hxx"
22 : : #include "osl/thread.h"
23 : : #include "gnujre.hxx"
24 : : #include "util.hxx"
25 : :
26 : : using namespace std;
27 : : using namespace osl;
28 : : using ::rtl::OUString;
29 : : using ::rtl::Reference;
30 : :
31 : : namespace jfw_plugin
32 : : {
33 : :
34 : 0 : Reference<VendorBase> GnuInfo::createInstance()
35 : : {
36 [ # # ]: 0 : return new GnuInfo;
37 : : }
38 : :
39 : 0 : char const* const* GnuInfo::getJavaExePaths(int * size)
40 : : {
41 : : static char const * ar[] = {
42 : : "gij",
43 : : "bin/gij",
44 : : "gij-4.3",
45 : : "bin/gij-4.3",
46 : : "gij-4.2",
47 : : "bin/gij-4.2",
48 : : "gij-4.1",
49 : : "bin/gij-4.1"
50 : : };
51 : 0 : *size = sizeof (ar) / sizeof (char*);
52 : 0 : return ar;
53 : : }
54 : :
55 : : #if defined(MIPS) && defined(OSL_LITENDIAN)
56 : : #define GCJ_JFW_PLUGIN_ARCH "mipsel"
57 : : #else
58 : : #define GCJ_JFW_PLUGIN_ARCH JFW_PLUGIN_ARCH
59 : : #endif
60 : :
61 : 0 : char const* const* GnuInfo::getRuntimePaths(int * size)
62 : : {
63 : : static char const* ar[]= {
64 : : "/libjvm.so",
65 : : "/lib/" GCJ_JFW_PLUGIN_ARCH "/client/libjvm.so",
66 : : "/gcj-4.1.1/libjvm.so",
67 : : "/gcj-4.3-90/libjvm.so",
68 : : "/gcj-4.2-81/libjvm.so",
69 : : "/gcj-4.2/libjvm.so",
70 : : "/gcj-4.2.1/libjvm.so",
71 : : "/gcj-4.2.2/libjvm.so",
72 : : "/gcj-4.2.3/libjvm.so",
73 : : "/gcj-4.1-71/libjvm.so",
74 : : "/gcj-4_1/libjvm.so",
75 : : "/gcj-4.1/libjvm.so",
76 : : "/libgcj.so.81",
77 : : "/libgcj.so.80",
78 : : "/libgcj.so.8",
79 : : "/libgcj.so.71",
80 : : "/libgcj.so.70",
81 : : "/libgcj.so.7",
82 : : "/libgcj.so.6"
83 : : };
84 : 0 : *size = sizeof(ar) / sizeof (char*);
85 : 0 : return ar;
86 : : }
87 : :
88 : 0 : bool GnuInfo::initialize(vector<pair<OUString, OUString> > props)
89 : : {
90 : : //get java.vendor, java.version, java.home,
91 : : //javax.accessibility.assistive_technologies from system properties
92 : :
93 : 0 : OUString sJavaLibraryPath;
94 : : typedef vector<pair<OUString, OUString> >::const_iterator it_prop;
95 : : OUString sVendorProperty(
96 [ # # ]: 0 : RTL_CONSTASCII_USTRINGPARAM("java.vendor"));
97 : : OUString sVersionProperty(
98 [ # # ]: 0 : RTL_CONSTASCII_USTRINGPARAM("java.version"));
99 : : OUString sJavaHomeProperty(
100 [ # # ]: 0 : RTL_CONSTASCII_USTRINGPARAM("java.home"));
101 : : OUString sJavaLibraryPathProperty(
102 [ # # ]: 0 : RTL_CONSTASCII_USTRINGPARAM("java.library.path"));
103 : : OUString sGNUHomeProperty(
104 [ # # ]: 0 : RTL_CONSTASCII_USTRINGPARAM("gnu.classpath.home.url"));
105 : : OUString sAccessProperty(
106 [ # # ]: 0 : RTL_CONSTASCII_USTRINGPARAM("javax.accessibility.assistive_technologies"));
107 : :
108 : 0 : bool bVersion = false;
109 : 0 : bool bVendor = false;
110 : 0 : bool bHome = false;
111 : 0 : bool bJavaHome = false;
112 : 0 : bool bJavaLibraryPath = false;
113 : 0 : bool bAccess = false;
114 : :
115 : : typedef vector<pair<OUString, OUString> >::const_iterator it_prop;
116 [ # # ][ # # ]: 0 : for (it_prop i = props.begin(); i != props.end(); ++i)
[ # # ]
117 : : {
118 [ # # ][ # # ]: 0 : if(! bVendor && sVendorProperty.equals(i->first))
[ # # ]
119 : : {
120 : 0 : m_sVendor = i->second;
121 : 0 : bVendor = true;
122 : : }
123 [ # # ][ # # ]: 0 : else if (!bVersion && sVersionProperty.equals(i->first))
[ # # ]
124 : : {
125 : 0 : m_sVersion = i->second;
126 : 0 : bVersion = true;
127 : : }
128 [ # # ][ # # ]: 0 : else if (!bHome && sGNUHomeProperty.equals(i->first))
[ # # ]
129 : : {
130 : 0 : m_sHome = i->second;
131 : 0 : bHome = true;
132 : : }
133 [ # # ][ # # ]: 0 : else if (!bJavaHome && sJavaHomeProperty.equals(i->first))
[ # # ]
134 : : {
135 : 0 : OUString fileURL;
136 [ # # ][ # # ]: 0 : if (osl_getFileURLFromSystemPath(i->second.pData,& fileURL.pData) ==
137 : : osl_File_E_None)
138 : : {
139 : : //make sure that the drive letter have all the same case
140 : : //otherwise file:///c:/jre and file:///C:/jre produce two
141 : : //different objects!!!
142 [ # # ][ # # ]: 0 : if (makeDriveLetterSame( & fileURL))
143 : : {
144 : 0 : m_sJavaHome = fileURL;
145 : 0 : bJavaHome = true;
146 : : }
147 : 0 : }
148 : : }
149 [ # # ][ # # ]: 0 : else if (!bJavaLibraryPath && sJavaLibraryPathProperty.equals(i->first))
[ # # ]
150 : : {
151 : 0 : sal_Int32 nIndex = 0;
152 [ # # ]: 0 : osl_getFileURLFromSystemPath(i->second.getToken(0, ':', nIndex).pData, &sJavaLibraryPath.pData);
153 : 0 : bJavaLibraryPath = true;
154 : : }
155 [ # # ][ # # ]: 0 : else if (!bAccess && sAccessProperty.equals(i->first))
[ # # ]
156 : : {
157 [ # # ]: 0 : if (!i->second.isEmpty())
158 : : {
159 : 0 : m_bAccessibility = true;
160 : 0 : bAccess = true;
161 : : }
162 : : }
163 : : // the javax.accessibility.xxx property may not be set. Therefore we
164 : : //must search through all properties.
165 : :
166 : : }
167 [ # # ][ # # ]: 0 : if (!bVersion || !bVendor || !bHome)
[ # # ]
168 : 0 : return false;
169 : :
170 [ # # ]: 0 : if (m_sJavaHome.isEmpty())
171 [ # # ]: 0 : m_sJavaHome = rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("file:///usr/lib"));
172 : :
173 : : // init m_sRuntimeLibrary
174 : : OSL_ASSERT(!m_sHome.isEmpty());
175 : : //call virtual function to get the possible paths to the runtime library.
176 : :
177 : 0 : int size = 0;
178 [ # # ]: 0 : char const* const* arRtPaths = getRuntimePaths( & size);
179 [ # # ]: 0 : vector<OUString> libpaths = getVectorFromCharArray(arRtPaths, size);
180 : :
181 : 0 : bool bRt = false;
182 : : typedef vector<OUString>::const_iterator i_path;
183 [ # # ][ # # ]: 0 : for(i_path ip = libpaths.begin(); ip != libpaths.end(); ++ip)
[ # # ]
184 : : {
185 : : //Construct an absolute path to the possible runtime
186 : 0 : OUString usRt= m_sHome + *ip;
187 : 0 : DirectoryItem item;
188 [ # # ][ # # ]: 0 : if(DirectoryItem::get(usRt, item) == File::E_None)
189 : : {
190 : : //found runtime lib
191 : 0 : m_sRuntimeLibrary = usRt;
192 : 0 : bRt = true;
193 : : break;
194 : : }
195 [ # # ][ # # ]: 0 : }
[ # # ]
196 : :
197 [ # # ]: 0 : if (!bRt)
198 : : {
199 : 0 : m_sHome = m_sJavaHome;
200 [ # # ][ # # ]: 0 : for(i_path ip = libpaths.begin(); ip != libpaths.end(); ++ip)
[ # # ]
201 : : {
202 : : //Construct an absolute path to the possible runtime
203 : 0 : OUString usRt= m_sHome + *ip;
204 : 0 : DirectoryItem item;
205 [ # # ][ # # ]: 0 : if(DirectoryItem::get(usRt, item) == File::E_None)
206 : : {
207 : : //found runtime lib
208 : 0 : m_sRuntimeLibrary = usRt;
209 : 0 : bRt = true;
210 : : break;
211 : : }
212 [ # # ][ # # ]: 0 : }
[ # # ]
213 : : }
214 : :
215 : : // try to find it by the java.library.path property
216 [ # # ][ # # ]: 0 : if (!bRt && m_sJavaHome != sJavaLibraryPath)
[ # # ]
217 : : {
218 : 0 : m_sHome = sJavaLibraryPath;
219 [ # # ][ # # ]: 0 : for(i_path ip = libpaths.begin(); ip != libpaths.end(); ++ip)
[ # # ]
220 : : {
221 : : //Construct an absolute path to the possible runtime
222 : 0 : OUString usRt= m_sHome + *ip;
223 : 0 : DirectoryItem item;
224 [ # # ][ # # ]: 0 : if(DirectoryItem::get(usRt, item) == File::E_None)
225 : : {
226 : : //found runtime lib
227 : 0 : m_sRuntimeLibrary = usRt;
228 : 0 : bRt = true;
229 : : break;
230 : : }
231 [ # # ][ # # ]: 0 : }
[ # # ]
232 : : }
233 : :
234 : : #ifdef X86_64
235 : : //Make one last final legacy attempt on x86_64 in case the distro placed it in lib64 instead
236 : : if (!bRt && m_sJavaHome != rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("file:///usr/lib")))
237 : : {
238 : : m_sHome = rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("file:///usr/lib64"));
239 : : for(i_path ip = libpaths.begin(); ip != libpaths.end(); ++ip)
240 : : {
241 : : //Construct an absolute path to the possible runtime
242 : : OUString usRt= m_sHome + *ip;
243 : : DirectoryItem item;
244 : : if(DirectoryItem::get(usRt, item) == File::E_None)
245 : : {
246 : : //found runtime lib
247 : : m_sRuntimeLibrary = usRt;
248 : : bRt = true;
249 : : break;
250 : : }
251 : : }
252 : : }
253 : : #endif
254 : :
255 [ # # ]: 0 : if (!bRt)
256 : 0 : return false;
257 : :
258 : : // init m_sLD_LIBRARY_PATH
259 : : OSL_ASSERT(!m_sHome.isEmpty());
260 : 0 : size = 0;
261 [ # # ]: 0 : char const * const * arLDPaths = getLibraryPaths( & size);
262 [ # # ]: 0 : vector<OUString> ld_paths = getVectorFromCharArray(arLDPaths, size);
263 : :
264 : 0 : char arSep[]= {SAL_PATHSEPARATOR, 0};
265 : 0 : OUString sPathSep= OUString::createFromAscii(arSep);
266 : 0 : bool bLdPath = true;
267 : 0 : int c = 0;
268 [ # # ][ # # ]: 0 : for(i_path il = ld_paths.begin(); il != ld_paths.end(); ++il, ++c)
[ # # ]
269 : : {
270 : 0 : OUString usAbsUrl= m_sHome + *il;
271 : : // convert to system path
272 : 0 : OUString usSysPath;
273 [ # # ][ # # ]: 0 : if(File::getSystemPathFromFileURL(usAbsUrl, usSysPath) == File::E_None)
274 : : {
275 : :
276 [ # # ]: 0 : if(c > 0)
277 : 0 : m_sLD_LIBRARY_PATH+= sPathSep;
278 : 0 : m_sLD_LIBRARY_PATH+= usSysPath;
279 : : }
280 : : else
281 : : {
282 : 0 : bLdPath = false;
283 : : break;
284 : : }
285 [ # # ][ # # ]: 0 : }
286 [ # # ]: 0 : if (bLdPath == false)
287 : 0 : return false;
288 : :
289 : 0 : return true;
290 : : }
291 : :
292 : 0 : int GnuInfo::compareVersions(const rtl::OUString&) const
293 : : {
294 : 0 : return 0;
295 : : }
296 : :
297 : : }
298 : :
299 : : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|