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 #ifndef INCLUDED_OSL_MODULE_HXX 21 #define INCLUDED_OSL_MODULE_HXX 22 23 #include "sal/config.h" 24 25 #include <cstddef> 26 27 #include "rtl/ustring.hxx" 28 #include "osl/module.h" 29 30 namespace osl 31 { 32 33 class Module 34 { 35 Module( const Module&) SAL_DELETED_FUNCTION; 36 Module& operator = ( const Module&) SAL_DELETED_FUNCTION; 37 38 public: getUrlFromAddress(void * addr,::rtl::OUString & libraryUrl)39 static bool getUrlFromAddress(void * addr, ::rtl::OUString & libraryUrl) { 40 return osl_getModuleURLFromAddress(addr, &libraryUrl.pData); 41 } 42 43 /** Get module URL from the specified function address in the module. 44 45 Similar to getUrlFromAddress, but use a function address to get URL of the Module. 46 Use Function pointer as symbol address to conceal type conversion. 47 48 @param[in] addr function address in oslGenericFunction format. 49 @param[in,out] libraryUrl receives the URL of the module. 50 51 @retval true on success 52 @retval false can not get the URL from the specified function address or the parameter is invalid. 53 54 @see getUrlFromAddress 55 */ getUrlFromAddress(oslGenericFunction addr,::rtl::OUString & libraryUrl)56 static bool getUrlFromAddress( oslGenericFunction addr, ::rtl::OUString & libraryUrl){ 57 return osl_getModuleURLFromFunctionAddress( addr, &libraryUrl.pData ); 58 } 59 Module()60 Module(): m_Module(NULL){} 61 62 #ifndef DISABLE_DYNLOADING 63 Module(const::rtl::OUString & strModuleName,sal_Int32 nRtldMode=SAL_LOADMODULE_DEFAULT)64 Module( const ::rtl::OUString& strModuleName, sal_Int32 nRtldMode = SAL_LOADMODULE_DEFAULT) : m_Module(NULL) 65 { 66 load( strModuleName, nRtldMode); 67 } 68 69 #endif 70 ~Module()71 ~Module() 72 { 73 #ifndef DISABLE_DYNLOADING 74 osl_unloadModule(m_Module); 75 #endif 76 } 77 78 #ifndef DISABLE_DYNLOADING 79 load(const::rtl::OUString & strModuleName,sal_Int32 nRtldMode=SAL_LOADMODULE_DEFAULT)80 bool SAL_CALL load( const ::rtl::OUString& strModuleName, 81 sal_Int32 nRtldMode = SAL_LOADMODULE_DEFAULT) 82 { 83 unload(); 84 m_Module= osl_loadModule( strModuleName.pData, nRtldMode ); 85 return is(); 86 } 87 88 /// @since UDK 3.2.8 loadRelative(::oslGenericFunction baseModule,::rtl::OUString const & relativePath,::sal_Int32 mode=SAL_LOADMODULE_DEFAULT)89 bool SAL_CALL loadRelative( 90 ::oslGenericFunction baseModule, ::rtl::OUString const & relativePath, 91 ::sal_Int32 mode = SAL_LOADMODULE_DEFAULT) 92 { 93 unload(); 94 m_Module = osl_loadModuleRelative(baseModule, relativePath.pData, mode); 95 return is(); 96 } 97 98 /// @since LibreOffice 3.5 loadRelative(oslGenericFunction baseModule,char const * relativePath,sal_Int32 mode=SAL_LOADMODULE_DEFAULT)99 bool SAL_CALL loadRelative( 100 oslGenericFunction baseModule, char const * relativePath, 101 sal_Int32 mode = SAL_LOADMODULE_DEFAULT) 102 { 103 unload(); 104 m_Module = osl_loadModuleRelativeAscii(baseModule, relativePath, mode); 105 return is(); 106 } 107 unload()108 void SAL_CALL unload() 109 { 110 if (m_Module) 111 { 112 osl_unloadModule(m_Module); 113 m_Module = NULL; 114 } 115 } 116 117 #endif 118 is() const119 bool SAL_CALL is() const 120 { 121 return m_Module != NULL; 122 } 123 getSymbol(const::rtl::OUString & strSymbolName)124 void* SAL_CALL getSymbol( const ::rtl::OUString& strSymbolName) 125 { 126 return osl_getSymbol( m_Module, strSymbolName.pData ); 127 } 128 129 /** Get function address by the function name in the module. 130 131 getFunctionSymbol is an alternative function for getSymbol. 132 Use Function pointer as symbol address to conceal type conversion. 133 134 @param[in] ustrFunctionSymbolName Function name to be looked up. 135 136 @retval oslGenericFunction format function address on success 137 @retval NULL lookup failed or parameter is somewhat invalid 138 139 @see getSymbol 140 */ getFunctionSymbol(const::rtl::OUString & ustrFunctionSymbolName) const141 oslGenericFunction SAL_CALL getFunctionSymbol( const ::rtl::OUString& ustrFunctionSymbolName ) const 142 { 143 return osl_getFunctionSymbol( m_Module, ustrFunctionSymbolName.pData ); 144 } 145 146 /// @since LibreOffice 3.5 getFunctionSymbol(char const * name) const147 oslGenericFunction SAL_CALL getFunctionSymbol(char const * name) const { 148 return osl_getAsciiFunctionSymbol(m_Module, name); 149 } 150 operator oslModule() const151 operator oslModule() const 152 { 153 return m_Module; 154 } 155 156 /** Release the module so that it will not be unloaded from the destructor. 157 158 This instance returns to the state of a default-constructed instance 159 again. 160 161 @since LibreOffice 4.3 162 */ release()163 void release() { m_Module = NULL; } 164 165 private: 166 oslModule m_Module; 167 168 }; 169 170 } 171 172 #endif 173 174 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ 175