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 #include "precompiled_shell.hxx"
25 #include "sal/config.h"
26
27 #include "boost/noncopyable.hpp"
28 #include "com/sun/star/beans/Optional.hpp"
29 #include "com/sun/star/beans/PropertyVetoException.hpp"
30 #include "com/sun/star/beans/UnknownPropertyException.hpp"
31 #include "com/sun/star/beans/XPropertyChangeListener.hpp"
32 #include "com/sun/star/beans/XPropertySet.hpp"
33 #include "com/sun/star/beans/XPropertySetInfo.hpp"
34 #include "com/sun/star/beans/XVetoableChangeListener.hpp"
35 #include "com/sun/star/lang/IllegalArgumentException.hpp"
36 #include "com/sun/star/lang/WrappedTargetException.hpp"
37 #include "com/sun/star/lang/XMultiComponentFactory.hpp"
38 #include "com/sun/star/lang/XServiceInfo.hpp"
39 #include "com/sun/star/lang/WrappedTargetException.hpp"
40 #include "com/sun/star/uno/Any.hxx"
41 #include "com/sun/star/uno/Exception.hpp"
42 #include "com/sun/star/uno/Reference.hxx"
43 #include "com/sun/star/uno/RuntimeException.hpp"
44 #include "com/sun/star/uno/Sequence.hxx"
45 #include "com/sun/star/uno/XComponentContext.hpp"
46 #include "com/sun/star/uno/XCurrentContext.hpp"
47 #include "cppuhelper/factory.hxx"
48 #include "cppuhelper/implbase2.hxx"
49 #include "cppuhelper/implementationentry.hxx"
50 #include "cppuhelper/weak.hxx"
51 #include "osl/diagnose.h"
52 #include "rtl/string.h"
53 #include "rtl/textenc.h"
54 #include "rtl/ustring.h"
55 #include "rtl/ustring.hxx"
56 #include "sal/types.h"
57 #include "uno/current_context.hxx"
58 #include "uno/lbnames.h"
59
60 namespace {
61
62 namespace css = com::sun::star;
63
getDefaultImplementationName()64 rtl::OUString SAL_CALL getDefaultImplementationName() {
65 return rtl::OUString(
66 RTL_CONSTASCII_USTRINGPARAM(
67 "com.sun.star.comp.configuration.backend.DesktopBackend"));
68 }
69
getDefaultSupportedServiceNames()70 css::uno::Sequence< rtl::OUString > SAL_CALL getDefaultSupportedServiceNames() {
71 rtl::OUString name(
72 RTL_CONSTASCII_USTRINGPARAM(
73 "com.sun.star.configuration.backend.DesktopBackend"));
74 return css::uno::Sequence< rtl::OUString >(&name, 1);
75 }
76
77 class Default:
78 public cppu::WeakImplHelper2<
79 css::lang::XServiceInfo, css::beans::XPropertySet >,
80 private boost::noncopyable
81 {
82 public:
Default()83 Default() {}
84
85 private:
~Default()86 virtual ~Default() {}
87
getImplementationName()88 virtual rtl::OUString SAL_CALL getImplementationName()
89 throw (css::uno::RuntimeException)
90 { return getDefaultImplementationName(); }
91
supportsService(rtl::OUString const & ServiceName)92 virtual sal_Bool SAL_CALL supportsService(rtl::OUString const & ServiceName)
93 throw (css::uno::RuntimeException)
94 { return ServiceName == getSupportedServiceNames()[0]; }
95
96 virtual css::uno::Sequence< rtl::OUString > SAL_CALL
getSupportedServiceNames()97 getSupportedServiceNames() throw (css::uno::RuntimeException)
98 { return getDefaultSupportedServiceNames(); }
99
100 virtual css::uno::Reference< css::beans::XPropertySetInfo > SAL_CALL
getPropertySetInfo()101 getPropertySetInfo() throw (css::uno::RuntimeException)
102 { return css::uno::Reference< css::beans::XPropertySetInfo >(); }
103
104 virtual void SAL_CALL setPropertyValue(
105 rtl::OUString const &, css::uno::Any const &)
106 throw (
107 css::beans::UnknownPropertyException,
108 css::beans::PropertyVetoException,
109 css::lang::IllegalArgumentException,
110 css::lang::WrappedTargetException, css::uno::RuntimeException);
111
112 virtual css::uno::Any SAL_CALL getPropertyValue(
113 rtl::OUString const & PropertyName)
114 throw (
115 css::beans::UnknownPropertyException,
116 css::lang::WrappedTargetException, css::uno::RuntimeException);
117
addPropertyChangeListener(rtl::OUString const &,css::uno::Reference<css::beans::XPropertyChangeListener> const &)118 virtual void SAL_CALL addPropertyChangeListener(
119 rtl::OUString const &,
120 css::uno::Reference< css::beans::XPropertyChangeListener > const &)
121 throw (
122 css::beans::UnknownPropertyException,
123 css::lang::WrappedTargetException, css::uno::RuntimeException)
124 {}
125
removePropertyChangeListener(rtl::OUString const &,css::uno::Reference<css::beans::XPropertyChangeListener> const &)126 virtual void SAL_CALL removePropertyChangeListener(
127 rtl::OUString const &,
128 css::uno::Reference< css::beans::XPropertyChangeListener > const &)
129 throw (
130 css::beans::UnknownPropertyException,
131 css::lang::WrappedTargetException, css::uno::RuntimeException)
132 {}
133
addVetoableChangeListener(rtl::OUString const &,css::uno::Reference<css::beans::XVetoableChangeListener> const &)134 virtual void SAL_CALL addVetoableChangeListener(
135 rtl::OUString const &,
136 css::uno::Reference< css::beans::XVetoableChangeListener > const &)
137 throw (
138 css::beans::UnknownPropertyException,
139 css::lang::WrappedTargetException, css::uno::RuntimeException)
140 {}
141
removeVetoableChangeListener(rtl::OUString const &,css::uno::Reference<css::beans::XVetoableChangeListener> const &)142 virtual void SAL_CALL removeVetoableChangeListener(
143 rtl::OUString const &,
144 css::uno::Reference< css::beans::XVetoableChangeListener > const &)
145 throw (
146 css::beans::UnknownPropertyException,
147 css::lang::WrappedTargetException, css::uno::RuntimeException)
148 {}
149 };
150
setPropertyValue(rtl::OUString const &,css::uno::Any const &)151 void Default::setPropertyValue(rtl::OUString const &, css::uno::Any const &)
152 throw (
153 css::beans::UnknownPropertyException, css::beans::PropertyVetoException,
154 css::lang::IllegalArgumentException, css::lang::WrappedTargetException,
155 css::uno::RuntimeException)
156 {
157 throw css::lang::IllegalArgumentException(
158 rtl::OUString(
159 RTL_CONSTASCII_USTRINGPARAM("setPropertyValue not supported")),
160 static_cast< cppu::OWeakObject * >(this), -1);
161 }
162
getPropertyValue(rtl::OUString const & PropertyName)163 css::uno::Any Default::getPropertyValue(rtl::OUString const & PropertyName)
164 throw (
165 css::beans::UnknownPropertyException, css::lang::WrappedTargetException,
166 css::uno::RuntimeException)
167 {
168 if (PropertyName.equalsAsciiL(
169 RTL_CONSTASCII_STRINGPARAM("EnableATToolSupport")) ||
170 PropertyName.equalsAsciiL(
171 RTL_CONSTASCII_STRINGPARAM("ExternalMailer")) ||
172 PropertyName.equalsAsciiL(
173 RTL_CONSTASCII_STRINGPARAM("SourceViewFontHeight")) ||
174 PropertyName.equalsAsciiL(
175 RTL_CONSTASCII_STRINGPARAM("SourceViewFontName")) ||
176 PropertyName.equalsAsciiL(
177 RTL_CONSTASCII_STRINGPARAM("WorkPathVariable")) ||
178 PropertyName.equalsAsciiL(
179 RTL_CONSTASCII_STRINGPARAM("ooInetFTPProxyName")) ||
180 PropertyName.equalsAsciiL(
181 RTL_CONSTASCII_STRINGPARAM("ooInetFTPProxyPort")) ||
182 PropertyName.equalsAsciiL(
183 RTL_CONSTASCII_STRINGPARAM("ooInetHTTPProxyName")) ||
184 PropertyName.equalsAsciiL(
185 RTL_CONSTASCII_STRINGPARAM("ooInetHTTPProxyPort")) ||
186 PropertyName.equalsAsciiL(
187 RTL_CONSTASCII_STRINGPARAM("ooInetHTTPSProxyName")) ||
188 PropertyName.equalsAsciiL(
189 RTL_CONSTASCII_STRINGPARAM("ooInetHTTPSProxyPort")) ||
190 PropertyName.equalsAsciiL(
191 RTL_CONSTASCII_STRINGPARAM("ooInetNoProxy")) ||
192 PropertyName.equalsAsciiL(
193 RTL_CONSTASCII_STRINGPARAM("ooInetProxyType")))
194 {
195 return css::uno::makeAny(css::beans::Optional< css::uno::Any >());
196 }
197 throw css::beans::UnknownPropertyException(
198 PropertyName, static_cast< cppu::OWeakObject * >(this));
199 }
200
createBackend(css::uno::Reference<css::uno::XComponentContext> const & context,rtl::OUString const & name)201 css::uno::Reference< css::uno::XInterface > createBackend(
202 css::uno::Reference< css::uno::XComponentContext > const & context,
203 rtl::OUString const & name)
204 {
205 try {
206 return css::uno::Reference< css::lang::XMultiComponentFactory >(
207 context->getServiceManager(), css::uno::UNO_SET_THROW)->
208 createInstanceWithContext(name, context);
209 } catch (css::uno::RuntimeException &) {
210 // Assuming these exceptions are real errors:
211 throw;
212 } catch (css::uno::Exception & e) {
213 // Assuming these exceptions indicate that the service is not installed:
214 OSL_TRACE(
215 "createInstance(%s) failed with %s",
216 rtl::OUStringToOString(name, RTL_TEXTENCODING_UTF8).getStr(),
217 rtl::OUStringToOString(e.Message, RTL_TEXTENCODING_UTF8).getStr());
218 return css::uno::Reference< css::uno::XInterface >();
219 }
220 }
221
createInstance(css::uno::Reference<css::uno::XComponentContext> const & context)222 css::uno::Reference< css::uno::XInterface > SAL_CALL createInstance(
223 css::uno::Reference< css::uno::XComponentContext > const & context)
224 {
225 rtl::OUString desktop;
226 css::uno::Reference< css::uno::XCurrentContext > current(
227 css::uno::getCurrentContext());
228 if (current.is()) {
229 current->getValueByName(
230 rtl::OUString(
231 RTL_CONSTASCII_USTRINGPARAM("system.desktop-environment"))) >>=
232 desktop;
233 }
234 // Fall back to the default if the specific backend is not available:
235 css::uno::Reference< css::uno::XInterface > backend;
236 if (desktop.equalsAsciiL(RTL_CONSTASCII_STRINGPARAM("GNOME"))) {
237 backend = createBackend(
238 context,
239 rtl::OUString(
240 RTL_CONSTASCII_USTRINGPARAM(
241 "com.sun.star.configuration.backend.GconfBackend")));
242 } else if (desktop.equalsAsciiL(RTL_CONSTASCII_STRINGPARAM("KDE"))) {
243 backend = createBackend(
244 context,
245 rtl::OUString(
246 RTL_CONSTASCII_USTRINGPARAM(
247 "com.sun.star.configuration.backend.KDEBackend")));
248 } else if (desktop.equalsAsciiL(RTL_CONSTASCII_STRINGPARAM("KDE4"))) {
249 backend = createBackend(
250 context,
251 rtl::OUString(
252 RTL_CONSTASCII_USTRINGPARAM(
253 "com.sun.star.configuration.backend.KDE4Backend")));
254 }
255 return backend.is()
256 ? backend : static_cast< cppu::OWeakObject * >(new Default);
257 }
258
259 static cppu::ImplementationEntry const services[] = {
260 { &createInstance, &getDefaultImplementationName,
261 &getDefaultSupportedServiceNames, &cppu::createSingleComponentFactory, 0,
262 0 },
263 { 0, 0, 0, 0, 0, 0 }
264 };
265
266 }
267
component_getFactory(char const * pImplName,void * pServiceManager,void * pRegistryKey)268 extern "C" SAL_DLLPUBLIC_EXPORT void * SAL_CALL component_getFactory(
269 char const * pImplName, void * pServiceManager, void * pRegistryKey)
270 {
271 return cppu::component_getFactoryHelper(
272 pImplName, pServiceManager, pRegistryKey, services);
273 }
274
275 extern "C" SAL_DLLPUBLIC_EXPORT void SAL_CALL
component_getImplementationEnvironment(char const ** ppEnvTypeName,uno_Environment **)276 component_getImplementationEnvironment(
277 char const ** ppEnvTypeName, uno_Environment **)
278 {
279 *ppEnvTypeName = CPPU_CURRENT_LANGUAGE_BINDING_NAME;
280 }
281