1 /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
3 * This file is part of the LibreOffice project.
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/.
9 * This file incorporates work covered by the following license notice:
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 .
23 #pragma warning(push, 1)
33 #include "osl/mutex.hxx"
34 #include "osl/module.hxx"
35 #include "osl/thread.hxx"
36 #include "rtl/ustring.hxx"
37 #include "rtl/ustrbuf.hxx"
38 #include "rtl/bootstrap.hxx"
39 #include "osl/file.hxx"
40 #include "osl/process.h"
41 #include "rtl/instance.hxx"
42 #include "rtl/uri.hxx"
43 #include "osl/getglobalmutex.hxx"
44 #include "com/sun/star/lang/IllegalArgumentException.hpp"
45 #include "cppuhelper/bootstrap.hxx"
47 #include "framework.hxx"
48 #include "fwkutil.hxx"
49 #include <boost/scoped_array.hpp>
57 bool isAccessibilitySupportDesired()
60 if (::rtl::Bootstrap::get( "JFW_PLUGIN_DO_NOT_CHECK_ACCESSIBILITY", sValue
) &&
67 if (RegOpenKeyEx(HKEY_CURRENT_USER
,
68 "Software\\LibreOffice\\Accessibility\\AtToolSupport",
69 0, KEY_READ
, &hKey
) == ERROR_SUCCESS
)
73 unsigned char arData
[16];
74 if( RegQueryValueEx(hKey
, "SupportAssistiveTechnology", NULL
, &dwType
, arData
,
75 & dwLen
)== ERROR_SUCCESS
)
79 if (strcmp((char*) arData
, "true") == 0
80 || strcmp((char*) arData
, "1") == 0)
82 else if (strcmp((char*) arData
, "false") == 0
83 || strcmp((char*) arData
, "0") == 0)
85 #if OSL_DEBUG_LEVEL > 1
90 else if (dwType
== REG_DWORD
)
94 else if (arData
[0] == 0)
96 #if OSL_DEBUG_LEVEL > 1
106 // Java is no longer required for a11y - we use atk directly.
107 retVal
= ::rtl::Bootstrap::get( "JFW_PLUGIN_FORCE_ACCESSIBILITY", sValue
) && sValue
== "1";
113 rtl::ByteSequence
encodeBase16(const rtl::ByteSequence
& rawData
)
115 static const char EncodingTable
[] =
116 {'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};
117 sal_Int32 lenRaw
= rawData
.getLength();
118 boost::scoped_array
<char> pBuf(new char[lenRaw
* 2]);
119 const sal_Int8
* arRaw
= rawData
.getConstArray();
121 char* pCurBuf
= pBuf
.get();
122 for (int i
= 0; i
< lenRaw
; i
++)
124 unsigned char curChar
= arRaw
[i
];
127 *pCurBuf
= EncodingTable
[curChar
];
133 *pCurBuf
= EncodingTable
[curChar
];
137 rtl::ByteSequence
ret((sal_Int8
*) pBuf
.get(), lenRaw
* 2);
141 rtl::ByteSequence
decodeBase16(const rtl::ByteSequence
& data
)
143 static const char decodingTable
[] =
144 {'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};
145 sal_Int32 lenData
= data
.getLength();
146 sal_Int32 lenBuf
= lenData
/ 2; //always divisable by two
147 boost::scoped_array
<unsigned char> pBuf(new unsigned char[lenBuf
]);
148 const sal_Int8
* pData
= data
.getConstArray();
149 for (sal_Int32 i
= 0; i
< lenBuf
; i
++)
151 sal_Int8 curChar
= *pData
++;
152 //find the index of the first 4bits
153 // TODO What happens if text is not valid Hex characters?
154 unsigned char nibble
= 0;
155 for (unsigned char j
= 0; j
< 16; j
++)
157 if (curChar
== decodingTable
[j
])
165 //find the index for the next 4bits
166 for (unsigned char j
= 0; j
< 16; j
++)
168 if (curChar
== decodingTable
[j
])
176 rtl::ByteSequence
ret((sal_Int8
*) pBuf
.get(), lenBuf
);
180 OUString
getDirFromFile(const OUString
& usFilePath
)
182 sal_Int32 index
= usFilePath
.lastIndexOf('/');
183 return OUString(usFilePath
.getStr(), index
);
186 OUString
getExecutableDirectory()
188 rtl_uString
* sExe
= NULL
;
189 if (osl_getExecutableFile( & sExe
) != osl_Process_E_None
)
190 throw FrameworkException(
192 "[Java framework] Error in function getExecutableDirectory (fwkutil.cxx)");
194 OUString
ouExe(sExe
, SAL_NO_ACQUIRE
);
195 return getDirFromFile(ouExe
);
199 const OUString
& baseUrl
, const OUString
& plugin
)
201 OUString expandedPlugin
;
204 expandedPlugin
= cppu::bootstrap_expandUri(plugin
);
206 catch (const com::sun::star::lang::IllegalArgumentException
& e
)
208 throw FrameworkException(
210 OString("[Java framework] IllegalArgumentException in findPlugin: ")
211 + OUStringToOString(e
.Message
, osl_getThreadTextEncoding()));
216 sUrl
= rtl::Uri::convertRelToAbs(baseUrl
, expandedPlugin
);
218 catch (const rtl::MalformedUriException
& e
)
220 throw FrameworkException(
222 OString("[Java framework] rtl::MalformedUriException in findPlugin: ")
224 e
.getMessage(), osl_getThreadTextEncoding()));
226 if (checkFileURL(sUrl
) == jfw::FILE_OK
)
231 OUString sProgDir
= getExecutableDirectory();
232 sUrl
= sProgDir
+ "/" + plugin
;
233 jfw::FileStatus s
= checkFileURL(sUrl
);
234 if (s
== jfw::FILE_INVALID
|| s
== jfw::FILE_DOES_NOT_EXIST
)
236 //If only the name of the library is given, then
237 //use PATH, LD_LIBRARY_PATH etc. to locate the plugin
238 if (plugin
.indexOf('/') == -1)
243 OUString path
= "DYLD_LIBRARY_PATH";
245 OUString path
= "LIBPATH";
247 OUString path
= "LD_LIBRARY_PATH";
250 oslProcessError err
= osl_getEnvironment(path
.pData
, &env_path
.pData
);
251 if (err
!= osl_Process_E_None
&& err
!= osl_Process_E_NotFound
)
252 throw FrameworkException(
254 "[Java framework] Error in function findPlugin (fwkutil.cxx).");
255 if (err
== osl_Process_E_NotFound
)
257 if (osl_searchFileURL(plugin
.pData
, env_path
.pData
, &url
.pData
)
260 if (osl_searchFileURL(plugin
.pData
, NULL
, &url
.pData
)
265 throw FrameworkException(
267 "[Java framework] Error in function findPlugin (fwkutil.cxx).");
277 OUString
getLibraryLocation()
279 OString
sExcMsg("[Java framework] Error in function getLibraryLocation "
281 OUString libraryFileUrl
;
283 if (!osl::Module::getUrlFromAddress(
284 reinterpret_cast< oslGenericFunction
>(getLibraryLocation
),
286 throw FrameworkException(JFW_E_ERROR
, sExcMsg
);
288 return getDirFromFile(libraryFileUrl
);
291 jfw::FileStatus
checkFileURL(const OUString
& sURL
)
293 jfw::FileStatus ret
= jfw::FILE_OK
;
295 File::RC rc_item
= DirectoryItem::get(sURL
, item
);
296 if (File::E_None
== rc_item
)
298 osl::FileStatus
status(osl_FileStatus_Mask_Validate
);
300 File::RC rc_stat
= item
.getFileStatus(status
);
301 if (File::E_None
== rc_stat
)
305 else if (File::E_NOENT
== rc_stat
)
307 ret
= FILE_DOES_NOT_EXIST
;
314 else if (File::E_NOENT
== rc_item
)
316 ret
= FILE_DOES_NOT_EXIST
;
327 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */