xref: /trunk/main/ucb/source/ucp/ftp/ftpcontentprovider.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_ucb.hxx"
30 
31 /**************************************************************************
32                                 TODO
33  **************************************************************************
34 
35  *************************************************************************/
36 
37 #include <ucbhelper/contentbroker.hxx>
38 #include <osl/socket.hxx>
39 #include "ftpcontentprovider.hxx"
40 #include "ftpcontent.hxx"
41 #include "ftploaderthread.hxx"
42 
43 
44 using namespace ftp;
45 using namespace com::sun::star::lang;
46 using namespace com::sun::star::container;
47 using namespace com::sun::star::uno;
48 using namespace com::sun::star::ucb;
49 using namespace com::sun::star::beans;
50 
51 
52 
53 //=========================================================================
54 //=========================================================================
55 //
56 // ContentProvider Implementation.
57 //
58 //=========================================================================
59 //=========================================================================
60 
61 FTPContentProvider::FTPContentProvider(
62     const Reference< XMultiServiceFactory >& rSMgr)
63 : ::ucbhelper::ContentProviderImplHelper(rSMgr),
64   m_ftpLoaderThread(0),
65   m_pProxyDecider(0)
66 {
67 }
68 
69 //=========================================================================
70 // virtual
71 FTPContentProvider::~FTPContentProvider()
72 {
73     delete m_ftpLoaderThread;
74     delete m_pProxyDecider;
75 }
76 
77 //=========================================================================
78 //
79 // XInterface methods.
80 //
81 //=========================================================================
82 
83 XINTERFACE_IMPL_3(FTPContentProvider,
84                   XTypeProvider,
85                   XServiceInfo,
86                   XContentProvider)
87 
88 //=========================================================================
89 //
90 // XTypeProvider methods.
91 //
92 //=========================================================================
93 
94 XTYPEPROVIDER_IMPL_3(FTPContentProvider,
95                      XTypeProvider,
96                      XServiceInfo,
97                      XContentProvider)
98 
99 //=========================================================================
100 //
101 // XServiceInfo methods.
102 //
103 //=========================================================================
104 
105 XSERVICEINFO_IMPL_1(
106     FTPContentProvider,
107     rtl::OUString::createFromAscii("com.sun.star.comp.FTPContentProvider"),
108     rtl::OUString::createFromAscii(FTP_CONTENT_PROVIDER_SERVICE_NAME));
109 
110 //=========================================================================
111 //
112 // Service factory implementation.
113 //
114 //=========================================================================
115 
116 ONE_INSTANCE_SERVICE_FACTORY_IMPL(FTPContentProvider);
117 
118 
119 //=========================================================================
120 //
121 // XContentProvider methods.
122 //
123 //=========================================================================
124 
125 // virtual
126 Reference<XContent> SAL_CALL
127 FTPContentProvider::queryContent(
128     const Reference< XContentIdentifier >& xCanonicId
129 )
130     throw(
131         IllegalIdentifierException,
132         RuntimeException
133     )
134 {
135     // Check, if a content with given id already exists...
136     Reference<XContent> xContent = queryExistingContent(xCanonicId).get();
137     if(xContent.is())
138         return xContent;
139 
140     // A new content has to be returned:
141     {
142         // Initialize
143         osl::MutexGuard aGuard( m_aMutex );
144         if(!m_ftpLoaderThread || !m_pProxyDecider)
145         {
146             try {
147                 init();
148             } catch( ... ) {
149                 throw RuntimeException();
150             }
151 
152             if(!m_ftpLoaderThread || !m_pProxyDecider)
153                 throw RuntimeException();
154         }
155     }
156 
157     try {
158         FTPURL aURL(xCanonicId->getContentIdentifier(),
159                     this);
160 
161         if(!m_pProxyDecider->shouldUseProxy(
162             rtl::OUString::createFromAscii("ftp"),
163             aURL.host(),
164             aURL.port().toInt32()))
165         {
166             xContent = new FTPContent(m_xSMgr,this,xCanonicId,aURL);
167             registerNewContent(xContent);
168         }
169         else {
170             Reference<XContentProvider>
171                 xProvider(getHttpProvider());
172             if(xProvider.is())
173                 return xProvider->queryContent(xCanonicId);
174             else
175                 throw RuntimeException();
176         }
177     } catch(const malformed_exception&) {
178         throw IllegalIdentifierException();
179     }
180 
181     // may throw IllegalIdentifierException
182     return xContent;
183 }
184 
185 
186 
187 
188 void FTPContentProvider::init() {
189     m_ftpLoaderThread = new FTPLoaderThread();
190     m_pProxyDecider = new ucbhelper::InternetProxyDecider(m_xSMgr);
191 }
192 
193 
194 
195 CURL* FTPContentProvider::handle() {
196     // Cannot be zero if called from here;
197     return m_ftpLoaderThread->handle();
198 }
199 
200 
201 bool FTPContentProvider::forHost(
202     const rtl::OUString& host,
203     const rtl::OUString& port,
204     const rtl::OUString& username,
205     rtl::OUString& password,
206     rtl::OUString& account)
207 {
208     osl::MutexGuard aGuard(m_aMutex);
209     for(unsigned int i = 0; i < m_ServerInfo.size(); ++i)
210         if(host == m_ServerInfo[i].host &&
211            port == m_ServerInfo[i].port &&
212            username == m_ServerInfo[i].username )
213         {
214             password = m_ServerInfo[i].password;
215             account = m_ServerInfo[i].account;
216             return true;
217         }
218 
219     return false;
220 }
221 
222 
223 bool  FTPContentProvider::setHost(
224     const rtl::OUString& host,
225     const rtl::OUString& port,
226     const rtl::OUString& username,
227     const rtl::OUString& password,
228     const rtl::OUString& account)
229 {
230     ServerInfo inf;
231     inf.host = host;
232     inf.port = port;
233     inf.username = username;
234     inf.password = password;
235     inf.account = account;
236 
237     bool present(false);
238     osl::MutexGuard aGuard(m_aMutex);
239     for(unsigned int i = 0; i < m_ServerInfo.size(); ++i)
240         if(host == m_ServerInfo[i].host &&
241            port == m_ServerInfo[i].port &&
242            username == m_ServerInfo[i].username)
243         {
244             present = true;
245             m_ServerInfo[i].password = password;
246             m_ServerInfo[i].account = account;
247         }
248 
249     if(!present)
250         m_ServerInfo.push_back(inf);
251 
252     return !present;
253 }
254 
255 
256 
257 Reference<XContentProvider>
258 FTPContentProvider::getHttpProvider()
259     throw(RuntimeException)
260 {
261     // used for access to ftp-proxy
262     ucbhelper::ContentBroker *pBroker = ucbhelper::ContentBroker::get();
263 
264     if(pBroker) {
265         Reference<XContentProviderManager > xManager(
266             pBroker->getContentProviderManagerInterface());
267 
268         if(xManager.is())
269             return
270                 xManager->queryContentProvider(
271                     rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("http:")));
272         else
273             throw RuntimeException(
274                 rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(
275                     "bad ucbhelper::ContentBroker")),
276                 *this);
277     } else
278         return 0;
279 
280 }
281