summaryrefslogtreecommitdiff
path: root/extensions/source/plugin/base/context.cxx
diff options
context:
space:
mode:
Diffstat (limited to 'extensions/source/plugin/base/context.cxx')
-rw-r--r--extensions/source/plugin/base/context.cxx343
1 files changed, 343 insertions, 0 deletions
diff --git a/extensions/source/plugin/base/context.cxx b/extensions/source/plugin/base/context.cxx
new file mode 100644
index 000000000000..27266579148e
--- /dev/null
+++ b/extensions/source/plugin/base/context.cxx
@@ -0,0 +1,343 @@
+/*************************************************************************
+ *
+ * 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_extensions.hxx"
+
+#if STLPORT_VERSION>=321
+#include <cstdarg>
+#include <cstdio>
+#endif
+
+#include <plugin/impl.hxx>
+
+#ifndef _COM_SUN_STAR_FRAME_FRAMESEARCHFLAGS_HPP_
+#include <com/sun/star/frame/FrameSearchFlag.hpp>
+#endif
+#include <com/sun/star/frame/XComponentLoader.hpp>
+#include <tools/fsys.hxx>
+#include <tools/urlobj.hxx>
+
+#include <cppuhelper/implbase1.hxx>
+
+using namespace com::sun::star::io;
+
+namespace ext_plug {
+
+class FileSink : public ::cppu::WeakAggImplHelper1< ::com::sun::star::io::XOutputStream >
+{
+private:
+ Reference< ::com::sun::star::lang::XMultiServiceFactory > m_xSMgr;
+ FILE* fp;
+ Reference< ::com::sun::star::plugin::XPlugin > m_xPlugin;
+ ::rtl::OUString m_aMIMEType;
+ ::rtl::OUString m_aTarget;
+ ::rtl::OUString m_aFileName;
+
+public:
+ FileSink( const Reference< ::com::sun::star::lang::XMultiServiceFactory > &,
+ const Reference< ::com::sun::star::plugin::XPlugin > & plugin,
+ const ::rtl::OUString& mimetype,
+ const ::rtl::OUString& target,
+ const Reference< ::com::sun::star::io::XActiveDataSource > & source );
+ virtual ~FileSink();
+
+ // ::com::sun::star::io::XOutputStream
+ virtual void SAL_CALL writeBytes( const Sequence<sal_Int8>& ) throw();
+ virtual void SAL_CALL flush() throw();
+ virtual void SAL_CALL closeOutput() throw();
+};
+
+}
+using namespace ext_plug;
+
+class XPluginContext_Impl : public ::cppu::WeakAggImplHelper1< ::com::sun::star::plugin::XPluginContext >
+{
+ Reference< ::com::sun::star::lang::XMultiServiceFactory > m_xSMgr;
+ rtl_TextEncoding m_aEncoding;
+public:
+
+ XPluginContext_Impl( const Reference< ::com::sun::star::lang::XMultiServiceFactory > & );
+ virtual ~XPluginContext_Impl();
+
+
+ virtual ::rtl::OUString SAL_CALL getValue(const Reference< ::com::sun::star::plugin::XPlugin > & plugin, ::com::sun::star::plugin::PluginVariable variable) throw( ::com::sun::star::plugin::PluginException, RuntimeException );
+ virtual void SAL_CALL getURLNotify(const Reference< ::com::sun::star::plugin::XPlugin > & plugin, const ::rtl::OUString& url, const ::rtl::OUString& target, const Reference< ::com::sun::star::lang::XEventListener > & listener) throw( ::com::sun::star::plugin::PluginException, RuntimeException );
+ virtual void SAL_CALL getURL(const Reference< ::com::sun::star::plugin::XPlugin > & plugin, const ::rtl::OUString& url, const ::rtl::OUString& target) throw( ::com::sun::star::plugin::PluginException, RuntimeException );
+ virtual void SAL_CALL postURLNotify(const Reference< ::com::sun::star::plugin::XPlugin > & plugin, const ::rtl::OUString& url, const ::rtl::OUString& target, const Sequence< sal_Int8 >& buf, sal_Bool file, const Reference< ::com::sun::star::lang::XEventListener > & listener) throw( ::com::sun::star::plugin::PluginException, RuntimeException );
+ virtual void SAL_CALL postURL(const Reference< ::com::sun::star::plugin::XPlugin > & plugin, const ::rtl::OUString& url, const ::rtl::OUString& target, const Sequence< sal_Int8 >& buf, sal_Bool file) throw( ::com::sun::star::plugin::PluginException, RuntimeException );
+ virtual void SAL_CALL newStream(const Reference< ::com::sun::star::plugin::XPlugin > & plugin, const ::rtl::OUString& mimetype, const ::rtl::OUString& target, const Reference< ::com::sun::star::io::XActiveDataSource > & source) throw( ::com::sun::star::plugin::PluginException, RuntimeException );
+ virtual void SAL_CALL displayStatusText(const Reference< ::com::sun::star::plugin::XPlugin > & plugin, const ::rtl::OUString& message) throw( ::com::sun::star::plugin::PluginException, RuntimeException );
+ virtual ::rtl::OUString SAL_CALL getUserAgent(const Reference< ::com::sun::star::plugin::XPlugin > & plugin) throw( ::com::sun::star::plugin::PluginException, RuntimeException );
+};
+
+Reference< ::com::sun::star::plugin::XPluginContext > XPluginManager_Impl::createPluginContext() throw()
+{
+ return new XPluginContext_Impl( m_xSMgr );
+}
+
+XPluginContext_Impl::XPluginContext_Impl( const Reference< ::com::sun::star::lang::XMultiServiceFactory > & rSMgr )
+ : m_xSMgr( rSMgr ),
+ m_aEncoding( gsl_getSystemTextEncoding() )
+{
+}
+
+XPluginContext_Impl::~XPluginContext_Impl()
+{
+}
+
+::rtl::OUString XPluginContext_Impl::getValue( const Reference< ::com::sun::star::plugin::XPlugin > & /*plugin*/, ::com::sun::star::plugin::PluginVariable /*variable*/ )
+ throw( ::com::sun::star::plugin::PluginException, RuntimeException )
+{
+ return ::rtl::OUString();
+}
+
+
+void XPluginContext_Impl::getURL(const Reference< ::com::sun::star::plugin::XPlugin > & plugin, const ::rtl::OUString& url, const ::rtl::OUString& target) throw( ::com::sun::star::plugin::PluginException, RuntimeException )
+{
+ Reference< XInterface > xInst = m_xSMgr->createInstance( ::rtl::OUString::createFromAscii( "com.sun.star.frame.Desktop" ) );
+ if( ! xInst.is() )
+ return;
+
+ if( ! target.getLength() )
+ {
+ INetURLObject aURL;
+ aURL.SetSmartProtocol( INET_PROT_FILE );
+ aURL.SetSmartURL( ::rtl::OUStringToOString( url, m_aEncoding ) );
+
+ rtl::OUString aUrl = aURL.GetMainURL(INetURLObject::DECODE_TO_IURI);
+ // the mimetype cannot be specified
+ plugin->provideNewStream( ::rtl::OUString(),
+ Reference< XActiveDataSource >(),
+ aUrl,
+ 0, 0, (sal_Bool)(aUrl.compareToAscii( "file:", 5 ) == 0) );
+ return;
+ }
+
+ Reference< ::com::sun::star::frame::XComponentLoader > xLoader( xInst, UNO_QUERY );
+ XPlugin_Impl* pPlugin = XPluginManager_Impl::getPluginImplementation( plugin );
+
+ if( xLoader.is() && pPlugin )
+ {
+ try
+ {
+ ::com::sun::star::beans::PropertyValue aValue;
+ aValue.Name = ::rtl::OUString::createFromAscii( "Referer" );
+ aValue.Value <<= pPlugin->getRefererURL();
+
+ Sequence< ::com::sun::star::beans::PropertyValue > aArgs( &aValue, 1 );
+ Reference< ::com::sun::star::lang::XComponent > xComp =
+ xLoader->loadComponentFromURL(
+ url,
+ target,
+ ::com::sun::star::frame::FrameSearchFlag::PARENT |
+ ::com::sun::star::frame::FrameSearchFlag::SELF |
+ ::com::sun::star::frame::FrameSearchFlag::CHILDREN |
+ ::com::sun::star::frame::FrameSearchFlag::SIBLINGS |
+ ::com::sun::star::frame::FrameSearchFlag::TASKS |
+ ::com::sun::star::frame::FrameSearchFlag::CREATE,
+ aArgs
+ );
+ }
+ catch(...)
+ {
+ throw ::com::sun::star::plugin::PluginException();
+ }
+ }
+}
+
+void XPluginContext_Impl::getURLNotify(const Reference< ::com::sun::star::plugin::XPlugin > & plugin, const ::rtl::OUString& url, const ::rtl::OUString& target, const Reference< ::com::sun::star::lang::XEventListener > & listener )
+ throw( ::com::sun::star::plugin::PluginException, RuntimeException )
+{
+ getURL( plugin, url, target );
+ if( listener.is() )
+ listener->disposing( ::com::sun::star::lang::EventObject() );
+}
+
+::rtl::OUString XPluginContext_Impl::getUserAgent(const Reference< ::com::sun::star::plugin::XPlugin > & /*plugin*/)
+ throw( ::com::sun::star::plugin::PluginException, RuntimeException )
+{
+ return ::rtl::OUString::createFromAscii( "Mozilla 3.0" );
+}
+
+void XPluginContext_Impl::displayStatusText(const Reference< ::com::sun::star::plugin::XPlugin > & /*plugin*/, const ::rtl::OUString& /*message*/)
+ throw( ::com::sun::star::plugin::PluginException, RuntimeException )
+{
+}
+
+void XPluginContext_Impl::postURL(const Reference< ::com::sun::star::plugin::XPlugin > & plugin, const ::rtl::OUString& url, const ::rtl::OUString& target, const Sequence< sal_Int8 >& buf, sal_Bool file)
+ throw( ::com::sun::star::plugin::PluginException, RuntimeException )
+{
+ Sequence< sal_Int8 > aBuf;
+
+ if( file )
+ {
+ String aFileName( (char*)buf.getConstArray(), m_aEncoding );
+ INetURLObject aFilePath( aFileName );
+ aFileName = aFilePath.PathToFileName();
+ SvFileStream aStream( aFileName, STREAM_READ );
+ if( aStream.IsOpen() )
+ {
+ int nBytes = 0;
+ aStream.Seek( STREAM_SEEK_TO_END );
+ aBuf = Sequence<sal_Int8>( nBytes = aStream.Tell() );
+ aStream.Seek( STREAM_SEEK_TO_BEGIN );
+ aStream.Read( aBuf.getArray(), nBytes );
+ aStream.Close();
+ DirEntry( aFileName ).Kill();
+ }
+ }
+
+ Reference< XInterface > xInst = m_xSMgr->createInstance( ::rtl::OUString::createFromAscii( "com.sun.star.frame.Desktop" ) );
+ if( ! xInst.is() )
+ return ;
+
+ Reference< ::com::sun::star::frame::XComponentLoader > xLoader( xInst, UNO_QUERY );
+ XPlugin_Impl* pPlugin = XPluginManager_Impl::getPluginImplementation( plugin );
+ if( xLoader.is() && pPlugin )
+ {
+ try
+ {
+ ::com::sun::star::beans::PropertyValue aValues[2];
+ aValues[0].Name = ::rtl::OUString::createFromAscii( "Referer" );
+ aValues[0].Value <<= pPlugin->getRefererURL();
+
+ aValues[1].Name = ::rtl::OUString::createFromAscii( "PostString" );
+ aValues[1].Value <<= ::rtl::OStringToOUString( (char*)( file ? aBuf : buf ).getConstArray(), m_aEncoding );
+ Sequence< ::com::sun::star::beans::PropertyValue > aArgs( aValues, 2 );
+ Reference< ::com::sun::star::lang::XComponent > xComp =
+ xLoader->loadComponentFromURL(
+ url,
+ target,
+ ::com::sun::star::frame::FrameSearchFlag::PARENT |
+ ::com::sun::star::frame::FrameSearchFlag::SELF |
+ ::com::sun::star::frame::FrameSearchFlag::CHILDREN |
+ ::com::sun::star::frame::FrameSearchFlag::SIBLINGS |
+ ::com::sun::star::frame::FrameSearchFlag::TASKS |
+ ::com::sun::star::frame::FrameSearchFlag::CREATE,
+ aArgs
+ );
+ }
+ catch( ... )
+ {
+ throw ::com::sun::star::plugin::PluginException();
+ }
+ }
+}
+
+void XPluginContext_Impl::postURLNotify(const Reference< ::com::sun::star::plugin::XPlugin > & plugin, const ::rtl::OUString& url, const ::rtl::OUString& target, const Sequence< sal_Int8 >& buf, sal_Bool file, const Reference< ::com::sun::star::lang::XEventListener > & listener )
+ throw( ::com::sun::star::plugin::PluginException, RuntimeException )
+{
+ postURL( plugin, url, target, buf, file );
+ if( listener.is() )
+ listener->disposing( ::com::sun::star::lang::EventObject() );
+}
+
+void XPluginContext_Impl::newStream( const Reference< ::com::sun::star::plugin::XPlugin > & plugin, const ::rtl::OUString& mimetype, const ::rtl::OUString& target, const Reference< ::com::sun::star::io::XActiveDataSource > & source )
+ throw( ::com::sun::star::plugin::PluginException, RuntimeException )
+{
+ FileSink* pNewSink = new FileSink( m_xSMgr, plugin, mimetype, target, source );
+ pNewSink->acquire();
+}
+
+
+
+FileSink::FileSink( const Reference< ::com::sun::star::lang::XMultiServiceFactory > & rSMgr, const Reference< ::com::sun::star::plugin::XPlugin > & plugin,
+ const ::rtl::OUString& mimetype,
+ const ::rtl::OUString& target, const Reference< ::com::sun::star::io::XActiveDataSource > & source ) :
+ m_xSMgr( rSMgr ),
+ m_xPlugin( plugin ),
+ m_aMIMEType( mimetype ),
+ m_aTarget( target )
+{
+ DirEntry aEntry;
+ m_aFileName = aEntry.TempName().GetFull();
+ ::rtl::OString aFile = ::rtl::OUStringToOString( m_aFileName, gsl_getSystemTextEncoding() );
+ fp = fopen( aFile.getStr() , "wb" );
+
+ Reference< ::com::sun::star::io::XActiveDataControl > xControl( source, UNO_QUERY );
+
+ source->setOutputStream( Reference< ::com::sun::star::io::XOutputStream > ( this ) );
+ if( xControl.is() )
+ xControl->start();
+}
+
+FileSink::~FileSink()
+{
+ DirEntry aEntry( m_aFileName );
+ aEntry.Kill();
+}
+
+void FileSink::closeOutput() throw()
+{
+ if( fp )
+ fclose( fp );
+
+ Reference< XInterface > xInst = m_xSMgr->createInstance( ::rtl::OUString::createFromAscii( "com.sun.star.frame.Desktop" ) );
+ Reference< ::com::sun::star::frame::XComponentLoader > xLoader( xInst, UNO_QUERY );
+ XPlugin_Impl* pPlugin = XPluginManager_Impl::getPluginImplementation( m_xPlugin );
+
+ if( xLoader.is() && pPlugin )
+ {
+ try
+ {
+ ::com::sun::star::beans::PropertyValue aValue;
+ aValue.Name = ::rtl::OUString::createFromAscii( "Referer" );
+ aValue.Value <<= pPlugin->getRefererURL();
+
+ Sequence< ::com::sun::star::beans::PropertyValue > aArgs( &aValue, 1 );
+ Reference< ::com::sun::star::lang::XComponent > xComp =
+ xLoader->loadComponentFromURL(
+ m_aFileName,
+ m_aTarget,
+ ::com::sun::star::frame::FrameSearchFlag::PARENT |
+ ::com::sun::star::frame::FrameSearchFlag::SELF |
+ ::com::sun::star::frame::FrameSearchFlag::CHILDREN |
+ ::com::sun::star::frame::FrameSearchFlag::SIBLINGS |
+ ::com::sun::star::frame::FrameSearchFlag::TASKS |
+ ::com::sun::star::frame::FrameSearchFlag::CREATE,
+ aArgs
+ );
+ }
+ catch( ... )
+ {
+ }
+ }
+ release();
+}
+
+void FileSink::writeBytes( const Sequence<sal_Int8>& Buffer ) throw()
+{
+ if( fp )
+ fwrite( Buffer.getConstArray(), 1, Buffer.getLength(), fp );
+}
+
+void FileSink::flush() throw()
+{
+ if( fp )
+ fflush( fp );
+}