| File: | jvmaccess/source/classpath.cxx |
| Location: | line 56, column 21 |
| Description: | Called C++ object pointer is null |
| 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 | #include "sal/config.h" | |||
| 21 | ||||
| 22 | #include "jvmaccess/classpath.hxx" | |||
| 23 | ||||
| 24 | #include <vector> | |||
| 25 | ||||
| 26 | #include "com/sun/star/lang/IllegalArgumentException.hpp" | |||
| 27 | #include "com/sun/star/uno/Any.hxx" | |||
| 28 | #include "com/sun/star/uno/Reference.hxx" | |||
| 29 | #include "com/sun/star/uno/RuntimeException.hpp" | |||
| 30 | #include "com/sun/star/uno/XComponentContext.hpp" | |||
| 31 | #include "com/sun/star/uno/XInterface.hpp" | |||
| 32 | #include "com/sun/star/uri/UriReferenceFactory.hpp" | |||
| 33 | #include "com/sun/star/uri/XVndSunStarExpandUrlReference.hpp" | |||
| 34 | #include "com/sun/star/util/XMacroExpander.hpp" | |||
| 35 | #include "osl/diagnose.h" | |||
| 36 | #include "rtl/ustring.hxx" | |||
| 37 | #include "sal/types.h" | |||
| 38 | ||||
| 39 | #if defined SOLAR_JAVA1 | |||
| 40 | #include "jni.h" | |||
| 41 | #endif | |||
| 42 | ||||
| 43 | namespace { | |||
| 44 | ||||
| 45 | namespace css = ::com::sun::star; | |||
| 46 | ||||
| 47 | } | |||
| 48 | ||||
| 49 | void * ::jvmaccess::ClassPath::doTranslateToUrls( | |||
| 50 | css::uno::Reference< css::uno::XComponentContext > const & context, | |||
| 51 | void * environment, ::rtl::OUString const & classPath) | |||
| 52 | { | |||
| 53 | OSL_ASSERT(context.is() && environment != 0)do { if (true && (!(context.is() && environment != 0))) { sal_detail_logFormat((SAL_DETAIL_LOG_LEVEL_WARN), ( "legacy.osl"), ("/usr/local/src/libreoffice/jvmaccess/source/classpath.cxx" ":" "53" ": "), "OSL_ASSERT: %s", "context.is() && environment != 0" ); } } while (false); | |||
| 54 | #if defined SOLAR_JAVA1 | |||
| 55 | ::JNIEnv * const env = static_cast< ::JNIEnv * >(environment); | |||
| ||||
| 56 | jclass classUrl(env->FindClass("java/net/URL")); | |||
| ||||
| 57 | if (classUrl == 0) { | |||
| 58 | return 0; | |||
| 59 | } | |||
| 60 | jmethodID ctorUrl( | |||
| 61 | env->GetMethodID(classUrl, "<init>", "(Ljava/lang/String;)V")); | |||
| 62 | if (ctorUrl == 0) { | |||
| 63 | return 0; | |||
| 64 | } | |||
| 65 | ::std::vector< jobject > urls; | |||
| 66 | for (::sal_Int32 i = 0; i != -1;) { | |||
| 67 | ::rtl::OUString url(classPath.getToken(0, ' ', i)); | |||
| 68 | if (!url.isEmpty()) { | |||
| 69 | css::uno::Reference< css::uri::XVndSunStarExpandUrlReference > | |||
| 70 | expUrl( | |||
| 71 | css::uri::UriReferenceFactory::create(context)->parse(url), | |||
| 72 | css::uno::UNO_QUERY); | |||
| 73 | if (expUrl.is()) { | |||
| 74 | css::uno::Reference< css::util::XMacroExpander > expander( | |||
| 75 | context->getValueByName( | |||
| 76 | ::rtl::OUString( | |||
| 77 | RTL_CONSTASCII_USTRINGPARAM((&("/singletons/" "com.sun.star.util.theMacroExpander")[0 ]), ((sal_Int32)((sizeof ("/singletons/" "com.sun.star.util.theMacroExpander" ) / sizeof (("/singletons/" "com.sun.star.util.theMacroExpander" )[0]))-1)), (((rtl_TextEncoding) 11)) | |||
| 78 | "/singletons/"(&("/singletons/" "com.sun.star.util.theMacroExpander")[0 ]), ((sal_Int32)((sizeof ("/singletons/" "com.sun.star.util.theMacroExpander" ) / sizeof (("/singletons/" "com.sun.star.util.theMacroExpander" )[0]))-1)), (((rtl_TextEncoding) 11)) | |||
| 79 | "com.sun.star.util.theMacroExpander")(&("/singletons/" "com.sun.star.util.theMacroExpander")[0 ]), ((sal_Int32)((sizeof ("/singletons/" "com.sun.star.util.theMacroExpander" ) / sizeof (("/singletons/" "com.sun.star.util.theMacroExpander" )[0]))-1)), (((rtl_TextEncoding) 11)))), | |||
| 80 | css::uno::UNO_QUERY_THROW); | |||
| 81 | try { | |||
| 82 | url = expUrl->expand(expander); | |||
| 83 | } catch (const css::lang::IllegalArgumentException & e) { | |||
| 84 | throw css::uno::RuntimeException( | |||
| 85 | (::rtl::OUString( | |||
| 86 | RTL_CONSTASCII_USTRINGPARAM((&("com.sun.star.lang.IllegalArgumentException: ")[0]), ( (sal_Int32)((sizeof ("com.sun.star.lang.IllegalArgumentException: " ) / sizeof (("com.sun.star.lang.IllegalArgumentException: ")[ 0]))-1)), (((rtl_TextEncoding) 11)) | |||
| 87 | "com.sun.star.lang.IllegalArgumentException: ")(&("com.sun.star.lang.IllegalArgumentException: ")[0]), ( (sal_Int32)((sizeof ("com.sun.star.lang.IllegalArgumentException: " ) / sizeof (("com.sun.star.lang.IllegalArgumentException: ")[ 0]))-1)), (((rtl_TextEncoding) 11))) | |||
| 88 | + e.Message), | |||
| 89 | css::uno::Reference< css::uno::XInterface >()); | |||
| 90 | } | |||
| 91 | } | |||
| 92 | jvalue arg; | |||
| 93 | arg.l = env->NewString( | |||
| 94 | static_cast< jchar const * >(url.getStr()), | |||
| 95 | static_cast< jsize >(url.getLength())); | |||
| 96 | if (arg.l == 0) { | |||
| 97 | return 0; | |||
| 98 | } | |||
| 99 | jobject o(env->NewObjectA(classUrl, ctorUrl, &arg)); | |||
| 100 | if (o == 0) { | |||
| 101 | return 0; | |||
| 102 | } | |||
| 103 | urls.push_back(o); | |||
| 104 | } | |||
| 105 | } | |||
| 106 | jobjectArray result = env->NewObjectArray( | |||
| 107 | static_cast< jsize >(urls.size()), classUrl, 0); | |||
| 108 | // static_cast is ok, as each element of urls occupied at least one | |||
| 109 | // character of the ::rtl::OUString classPath | |||
| 110 | if (result == 0) { | |||
| 111 | return 0; | |||
| 112 | } | |||
| 113 | jsize idx = 0; | |||
| 114 | for (std::vector< jobject >::iterator i(urls.begin()); i != urls.end(); ++i) | |||
| 115 | { | |||
| 116 | env->SetObjectArrayElement(result, idx++, *i); | |||
| 117 | } | |||
| 118 | return result; | |||
| 119 | #else | |||
| 120 | (void) context; | |||
| 121 | (void) environment; | |||
| 122 | (void) classPath; | |||
| 123 | return 0; | |||
| 124 | #endif | |||
| 125 | } | |||
| 126 | ||||
| 127 | void * ::jvmaccess::ClassPath::doLoadClass( | |||
| 128 | css::uno::Reference< css::uno::XComponentContext > const & context, | |||
| 129 | void * environment, ::rtl::OUString const & classPath, | |||
| 130 | ::rtl::OUString const & name) | |||
| 131 | { | |||
| 132 | OSL_ASSERT(context.is() && environment != 0)do { if (true && (!(context.is() && environment != 0))) { sal_detail_logFormat((SAL_DETAIL_LOG_LEVEL_WARN), ( "legacy.osl"), ("/usr/local/src/libreoffice/jvmaccess/source/classpath.cxx" ":" "132" ": "), "OSL_ASSERT: %s", "context.is() && environment != 0" ); } } while (false); | |||
| 133 | #if defined SOLAR_JAVA1 | |||
| 134 | ::JNIEnv * const env = static_cast< ::JNIEnv * >(environment); | |||
| 135 | jclass classLoader(env->FindClass("java/net/URLClassLoader")); | |||
| 136 | if (classLoader == 0) { | |||
| 137 | return 0; | |||
| 138 | } | |||
| 139 | jmethodID ctorLoader( | |||
| 140 | env->GetMethodID(classLoader, "<init>", "([Ljava/net/URL;)V")); | |||
| 141 | if (ctorLoader == 0) { | |||
| 142 | return 0; | |||
| 143 | } | |||
| 144 | jvalue arg; | |||
| 145 | arg.l = translateToUrls(context, env, classPath); | |||
| 146 | if (arg.l == 0) { | |||
| 147 | return 0; | |||
| 148 | } | |||
| 149 | jobject cl = env->NewObjectA(classLoader, ctorLoader, &arg); | |||
| 150 | if (cl == 0) { | |||
| 151 | return 0; | |||
| 152 | } | |||
| 153 | jmethodID methLoadClass( | |||
| 154 | env->GetMethodID( | |||
| 155 | classLoader, "loadClass", "(Ljava/lang/String;)Ljava/lang/Class;")); | |||
| 156 | if (methLoadClass == 0) { | |||
| 157 | return 0; | |||
| 158 | } | |||
| 159 | arg.l = env->NewString( | |||
| 160 | static_cast< jchar const * >(name.getStr()), | |||
| 161 | static_cast< jsize >(name.getLength())); | |||
| 162 | if (arg.l == 0) { | |||
| 163 | return 0; | |||
| 164 | } | |||
| 165 | return env->CallObjectMethodA(cl, methLoadClass, &arg); | |||
| 166 | #else | |||
| 167 | (void) context; | |||
| 168 | (void) environment; | |||
| 169 | (void) classPath; | |||
| 170 | (void) name; | |||
| 171 | return 0; | |||
| 172 | #endif | |||
| 173 | } | |||
| 174 | ||||
| 175 | /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ |