1 /*************************************************************************
2 *
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4 *
5 * Copyright 2000, 2010 Oracle and/or its affiliates.
6 *
7 * OpenOffice.org - a multi-platform office productivity suite
8 *
9 * This file is part of OpenOffice.org.
10 *
11 * OpenOffice.org is free software: you can redistribute it and/or modify
12 * it under the terms of the GNU Lesser General Public License version 3
13 * only, as published by the Free Software Foundation.
14 *
15 * OpenOffice.org is distributed in the hope that it will be useful,
16 * but WITHOUT ANY WARRANTY; without even the implied warranty of
17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18 * GNU Lesser General Public License version 3 for more details
19 * (a copy is included in the LICENSE file that accompanied this code).
20 *
21 * You should have received a copy of the GNU Lesser General Public License
22 * version 3 along with OpenOffice.org.  If not, see
23 * <http://www.openoffice.org/license.html>
24 * for a copy of the LGPLv3 License.
25 *
26 ************************************************************************/
27 
28 #include "precompiled_shell.hxx"
29 #include "sal/config.h"
30 
31 #include "kapplication.h"
32 
33 #include "boost/noncopyable.hpp"
34 #include "com/sun/star/beans/Optional.hpp"
35 #include "com/sun/star/beans/PropertyVetoException.hpp"
36 #include "com/sun/star/beans/UnknownPropertyException.hpp"
37 #include "com/sun/star/beans/XPropertyChangeListener.hpp"
38 #include "com/sun/star/beans/XPropertySet.hpp"
39 #include "com/sun/star/beans/XPropertySetInfo.hpp"
40 #include "com/sun/star/beans/XVetoableChangeListener.hpp"
41 #include "com/sun/star/lang/IllegalArgumentException.hpp"
42 #include "com/sun/star/lang/WrappedTargetException.hpp"
43 #include "com/sun/star/lang/XMultiComponentFactory.hpp"
44 #include "com/sun/star/lang/XServiceInfo.hpp"
45 #include "com/sun/star/lang/WrappedTargetException.hpp"
46 #include "com/sun/star/uno/Any.hxx"
47 #include "com/sun/star/uno/Reference.hxx"
48 #include "com/sun/star/uno/RuntimeException.hpp"
49 #include "com/sun/star/uno/Sequence.hxx"
50 #include "com/sun/star/uno/XComponentContext.hpp"
51 #include "com/sun/star/uno/XCurrentContext.hpp"
52 #include "cppuhelper/factory.hxx"
53 #include "cppuhelper/implbase2.hxx"
54 #include "cppuhelper/implementationentry.hxx"
55 #include "cppuhelper/weak.hxx"
56 #include "rtl/string.h"
57 #include "rtl/ustring.h"
58 #include "rtl/ustring.hxx"
59 #include "sal/types.h"
60 #include "uno/current_context.hxx"
61 #include "uno/lbnames.h"
62 
63 #include "kde4access.hxx"
64 
65 namespace {
66 
67 namespace css = com::sun::star;
68 
69 rtl::OUString SAL_CALL getServiceImplementationName() {
70     return rtl::OUString(
71         RTL_CONSTASCII_USTRINGPARAM(
72             "com.sun.star.comp.configuration.backend.KDE4Backend"));
73 }
74 
75 css::uno::Sequence< rtl::OUString > SAL_CALL getServiceSupportedServiceNames() {
76     rtl::OUString name(
77         RTL_CONSTASCII_USTRINGPARAM(
78             "com.sun.star.configuration.backend.KDE4Backend"));
79     return css::uno::Sequence< rtl::OUString >(&name, 1);
80 }
81 
82 class Service:
83     public cppu::WeakImplHelper2<
84         css::lang::XServiceInfo, css::beans::XPropertySet >,
85     private boost::noncopyable
86 {
87 public:
88     Service();
89 
90 private:
91     virtual ~Service() {}
92 
93     virtual rtl::OUString SAL_CALL getImplementationName()
94         throw (css::uno::RuntimeException)
95     { return getServiceImplementationName(); }
96 
97     virtual sal_Bool SAL_CALL supportsService(rtl::OUString const & ServiceName)
98         throw (css::uno::RuntimeException)
99     { return ServiceName == getSupportedServiceNames()[0]; }
100 
101     virtual css::uno::Sequence< rtl::OUString > SAL_CALL
102     getSupportedServiceNames() throw (css::uno::RuntimeException)
103     { return getServiceSupportedServiceNames(); }
104 
105     virtual css::uno::Reference< css::beans::XPropertySetInfo > SAL_CALL
106     getPropertySetInfo() throw (css::uno::RuntimeException)
107     { return css::uno::Reference< css::beans::XPropertySetInfo >(); }
108 
109     virtual void SAL_CALL setPropertyValue(
110         rtl::OUString const &, css::uno::Any const &)
111         throw (
112             css::beans::UnknownPropertyException,
113             css::beans::PropertyVetoException,
114             css::lang::IllegalArgumentException,
115             css::lang::WrappedTargetException, css::uno::RuntimeException);
116 
117     virtual css::uno::Any SAL_CALL getPropertyValue(
118         rtl::OUString const & PropertyName)
119         throw (
120             css::beans::UnknownPropertyException,
121             css::lang::WrappedTargetException, css::uno::RuntimeException);
122 
123     virtual void SAL_CALL addPropertyChangeListener(
124         rtl::OUString const &,
125         css::uno::Reference< css::beans::XPropertyChangeListener > const &)
126         throw (
127             css::beans::UnknownPropertyException,
128             css::lang::WrappedTargetException, css::uno::RuntimeException)
129     {}
130 
131     virtual void SAL_CALL removePropertyChangeListener(
132         rtl::OUString const &,
133         css::uno::Reference< css::beans::XPropertyChangeListener > const &)
134         throw (
135             css::beans::UnknownPropertyException,
136             css::lang::WrappedTargetException, css::uno::RuntimeException)
137     {}
138 
139     virtual void SAL_CALL addVetoableChangeListener(
140         rtl::OUString const &,
141         css::uno::Reference< css::beans::XVetoableChangeListener > const &)
142         throw (
143             css::beans::UnknownPropertyException,
144             css::lang::WrappedTargetException, css::uno::RuntimeException)
145     {}
146 
147     virtual void SAL_CALL removeVetoableChangeListener(
148         rtl::OUString const &,
149         css::uno::Reference< css::beans::XVetoableChangeListener > const &)
150         throw (
151             css::beans::UnknownPropertyException,
152             css::lang::WrappedTargetException, css::uno::RuntimeException)
153     {}
154 
155     bool enabled_;
156 };
157 
158 Service::Service(): enabled_(false) {
159     css::uno::Reference< css::uno::XCurrentContext > context(
160         css::uno::getCurrentContext());
161     if (context.is()) {
162         rtl::OUString desktop;
163         context->getValueByName(
164             rtl::OUString(
165                 RTL_CONSTASCII_USTRINGPARAM("system.desktop-environment"))) >>=
166             desktop;
167         enabled_ = desktop.equalsAsciiL(RTL_CONSTASCII_STRINGPARAM("KDE4")) &&
168             KApplication::kApplication() != 0;
169     }
170 }
171 
172 void Service::setPropertyValue(rtl::OUString const &, css::uno::Any const &)
173     throw (
174         css::beans::UnknownPropertyException, css::beans::PropertyVetoException,
175         css::lang::IllegalArgumentException, css::lang::WrappedTargetException,
176         css::uno::RuntimeException)
177 {
178     throw css::lang::IllegalArgumentException(
179         rtl::OUString(
180             RTL_CONSTASCII_USTRINGPARAM("setPropertyValue not supported")),
181         static_cast< cppu::OWeakObject * >(this), -1);
182 }
183 
184 css::uno::Any Service::getPropertyValue(rtl::OUString const & PropertyName)
185     throw (
186         css::beans::UnknownPropertyException, css::lang::WrappedTargetException,
187         css::uno::RuntimeException)
188 {
189     if (PropertyName.equalsAsciiL(
190             RTL_CONSTASCII_STRINGPARAM("EnableATToolSupport")) ||
191         PropertyName.equalsAsciiL(
192             RTL_CONSTASCII_STRINGPARAM("ExternalMailer")) ||
193         PropertyName.equalsAsciiL(
194             RTL_CONSTASCII_STRINGPARAM("SourceViewFontHeight")) ||
195         PropertyName.equalsAsciiL(
196             RTL_CONSTASCII_STRINGPARAM("SourceViewFontName")) ||
197         PropertyName.equalsAsciiL(
198             RTL_CONSTASCII_STRINGPARAM("WorkPathVariable")) ||
199         PropertyName.equalsAsciiL(
200             RTL_CONSTASCII_STRINGPARAM("ooInetFTPProxyName")) ||
201         PropertyName.equalsAsciiL(
202             RTL_CONSTASCII_STRINGPARAM("ooInetFTPProxyPort")) ||
203         PropertyName.equalsAsciiL(
204             RTL_CONSTASCII_STRINGPARAM("ooInetHTTPProxyName")) ||
205         PropertyName.equalsAsciiL(
206             RTL_CONSTASCII_STRINGPARAM("ooInetHTTPProxyPort")) ||
207         PropertyName.equalsAsciiL(
208             RTL_CONSTASCII_STRINGPARAM("ooInetHTTPSProxyName")) ||
209         PropertyName.equalsAsciiL(
210             RTL_CONSTASCII_STRINGPARAM("ooInetHTTPSProxyPort")) ||
211         PropertyName.equalsAsciiL(
212             RTL_CONSTASCII_STRINGPARAM("ooInetNoProxy")) ||
213         PropertyName.equalsAsciiL(
214             RTL_CONSTASCII_STRINGPARAM("ooInetProxyType")))
215     {
216         return css::uno::makeAny(
217             enabled_
218             ? kde4access::getValue(PropertyName)
219             : css::beans::Optional< css::uno::Any >());
220     }
221     throw css::beans::UnknownPropertyException(
222         PropertyName, static_cast< cppu::OWeakObject * >(this));
223 }
224 
225 css::uno::Reference< css::uno::XInterface > SAL_CALL createInstance(
226     css::uno::Reference< css::uno::XComponentContext > const &)
227 {
228     return static_cast< cppu::OWeakObject * >(new Service);
229 }
230 
231 static cppu::ImplementationEntry const services[] = {
232     { &createInstance, &getServiceImplementationName,
233       &getServiceSupportedServiceNames, &cppu::createSingleComponentFactory, 0,
234       0 },
235     { 0, 0, 0, 0, 0, 0 }
236 };
237 
238 }
239 
240 extern "C" SAL_DLLPUBLIC_EXPORT void * SAL_CALL component_getFactory(
241     char const * pImplName, void * pServiceManager, void * pRegistryKey)
242 {
243     return cppu::component_getFactoryHelper(
244         pImplName, pServiceManager, pRegistryKey, services);
245 }
246 
247 extern "C" SAL_DLLPUBLIC_EXPORT void SAL_CALL
248 component_getImplementationEnvironment(
249     char const ** ppEnvTypeName, uno_Environment **)
250 {
251     *ppEnvTypeName = CPPU_CURRENT_LANGUAGE_BINDING_NAME;
252 }
253