xref: /trunk/main/configmgr/source/configurationregistry.cxx (revision 45c5a00162811bd03b87fcb4fe9996782f2b59ec)
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_configmgr.hxx"
25 #include "sal/config.h"
26 
27 #include "boost/noncopyable.hpp"
28 #include "com/sun/star/beans/NamedValue.hpp"
29 #include "com/sun/star/beans/Property.hpp"
30 #include "com/sun/star/beans/XProperty.hpp"
31 #include "com/sun/star/container/NoSuchElementException.hpp"
32 #include "com/sun/star/container/XHierarchicalNameAccess.hpp"
33 #include "com/sun/star/container/XNamed.hpp"
34 #include "com/sun/star/lang/XMultiComponentFactory.hpp"
35 #include "com/sun/star/lang/XMultiServiceFactory.hpp"
36 #include "com/sun/star/lang/XServiceInfo.hpp"
37 #include "com/sun/star/registry/InvalidRegistryException.hpp"
38 #include "com/sun/star/registry/InvalidValueException.hpp"
39 #include "com/sun/star/registry/MergeConflictException.hpp"
40 #include "com/sun/star/registry/RegistryKeyType.hpp"
41 #include "com/sun/star/registry/RegistryValueType.hpp"
42 #include "com/sun/star/registry/XRegistryKey.hpp"
43 #include "com/sun/star/registry/XSimpleRegistry.hpp"
44 #include "com/sun/star/uno/Any.hxx"
45 #include "com/sun/star/uno/DeploymentException.hpp"
46 #include "com/sun/star/uno/Exception.hpp"
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/Type.hxx"
51 #include "com/sun/star/uno/TypeClass.hpp"
52 #include "com/sun/star/uno/XComponentContext.hpp"
53 #include "com/sun/star/uno/XInterface.hpp"
54 #include "com/sun/star/util/XFlushable.hpp"
55 #include "cppu/unotype.hxx"
56 #include "cppuhelper/implbase1.hxx"
57 #include "cppuhelper/implbase3.hxx"
58 #include "cppuhelper/weak.hxx"
59 #include "osl/diagnose.h"
60 #include "osl/mutex.hxx"
61 #include "rtl/ustring.h"
62 #include "rtl/ustring.hxx"
63 #include "sal/types.h"
64 
65 #include "configurationregistry.hxx"
66 
67 namespace com { namespace sun { namespace star { namespace util {
68     class XFlushListener;
69 } } } }
70 
71 namespace configmgr { namespace configuration_registry {
72 
73 namespace {
74 
75 namespace css = com::sun::star;
76 
77 class Service:
78     public cppu::WeakImplHelper3<
79         css::lang::XServiceInfo, css::registry::XSimpleRegistry,
80         css::util::XFlushable >,
81     private boost::noncopyable
82 {
83 public:
84     Service(css::uno::Reference< css::uno::XComponentContext > const & context);
85 
86 private:
87     virtual ~Service() {}
88 
89     virtual rtl::OUString SAL_CALL getImplementationName()
90     { return configuration_registry::getImplementationName(); }
91 
92     virtual sal_Bool SAL_CALL supportsService(rtl::OUString const & ServiceName)
93     { return ServiceName == getSupportedServiceNames()[0]; } //TODO
94 
95     virtual css::uno::Sequence< rtl::OUString > SAL_CALL
96     getSupportedServiceNames()
97     { return configuration_registry::getSupportedServiceNames(); }
98 
99     virtual rtl::OUString SAL_CALL getURL();
100 
101     virtual void SAL_CALL open(
102         rtl::OUString const & rURL, sal_Bool bReadOnly, sal_Bool);
103 
104     virtual sal_Bool SAL_CALL isValid();
105 
106     virtual void SAL_CALL close();
107 
108     virtual void SAL_CALL destroy();
109 
110     virtual css::uno::Reference< css::registry::XRegistryKey > SAL_CALL
111     getRootKey();
112 
113     virtual sal_Bool SAL_CALL isReadOnly();
114 
115     virtual void SAL_CALL mergeKey(rtl::OUString const &, rtl::OUString const &);
116 
117     virtual void SAL_CALL flush();
118 
119     virtual void SAL_CALL addFlushListener(
120         css::uno::Reference< css::util::XFlushListener > const &);
121 
122     virtual void SAL_CALL removeFlushListener(
123         css::uno::Reference< css::util::XFlushListener > const &);
124 
125     void checkValid();
126 
127     void checkValid_RuntimeException();
128 
129     void doClose();
130 
131     css::uno::Reference< css::lang::XMultiServiceFactory > provider_;
132     osl::Mutex mutex_;
133     css::uno::Reference< css::uno::XInterface > access_;
134     rtl::OUString url_;
135     bool readOnly_;
136 
137     friend class RegistryKey;
138 };
139 
140 class RegistryKey:
141     public cppu::WeakImplHelper1< css::registry::XRegistryKey >,
142     private boost::noncopyable
143 {
144 public:
145     RegistryKey(Service & service, css::uno::Any const & value):
146         service_(service), value_(value) {}
147 
148 private:
149     virtual ~RegistryKey() {}
150 
151     virtual rtl::OUString SAL_CALL getKeyName();
152 
153     virtual sal_Bool SAL_CALL isReadOnly();
154 
155     virtual sal_Bool SAL_CALL isValid();
156 
157     virtual css::registry::RegistryKeyType SAL_CALL getKeyType(
158         rtl::OUString const &);
159 
160     virtual css::registry::RegistryValueType SAL_CALL getValueType();
161 
162     virtual sal_Int32 SAL_CALL getLongValue();
163 
164     virtual void SAL_CALL setLongValue(sal_Int32);
165 
166     virtual css::uno::Sequence< sal_Int32 > SAL_CALL getLongListValue();
167 
168     virtual void SAL_CALL setLongListValue(
169         css::uno::Sequence< sal_Int32 > const &);
170 
171     virtual rtl::OUString SAL_CALL getAsciiValue();
172 
173     virtual void SAL_CALL setAsciiValue(rtl::OUString const &);
174 
175     virtual css::uno::Sequence< rtl::OUString > SAL_CALL getAsciiListValue();
176 
177     virtual void SAL_CALL setAsciiListValue(
178         css::uno::Sequence< rtl::OUString > const &);
179 
180     virtual rtl::OUString SAL_CALL getStringValue();
181 
182     virtual void SAL_CALL setStringValue(rtl::OUString const &);
183 
184     virtual css::uno::Sequence< rtl::OUString > SAL_CALL getStringListValue();
185 
186     virtual void SAL_CALL setStringListValue(
187         css::uno::Sequence< rtl::OUString > const &);
188 
189     virtual css::uno::Sequence< sal_Int8 > SAL_CALL getBinaryValue();
190 
191     virtual void SAL_CALL setBinaryValue(css::uno::Sequence< sal_Int8 > const &);
192 
193     virtual css::uno::Reference< css::registry::XRegistryKey > SAL_CALL openKey(
194         rtl::OUString const & aKeyName);
195 
196     virtual css::uno::Reference< css::registry::XRegistryKey > SAL_CALL
197     createKey(rtl::OUString const &);
198 
199     virtual void SAL_CALL closeKey();
200 
201     virtual void SAL_CALL deleteKey(rtl::OUString const &);
202 
203     virtual
204     css::uno::Sequence< css::uno::Reference< css::registry::XRegistryKey > >
205     SAL_CALL openKeys();
206 
207     virtual css::uno::Sequence< rtl::OUString > SAL_CALL getKeyNames();
208 
209     virtual sal_Bool SAL_CALL createLink(
210         rtl::OUString const &, rtl::OUString const &);
211 
212     virtual void SAL_CALL deleteLink(rtl::OUString const &);
213 
214     virtual rtl::OUString SAL_CALL getLinkTarget(rtl::OUString const &);
215 
216     virtual rtl::OUString SAL_CALL getResolvedName(
217         rtl::OUString const & aKeyName);
218 
219     Service & service_;
220     css::uno::Any value_;
221 };
222 
223 Service::Service(
224     css::uno::Reference< css::uno::XComponentContext > const & context)
225 {
226     OSL_ASSERT(context.is());
227     try {
228         provider_ = css::uno::Reference< css::lang::XMultiServiceFactory >(
229             (css::uno::Reference< css::lang::XMultiComponentFactory >(
230                 context->getServiceManager(), css::uno::UNO_SET_THROW)->
231              createInstanceWithContext(
232                  rtl::OUString(
233                      RTL_CONSTASCII_USTRINGPARAM(
234                          "com.sun.star.configuration.DefaultProvider")),
235                  context)),
236             css::uno::UNO_QUERY_THROW);
237     } catch (css::uno::RuntimeException &) {
238         throw;
239     } catch (css::uno::Exception & e) {
240         throw css::uno::DeploymentException(
241             (rtl::OUString(
242                 RTL_CONSTASCII_USTRINGPARAM(
243                     "component context fails to supply service"
244                     " com.sun.star.configuration.DefaultProvider of type"
245                     " com.sun.star.lang.XMultiServiceFactory: ")) +
246              e.Message),
247             context);
248     }
249 }
250 
251 rtl::OUString Service::getURL() {
252     osl::MutexGuard g(mutex_);
253     checkValid_RuntimeException();
254     return url_;
255 }
256 
257 void Service::open(rtl::OUString const & rURL, sal_Bool bReadOnly, sal_Bool)
258 {
259     //TODO: bCreate
260     osl::MutexGuard g(mutex_);
261     if (access_.is()) {
262         doClose();
263     }
264     css::uno::Sequence< css::uno::Any > args(1);
265     args[0] <<= css::beans::NamedValue(
266         rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("nodepath")),
267         css::uno::makeAny(rURL));
268     try {
269         access_ = provider_->createInstanceWithArguments(
270             (bReadOnly
271              ? rtl::OUString(
272                  RTL_CONSTASCII_USTRINGPARAM(
273                      "com.sun.star.configuration.ConfigurationAccess"))
274              : rtl::OUString(
275                  RTL_CONSTASCII_USTRINGPARAM(
276                      "com.sun.star.configuration.ConfigurationUpdateAccess"))),
277             args);
278     } catch (css::uno::RuntimeException &) {
279         throw;
280     } catch (css::uno::Exception & e) {
281         throw css::uno::RuntimeException(
282             (rtl::OUString(
283                 RTL_CONSTASCII_USTRINGPARAM(
284                     "com.sun.star.configuration.ConfigurationRegistry: open"
285                     " failed: ")) +
286              e.Message),
287             static_cast< cppu::OWeakObject * >(this));
288     }
289     url_ = rURL;
290     readOnly_ = bReadOnly;
291 }
292 
293 sal_Bool Service::isValid() {
294     osl::MutexGuard g(mutex_);
295     return access_.is();
296 }
297 
298 void Service::close()
299 {
300     osl::MutexGuard g(mutex_);
301     checkValid();
302     doClose();
303 }
304 
305 void Service::destroy()
306 {
307     throw css::uno::RuntimeException(
308         rtl::OUString(
309             RTL_CONSTASCII_USTRINGPARAM(
310                 "com.sun.star.configuration.ConfigurationRegistry: not"
311                 " implemented")),
312         static_cast< cppu::OWeakObject * >(this));
313 }
314 
315 css::uno::Reference< css::registry::XRegistryKey > Service::getRootKey()
316 {
317     osl::MutexGuard g(mutex_);
318     checkValid();
319     return new RegistryKey(*this, css::uno::makeAny(access_));
320 }
321 
322 sal_Bool Service::isReadOnly() {
323     osl::MutexGuard g(mutex_);
324     checkValid_RuntimeException();
325     return readOnly_;
326 }
327 
328 void Service::mergeKey(rtl::OUString const &, rtl::OUString const &)
329 {
330     throw css::uno::RuntimeException(
331         rtl::OUString(
332             RTL_CONSTASCII_USTRINGPARAM(
333                 "com.sun.star.configuration.ConfigurationRegistry: not"
334                 " implemented")),
335         static_cast< cppu::OWeakObject * >(this));
336 }
337 
338 void Service::flush()
339 {
340     throw css::uno::RuntimeException(
341         rtl::OUString(
342             RTL_CONSTASCII_USTRINGPARAM(
343                 "com.sun.star.configuration.ConfigurationRegistry: not"
344                 " implemented")),
345         static_cast< cppu::OWeakObject * >(this));
346 }
347 
348 void Service::addFlushListener(
349     css::uno::Reference< css::util::XFlushListener > const &)
350 {
351     throw css::uno::RuntimeException(
352         rtl::OUString(
353             RTL_CONSTASCII_USTRINGPARAM(
354                 "com.sun.star.configuration.ConfigurationRegistry: not"
355                 " implemented")),
356         static_cast< cppu::OWeakObject * >(this));
357 }
358 
359 void Service::removeFlushListener(
360     css::uno::Reference< css::util::XFlushListener > const &)
361 {
362     throw css::uno::RuntimeException(
363         rtl::OUString(
364             RTL_CONSTASCII_USTRINGPARAM(
365                 "com.sun.star.configuration.ConfigurationRegistry: not"
366                 " implemented")),
367         static_cast< cppu::OWeakObject * >(this));
368 }
369 
370 void Service::checkValid() {
371     if (!access_.is()) {
372         throw css::registry::InvalidRegistryException(
373             rtl::OUString(
374                 RTL_CONSTASCII_USTRINGPARAM(
375                     "com.sun.star.configuration.ConfigurationRegistry: not"
376                     " valid")),
377             static_cast< cppu::OWeakObject * >(this));
378     }
379 }
380 
381 void Service::checkValid_RuntimeException() {
382     if (!access_.is()) {
383         throw css::uno::RuntimeException(
384             rtl::OUString(
385                 RTL_CONSTASCII_USTRINGPARAM(
386                     "com.sun.star.configuration.ConfigurationRegistry: not"
387                     " valid")),
388             static_cast< cppu::OWeakObject * >(this));
389     }
390 }
391 
392 void Service::doClose() {
393     access_.clear();
394 }
395 
396 rtl::OUString RegistryKey::getKeyName() {
397     osl::MutexGuard g(service_.mutex_);
398     service_.checkValid_RuntimeException();
399     css::uno::Reference< css::container::XNamed > named;
400     if (value_ >>= named) {
401         return named->getName();
402     }
403     throw css::uno::RuntimeException(
404         rtl::OUString(
405             RTL_CONSTASCII_USTRINGPARAM(
406                 "com.sun.star.configuration.ConfigurationRegistry: not"
407                 " implemented")),
408         static_cast< cppu::OWeakObject * >(this));
409 }
410 
411 sal_Bool RegistryKey::isReadOnly()
412 {
413     osl::MutexGuard g(service_.mutex_);
414     service_.checkValid_RuntimeException();
415     return service_.readOnly_; //TODO: read-only sub-nodes in update access?
416 }
417 
418 sal_Bool RegistryKey::isValid() {
419     return service_.isValid();
420 }
421 
422 css::registry::RegistryKeyType RegistryKey::getKeyType(rtl::OUString const &)
423 {
424     osl::MutexGuard g(service_.mutex_);
425     service_.checkValid();
426     return css::registry::RegistryKeyType_KEY;
427 }
428 
429 css::registry::RegistryValueType RegistryKey::getValueType()
430 {
431     osl::MutexGuard g(service_.mutex_);
432     service_.checkValid();
433     css::uno::Type t(value_.getValueType());
434     switch (t.getTypeClass()) {
435     case css::uno::TypeClass_LONG:
436         return css::registry::RegistryValueType_LONG;
437     case css::uno::TypeClass_STRING:
438         return css::registry::RegistryValueType_STRING;
439     case css::uno::TypeClass_SEQUENCE:
440         if (t == cppu::UnoType< css::uno::Sequence< sal_Int8 > >::get()) {
441             return css::registry::RegistryValueType_BINARY;
442         } else if (t == cppu::UnoType< css::uno::Sequence< sal_Int32 > >::get())
443         {
444             return css::registry::RegistryValueType_LONGLIST;
445         } else if (t ==
446                    cppu::UnoType< css::uno::Sequence< rtl::OUString > >::get())
447         {
448             return css::registry::RegistryValueType_STRINGLIST;
449         }
450         // fall through
451     default:
452         return css::registry::RegistryValueType_NOT_DEFINED;
453     }
454 }
455 
456 sal_Int32 RegistryKey::getLongValue()
457 {
458     osl::MutexGuard g(service_.mutex_);
459     service_.checkValid();
460     sal_Int32 v = 0;
461     if (value_ >>= v) {
462         return v;
463     }
464     throw css::registry::InvalidValueException(
465         rtl::OUString(
466             RTL_CONSTASCII_USTRINGPARAM(
467                 "com.sun.star.configuration.ConfigurationRegistry")),
468         static_cast< cppu::OWeakObject * >(this));
469 }
470 
471 void RegistryKey::setLongValue(sal_Int32)
472 {
473     throw css::uno::RuntimeException(
474         rtl::OUString(
475             RTL_CONSTASCII_USTRINGPARAM(
476                 "com.sun.star.configuration.ConfigurationRegistry: not"
477                 " implemented")),
478         static_cast< cppu::OWeakObject * >(this));
479 }
480 
481 css::uno::Sequence< sal_Int32 > RegistryKey::getLongListValue()
482 {
483     osl::MutexGuard g(service_.mutex_);
484     service_.checkValid();
485     css::uno::Sequence< sal_Int32 > v;
486     if (value_ >>= v) {
487         return v;
488     }
489     throw css::registry::InvalidValueException(
490         rtl::OUString(
491             RTL_CONSTASCII_USTRINGPARAM(
492                 "com.sun.star.configuration.ConfigurationRegistry")),
493         static_cast< cppu::OWeakObject * >(this));
494 }
495 
496 void RegistryKey::setLongListValue(css::uno::Sequence< sal_Int32 > const &)
497 {
498     throw css::uno::RuntimeException(
499         rtl::OUString(
500             RTL_CONSTASCII_USTRINGPARAM(
501                 "com.sun.star.configuration.ConfigurationRegistry: not"
502                 " implemented")),
503         static_cast< cppu::OWeakObject * >(this));
504 }
505 
506 rtl::OUString RegistryKey::getAsciiValue()
507 {
508     osl::MutexGuard g(service_.mutex_);
509     service_.checkValid();
510     rtl::OUString v;
511     if (value_ >>= v) {
512         return v;
513     }
514     throw css::registry::InvalidValueException(
515         rtl::OUString(
516             RTL_CONSTASCII_USTRINGPARAM(
517                 "com.sun.star.configuration.ConfigurationRegistry")),
518         static_cast< cppu::OWeakObject * >(this));
519 }
520 
521 void RegistryKey::setAsciiValue(rtl::OUString const &)
522 {
523     throw css::uno::RuntimeException(
524         rtl::OUString(
525             RTL_CONSTASCII_USTRINGPARAM(
526                 "com.sun.star.configuration.ConfigurationRegistry: not"
527                 " implemented")),
528         static_cast< cppu::OWeakObject * >(this));
529 }
530 
531 css::uno::Sequence< rtl::OUString > RegistryKey::getAsciiListValue()
532 {
533     osl::MutexGuard g(service_.mutex_);
534     service_.checkValid();
535     css::uno::Sequence< rtl::OUString > v;
536     if (value_ >>= v) {
537         return v;
538     }
539     throw css::registry::InvalidValueException(
540         rtl::OUString(
541             RTL_CONSTASCII_USTRINGPARAM(
542                 "com.sun.star.configuration.ConfigurationRegistry")),
543         static_cast< cppu::OWeakObject * >(this));
544 }
545 
546 void RegistryKey::setAsciiListValue(css::uno::Sequence< rtl::OUString > const &)
547 {
548     throw css::uno::RuntimeException(
549         rtl::OUString(
550             RTL_CONSTASCII_USTRINGPARAM(
551                 "com.sun.star.configuration.ConfigurationRegistry: not"
552                 " implemented")),
553         static_cast< cppu::OWeakObject * >(this));
554 }
555 
556 rtl::OUString RegistryKey::getStringValue()
557 {
558     osl::MutexGuard g(service_.mutex_);
559     service_.checkValid();
560     rtl::OUString v;
561     if (value_ >>= v) {
562         return v;
563     }
564     throw css::registry::InvalidValueException(
565         rtl::OUString(
566             RTL_CONSTASCII_USTRINGPARAM(
567                 "com.sun.star.configuration.ConfigurationRegistry")),
568         static_cast< cppu::OWeakObject * >(this));
569 }
570 
571 void RegistryKey::setStringValue(rtl::OUString const &)
572 {
573     throw css::uno::RuntimeException(
574         rtl::OUString(
575             RTL_CONSTASCII_USTRINGPARAM(
576                 "com.sun.star.configuration.ConfigurationRegistry: not"
577                 " implemented")),
578         static_cast< cppu::OWeakObject * >(this));
579 }
580 
581 css::uno::Sequence< rtl::OUString > RegistryKey::getStringListValue()
582 {
583     osl::MutexGuard g(service_.mutex_);
584     service_.checkValid();
585     css::uno::Sequence< rtl::OUString > v;
586     if (value_ >>= v) {
587         return v;
588     }
589     throw css::registry::InvalidValueException(
590         rtl::OUString(
591             RTL_CONSTASCII_USTRINGPARAM(
592                 "com.sun.star.configuration.ConfigurationRegistry")),
593         static_cast< cppu::OWeakObject * >(this));
594 }
595 
596 void RegistryKey::setStringListValue(
597     css::uno::Sequence< rtl::OUString > const &)
598 {
599     throw css::uno::RuntimeException(
600         rtl::OUString(
601             RTL_CONSTASCII_USTRINGPARAM(
602                 "com.sun.star.configuration.ConfigurationRegistry: not"
603                 " implemented")),
604         static_cast< cppu::OWeakObject * >(this));
605 }
606 
607 css::uno::Sequence< sal_Int8 > RegistryKey::getBinaryValue()
608 {
609     osl::MutexGuard g(service_.mutex_);
610     service_.checkValid();
611     css::uno::Sequence< sal_Int8 > v;
612     if (value_ >>= v) {
613         return v;
614     }
615     throw css::registry::InvalidValueException(
616         rtl::OUString(
617             RTL_CONSTASCII_USTRINGPARAM(
618                 "com.sun.star.configuration.ConfigurationRegistry")),
619         static_cast< cppu::OWeakObject * >(this));
620 }
621 
622 void RegistryKey::setBinaryValue(css::uno::Sequence< sal_Int8 > const &)
623 {
624     throw css::uno::RuntimeException(
625         rtl::OUString(
626             RTL_CONSTASCII_USTRINGPARAM(
627                 "com.sun.star.configuration.ConfigurationRegistry: not"
628                 " implemented")),
629         static_cast< cppu::OWeakObject * >(this));
630 }
631 
632 css::uno::Reference< css::registry::XRegistryKey > RegistryKey::openKey(
633     rtl::OUString const & aKeyName)
634 {
635     osl::MutexGuard g(service_.mutex_);
636     service_.checkValid_RuntimeException();
637     css::uno::Reference< css::container::XHierarchicalNameAccess > access;
638     if (value_ >>= access) {
639         try {
640             return new RegistryKey(
641                 service_, access->getByHierarchicalName(aKeyName));
642         } catch (css::container::NoSuchElementException &) {}
643     }
644     return css::uno::Reference< css::registry::XRegistryKey >();
645 }
646 
647 css::uno::Reference< css::registry::XRegistryKey > RegistryKey::createKey(
648     rtl::OUString const &)
649 {
650     throw css::uno::RuntimeException(
651         rtl::OUString(
652             RTL_CONSTASCII_USTRINGPARAM(
653                 "com.sun.star.configuration.ConfigurationRegistry: not"
654                 " implemented")),
655         static_cast< cppu::OWeakObject * >(this));
656 }
657 
658 void RegistryKey::closeKey()
659 {
660     osl::MutexGuard g(service_.mutex_);
661     service_.checkValid_RuntimeException();
662 }
663 
664 void RegistryKey::deleteKey(rtl::OUString const &)
665 {
666     throw css::uno::RuntimeException(
667         rtl::OUString(
668             RTL_CONSTASCII_USTRINGPARAM(
669                 "com.sun.star.configuration.ConfigurationRegistry: not"
670                 " implemented")),
671         static_cast< cppu::OWeakObject * >(this));
672 }
673 
674 css::uno::Sequence< css::uno::Reference< css::registry::XRegistryKey > >
675 RegistryKey::openKeys()
676 {
677     throw css::uno::RuntimeException(
678         rtl::OUString(
679             RTL_CONSTASCII_USTRINGPARAM(
680                 "com.sun.star.configuration.ConfigurationRegistry: not"
681                 " implemented")),
682         static_cast< cppu::OWeakObject * >(this));
683 }
684 
685 css::uno::Sequence< rtl::OUString > RegistryKey::getKeyNames()
686 {
687     throw css::uno::RuntimeException(
688         rtl::OUString(
689             RTL_CONSTASCII_USTRINGPARAM(
690                 "com.sun.star.configuration.ConfigurationRegistry: not"
691                 " implemented")),
692         static_cast< cppu::OWeakObject * >(this));
693 }
694 
695 sal_Bool RegistryKey::createLink(rtl::OUString const &, rtl::OUString const &)
696 {
697     osl::MutexGuard g(service_.mutex_);
698     service_.checkValid_RuntimeException();
699     return false;
700 }
701 
702 void RegistryKey::deleteLink(rtl::OUString const &)
703 {
704     osl::MutexGuard g(service_.mutex_);
705     service_.checkValid_RuntimeException();
706 }
707 
708 rtl::OUString RegistryKey::getLinkTarget(rtl::OUString const &)
709 {
710     osl::MutexGuard g(service_.mutex_);
711     service_.checkValid_RuntimeException();
712     return rtl::OUString();
713 }
714 
715 rtl::OUString RegistryKey::getResolvedName(rtl::OUString const & aKeyName)
716 {
717     osl::MutexGuard g(service_.mutex_);
718     service_.checkValid_RuntimeException();
719     return aKeyName;
720 }
721 
722 }
723 
724 css::uno::Reference< css::uno::XInterface > create(
725     css::uno::Reference< css::uno::XComponentContext > const & context)
726 {
727     return static_cast< cppu::OWeakObject * >(new Service(context));
728 }
729 
730 rtl::OUString getImplementationName() {
731     return rtl::OUString(
732         RTL_CONSTASCII_USTRINGPARAM(
733             "com.sun.star.comp.configuration.ConfigurationRegistry"));
734 }
735 
736 css::uno::Sequence< rtl::OUString > getSupportedServiceNames() {
737     rtl::OUString name(
738         RTL_CONSTASCII_USTRINGPARAM(
739             "com.sun.star.configuration.ConfigurationRegistry"));
740     return css::uno::Sequence< rtl::OUString >(&name, 1);
741 }
742 
743 } }
744