summaryrefslogtreecommitdiff
path: root/ucb/source/ucp/ftp/ftpcontentprovider.cxx
diff options
context:
space:
mode:
Diffstat (limited to 'ucb/source/ucp/ftp/ftpcontentprovider.cxx')
-rw-r--r--ucb/source/ucp/ftp/ftpcontentprovider.cxx280
1 files changed, 280 insertions, 0 deletions
diff --git a/ucb/source/ucp/ftp/ftpcontentprovider.cxx b/ucb/source/ucp/ftp/ftpcontentprovider.cxx
new file mode 100644
index 000000000000..2cfc62afe440
--- /dev/null
+++ b/ucb/source/ucp/ftp/ftpcontentprovider.cxx
@@ -0,0 +1,280 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+// MARKER(update_precomp.py): autogen include statement, do not remove
+#include "precompiled_ucb.hxx"
+
+/**************************************************************************
+ TODO
+ **************************************************************************
+
+ *************************************************************************/
+
+#include <ucbhelper/contentbroker.hxx>
+#include <osl/socket.hxx>
+#include "ftpcontentprovider.hxx"
+#include "ftpcontent.hxx"
+#include "ftploaderthread.hxx"
+
+
+using namespace ftp;
+using namespace com::sun::star::lang;
+using namespace com::sun::star::container;
+using namespace com::sun::star::uno;
+using namespace com::sun::star::ucb;
+using namespace com::sun::star::beans;
+
+
+
+//=========================================================================
+//=========================================================================
+//
+// ContentProvider Implementation.
+//
+//=========================================================================
+//=========================================================================
+
+FTPContentProvider::FTPContentProvider(
+ const Reference< XMultiServiceFactory >& rSMgr)
+: ::ucbhelper::ContentProviderImplHelper(rSMgr),
+ m_ftpLoaderThread(0),
+ m_pProxyDecider(0)
+{
+}
+
+//=========================================================================
+// virtual
+FTPContentProvider::~FTPContentProvider()
+{
+ delete m_ftpLoaderThread;
+ delete m_pProxyDecider;
+}
+
+//=========================================================================
+//
+// XInterface methods.
+//
+//=========================================================================
+
+XINTERFACE_IMPL_3(FTPContentProvider,
+ XTypeProvider,
+ XServiceInfo,
+ XContentProvider)
+
+//=========================================================================
+//
+// XTypeProvider methods.
+//
+//=========================================================================
+
+XTYPEPROVIDER_IMPL_3(FTPContentProvider,
+ XTypeProvider,
+ XServiceInfo,
+ XContentProvider)
+
+//=========================================================================
+//
+// XServiceInfo methods.
+//
+//=========================================================================
+
+XSERVICEINFO_IMPL_1(
+ FTPContentProvider,
+ rtl::OUString::createFromAscii("com.sun.star.comp.FTPContentProvider"),
+ rtl::OUString::createFromAscii(FTP_CONTENT_PROVIDER_SERVICE_NAME));
+
+//=========================================================================
+//
+// Service factory implementation.
+//
+//=========================================================================
+
+ONE_INSTANCE_SERVICE_FACTORY_IMPL(FTPContentProvider);
+
+
+//=========================================================================
+//
+// XContentProvider methods.
+//
+//=========================================================================
+
+// virtual
+Reference<XContent> SAL_CALL
+FTPContentProvider::queryContent(
+ const Reference< XContentIdentifier >& xCanonicId
+)
+ throw(
+ IllegalIdentifierException,
+ RuntimeException
+ )
+{
+ // Check, if a content with given id already exists...
+ Reference<XContent> xContent = queryExistingContent(xCanonicId).get();
+ if(xContent.is())
+ return xContent;
+
+ // A new content has to be returned:
+ {
+ // Initialize
+ osl::MutexGuard aGuard( m_aMutex );
+ if(!m_ftpLoaderThread || !m_pProxyDecider)
+ {
+ try {
+ init();
+ } catch( ... ) {
+ throw RuntimeException();
+ }
+
+ if(!m_ftpLoaderThread || !m_pProxyDecider)
+ throw RuntimeException();
+ }
+ }
+
+ try {
+ FTPURL aURL(xCanonicId->getContentIdentifier(),
+ this);
+
+ if(!m_pProxyDecider->shouldUseProxy(
+ rtl::OUString::createFromAscii("ftp"),
+ aURL.host(),
+ aURL.port().toInt32()))
+ {
+ xContent = new FTPContent(m_xSMgr,this,xCanonicId,aURL);
+ registerNewContent(xContent);
+ }
+ else {
+ Reference<XContentProvider>
+ xProvider(getHttpProvider());
+ if(xProvider.is())
+ return xProvider->queryContent(xCanonicId);
+ else
+ throw RuntimeException();
+ }
+ } catch(const malformed_exception&) {
+ throw IllegalIdentifierException();
+ }
+
+ // may throw IllegalIdentifierException
+ return xContent;
+}
+
+
+
+
+void FTPContentProvider::init() {
+ m_ftpLoaderThread = new FTPLoaderThread();
+ m_pProxyDecider = new ucbhelper::InternetProxyDecider(m_xSMgr);
+}
+
+
+
+CURL* FTPContentProvider::handle() {
+ // Cannot be zero if called from here;
+ return m_ftpLoaderThread->handle();
+}
+
+
+bool FTPContentProvider::forHost(
+ const rtl::OUString& host,
+ const rtl::OUString& port,
+ const rtl::OUString& username,
+ rtl::OUString& password,
+ rtl::OUString& account)
+{
+ osl::MutexGuard aGuard(m_aMutex);
+ for(unsigned int i = 0; i < m_ServerInfo.size(); ++i)
+ if(host == m_ServerInfo[i].host &&
+ port == m_ServerInfo[i].port &&
+ username == m_ServerInfo[i].username )
+ {
+ password = m_ServerInfo[i].password;
+ account = m_ServerInfo[i].account;
+ return true;
+ }
+
+ return false;
+}
+
+
+bool FTPContentProvider::setHost(
+ const rtl::OUString& host,
+ const rtl::OUString& port,
+ const rtl::OUString& username,
+ const rtl::OUString& password,
+ const rtl::OUString& account)
+{
+ ServerInfo inf;
+ inf.host = host;
+ inf.port = port;
+ inf.username = username;
+ inf.password = password;
+ inf.account = account;
+
+ bool present(false);
+ osl::MutexGuard aGuard(m_aMutex);
+ for(unsigned int i = 0; i < m_ServerInfo.size(); ++i)
+ if(host == m_ServerInfo[i].host &&
+ port == m_ServerInfo[i].port &&
+ username == m_ServerInfo[i].username)
+ {
+ present = true;
+ m_ServerInfo[i].password = password;
+ m_ServerInfo[i].account = account;
+ }
+
+ if(!present)
+ m_ServerInfo.push_back(inf);
+
+ return !present;
+}
+
+
+
+Reference<XContentProvider>
+FTPContentProvider::getHttpProvider()
+ throw(RuntimeException)
+{
+ // used for access to ftp-proxy
+ ucbhelper::ContentBroker *pBroker = ucbhelper::ContentBroker::get();
+
+ if(pBroker) {
+ Reference<XContentProviderManager > xManager(
+ pBroker->getContentProviderManagerInterface());
+
+ if(xManager.is())
+ return
+ xManager->queryContentProvider(
+ rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("http:")));
+ else
+ throw RuntimeException(
+ rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(
+ "bad ucbhelper::ContentBroker")),
+ *this);
+ } else
+ return 0;
+
+}