1 /************************************************************** 2 * 3 * Licensed to the Apache Software Foundation (ASF) under one 4 * or more contributor license agreements. See the NOTICE file 5 * distributed with this work for additional information 6 * regarding copyright ownership. The ASF licenses this file 7 * to you under the Apache License, Version 2.0 (the 8 * "License"); you may not use this file except in compliance 9 * with the License. You may obtain a copy of the License at 10 * 11 * http://www.apache.org/licenses/LICENSE-2.0 12 * 13 * Unless required by applicable law or agreed to in writing, 14 * software distributed under the License is distributed on an 15 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 16 * KIND, either express or implied. See the License for the 17 * specific language governing permissions and limitations 18 * under the License. 19 * 20 *************************************************************/ 21 22 23 24 // MARKER(update_precomp.py): autogen include statement, do not remove 25 #include "precompiled_jvmfwk.hxx" 26 27 #if defined WNT 28 #if defined _MSC_VER 29 #pragma warning(push, 1) 30 #endif 31 #include <windows.h> 32 #if defined _MSC_VER 33 #pragma warning(pop) 34 #endif 35 #endif 36 37 #include <string> 38 #include <string.h> 39 #include "osl/mutex.hxx" 40 #include "osl/module.hxx" 41 #include "osl/thread.hxx" 42 #include "rtl/ustring.hxx" 43 #include "rtl/ustrbuf.hxx" 44 #include "rtl/bootstrap.hxx" 45 #include "osl/file.hxx" 46 #include "osl/process.h" 47 #include "rtl/instance.hxx" 48 #include "rtl/uri.hxx" 49 #include "osl/getglobalmutex.hxx" 50 #include "com/sun/star/lang/IllegalArgumentException.hpp" 51 #include "cppuhelper/bootstrap.hxx" 52 53 #include "framework.hxx" 54 #include "fwkutil.hxx" 55 56 using namespace rtl; 57 using namespace osl; 58 59 namespace jfw 60 { 61 62 bool isAccessibilitySupportDesired() 63 { 64 OUString sValue; 65 if ((sal_True == ::rtl::Bootstrap::get( 66 OUString(RTL_CONSTASCII_USTRINGPARAM("JFW_PLUGIN_DO_NOT_CHECK_ACCESSIBILITY")), sValue)) 67 && sValue.equals(OUString(RTL_CONSTASCII_USTRINGPARAM("1"))) 68 ) 69 return false; 70 71 bool retVal = false; 72 #ifdef WNT 73 HKEY hKey = 0; 74 if (RegOpenKeyEx(HKEY_CURRENT_USER, 75 "Software\\OpenOffice.org\\Accessibility\\AtToolSupport", 76 0, KEY_READ, &hKey) == ERROR_SUCCESS) 77 { 78 DWORD dwType = 0; 79 DWORD dwLen = 16; 80 unsigned char arData[16]; 81 if( RegQueryValueEx(hKey, "SupportAssistiveTechnology", NULL, &dwType, arData, 82 & dwLen)== ERROR_SUCCESS) 83 { 84 if (dwType == REG_SZ) 85 { 86 if (strcmp((char*) arData, "true") == 0 87 || strcmp((char*) arData, "1") == 0) 88 retVal = true; 89 else if (strcmp((char*) arData, "false") == 0 90 || strcmp((char*) arData, "0") == 0) 91 retVal = false; 92 #if OSL_DEBUG_LEVEL > 1 93 else 94 OSL_ASSERT(0); 95 #endif 96 } 97 else if (dwType == REG_DWORD) 98 { 99 if (arData[0] == 1) 100 retVal = true; 101 else if (arData[0] == 0) 102 retVal = false; 103 #if OSL_DEBUG_LEVEL > 1 104 else 105 OSL_ASSERT(0); 106 #endif 107 } 108 } 109 } 110 RegCloseKey(hKey); 111 112 #elif UNX 113 char buf[16]; 114 // use 2 shells to suppress the eventual "gcontool-2 not found" message 115 // of the shell trying to execute the command 116 FILE* fp = popen( "/bin/sh 2>/dev/null -c \"gconftool-2 -g /desktop/gnome/interface/accessibility\"", "r" ); 117 if( fp ) 118 { 119 if( fgets( buf, sizeof(buf), fp ) ) 120 { 121 int nCompare = strncasecmp( buf, "true", 4 ); 122 retVal = (nCompare == 0 ? true : false); 123 } 124 pclose( fp ); 125 } 126 #endif 127 return retVal; 128 } 129 130 131 rtl::ByteSequence encodeBase16(const rtl::ByteSequence& rawData) 132 { 133 static char EncodingTable[] = 134 {'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'}; 135 sal_Int32 lenRaw = rawData.getLength(); 136 char* pBuf = new char[lenRaw * 2]; 137 const sal_Int8* arRaw = rawData.getConstArray(); 138 139 char* pCurBuf = pBuf; 140 for (int i = 0; i < lenRaw; i++) 141 { 142 unsigned char curChar = arRaw[i]; 143 curChar >>= 4; 144 145 *pCurBuf = EncodingTable[curChar]; 146 pCurBuf++; 147 148 curChar = arRaw[i]; 149 curChar &= 0x0F; 150 151 *pCurBuf = EncodingTable[curChar]; 152 pCurBuf++; 153 } 154 155 rtl::ByteSequence ret((sal_Int8*) pBuf, lenRaw * 2); 156 delete [] pBuf; 157 return ret; 158 } 159 160 rtl::ByteSequence decodeBase16(const rtl::ByteSequence& data) 161 { 162 static char decodingTable[] = 163 {'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'}; 164 sal_Int32 lenData = data.getLength(); 165 sal_Int32 lenBuf = lenData / 2; //always divisable by two 166 unsigned char* pBuf = new unsigned char[lenBuf]; 167 const sal_Int8* pData = data.getConstArray(); 168 for (sal_Int32 i = 0; i < lenBuf; i++) 169 { 170 sal_Int8 curChar = *pData++; 171 //find the index of the first 4bits 172 // TODO What happens if text is not valid Hex characters? 173 unsigned char nibble = 0; 174 for (unsigned char j = 0; j < 16; j++) 175 { 176 if (curChar == decodingTable[j]) 177 { 178 nibble = j; 179 break; 180 } 181 } 182 nibble <<= 4; 183 curChar = *pData++; 184 //find the index for the next 4bits 185 for (unsigned char j = 0; j < 16; j++) 186 { 187 if (curChar == decodingTable[j]) 188 { 189 nibble |= j; 190 break; 191 } 192 } 193 pBuf[i] = nibble; 194 } 195 rtl::ByteSequence ret((sal_Int8*) pBuf, lenBuf ); 196 delete [] pBuf; 197 return ret; 198 } 199 200 rtl::OUString getDirFromFile(const rtl::OUString& usFilePath) 201 { 202 sal_Int32 index= usFilePath.lastIndexOf('/'); 203 return rtl::OUString(usFilePath.getStr(), index); 204 } 205 206 rtl::OUString getExecutableDirectory() 207 { 208 rtl_uString* sExe = NULL; 209 if (osl_getExecutableFile( & sExe) != osl_Process_E_None) 210 throw FrameworkException( 211 JFW_E_ERROR, 212 "[Java framework] Error in function getExecutableDirectory (fwkutil.cxx)"); 213 214 rtl::OUString ouExe(sExe, SAL_NO_ACQUIRE); 215 return getDirFromFile(ouExe); 216 } 217 218 rtl::OUString findPlugin( 219 const rtl::OUString & baseUrl, const rtl::OUString & plugin) 220 { 221 rtl::OUString expandedPlugin; 222 try 223 { 224 expandedPlugin = cppu::bootstrap_expandUri(plugin); 225 } 226 catch (com::sun::star::lang::IllegalArgumentException & e) 227 { 228 throw FrameworkException( 229 JFW_E_ERROR, 230 (rtl::OString( 231 RTL_CONSTASCII_STRINGPARAM( 232 "[Java framework] IllegalArgumentException in" 233 " findPlugin: ")) 234 + rtl::OUStringToOString(e.Message, osl_getThreadTextEncoding()))); 235 } 236 rtl::OUString sUrl; 237 try 238 { 239 sUrl = rtl::Uri::convertRelToAbs(baseUrl, expandedPlugin); 240 } 241 catch (rtl::MalformedUriException & e) 242 { 243 throw FrameworkException( 244 JFW_E_ERROR, 245 (rtl::OString( 246 RTL_CONSTASCII_STRINGPARAM( 247 "[Java framework] rtl::MalformedUriException in" 248 " findPlugin: ")) 249 + rtl::OUStringToOString( 250 e.getMessage(), osl_getThreadTextEncoding()))); 251 } 252 if (checkFileURL(sUrl) == jfw::FILE_OK) 253 { 254 return sUrl; 255 } 256 rtl::OUString retVal; 257 rtl::OUString sProgDir = getExecutableDirectory(); 258 sUrl = sProgDir + rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("/")) 259 + plugin; 260 jfw::FileStatus s = checkFileURL(sUrl); 261 if (s == jfw::FILE_INVALID || s == jfw::FILE_DOES_NOT_EXIST) 262 { 263 //If only the name of the library is given, then 264 //use PATH, LD_LIBRARY_PATH etc. to locate the plugin 265 if (plugin.indexOf('/') == -1) 266 { 267 rtl::OUString url; 268 #ifdef UNX 269 #ifdef MACOSX 270 rtl::OUString path = rtl::OUString::createFromAscii("DYLD_LIBRARY_PATH"); 271 #else 272 rtl::OUString path = rtl::OUString::createFromAscii("LD_LIBRARY_PATH"); 273 #endif 274 rtl::OUString env_path; 275 oslProcessError err = osl_getEnvironment(path.pData, &env_path.pData); 276 if (err != osl_Process_E_None && err != osl_Process_E_NotFound) 277 throw FrameworkException( 278 JFW_E_ERROR, 279 "[Java framework] Error in function findPlugin (fwkutil.cxx)."); 280 if (err == osl_Process_E_NotFound) 281 return retVal; 282 if (osl_searchFileURL(plugin.pData, env_path.pData, &url.pData) 283 == osl_File_E_None) 284 #else 285 if (osl_searchFileURL(plugin.pData, NULL, &url.pData) 286 == osl_File_E_None) 287 #endif 288 retVal = url; 289 else 290 throw FrameworkException( 291 JFW_E_ERROR, 292 "[Java framework] Error in function findPlugin (fwkutil.cxx)."); 293 } 294 } 295 else 296 { 297 retVal = sUrl; 298 } 299 return retVal; 300 } 301 302 rtl::OUString getLibraryLocation() 303 { 304 rtl::OString sExcMsg("[Java framework] Error in function getLibraryLocation " 305 "(fwkutil.cxx)."); 306 rtl::OUString libraryFileUrl; 307 308 if (!osl::Module::getUrlFromAddress( 309 reinterpret_cast< oslGenericFunction >(getLibraryLocation), 310 libraryFileUrl)) 311 throw FrameworkException(JFW_E_ERROR, sExcMsg); 312 313 return getDirFromFile(libraryFileUrl); 314 } 315 316 jfw::FileStatus checkFileURL(const rtl::OUString & sURL) 317 { 318 jfw::FileStatus ret = jfw::FILE_OK; 319 DirectoryItem item; 320 File::RC rc_item = DirectoryItem::get(sURL, item); 321 if (File::E_None == rc_item) 322 { 323 osl::FileStatus status(FileStatusMask_Validate); 324 325 File::RC rc_stat = item.getFileStatus(status); 326 if (File::E_None == rc_stat) 327 { 328 ret = FILE_OK; 329 } 330 else if (File::E_NOENT == rc_stat) 331 { 332 ret = FILE_DOES_NOT_EXIST; 333 } 334 else 335 { 336 ret = FILE_INVALID; 337 } 338 } 339 else if (File::E_NOENT == rc_item) 340 { 341 ret = FILE_DOES_NOT_EXIST; 342 } 343 else 344 { 345 ret = FILE_INVALID; 346 } 347 return ret; 348 } 349 350 } 351