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_vcl.hxx"
26
27 #include <tools/tempfile.hxx>
28
29 #include <osl/file.hxx>
30
31 #include <cppuhelper/servicefactory.hxx>
32
33 #include <vcl/svapp.hxx>
34 #include <vcl/unohelp.hxx>
35
36 #include <svdata.hxx>
37
38 #include <com/sun/star/lang/XSingleServiceFactory.hpp>
39 #include <com/sun/star/lang/XMultiServiceFactory.hpp>
40 #include <comphelper/processfactory.hxx>
41
42 #include <com/sun/star/i18n/XBreakIterator.hpp>
43 #include <com/sun/star/i18n/XCharacterClassification.hpp>
44 #include <com/sun/star/i18n/XCollator.hpp>
45 #include <com/sun/star/awt/XExtendedToolkit.hpp>
46 #include <com/sun/star/accessibility/AccessibleEventObject.hpp>
47 #include <com/sun/star/accessibility/AccessibleStateType.hpp>
48 #include <com/sun/star/registry/XImplementationRegistration.hpp>
49
50 using namespace ::com::sun::star;
51 using namespace ::rtl;
52
53 struct VCLRegServiceInfo
54 {
55 const sal_Char* pLibName;
56 sal_Bool bHasSUPD;
57 };
58
59 static VCLRegServiceInfo aVCLComponentsArray[] =
60 {
61 {"i18n", sal_True},
62 {"i18npool", sal_True},
63 #ifdef UNX
64 #ifdef MACOSX
65 {"dtransaqua", sal_True},
66 #else
67 {"dtransX11", sal_True},
68 #endif
69 #endif
70 #if defined(WNT) || defined(OS2)
71 {"sysdtrans", sal_False},
72 #endif
73 {"dtrans", sal_False},
74 {"mcnttype", sal_False},
75 {"ftransl", sal_False},
76 {"dnd", sal_False},
77 {NULL, sal_False}
78 };
79
GetMultiServiceFactory()80 uno::Reference< lang::XMultiServiceFactory > vcl::unohelper::GetMultiServiceFactory()
81 {
82 ImplSVData* pSVData = ImplGetSVData();
83 if ( !pSVData->maAppData.mxMSF.is() )
84 {
85 pSVData->maAppData.mxMSF = ::comphelper::getProcessServiceFactory();
86 }
87 if ( !pSVData->maAppData.mxMSF.is() )
88 {
89 TempFile aTempFile;
90 OUString aTempFileName;
91 osl::FileBase::getSystemPathFromFileURL( aTempFile.GetName(), aTempFileName );
92 pSVData->maAppData.mpMSFTempFileName = new String(aTempFileName);
93
94 try
95 {
96 pSVData->maAppData.mxMSF = ::cppu::createRegistryServiceFactory( aTempFileName, rtl::OUString(), sal_False );
97 uno::Reference < registry::XImplementationRegistration > xReg(
98 pSVData->maAppData.mxMSF->createInstance( OUString::createFromAscii( "com.sun.star.registry.ImplementationRegistration" )), uno::UNO_QUERY );
99
100 if( xReg.is() )
101 {
102 sal_Int32 nCompCount = 0;
103 while ( aVCLComponentsArray[ nCompCount ].pLibName )
104 {
105 OUString aComponentPathString = CreateLibraryName( aVCLComponentsArray[ nCompCount ].pLibName, aVCLComponentsArray[ nCompCount ].bHasSUPD );
106 if (aComponentPathString.getLength() )
107 {
108 try
109 {
110 xReg->registerImplementation(
111 OUString::createFromAscii( "com.sun.star.loader.SharedLibrary" ),aComponentPathString, NULL );
112 }
113 catch( ::com::sun::star::uno::Exception & )
114 {
115 }
116 }
117 nCompCount++;
118 }
119 }
120 }
121 catch( ::com::sun::star::uno::Exception & )
122 {
123 delete pSVData->maAppData.mpMSFTempFileName;
124 pSVData->maAppData.mpMSFTempFileName = NULL;
125 }
126 }
127 return pSVData->maAppData.mxMSF;
128 }
129
130
CreateBreakIterator()131 uno::Reference < i18n::XBreakIterator > vcl::unohelper::CreateBreakIterator()
132 {
133 uno::Reference < i18n::XBreakIterator > xB;
134 uno::Reference< lang::XMultiServiceFactory > xMSF = GetMultiServiceFactory();
135 if ( xMSF.is() )
136 {
137 uno::Reference < uno::XInterface > xI = xMSF->createInstance( ::rtl::OUString::createFromAscii( "com.sun.star.i18n.BreakIterator" ) );
138 if ( xI.is() )
139 {
140 uno::Any x = xI->queryInterface( ::getCppuType((const uno::Reference< i18n::XBreakIterator >*)0) );
141 x >>= xB;
142 }
143 }
144 return xB;
145 }
146
CreateCharacterClassification()147 uno::Reference < i18n::XCharacterClassification > vcl::unohelper::CreateCharacterClassification()
148 {
149 uno::Reference < i18n::XCharacterClassification > xB;
150 uno::Reference< lang::XMultiServiceFactory > xMSF = GetMultiServiceFactory();
151 if ( xMSF.is() )
152 {
153 uno::Reference < uno::XInterface > xI = xMSF->createInstance( ::rtl::OUString::createFromAscii( "com.sun.star.i18n.CharacterClassification" ) );
154 if ( xI.is() )
155 {
156 uno::Any x = xI->queryInterface( ::getCppuType((const uno::Reference< i18n::XCharacterClassification >*)0) );
157 x >>= xB;
158 }
159 }
160 return xB;
161 }
162
CreateCollator()163 uno::Reference < i18n::XCollator > vcl::unohelper::CreateCollator()
164 {
165 uno::Reference < i18n::XCollator > xB;
166 uno::Reference< lang::XMultiServiceFactory > xMSF = GetMultiServiceFactory();
167 if ( xMSF.is() )
168 {
169 uno::Reference < uno::XInterface > xI = xMSF->createInstance( ::rtl::OUString::createFromAscii( "com.sun.star.i18n.Collator" ) );
170 if ( xI.is() )
171 {
172 uno::Any x = xI->queryInterface( ::getCppuType((const uno::Reference< i18n::XCollator >*)0) );
173 x >>= xB;
174 }
175 }
176 return xB;
177 }
178
CreateLibraryName(const sal_Char * pModName,sal_Bool bSUPD)179 ::rtl::OUString vcl::unohelper::CreateLibraryName( const sal_Char* pModName, sal_Bool bSUPD )
180 {
181 // create variable library name suffixes
182 OUString aDLLSuffix; //= OUString::createFromAscii( STRING(DLLPOSTFIX) );
183
184 OUString aLibName;
185
186 #if defined( WNT) || defined(OS2)
187 aLibName = OUString::createFromAscii( pModName );
188 if ( bSUPD )
189 {
190 aLibName += aDLLSuffix;
191 }
192 aLibName += rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( ".dll" ));
193 #else
194 aLibName = OUString( RTL_CONSTASCII_USTRINGPARAM( "lib" ));
195 aLibName += OUString::createFromAscii( pModName );
196 if ( bSUPD )
197 {
198 aLibName += aDLLSuffix;
199 }
200 #ifdef MACOSX
201 aLibName += OUString( RTL_CONSTASCII_USTRINGPARAM( ".dylib" ));
202 #else
203 aLibName += OUString( RTL_CONSTASCII_USTRINGPARAM( ".so" ));
204 #endif
205 #endif
206
207 return aLibName;
208 }
209
NotifyAccessibleStateEventGlobally(const::com::sun::star::accessibility::AccessibleEventObject & rEventObject)210 void vcl::unohelper::NotifyAccessibleStateEventGlobally( const ::com::sun::star::accessibility::AccessibleEventObject& rEventObject )
211 {
212 ::com::sun::star::uno::Reference< ::com::sun::star::awt::XExtendedToolkit > xExtToolkit( Application::GetVCLToolkit(), uno::UNO_QUERY );
213 if ( xExtToolkit.is() )
214 {
215 // Only for focus events
216 sal_Int16 nType = ::com::sun::star::accessibility::AccessibleStateType::INVALID;
217 rEventObject.NewValue >>= nType;
218 if ( nType == ::com::sun::star::accessibility::AccessibleStateType::FOCUSED )
219 xExtToolkit->fireFocusGained( rEventObject.Source );
220 else
221 {
222 rEventObject.OldValue >>= nType;
223 if ( nType == ::com::sun::star::accessibility::AccessibleStateType::FOCUSED )
224 xExtToolkit->fireFocusLost( rEventObject.Source );
225 }
226
227 }
228 }
229