xref: /trunk/main/ucbhelper/source/provider/registerucb.cxx (revision 1ecadb572e7010ff3b3382ad9bf179dbc6efadbb)
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 // MARKER(update_precomp.py): autogen include statement, do not remove
29 #include "precompiled_ucbhelper.hxx"
30 #include <ucbhelper/registerucb.hxx>
31 #include <com/sun/star/lang/XMultiServiceFactory.hpp>
32 #include <com/sun/star/ucb/XContentProviderManager.hpp>
33 #include <com/sun/star/ucb/XParameterizedContentProvider.hpp>
34 #include <com/sun/star/ucb/XContentProviderFactory.hpp>
35 #include <com/sun/star/uno/RuntimeException.hpp>
36 
37 #include "osl/diagnose.h"
38 
39 using namespace com::sun::star;
40 
41 namespace ucbhelper {
42 
43 //============================================================================
44 //
45 //  registerAtUcb
46 //
47 //============================================================================
48 
49 bool
50 registerAtUcb(
51     uno::Reference< ucb::XContentProviderManager > const & rManager,
52     uno::Reference< lang::XMultiServiceFactory > const & rServiceFactory,
53     rtl::OUString const & rName,
54     rtl::OUString const & rArguments,
55     rtl::OUString const & rTemplate,
56     ContentProviderRegistrationInfo * pInfo)
57     throw (uno::RuntimeException)
58 {
59     OSL_ENSURE(rServiceFactory.is(),
60                "ucb::registerAtUcb(): No service factory");
61 
62     bool bNoProxy
63         = rArguments.compareToAscii(RTL_CONSTASCII_STRINGPARAM("{noproxy}"))
64               == 0;
65     rtl::OUString
66         aProviderArguments(bNoProxy ?
67                                rArguments.
68                                    copy(RTL_CONSTASCII_LENGTH("{noproxy}")) :
69                                rArguments);
70 
71     // First, try to instantiate proxy for provider:
72     uno::Reference< ucb::XContentProvider > xProvider;
73     if (!bNoProxy)
74     {
75         uno::Reference< ucb::XContentProviderFactory > xProxyFactory;
76         try
77         {
78             xProxyFactory
79                 = uno::Reference< ucb::XContentProviderFactory >(
80                       rServiceFactory->
81                           createInstance(
82                               rtl::OUString(
83                                   RTL_CONSTASCII_USTRINGPARAM(
84                             "com.sun.star.ucb.ContentProviderProxyFactory"))),
85                       uno::UNO_QUERY);
86         }
87         catch (uno::Exception const &) {}
88         OSL_ENSURE(xProxyFactory.is(), "No ContentProviderProxyFactory");
89         if (xProxyFactory.is())
90             xProvider = xProxyFactory->createContentProvider(rName);
91     }
92 
93     // Then, try to instantiate provider directly:
94     if (!xProvider.is())
95         try
96         {
97             xProvider = uno::Reference< ucb::XContentProvider >(
98                             rServiceFactory->createInstance(rName),
99                             uno::UNO_QUERY);
100         }
101         catch (uno::RuntimeException const &) { throw; }
102         catch (uno::Exception const &) {}
103 
104     uno::Reference< ucb::XContentProvider >
105         xOriginalProvider(xProvider);
106     uno::Reference< ucb::XParameterizedContentProvider >
107         xParameterized(xProvider, uno::UNO_QUERY);
108     if (xParameterized.is())
109     {
110         uno::Reference< ucb::XContentProvider > xInstance;
111         try
112         {
113             xInstance = xParameterized->registerInstance(rTemplate,
114                                                          aProviderArguments,
115                                                          true);
116                 //@@@ if this call replaces an old instance, the commit-or-
117                 // rollback code below will not work
118         }
119         catch (lang::IllegalArgumentException const &) {}
120 
121         if (xInstance.is())
122             xProvider = xInstance;
123     }
124 
125     bool bSuccess = false;
126     if (rManager.is() && xProvider.is())
127         try
128         {
129             rManager->registerContentProvider(xProvider, rTemplate, true);
130             bSuccess = true;
131         }
132         catch (ucb::DuplicateProviderException const &)
133         {
134             if (xParameterized.is())
135                 try
136                 {
137                     xParameterized->deregisterInstance(rTemplate,
138                                                        aProviderArguments);
139                 }
140                 catch (lang::IllegalArgumentException const &) {}
141         }
142         catch (...)
143         {
144             if (xParameterized.is())
145                 try
146                 {
147                     xParameterized->deregisterInstance(rTemplate,
148                                                        aProviderArguments);
149                 }
150                 catch (lang::IllegalArgumentException const &) {}
151                 catch (uno::RuntimeException const &) {}
152             throw;
153         }
154 
155     if (bSuccess && pInfo)
156     {
157         pInfo->m_xProvider = xOriginalProvider;
158         pInfo->m_aArguments = aProviderArguments;
159         pInfo->m_aTemplate = rTemplate;
160     }
161     return bSuccess;
162 }
163 
164 }
165