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_tools.hxx"
26
27 #include <tools/svlibrary.hxx>
28 #include <com/sun/star/uno/Sequence.hxx>
29 #include <com/sun/star/uno/Reference.hxx>
30 #include <com/sun/star/uno/XComponentContext.hpp>
31 #include <com/sun/star/util/XMacroExpander.hpp>
32 #include <com/sun/star/lang/XMultiServiceFactory.hpp>
33 #include <com/sun/star/beans/XPropertySet.hpp>
34 #include <comphelper/processfactory.hxx>
35 #include <tools/string.hxx>
36 #include <rtl/uri.hxx>
37
38 using namespace com::sun::star;
39
GetMultiPaths_Impl()40 static uno::Sequence< rtl::OUString > GetMultiPaths_Impl()
41 {
42 uno::Sequence< rtl::OUString > aRes;
43 uno::Sequence< rtl::OUString > aInternalPaths;
44 uno::Sequence< rtl::OUString > aUserPaths;
45
46 bool bSuccess = true;
47 uno::Reference< lang::XMultiServiceFactory > xMgr( comphelper::getProcessServiceFactory() );
48 if (xMgr.is())
49 {
50 try
51 {
52 String aInternal;
53 aInternal.AppendAscii("Libraries");
54 String aUser;
55 aUser.AppendAscii("Libraries");
56 aInternal .AppendAscii( "_internal" );
57 aUser .AppendAscii( "_user" );
58
59 uno::Reference< beans::XPropertySet > xPathSettings( xMgr->createInstance(
60 rtl::OUString::createFromAscii( "com.sun.star.util.PathSettings" ) ), uno::UNO_QUERY_THROW );
61 xPathSettings->getPropertyValue( aInternal ) >>= aInternalPaths;
62 xPathSettings->getPropertyValue( aUser ) >>= aUserPaths;
63 }
64 catch (uno::Exception &)
65 {
66 bSuccess = false;
67 }
68 }
69 if (bSuccess)
70 {
71 sal_Int32 nMaxEntries = aInternalPaths.getLength() + aUserPaths.getLength();
72 aRes.realloc( nMaxEntries );
73 rtl::OUString *pRes = aRes.getArray();
74 sal_Int32 nCount = 0; // number of actually added entries
75 for (int i = 0; i < 2; ++i)
76 {
77 const uno::Sequence< rtl::OUString > &rPathSeq = i == 0 ? aUserPaths : aInternalPaths;
78 const rtl::OUString *pPathSeq = rPathSeq.getConstArray();
79 for (sal_Int32 k = 0; k < rPathSeq.getLength(); ++k)
80 {
81 const bool bAddUser = (&rPathSeq == &aUserPaths);
82 const bool bAddInternal = (&rPathSeq == &aInternalPaths);
83 if ((bAddUser || bAddInternal) && pPathSeq[k].getLength() > 0)
84 pRes[ nCount++ ] = pPathSeq[k];
85 }
86 }
87 aRes.realloc( nCount );
88 }
89
90 return aRes;
91 }
92
LoadModule(osl::Module & rModule,const rtl::OUString & rLibName,::oslGenericFunction baseModule,::sal_Int32 mode)93 bool SvLibrary::LoadModule( osl::Module& rModule, const rtl::OUString& rLibName, ::oslGenericFunction baseModule, ::sal_Int32 mode )
94 {
95 static uno::Sequence < rtl::OUString > aPaths = GetMultiPaths_Impl();
96 bool bLoaded = false;
97
98 for (sal_Int32 n=0; n<aPaths.getLength(); n++)
99 {
100 rtl::OUString aMod = aPaths[n];
101 if ( aPaths[n].indexOfAsciiL("vnd.sun.star.expand",19) == 0)
102 {
103 uno::Reference< uno::XComponentContext > xComponentContext = comphelper::getProcessComponentContext();
104 uno::Reference< util::XMacroExpander > xMacroExpander;
105 xComponentContext->getValueByName(
106 ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("/singletons/com.sun.star.util.theMacroExpander") ) )
107 >>= xMacroExpander;
108
109 aMod = aMod.copy( sizeof("vnd.sun.star.expand:") -1 );
110 aMod = ::rtl::Uri::decode( aMod, rtl_UriDecodeWithCharset, RTL_TEXTENCODING_UTF8 );
111 aMod = xMacroExpander->expandMacros( aMod );
112 }
113
114 aMod += ::rtl::OUString( sal_Unicode('/') );
115 aMod += rLibName;
116 bLoaded = rModule.load( aMod, mode );
117 if ( bLoaded )
118 break;
119 }
120
121 if (!bLoaded )
122 bLoaded = rModule.loadRelative( baseModule, rLibName, mode );
123
124 return bLoaded;
125 }
126