summaryrefslogtreecommitdiff
path: root/ucbhelper/workben
diff options
context:
space:
mode:
Diffstat (limited to 'ucbhelper/workben')
-rw-r--r--ucbhelper/workben/myucp/exports.map8
-rw-r--r--ucbhelper/workben/myucp/makefile.mk93
-rw-r--r--ucbhelper/workben/myucp/myucp_content.cxx986
-rw-r--r--ucbhelper/workben/myucp/myucp_content.hxx194
-rw-r--r--ucbhelper/workben/myucp/myucp_contentcaps.cxx226
-rw-r--r--ucbhelper/workben/myucp/myucp_datasupplier.cxx401
-rw-r--r--ucbhelper/workben/myucp/myucp_datasupplier.hxx80
-rw-r--r--ucbhelper/workben/myucp/myucp_provider.cxx174
-rw-r--r--ucbhelper/workben/myucp/myucp_provider.hxx98
-rw-r--r--ucbhelper/workben/myucp/myucp_resultset.cxx100
-rw-r--r--ucbhelper/workben/myucp/myucp_resultset.hxx65
-rw-r--r--ucbhelper/workben/myucp/myucp_services.cxx139
-rw-r--r--ucbhelper/workben/ucbexplorer/bmp/document.bmpbin0 -> 1318 bytes
-rw-r--r--ucbhelper/workben/ucbexplorer/bmp/fldclose.bmpbin0 -> 298 bytes
-rw-r--r--ucbhelper/workben/ucbexplorer/bmp/fldopen.bmpbin0 -> 322 bytes
-rw-r--r--ucbhelper/workben/ucbexplorer/bmp/link.bmpbin0 -> 1318 bytes
-rw-r--r--ucbhelper/workben/ucbexplorer/makefile.mk75
-rw-r--r--ucbhelper/workben/ucbexplorer/ucbexplorer.cxx1199
-rw-r--r--ucbhelper/workben/ucbexplorer/ucbexplorer.hrc68
-rw-r--r--ucbhelper/workben/ucbexplorer/ucbexplorer.src159
20 files changed, 4065 insertions, 0 deletions
diff --git a/ucbhelper/workben/myucp/exports.map b/ucbhelper/workben/myucp/exports.map
new file mode 100644
index 000000000000..f4ed78b9e970
--- /dev/null
+++ b/ucbhelper/workben/myucp/exports.map
@@ -0,0 +1,8 @@
+UDK_3_0_0 {
+ global:
+ component_getImplementationEnvironment;
+ component_writeInfo;
+ component_getFactory;
+ local:
+ *;
+};
diff --git a/ucbhelper/workben/myucp/makefile.mk b/ucbhelper/workben/myucp/makefile.mk
new file mode 100644
index 000000000000..ca6b3f941b0e
--- /dev/null
+++ b/ucbhelper/workben/myucp/makefile.mk
@@ -0,0 +1,93 @@
+#*************************************************************************
+#
+# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+#
+# Copyright 2008 by Sun Microsystems, Inc.
+#
+# OpenOffice.org - a multi-platform office productivity suite
+#
+# $RCSfile: makefile.mk,v $
+#
+# $Revision: 1.5 $
+#
+# 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.
+#
+#*************************************************************************
+
+# @@@ UCP Version - Increase, if your UCP libraray becomes incompatible.
+UCP_VERSION=1
+
+# @@@ Name for your UCP. Will become part of the library name (See below).
+UCP_NAME=myucp
+
+# @@@ Relative path to project root.
+PRJ=..$/..
+
+# @@@ Name of the project your UCP code recides it.
+PRJNAME=ucbhelper
+
+TARGET=ucp$(UCP_NAME)$(UCP_VERSION).uno
+
+ENABLE_EXCEPTIONS=TRUE
+USE_DEFFILE=TRUE
+NO_BSYMBOLIC=TRUE
+
+# --- Settings ---------------------------------------------------------
+
+.INCLUDE: settings.mk
+
+# --- General -----------------------------------------------------
+
+# no "lib" prefix
+DLLPRE =
+
+# @@@ Adjust template file names. Add own files here.
+SLOFILES=\
+ $(SLO)$/myucp_services.obj \
+ $(SLO)$/myucp_provider.obj \
+ $(SLO)$/myucp_content.obj \
+ $(SLO)$/myucp_contentcaps.obj \
+ $(SLO)$/myucp_resultset.obj \
+ $(SLO)$/myucp_datasupplier.obj
+
+LIB1TARGET=$(SLB)$/_$(TARGET).lib
+LIB1OBJFILES=$(SLOFILES)
+
+# --- Shared-Library ---------------------------------------------------
+
+SHL1TARGET=$(TARGET)
+SHL1IMPLIB=i$(TARGET)
+SHL1VERSIONMAP=exports.map
+
+# @@@ Add additional libs here.
+SHL1STDLIBS=\
+ $(CPPUHELPERLIB) \
+ $(CPPULIB) \
+ $(SALLIB) \
+ $(SALHELPERLIB) \
+ $(UCBHELPERLIB)
+
+SHL1DEF=$(MISC)$/$(SHL1TARGET).def
+SHL1LIBS=$(LIB1TARGET)
+
+DEF1NAME=$(SHL1TARGET)
+
+# --- Targets ----------------------------------------------------------
+
+.INCLUDE: target.mk
+
diff --git a/ucbhelper/workben/myucp/myucp_content.cxx b/ucbhelper/workben/myucp/myucp_content.cxx
new file mode 100644
index 000000000000..2be1c0e8b844
--- /dev/null
+++ b/ucbhelper/workben/myucp/myucp_content.cxx
@@ -0,0 +1,986 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2008 by Sun Microsystems, Inc.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * $RCSfile: myucp_content.cxx,v $
+ * $Revision: 1.13 $
+ *
+ * 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_ucbhelper.hxx"
+
+/**************************************************************************
+ TODO
+ **************************************************************************
+
+ *************************************************************************/
+
+#include "osl/diagnose.h"
+
+#include "com/sun/star/beans/PropertyAttribute.hpp"
+#include "com/sun/star/beans/XPropertyAccess.hpp"
+#include "com/sun/star/lang/IllegalAccessException.hpp"
+#include "com/sun/star/sdbc/XRow.hpp"
+#include "com/sun/star/ucb/XCommandInfo.hpp"
+#include "com/sun/star/ucb/XPersistentPropertySet.hpp"
+#include "ucbhelper/contentidentifier.hxx"
+#include "ucbhelper/propertyvalueset.hxx"
+#include "ucbhelper/cancelcommandexecution.hxx"
+
+#include "myucp_content.hxx"
+#include "myucp_provider.hxx"
+
+#ifdef IMPLEMENT_COMMAND_INSERT
+#include "com/sun/star/ucb/InsertCommandArgument.hpp"
+#include "com/sun/star/ucb/MissingInputStreamException.hpp"
+#include "com/sun/star/ucb/MissingPropertiesException.hpp"
+#endif
+#ifdef IMPLEMENT_COMMAND_OPEN
+#include "com/sun/star/io/XOutputStream.hpp"
+#include "com/sun/star/io/XActiveDataSink.hpp"
+#include "com/sun/star/ucb/OpenCommandArgument2.hpp"
+#include "com/sun/star/ucb/OpenMode.hpp"
+#include "com/sun/star/ucb/UnsupportedDataSinkException.hpp"
+#include "com/sun/star/ucb/UnsupportedOpenModeException.hpp"
+#include "myucp_resultset.hxx"
+#endif
+
+using namespace com::sun::star;
+
+// @@@ Adjust namespace name.
+using namespace myucp;
+
+//=========================================================================
+//=========================================================================
+//
+// Content Implementation.
+//
+//=========================================================================
+//=========================================================================
+
+Content::Content( const uno::Reference< lang::XMultiServiceFactory >& rxSMgr,
+ ::ucbhelper::ContentProviderImplHelper* pProvider,
+ const uno::Reference< ucb::XContentIdentifier >& Identifier )
+: ContentImplHelper( rxSMgr, pProvider, Identifier )
+{
+ // @@@ Fill m_aProps here or implement lazy evaluation logic for this.
+ // m_aProps.aTitle =
+ // m_aprops.aContentType =
+ // m_aProps.bIsDocument =
+ // m_aProps.bIsFolder =
+}
+
+//=========================================================================
+// virtual
+Content::~Content()
+{
+}
+
+//=========================================================================
+//
+// XInterface methods.
+//
+//=========================================================================
+
+// virtual
+void SAL_CALL Content::acquire()
+ throw()
+{
+ ContentImplHelper::acquire();
+}
+
+//=========================================================================
+// virtual
+void SAL_CALL Content::release()
+ throw()
+{
+ ContentImplHelper::release();
+}
+
+//=========================================================================
+// virtual
+uno::Any SAL_CALL Content::queryInterface( const uno::Type & rType )
+ throw ( uno::RuntimeException )
+{
+ uno::Any aRet;
+
+ // @@@ Add support for additional interfaces.
+#if 0
+ aRet = cppu::queryInterface( rType,
+ static_cast< yyy::Xxxxxxxxx * >( this ) );
+#endif
+
+ return aRet.hasValue() ? aRet : ContentImplHelper::queryInterface( rType );
+}
+
+//=========================================================================
+//
+// XTypeProvider methods.
+//
+//=========================================================================
+
+XTYPEPROVIDER_COMMON_IMPL( Content );
+
+//=========================================================================
+// virtual
+uno::Sequence< uno::Type > SAL_CALL Content::getTypes()
+ throw( uno::RuntimeException )
+{
+ // @@@ Add own interfaces.
+
+ static cppu::OTypeCollection* pCollection = 0;
+
+ if ( !pCollection )
+ {
+ osl::Guard< osl::Mutex > aGuard( osl::Mutex::getGlobalMutex() );
+ if ( !pCollection )
+ {
+ static cppu::OTypeCollection aCollection(
+ CPPU_TYPE_REF( lang::XTypeProvider ),
+ CPPU_TYPE_REF( lang::XServiceInfo ),
+ CPPU_TYPE_REF( lang::XComponent ),
+ CPPU_TYPE_REF( ucb::XContent ),
+ CPPU_TYPE_REF( ucb::XCommandProcessor ),
+ CPPU_TYPE_REF( beans::XPropertiesChangeNotifier ),
+ CPPU_TYPE_REF( ucb::XCommandInfoChangeNotifier ),
+ CPPU_TYPE_REF( beans::XPropertyContainer ),
+ CPPU_TYPE_REF( beans::XPropertySetInfoChangeNotifier ),
+ CPPU_TYPE_REF( container::XChild ) );
+ pCollection = &aCollection;
+ }
+ }
+
+ return (*pCollection).getTypes();
+}
+
+//=========================================================================
+//
+// XServiceInfo methods.
+//
+//=========================================================================
+
+// virtual
+rtl::OUString SAL_CALL Content::getImplementationName()
+ throw( uno::RuntimeException )
+{
+ // @@@ Adjust implementation name.
+ // Prefix with reversed company domain name.
+ return rtl::OUString::createFromAscii( "com.sun.star.comp.myucp.Content" );
+}
+
+//=========================================================================
+// virtual
+uno::Sequence< rtl::OUString > SAL_CALL Content::getSupportedServiceNames()
+ throw( uno::RuntimeException )
+{
+ // @@@ Adjust macro name.
+ uno::Sequence< rtl::OUString > aSNS( 1 );
+ aSNS.getArray()[ 0 ]
+ = rtl::OUString::createFromAscii( MYUCP_CONTENT_SERVICE_NAME );
+ return aSNS;
+}
+
+//=========================================================================
+//
+// XContent methods.
+//
+//=========================================================================
+
+// virtual
+rtl::OUString SAL_CALL Content::getContentType()
+ throw( uno::RuntimeException )
+{
+ // @@@ Adjust macro name ( def in myucp_provider.hxx ).
+ return rtl::OUString::createFromAscii( MYUCP_CONTENT_TYPE );
+}
+
+//=========================================================================
+//
+// XCommandProcessor methods.
+//
+//=========================================================================
+
+// virtual
+uno::Any SAL_CALL Content::execute(
+ const ucb::Command& aCommand,
+ sal_Int32 /* CommandId */,
+ const uno::Reference< ucb::XCommandEnvironment >& Environment )
+ throw( uno::Exception,
+ ucb::CommandAbortedException,
+ uno::RuntimeException )
+{
+ uno::Any aRet;
+
+ if ( aCommand.Name.equalsAsciiL(
+ RTL_CONSTASCII_STRINGPARAM( "getPropertyValues" ) ) )
+ {
+ //////////////////////////////////////////////////////////////////
+ // getPropertyValues
+ //////////////////////////////////////////////////////////////////
+
+ uno::Sequence< beans::Property > Properties;
+ if ( !( aCommand.Argument >>= Properties ) )
+ {
+ OSL_ENSURE( sal_False, "Wrong argument type!" );
+ ::ucbhelper::cancelCommandExecution(
+ uno::makeAny( lang::IllegalArgumentException(
+ rtl::OUString(),
+ static_cast< cppu::OWeakObject * >( this ),
+ -1 ) ),
+ Environment );
+ // Unreachable
+ }
+
+ aRet <<= getPropertyValues( Properties, Environment );
+ }
+ else if ( aCommand.Name.equalsAsciiL(
+ RTL_CONSTASCII_STRINGPARAM( "setPropertyValues" ) ) )
+ {
+ //////////////////////////////////////////////////////////////////
+ // setPropertyValues
+ //////////////////////////////////////////////////////////////////
+
+ uno::Sequence< beans::PropertyValue > aProperties;
+ if ( !( aCommand.Argument >>= aProperties ) )
+ {
+ OSL_ENSURE( sal_False, "Wrong argument type!" );
+ ::ucbhelper::cancelCommandExecution(
+ uno::makeAny( lang::IllegalArgumentException(
+ rtl::OUString(),
+ static_cast< cppu::OWeakObject * >( this ),
+ -1 ) ),
+ Environment );
+ // Unreachable
+ }
+
+ if ( !aProperties.getLength() )
+ {
+ OSL_ENSURE( sal_False, "No properties!" );
+ ::ucbhelper::cancelCommandExecution(
+ uno::makeAny( lang::IllegalArgumentException(
+ rtl::OUString(),
+ static_cast< cppu::OWeakObject * >( this ),
+ -1 ) ),
+ Environment );
+ // Unreachable
+ }
+
+ aRet <<= setPropertyValues( aProperties, Environment );
+ }
+ else if ( aCommand.Name.equalsAsciiL(
+ RTL_CONSTASCII_STRINGPARAM( "getPropertySetInfo" ) ) )
+ {
+ //////////////////////////////////////////////////////////////////
+ // getPropertySetInfo
+ //////////////////////////////////////////////////////////////////
+
+ // Note: Implemented by base class.
+ aRet <<= getPropertySetInfo( Environment );
+ }
+ else if ( aCommand.Name.equalsAsciiL(
+ RTL_CONSTASCII_STRINGPARAM( "getCommandInfo" ) ) )
+ {
+ //////////////////////////////////////////////////////////////////
+ // getCommandInfo
+ //////////////////////////////////////////////////////////////////
+
+ // Note: Implemented by base class.
+ aRet <<= getCommandInfo( Environment );
+ }
+#ifdef IMPLEMENT_COMMAND_OPEN
+ else if ( aCommand.Name.equalsAsciiL(
+ RTL_CONSTASCII_STRINGPARAM( "open" ) ) )
+ {
+ ucb::OpenCommandArgument2 aOpenCommand;
+ if ( !( aCommand.Argument >>= aOpenCommand ) )
+ {
+ OSL_ENSURE( sal_False, "Wrong argument type!" );
+ ::ucbhelper::cancelCommandExecution(
+ uno::makeAny( lang::IllegalArgumentException(
+ rtl::OUString(),
+ static_cast< cppu::OWeakObject * >( this ),
+ -1 ) ),
+ Environment );
+ // Unreachable
+ }
+
+ sal_Bool bOpenFolder =
+ ( ( aOpenCommand.Mode == ucb::OpenMode::ALL ) ||
+ ( aOpenCommand.Mode == ucb::OpenMode::FOLDERS ) ||
+ ( aOpenCommand.Mode == ucb::OpenMode::DOCUMENTS ) );
+
+ if ( bOpenFolder /*&& isFolder( Environment )*/ )
+ {
+ // open as folder - return result set
+
+ uno::Reference< ucb::XDynamicResultSet > xSet
+ = new DynamicResultSet( m_xSMgr,
+ this,
+ aOpenCommand,
+ Environment );
+ aRet <<= xSet;
+ }
+
+ if ( aOpenCommand.Sink.is() )
+ {
+ // Open document - supply document data stream.
+
+ // Check open mode
+ if ( ( aOpenCommand.Mode
+ == ucb::OpenMode::DOCUMENT_SHARE_DENY_NONE ) ||
+ ( aOpenCommand.Mode
+ == ucb::OpenMode::DOCUMENT_SHARE_DENY_WRITE ) )
+ {
+ // Unsupported.
+ ::ucbhelper::cancelCommandExecution(
+ uno::makeAny( ucb::UnsupportedOpenModeException(
+ rtl::OUString(),
+ static_cast< cppu::OWeakObject * >( this ),
+ sal_Int16( aOpenCommand.Mode ) ) ),
+ Environment );
+ // Unreachable
+ }
+
+
+ rtl::OUString aURL = m_xIdentifier->getContentIdentifier();
+ uno::Reference< io::XOutputStream > xOut
+ = uno::Reference< io::XOutputStream >(
+ aOpenCommand.Sink, uno::UNO_QUERY );
+ if ( xOut.is() )
+ {
+ // @@@ write data into xOut
+ }
+ else
+ {
+ uno::Reference< io::XActiveDataSink > xDataSink(
+ aOpenCommand.Sink, uno::UNO_QUERY );
+ if ( xDataSink.is() )
+ {
+ uno::Reference< io::XInputStream > xIn
+ /* @@@ your XInputStream + XSeekable impl. object */;
+ xDataSink->setInputStream( xIn );
+ }
+ else
+ {
+ // Note: aOpenCommand.Sink may contain an XStream
+ // implementation. Support for this type of
+ // sink is optional...
+ ::ucbhelper::cancelCommandExecution(
+ uno::makeAny( ucb::UnsupportedDataSinkException(
+ rtl::OUString(),
+ static_cast< cppu::OWeakObject * >( this ),
+ aOpenCommand.Sink ) ),
+ Environment );
+ // Unreachable
+ }
+ }
+ }
+ }
+#endif // IMPLEMENT_COMMAND_OPEN
+
+#ifdef IMPLEMENT_COMMAND_INSERT
+ else if ( aCommand.Name.equalsAsciiL(
+ RTL_CONSTASCII_STRINGPARAM( "insert" ) ) )
+ {
+ //////////////////////////////////////////////////////////////////
+ // insert
+ //////////////////////////////////////////////////////////////////
+
+ ucb::InsertCommandArgument arg;
+ if ( !( aCommand.Argument >>= arg ) )
+ {
+ OSL_ENSURE( sal_False, "Wrong argument type!" );
+ ::ucbhelper::cancelCommandExecution(
+ uno::makeAny( lang::IllegalArgumentException(
+ rtl::OUString(),
+ static_cast< cppu::OWeakObject * >( this ),
+ -1 ) ),
+ Environment );
+ // Unreachable
+ }
+
+ insert( arg.Data, arg.ReplaceExisting, Environment );
+ }
+#endif // IMPLEMENT_COMMAND_INSERT
+
+#ifdef IMPLEMENT_COMMAND_DELETE
+ else if ( aCommand.Name.equalsAsciiL(
+ RTL_CONSTASCII_STRINGPARAM( "delete" ) ) )
+ {
+ //////////////////////////////////////////////////////////////////
+ // delete
+ //////////////////////////////////////////////////////////////////
+
+ sal_Bool bDeletePhysical = sal_False;
+ aCommand.Argument >>= bDeletePhysical;
+ destroy( bDeletePhysical );
+
+ // Remove own and all children's Additional Core Properties.
+ removeAdditionalPropertySet( sal_True );
+
+ // Remove own and all childrens(!) persistent data.
+// removeData();
+ }
+#endif // IMPLEMENT_COMMAND_DELETE
+ else
+ {
+ //////////////////////////////////////////////////////////////////
+ // Unsupported command
+ //////////////////////////////////////////////////////////////////
+
+ OSL_ENSURE( sal_False, "Content::execute - unsupported command!" );
+
+ ::ucbhelper::cancelCommandExecution(
+ uno::makeAny( ucb::UnsupportedCommandException(
+ rtl::OUString(),
+ static_cast< cppu::OWeakObject * >( this ) ) ),
+ Environment );
+ // Unreachable
+ }
+
+ return aRet;
+}
+
+//=========================================================================
+// virtual
+void SAL_CALL Content::abort( sal_Int32 )
+ throw( uno::RuntimeException )
+{
+ // @@@ Implement logic to abort running commands, if this makes
+ // sense for your content.
+}
+
+//=========================================================================
+//
+// Non-interface methods.
+//
+//=========================================================================
+
+// virtual
+rtl::OUString Content::getParentURL()
+{
+ rtl::OUString aURL = m_xIdentifier->getContentIdentifier();
+
+ // @@@ Extract URL of parent from aURL and return it...
+
+ return rtl::OUString();
+}
+
+//=========================================================================
+// static
+uno::Reference< sdbc::XRow > Content::getPropertyValues(
+ const uno::Reference< lang::XMultiServiceFactory >& rSMgr,
+ const uno::Sequence< beans::Property >& rProperties,
+ const ContentProperties& rData,
+ const rtl::Reference<
+ ::ucbhelper::ContentProviderImplHelper >& rProvider,
+ const rtl::OUString& rContentId )
+{
+ // Note: Empty sequence means "get values of all supported properties".
+
+ rtl::Reference< ::ucbhelper::PropertyValueSet > xRow
+ = new ::ucbhelper::PropertyValueSet( rSMgr );
+
+ sal_Int32 nCount = rProperties.getLength();
+ if ( nCount )
+ {
+ uno::Reference< beans::XPropertySet > xAdditionalPropSet;
+ sal_Bool bTriedToGetAdditonalPropSet = sal_False;
+
+ const beans::Property* pProps = rProperties.getConstArray();
+ for ( sal_Int32 n = 0; n < nCount; ++n )
+ {
+ const beans::Property& rProp = pProps[ n ];
+
+ // Process Core properties.
+
+ if ( rProp.Name.equalsAsciiL(
+ RTL_CONSTASCII_STRINGPARAM( "ContentType" ) ) )
+ {
+ xRow->appendString ( rProp, rData.aContentType );
+ }
+ else if ( rProp.Name.equalsAsciiL(
+ RTL_CONSTASCII_STRINGPARAM( "Title" ) ) )
+ {
+ xRow->appendString ( rProp, rData.aTitle );
+ }
+ else if ( rProp.Name.equalsAsciiL(
+ RTL_CONSTASCII_STRINGPARAM( "IsDocument" ) ) )
+ {
+ xRow->appendBoolean( rProp, rData.bIsDocument );
+ }
+ else if ( rProp.Name.equalsAsciiL(
+ RTL_CONSTASCII_STRINGPARAM( "IsFolder" ) ) )
+ {
+ xRow->appendBoolean( rProp, rData.bIsFolder );
+ }
+
+ // @@@ Process other properties supported directly.
+#if 0
+ else if ( rProp.Name.equalsAsciiL(
+ RTL_CONSTASCII_STRINGPARAM( "xxxxxx" ) ) )
+ {
+ }
+#endif
+ else
+ {
+ // @@@ Note: If your data source supports adding/removing
+ // properties, you should implement the interface
+ // XPropertyContainer by yourself and supply your own
+ // logic here. The base class uses the service
+ // "com.sun.star.ucb.Store" to maintain Additional Core
+ // properties. But using server functionality is preferred!
+
+ // Not a Core Property! Maybe it's an Additional Core Property?!
+
+ if ( !bTriedToGetAdditonalPropSet && !xAdditionalPropSet.is() )
+ {
+ xAdditionalPropSet
+ = uno::Reference< beans::XPropertySet >(
+ rProvider->getAdditionalPropertySet( rContentId,
+ sal_False ),
+ uno::UNO_QUERY );
+ bTriedToGetAdditonalPropSet = sal_True;
+ }
+
+ if ( xAdditionalPropSet.is() )
+ {
+ if ( !xRow->appendPropertySetValue(
+ xAdditionalPropSet,
+ rProp ) )
+ {
+ // Append empty entry.
+ xRow->appendVoid( rProp );
+ }
+ }
+ else
+ {
+ // Append empty entry.
+ xRow->appendVoid( rProp );
+ }
+ }
+ }
+ }
+ else
+ {
+ // Append all Core Properties.
+ xRow->appendString (
+ beans::Property( rtl::OUString::createFromAscii( "ContentType" ),
+ -1,
+ getCppuType( static_cast< const rtl::OUString * >( 0 ) ),
+ beans::PropertyAttribute::BOUND
+ | beans::PropertyAttribute::READONLY ),
+ rData.aContentType );
+ xRow->appendString (
+ beans::Property( rtl::OUString::createFromAscii( "Title" ),
+ -1,
+ getCppuType( static_cast< const rtl::OUString * >( 0 ) ),
+ beans::PropertyAttribute::BOUND ),
+ rData.aTitle );
+ xRow->appendBoolean(
+ beans::Property( rtl::OUString::createFromAscii( "IsDocument" ),
+ -1,
+ getCppuBooleanType(),
+ beans::PropertyAttribute::BOUND
+ | beans::PropertyAttribute::READONLY ),
+ rData.bIsDocument );
+ xRow->appendBoolean(
+ beans::Property( rtl::OUString::createFromAscii( "IsFolder" ),
+ -1,
+ getCppuBooleanType(),
+ beans::PropertyAttribute::BOUND
+ | beans::PropertyAttribute::READONLY ),
+ rData.bIsFolder );
+
+ // @@@ Append other properties supported directly.
+
+ // @@@ Note: If your data source supports adding/removing
+ // properties, you should implement the interface
+ // XPropertyContainer by yourself and supply your own
+ // logic here. The base class uses the service
+ // "com.sun.star.ucb.Store" to maintain Additional Core
+ // properties. But using server functionality is preferred!
+
+ // Append all Additional Core Properties.
+
+ uno::Reference< beans::XPropertySet > xSet(
+ rProvider->getAdditionalPropertySet( rContentId, sal_False ),
+ uno::UNO_QUERY );
+ xRow->appendPropertySet( xSet );
+ }
+
+ return uno::Reference< sdbc::XRow >( xRow.get() );
+}
+
+//=========================================================================
+uno::Reference< sdbc::XRow > Content::getPropertyValues(
+ const uno::Sequence< beans::Property >& rProperties,
+ const uno::Reference< ucb::XCommandEnvironment >& /* xEnv */)
+{
+ osl::Guard< osl::Mutex > aGuard( m_aMutex );
+ return getPropertyValues( m_xSMgr,
+ rProperties,
+ m_aProps,
+ rtl::Reference<
+ ::ucbhelper::ContentProviderImplHelper >(
+ m_xProvider.get() ),
+ m_xIdentifier->getContentIdentifier() );
+}
+
+//=========================================================================
+uno::Sequence< uno::Any > Content::setPropertyValues(
+ const uno::Sequence< beans::PropertyValue >& rValues,
+ const uno::Reference< ucb::XCommandEnvironment >& /* xEnv */)
+{
+ osl::ClearableGuard< osl::Mutex > aGuard( m_aMutex );
+
+ uno::Sequence< uno::Any > aRet( rValues.getLength() );
+ uno::Sequence< beans::PropertyChangeEvent > aChanges( rValues.getLength() );
+ sal_Int32 nChanged = 0;
+
+ beans::PropertyChangeEvent aEvent;
+ aEvent.Source = static_cast< cppu::OWeakObject * >( this );
+ aEvent.Further = sal_False;
+// aEvent.PropertyName =
+ aEvent.PropertyHandle = -1;
+// aEvent.OldValue =
+// aEvent.NewValue =
+
+ const beans::PropertyValue* pValues = rValues.getConstArray();
+ sal_Int32 nCount = rValues.getLength();
+
+ uno::Reference< ucb::XPersistentPropertySet > xAdditionalPropSet;
+ sal_Bool bTriedToGetAdditonalPropSet = sal_False;
+
+ for ( sal_Int32 n = 0; n < nCount; ++n )
+ {
+ const beans::PropertyValue& rValue = pValues[ n ];
+
+ if ( rValue.Name.equalsAsciiL(
+ RTL_CONSTASCII_STRINGPARAM( "ContentType" ) ) )
+ {
+ // Read-only property!
+ aRet[ n ] <<= lang::IllegalAccessException(
+ rtl::OUString::createFromAscii(
+ "Property is read-only!" ),
+ static_cast< cppu::OWeakObject * >( this ) );
+ }
+ else if ( rValue.Name.equalsAsciiL(
+ RTL_CONSTASCII_STRINGPARAM( "IsDocument" ) ) )
+ {
+ // Read-only property!
+ aRet[ n ] <<= lang::IllegalAccessException(
+ rtl::OUString::createFromAscii(
+ "Property is read-only!" ),
+ static_cast< cppu::OWeakObject * >( this ) );
+ }
+ else if ( rValue.Name.equalsAsciiL(
+ RTL_CONSTASCII_STRINGPARAM( "IsFolder" ) ) )
+ {
+ // Read-only property!
+ aRet[ n ] <<= lang::IllegalAccessException(
+ rtl::OUString::createFromAscii(
+ "Property is read-only!" ),
+ static_cast< cppu::OWeakObject * >( this ) );
+ }
+ else if ( rValue.Name.equalsAsciiL(
+ RTL_CONSTASCII_STRINGPARAM( "Title" ) ) )
+ {
+ rtl::OUString aNewValue;
+ if ( rValue.Value >>= aNewValue )
+ {
+ if ( aNewValue != m_aProps.aTitle )
+ {
+ aEvent.PropertyName = rValue.Name;
+ aEvent.OldValue = uno::makeAny( m_aProps.aTitle );
+ aEvent.NewValue = uno::makeAny( aNewValue );
+
+ aChanges.getArray()[ nChanged ] = aEvent;
+
+ m_aProps.aTitle = aNewValue;
+ nChanged++;
+ }
+ else
+ {
+ // Old value equals new value. No error!
+ }
+ }
+ else
+ {
+ aRet[ n ] <<= beans::IllegalTypeException(
+ rtl::OUString::createFromAscii(
+ "Property value has wrong type!" ),
+ static_cast< cppu::OWeakObject * >( this ) );
+ }
+ }
+
+ // @@@ Process other properties supported directly.
+#if 0
+ else if ( rValue.Name.equalsAsciiL(
+ RTL_CONSTASCII_STRINGPARAM( "xxxxxx" ) ) )
+ {
+ }
+#endif
+ else
+ {
+ // @@@ Note: If your data source supports adding/removing
+ // properties, you should implement the interface
+ // XPropertyContainer by yourself and supply your own
+ // logic here. The base class uses the service
+ // "com.sun.star.ucb.Store" to maintain Additional Core
+ // properties. But using server functionality is preferred!
+
+ // Not a Core Property! Maybe it's an Additional Core Property?!
+
+ if ( !bTriedToGetAdditonalPropSet && !xAdditionalPropSet.is() )
+ {
+ xAdditionalPropSet = getAdditionalPropertySet( sal_False );
+ bTriedToGetAdditonalPropSet = sal_True;
+ }
+
+ if ( xAdditionalPropSet.is() )
+ {
+ try
+ {
+ uno::Any aOldValue
+ = xAdditionalPropSet->getPropertyValue( rValue.Name );
+ if ( aOldValue != rValue.Value )
+ {
+ xAdditionalPropSet->setPropertyValue(
+ rValue.Name, rValue.Value );
+
+ aEvent.PropertyName = rValue.Name;
+ aEvent.OldValue = aOldValue;
+ aEvent.NewValue = rValue.Value;
+
+ aChanges.getArray()[ nChanged ] = aEvent;
+ nChanged++;
+ }
+ else
+ {
+ // Old value equals new value. No error!
+ }
+ }
+ catch ( beans::UnknownPropertyException const & e )
+ {
+ aRet[ n ] <<= e;
+ }
+ catch ( lang::WrappedTargetException const & e )
+ {
+ aRet[ n ] <<= e;
+ }
+ catch ( beans::PropertyVetoException const & e )
+ {
+ aRet[ n ] <<= e;
+ }
+ catch ( lang::IllegalArgumentException const & e )
+ {
+ aRet[ n ] <<= e;
+ }
+ }
+ else
+ {
+ aRet[ n ] <<= uno::Exception(
+ rtl::OUString::createFromAscii(
+ "No property set for storing the value!" ),
+ static_cast< cppu::OWeakObject * >( this ) );
+ }
+ }
+ }
+
+ if ( nChanged > 0 )
+ {
+ // @@@ Save changes.
+// storeData();
+
+ aGuard.clear();
+ aChanges.realloc( nChanged );
+ notifyPropertiesChange( aChanges );
+ }
+
+ return aRet;
+}
+
+#ifdef IMPLEMENT_COMMAND_INSERT
+
+//=========================================================================
+void Content::queryChildren( ContentRefList& rChildren )
+{
+ // @@@ Adapt method to your URL scheme...
+
+ // Obtain a list with a snapshot of all currently instanciated contents
+ // from provider and extract the contents which are direct children
+ // of this content.
+
+ ::ucbhelper::ContentRefList aAllContents;
+ m_xProvider->queryExistingContents( aAllContents );
+
+ ::rtl::OUString aURL = m_xIdentifier->getContentIdentifier();
+ sal_Int32 nPos = aURL.lastIndexOf( '/' );
+
+ if ( nPos != ( aURL.getLength() - 1 ) )
+ {
+ // No trailing slash found. Append.
+ aURL += ::rtl::OUString::createFromAscii( "/" );
+ }
+
+ sal_Int32 nLen = aURL.getLength();
+
+ ::ucbhelper::ContentRefList::const_iterator it = aAllContents.begin();
+ ::ucbhelper::ContentRefList::const_iterator end = aAllContents.end();
+
+ while ( it != end )
+ {
+ ::ucbhelper::ContentImplHelperRef xChild = (*it);
+ ::rtl::OUString aChildURL
+ = xChild->getIdentifier()->getContentIdentifier();
+
+ // Is aURL a prefix of aChildURL?
+ if ( ( aChildURL.getLength() > nLen ) &&
+ ( aChildURL.compareTo( aURL, nLen ) == 0 ) )
+ {
+ nPos = aChildURL.indexOf( '/', nLen );
+
+ if ( ( nPos == -1 ) ||
+ ( nPos == ( aChildURL.getLength() - 1 ) ) )
+ {
+ // No further slashes / only a final slash. It's a child!
+ rChildren.push_back(
+ ContentRef(
+ static_cast< Content * >( xChild.get() ) ) );
+ }
+ }
+ ++it;
+ }
+}
+
+//=========================================================================
+void Content::insert(
+ const uno::Reference< io::XInputStream > & xInputStream,
+ sal_Bool bReplaceExisting,
+ const uno::Reference< ucb::XCommandEnvironment >& Environment )
+ throw( uno::Exception )
+{
+ osl::ClearableGuard< osl::Mutex > aGuard( m_aMutex );
+
+ // Check, if all required properties were set.
+
+#if 0
+ // @@@ add checks for property presence
+ if ( m_aProps.xxxx == yyyyy )
+ {
+ OSL_ENSURE( sal_False, "Content::insert - property value missing!" );
+
+ uno::Sequence< rtl::OUString > aProps( 1 );
+ aProps[ 0 ] = rtl::OUString::createFromAscii( "zzzz" );
+ ::ucbhelper::cancelCommandExecution(
+ uno::makeAny( ucb::MissingPropertiesException(
+ rtl::OUString(),
+ static_cast< cppu::OWeakObject * >( this ),
+ aProps ) ),
+ Environment );
+ // Unreachable
+ }
+#endif
+
+ bool bNeedInputStream = true; // @@@ adjust to real requirements
+ if ( bNeedInputStream && !xInputStream.is() )
+ {
+ OSL_ENSURE( sal_False, "Content::insert - No data stream!" );
+
+ ::ucbhelper::cancelCommandExecution(
+ uno::makeAny( ucb::MissingInputStreamException(
+ rtl::OUString(),
+ static_cast< cppu::OWeakObject * >( this ) ) ),
+ Environment );
+ // Unreachable
+ }
+
+ // Assemble new content identifier...
+
+ uno::Reference< ucb::XContentIdentifier > xId /* @@@ create content identifier */;
+
+ // Fail, if a resource with given id already exists.
+ if ( !bReplaceExisting /*&& hasData( xId ) @@@ impl for hasData() */ )
+ {
+ uno::Any aProps
+ = uno::makeAny( beans::PropertyValue(
+ rtl::OUString(
+ RTL_CONSTASCII_USTRINGPARAM( "Uri" ) ),
+ -1,
+ uno::makeAny( xId->getContentIdentifier() ),
+ beans::PropertyState_DIRECT_VALUE ) );
+ ucbhelper::cancelCommandExecution(
+ ucb::IOErrorCode_ALREADY_EXISTING,
+ uno::Sequence< uno::Any >(&aProps, 1),
+ Environment,
+ rtl::OUString::createFromAscii( "content already existing!!" ),
+ this );
+ // Unreachable
+ }
+
+ m_xIdentifier = xId;
+
+// @@@
+// storeData();
+
+ aGuard.clear();
+ inserted();
+}
+
+#endif // IMPLEMENT_COMMAND_INSERT
+
+#ifdef IMPLEMENT_COMMAND_DELETE
+
+//=========================================================================
+void Content::destroy( sal_Bool bDeletePhysical )
+ throw( uno::Exception )
+{
+ // @@@ take care about bDeletePhysical -> trashcan support
+
+ uno::Reference< ucb::XContent > xThis = this;
+
+ deleted();
+
+ osl::Guard< osl::Mutex > aGuard( m_aMutex );
+
+ // Process instanciated children...
+
+ ContentRefList aChildren;
+ queryChildren( aChildren );
+
+ ContentRefList::const_iterator it = aChildren.begin();
+ ContentRefList::const_iterator end = aChildren.end();
+
+ while ( it != end )
+ {
+ (*it)->destroy( bDeletePhysical );
+ ++it;
+ }
+}
+
+#endif // IMPLEMENT_COMMAND_DELETE
+
+
diff --git a/ucbhelper/workben/myucp/myucp_content.hxx b/ucbhelper/workben/myucp/myucp_content.hxx
new file mode 100644
index 000000000000..a570533c2519
--- /dev/null
+++ b/ucbhelper/workben/myucp/myucp_content.hxx
@@ -0,0 +1,194 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2008 by Sun Microsystems, Inc.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * $RCSfile: myucp_content.hxx,v $
+ * $Revision: 1.9 $
+ *
+ * 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.
+ *
+ ************************************************************************/
+
+// @@@ Adjust multi-include-protection-ifdef.
+#ifndef _MYUCP_CONTENT_HXX
+#define _MYUCP_CONTENT_HXX
+
+#include <list>
+
+#include "rtl/ref.hxx"
+#include "ucbhelper/contenthelper.hxx"
+
+namespace com { namespace sun { namespace star { namespace beans {
+ struct Property;
+ struct PropertyValue;
+} } } }
+
+namespace com { namespace sun { namespace star { namespace sdbc {
+ class XRow;
+} } } }
+
+namespace com { namespace sun { namespace star { namespace io {
+ class XInputStream;
+} } } }
+
+// @@@ Adjust namespace name.
+namespace myucp
+{
+
+//=========================================================================
+
+// @@@ Adjust service name.
+
+// UNO service name for the content. Prefix with reversed company domain main.
+#define MYUCP_CONTENT_SERVICE_NAME "com.sun.star.ucb.MyContent"
+
+//=========================================================================
+
+struct ContentProperties
+{
+ ::rtl::OUString aTitle; // Title
+ ::rtl::OUString aContentType; // ContentType
+ sal_Bool bIsDocument; // IsDocument
+ sal_Bool bIsFolder; // IsFolder
+
+ // @@@ Add other properties supported by your content.
+
+ ContentProperties()
+ : bIsDocument( sal_True ), bIsFolder( sal_False ) {}
+};
+
+//=========================================================================
+
+class Content : public ::ucbhelper::ContentImplHelper
+{
+ ContentProperties m_aProps;
+
+private:
+ virtual com::sun::star::uno::Sequence< com::sun::star::beans::Property >
+ getProperties( const com::sun::star::uno::Reference<
+ com::sun::star::ucb::XCommandEnvironment > & xEnv );
+ virtual com::sun::star::uno::Sequence< com::sun::star::ucb::CommandInfo >
+ getCommands( const com::sun::star::uno::Reference<
+ com::sun::star::ucb::XCommandEnvironment > & xEnv );
+ virtual ::rtl::OUString getParentURL();
+
+ ::com::sun::star::uno::Reference< ::com::sun::star::sdbc::XRow >
+ getPropertyValues( const ::com::sun::star::uno::Sequence<
+ ::com::sun::star::beans::Property >& rProperties,
+ const ::com::sun::star::uno::Reference<
+ ::com::sun::star::ucb::XCommandEnvironment >& xEnv );
+ ::com::sun::star::uno::Sequence< ::com::sun::star::uno::Any >
+ setPropertyValues( const ::com::sun::star::uno::Sequence<
+ ::com::sun::star::beans::PropertyValue >& rValues,
+ const ::com::sun::star::uno::Reference<
+ ::com::sun::star::ucb::XCommandEnvironment >& xEnv );
+
+#define IMPLEMENT_COMMAND_OPEN
+#define IMPLEMENT_COMMAND_INSERT
+#define IMPLEMENT_COMMAND_DELETE
+
+#ifdef IMPLEMENT_COMMAND_INSERT
+ typedef rtl::Reference< Content > ContentRef;
+ typedef std::list< ContentRef > ContentRefList;
+ void queryChildren( ContentRefList& rChildren );
+
+ // Command "insert"
+ void insert( const ::com::sun::star::uno::Reference<
+ ::com::sun::star::io::XInputStream > & xInputStream,
+ sal_Bool bReplaceExisting,
+ const com::sun::star::uno::Reference<
+ com::sun::star::ucb::XCommandEnvironment >& Environment )
+ throw( ::com::sun::star::uno::Exception );
+#endif
+
+#ifdef IMPLEMENT_COMMAND_DELETE
+
+ // Command "delete"
+ void destroy( sal_Bool bDeletePhysical )
+ throw( ::com::sun::star::uno::Exception );
+#endif
+
+public:
+ Content( const ::com::sun::star::uno::Reference<
+ ::com::sun::star::lang::XMultiServiceFactory >& rxSMgr,
+ ::ucbhelper::ContentProviderImplHelper* pProvider,
+ const ::com::sun::star::uno::Reference<
+ ::com::sun::star::ucb::XContentIdentifier >& Identifier );
+ virtual ~Content();
+
+ // XInterface
+ XINTERFACE_DECL()
+
+ // XTypeProvider
+ XTYPEPROVIDER_DECL()
+
+ // XServiceInfo
+ virtual ::rtl::OUString SAL_CALL
+ getImplementationName()
+ throw( ::com::sun::star::uno::RuntimeException );
+ virtual ::com::sun::star::uno::Sequence< ::rtl::OUString > SAL_CALL
+ getSupportedServiceNames()
+ throw( ::com::sun::star::uno::RuntimeException );
+
+ // XContent
+ virtual rtl::OUString SAL_CALL
+ getContentType()
+ throw( com::sun::star::uno::RuntimeException );
+
+ // XCommandProcessor
+ virtual com::sun::star::uno::Any SAL_CALL
+ execute( const com::sun::star::ucb::Command& aCommand,
+ sal_Int32 CommandId,
+ const com::sun::star::uno::Reference<
+ com::sun::star::ucb::XCommandEnvironment >& Environment )
+ throw( com::sun::star::uno::Exception,
+ com::sun::star::ucb::CommandAbortedException,
+ com::sun::star::uno::RuntimeException );
+ virtual void SAL_CALL
+ abort( sal_Int32 CommandId )
+ throw( com::sun::star::uno::RuntimeException );
+
+ //////////////////////////////////////////////////////////////////////
+ // Additional interfaces
+ //////////////////////////////////////////////////////////////////////
+
+ // @@@ Add additional interfaces ( like com::sun::star::ucb::XContentCreator ).
+
+ //////////////////////////////////////////////////////////////////////
+ // Non-interface methods.
+ //////////////////////////////////////////////////////////////////////
+
+ // Called from resultset data supplier.
+ static ::com::sun::star::uno::Reference< ::com::sun::star::sdbc::XRow >
+ getPropertyValues( const ::com::sun::star::uno::Reference<
+ ::com::sun::star::lang::XMultiServiceFactory >& rSMgr,
+ const ::com::sun::star::uno::Sequence<
+ ::com::sun::star::beans::Property >& rProperties,
+ const ContentProperties& rData,
+ const rtl::Reference<
+ ::ucbhelper::ContentProviderImplHelper >& rProvider,
+ const ::rtl::OUString& rContentId );
+};
+
+}
+
+#endif
diff --git a/ucbhelper/workben/myucp/myucp_contentcaps.cxx b/ucbhelper/workben/myucp/myucp_contentcaps.cxx
new file mode 100644
index 000000000000..1c1d02fe33ae
--- /dev/null
+++ b/ucbhelper/workben/myucp/myucp_contentcaps.cxx
@@ -0,0 +1,226 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2008 by Sun Microsystems, Inc.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * $RCSfile: myucp_contentcaps.cxx,v $
+ * $Revision: 1.7 $
+ *
+ * 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_ucbhelper.hxx"
+
+/**************************************************************************
+ TODO
+ **************************************************************************
+
+ *************************************************************************/
+
+#include "com/sun/star/beans/Property.hpp"
+#include "com/sun/star/beans/PropertyAttribute.hpp"
+#include "com/sun/star/beans/PropertyValue.hpp"
+#include "com/sun/star/ucb/CommandInfo.hpp"
+#include "com/sun/star/uno/Sequence.hxx"
+
+#include "myucp_content.hxx"
+
+#ifdef IMPLEMENT_COMMAND_INSERT
+#include "com/sun/star/ucb/InsertCommandArgument.hpp"
+#endif
+
+#ifdef IMPLEMENT_COMMAND_OPEN
+#include "com/sun/star/ucb/OpenCommandArgument2.hpp"
+#endif
+
+using namespace com::sun::star;
+
+// @@@ Adjust namespace name.
+using namespace myucp;
+
+//=========================================================================
+//
+// Content implementation.
+//
+//=========================================================================
+
+//=========================================================================
+//
+// IMPORTENT: If any property data ( name / type / ... ) are changed, then
+// Content::getPropertyValues(...) must be adapted too!
+//
+//=========================================================================
+
+// virtual
+uno::Sequence< beans::Property > Content::getProperties(
+ const uno::Reference< ucb::XCommandEnvironment > & /*xEnv*/ )
+{
+ // @@@ Add additional properties...
+
+ // @@@ Note: If your data source supports adding/removing properties,
+ // you should implement the interface XPropertyContainer
+ // by yourself and supply your own logic here. The base class
+ // uses the service "com.sun.star.ucb.Store" to maintain
+ // Additional Core properties. But using server functionality
+ // is preferred! In fact you should return a table conatining
+ // even that dynamicly added properties.
+
+// osl::Guard< osl::Mutex > aGuard( m_aMutex );
+
+ //=================================================================
+ //
+ // Supported properties
+ //
+ //=================================================================
+
+ #define PROPERTY_COUNT 4
+
+ static beans::Property aPropertyInfoTable[] =
+ {
+ ///////////////////////////////////////////////////////////////
+ // Mandatory properties
+ ///////////////////////////////////////////////////////////////
+ beans::Property(
+ rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "ContentType" ) ),
+ -1,
+ getCppuType( static_cast< const rtl::OUString * >( 0 ) ),
+ beans::PropertyAttribute::BOUND | beans::PropertyAttribute::READONLY
+ ),
+ beans::Property(
+ rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "IsDocument" ) ),
+ -1,
+ getCppuBooleanType(),
+ beans::PropertyAttribute::BOUND | beans::PropertyAttribute::READONLY
+ ),
+ beans::Property(
+ rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "IsFolder" ) ),
+ -1,
+ getCppuBooleanType(),
+ beans::PropertyAttribute::BOUND | beans::PropertyAttribute::READONLY
+ ),
+ beans::Property(
+ rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "Title" ) ),
+ -1,
+ getCppuType( static_cast< const rtl::OUString * >( 0 ) ),
+ beans::PropertyAttribute::BOUND
+ )
+ ///////////////////////////////////////////////////////////////
+ // Optional standard properties
+ ///////////////////////////////////////////////////////////////
+
+ ///////////////////////////////////////////////////////////////
+ // New properties
+ ///////////////////////////////////////////////////////////////
+ };
+ return uno::Sequence<
+ beans::Property >( aPropertyInfoTable, PROPERTY_COUNT );
+}
+
+//=========================================================================
+// virtual
+uno::Sequence< ucb::CommandInfo > Content::getCommands(
+ const uno::Reference< ucb::XCommandEnvironment > & /*xEnv*/ )
+{
+ // @@@ Add additional commands...
+
+// osl::Guard< osl::Mutex > aGuard( m_aMutex );
+
+ //=================================================================
+ //
+ // Supported commands
+ //
+ //=================================================================
+
+ sal_uInt32 nCommandCount = 4;
+#ifdef IMPLEMENT_COMMAND_DELETE
+ nCommandCount++;
+#endif
+#ifdef IMPLEMENT_COMMAND_INSERT
+ nCommandCount++;
+#endif
+#ifdef IMPLEMENT_COMMAND_OPEN
+ nCommandCount++;
+#endif
+
+ static const ucb::CommandInfo aCommandInfoTable[] =
+ {
+ ///////////////////////////////////////////////////////////////
+ // Mandatory commands
+ ///////////////////////////////////////////////////////////////
+ ucb::CommandInfo(
+ rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "getCommandInfo" ) ),
+ -1,
+ getCppuVoidType()
+ ),
+ ucb::CommandInfo(
+ rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "getPropertySetInfo" ) ),
+ -1,
+ getCppuVoidType()
+ ),
+ ucb::CommandInfo(
+ rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "getPropertyValues" ) ),
+ -1,
+ getCppuType(
+ static_cast< uno::Sequence< beans::Property > * >( 0 ) )
+ ),
+ ucb::CommandInfo(
+ rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "setPropertyValues" ) ),
+ -1,
+ getCppuType(
+ static_cast< uno::Sequence< beans::PropertyValue > * >( 0 ) )
+ )
+ ///////////////////////////////////////////////////////////////
+ // Optional standard commands
+ ///////////////////////////////////////////////////////////////
+
+#ifdef IMPLEMENT_COMMAND_DELETE
+ , ucb::CommandInfo(
+ rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "delete" ) ),
+ -1,
+ getCppuBooleanType()
+ )
+#endif
+#ifdef IMPLEMENT_COMMAND_INSERT
+ , ucb::CommandInfo(
+ rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "insert" ) ),
+ -1,
+ getCppuType(
+ static_cast< ucb::InsertCommandArgument * >( 0 ) )
+ )
+#endif
+#ifdef IMPLEMENT_COMMAND_OPEN
+ , ucb::CommandInfo(
+ rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "open" ) ),
+ -1,
+ getCppuType( static_cast< ucb::OpenCommandArgument2 * >( 0 ) )
+ )
+#endif
+ ///////////////////////////////////////////////////////////////
+ // New commands
+ ///////////////////////////////////////////////////////////////
+ };
+
+ return uno::Sequence<
+ ucb::CommandInfo >( aCommandInfoTable, nCommandCount );
+}
+
diff --git a/ucbhelper/workben/myucp/myucp_datasupplier.cxx b/ucbhelper/workben/myucp/myucp_datasupplier.cxx
new file mode 100644
index 000000000000..23154df31439
--- /dev/null
+++ b/ucbhelper/workben/myucp/myucp_datasupplier.cxx
@@ -0,0 +1,401 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2008 by Sun Microsystems, Inc.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * $RCSfile: myucp_datasupplier.cxx,v $
+ * $Revision: 1.9 $
+ *
+ * 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_ucbhelper.hxx"
+
+/**************************************************************************
+ TODO
+ **************************************************************************
+
+ *************************************************************************/
+
+#include <vector>
+
+#include "ucbhelper/contentidentifier.hxx"
+#include "ucbhelper/providerhelper.hxx"
+
+#include "myucp_datasupplier.hxx"
+#include "myucp_content.hxx"
+
+using namespace com::sun::star;
+
+// @@@ Adjust namespace name.
+namespace myucp
+{
+
+//=========================================================================
+//
+// struct ResultListEntry.
+//
+//=========================================================================
+
+struct ResultListEntry
+{
+ rtl::OUString aId;
+ uno::Reference< ucb::XContentIdentifier > xId;
+ uno::Reference< ucb::XContent > xContent;
+ uno::Reference< sdbc::XRow > xRow;
+ const ContentProperties& rData;
+
+ ResultListEntry( const ContentProperties& rEntry ) : rData( rEntry ) {}
+};
+
+//=========================================================================
+//
+// ResultList.
+//
+//=========================================================================
+
+typedef std::vector< ResultListEntry* > ResultList;
+
+//=========================================================================
+//
+// struct DataSupplier_Impl.
+//
+//=========================================================================
+
+struct DataSupplier_Impl
+{
+ osl::Mutex m_aMutex;
+ ResultList m_aResults;
+ rtl::Reference< Content > m_xContent;
+ uno::Reference< lang::XMultiServiceFactory > m_xSMgr;
+// @@@ The data source and an iterator for it
+// Entry m_aFolder;
+// Entry::iterator m_aIterator;
+ sal_Int32 m_nOpenMode;
+ sal_Bool m_bCountFinal;
+
+ DataSupplier_Impl( const uno::Reference< lang::XMultiServiceFactory >& rxSMgr,
+ const rtl::Reference< Content >& rContent,
+ sal_Int32 nOpenMode )
+ : m_xContent( rContent ), m_xSMgr( rxSMgr ),
+// m_aFolder( rxSMgr, rContent->getIdentifier()->getContentIdentifier() ),
+ m_nOpenMode( nOpenMode ), m_bCountFinal( sal_False ) {}
+ ~DataSupplier_Impl();
+};
+
+//=========================================================================
+DataSupplier_Impl::~DataSupplier_Impl()
+{
+ ResultList::const_iterator it = m_aResults.begin();
+ ResultList::const_iterator end = m_aResults.end();
+
+ while ( it != end )
+ {
+ delete (*it);
+ it++;
+ }
+}
+
+//=========================================================================
+//=========================================================================
+//
+// DataSupplier Implementation.
+//
+//=========================================================================
+//=========================================================================
+
+DataSupplier::DataSupplier( const uno::Reference< lang::XMultiServiceFactory >& rxSMgr,
+ const rtl::Reference< Content >& rContent,
+ sal_Int32 nOpenMode )
+: m_pImpl( new DataSupplier_Impl( rxSMgr, rContent, nOpenMode ) )
+{
+}
+
+//=========================================================================
+// virtual
+DataSupplier::~DataSupplier()
+{
+ delete m_pImpl;
+}
+
+//=========================================================================
+// virtual
+rtl::OUString DataSupplier::queryContentIdentifierString( sal_uInt32 nIndex )
+{
+ osl::Guard< osl::Mutex > aGuard( m_pImpl->m_aMutex );
+
+ if ( nIndex < m_pImpl->m_aResults.size() )
+ {
+ rtl::OUString aId = m_pImpl->m_aResults[ nIndex ]->aId;
+ if ( aId.getLength() )
+ {
+ // Already cached.
+ return aId;
+ }
+ }
+
+ if ( getResult( nIndex ) )
+ {
+ rtl::OUString aId
+ = m_pImpl->m_xContent->getIdentifier()->getContentIdentifier();
+
+ aId += m_pImpl->m_aResults[ nIndex ]->rData.aTitle;
+
+ m_pImpl->m_aResults[ nIndex ]->aId = aId;
+ return aId;
+ }
+ return rtl::OUString();
+}
+
+//=========================================================================
+// virtual
+uno::Reference< ucb::XContentIdentifier >
+DataSupplier::queryContentIdentifier( sal_uInt32 nIndex )
+{
+ osl::Guard< osl::Mutex > aGuard( m_pImpl->m_aMutex );
+
+ if ( nIndex < m_pImpl->m_aResults.size() )
+ {
+ uno::Reference< ucb::XContentIdentifier > xId
+ = m_pImpl->m_aResults[ nIndex ]->xId;
+ if ( xId.is() )
+ {
+ // Already cached.
+ return xId;
+ }
+ }
+
+ rtl::OUString aId = queryContentIdentifierString( nIndex );
+ if ( aId.getLength() )
+ {
+ uno::Reference< ucb::XContentIdentifier > xId
+ = new ::ucbhelper::ContentIdentifier( aId );
+ m_pImpl->m_aResults[ nIndex ]->xId = xId;
+ return xId;
+ }
+ return uno::Reference< ucb::XContentIdentifier >();
+}
+
+//=========================================================================
+// virtual
+uno::Reference< ucb::XContent >
+DataSupplier::queryContent( sal_uInt32 nIndex )
+{
+ osl::Guard< osl::Mutex > aGuard( m_pImpl->m_aMutex );
+
+ if ( nIndex < m_pImpl->m_aResults.size() )
+ {
+ uno::Reference< ucb::XContent > xContent
+ = m_pImpl->m_aResults[ nIndex ]->xContent;
+ if ( xContent.is() )
+ {
+ // Already cached.
+ return xContent;
+ }
+ }
+
+ uno::Reference< ucb::XContentIdentifier > xId
+ = queryContentIdentifier( nIndex );
+ if ( xId.is() )
+ {
+ try
+ {
+ uno::Reference< ucb::XContent > xContent
+ = m_pImpl->m_xContent->getProvider()->queryContent( xId );
+ m_pImpl->m_aResults[ nIndex ]->xContent = xContent;
+ return xContent;
+
+ }
+ catch ( ucb::IllegalIdentifierException& )
+ {
+ }
+ }
+ return uno::Reference< ucb::XContent >();
+}
+
+//=========================================================================
+// virtual
+sal_Bool DataSupplier::getResult( sal_uInt32 nIndex )
+{
+ osl::ClearableGuard< osl::Mutex > aGuard( m_pImpl->m_aMutex );
+
+ if ( m_pImpl->m_aResults.size() > nIndex )
+ {
+ // Result already present.
+ return sal_True;
+ }
+
+ // Result not (yet) present.
+
+ if ( m_pImpl->m_bCountFinal )
+ return sal_False;
+
+ // Try to obtain result...
+
+ sal_uInt32 nOldCount = m_pImpl->m_aResults.size();
+ sal_Bool bFound = sal_False;
+
+ // @@@ Obtain data and put it into result list...
+/*
+ sal_uInt32 nPos = nOldCount;
+ while ( m_pImpl->m_aFolder.next( m_pImpl->m_aIterator ) )
+ {
+ m_pImpl->m_aResults.push_back(
+ new ResultListEntry( *m_pImpl->m_aIterator ) );
+
+ if ( nPos == nIndex )
+ {
+ // Result obtained.
+ bFound = sal_True;
+ break;
+ }
+
+ nPos++;
+ }
+*/
+
+ if ( !bFound )
+ m_pImpl->m_bCountFinal = sal_True;
+
+ rtl::Reference< ::ucbhelper::ResultSet > xResultSet = getResultSet().get();
+ if ( xResultSet.is() )
+ {
+ // Callbacks follow!
+ aGuard.clear();
+
+ if ( nOldCount < m_pImpl->m_aResults.size() )
+ xResultSet->rowCountChanged(
+ nOldCount, m_pImpl->m_aResults.size() );
+
+ if ( m_pImpl->m_bCountFinal )
+ xResultSet->rowCountFinal();
+ }
+
+ return bFound;
+}
+
+//=========================================================================
+// virtual
+sal_uInt32 DataSupplier::totalCount()
+{
+ osl::ClearableGuard< osl::Mutex > aGuard( m_pImpl->m_aMutex );
+
+ if ( m_pImpl->m_bCountFinal )
+ return m_pImpl->m_aResults.size();
+
+ sal_uInt32 nOldCount = m_pImpl->m_aResults.size();
+
+ // @@@ Obtain data and put it into result list...
+/*
+ while ( m_pImpl->m_aFolder.next( m_pImpl->m_aIterator ) )
+ m_pImpl->m_aResults.push_back(
+ new ResultListEntry( *m_pImpl->m_aIterator ) );
+*/
+ m_pImpl->m_bCountFinal = sal_True;
+
+ rtl::Reference< ::ucbhelper::ResultSet > xResultSet = getResultSet().get();
+ if ( xResultSet.is() )
+ {
+ // Callbacks follow!
+ aGuard.clear();
+
+ if ( nOldCount < m_pImpl->m_aResults.size() )
+ xResultSet->rowCountChanged(
+ nOldCount, m_pImpl->m_aResults.size() );
+
+ xResultSet->rowCountFinal();
+ }
+
+ return m_pImpl->m_aResults.size();
+}
+
+//=========================================================================
+// virtual
+sal_uInt32 DataSupplier::currentCount()
+{
+ return m_pImpl->m_aResults.size();
+}
+
+//=========================================================================
+// virtual
+sal_Bool DataSupplier::isCountFinal()
+{
+ return m_pImpl->m_bCountFinal;
+}
+
+//=========================================================================
+// virtual
+uno::Reference< sdbc::XRow >
+DataSupplier::queryPropertyValues( sal_uInt32 nIndex )
+{
+ osl::Guard< osl::Mutex > aGuard( m_pImpl->m_aMutex );
+
+ if ( nIndex < m_pImpl->m_aResults.size() )
+ {
+ uno::Reference< sdbc::XRow > xRow = m_pImpl->m_aResults[ nIndex ]->xRow;
+ if ( xRow.is() )
+ {
+ // Already cached.
+ return xRow;
+ }
+ }
+
+ if ( getResult( nIndex ) )
+ {
+ uno::Reference< sdbc::XRow > xRow = Content::getPropertyValues(
+ m_pImpl->m_xSMgr,
+ getResultSet()->getProperties(),
+ m_pImpl->m_aResults[ nIndex ]->rData,
+ m_pImpl->m_xContent->getProvider().get(),
+ queryContentIdentifierString( nIndex ) );
+ m_pImpl->m_aResults[ nIndex ]->xRow = xRow;
+ return xRow;
+ }
+
+ return uno::Reference< sdbc::XRow >();
+}
+
+//=========================================================================
+// virtual
+void DataSupplier::releasePropertyValues( sal_uInt32 nIndex )
+{
+ osl::Guard< osl::Mutex > aGuard( m_pImpl->m_aMutex );
+
+ if ( nIndex < m_pImpl->m_aResults.size() )
+ m_pImpl->m_aResults[ nIndex ]->xRow = uno::Reference< sdbc::XRow >();
+}
+
+//=========================================================================
+// virtual
+void DataSupplier::close()
+{
+}
+
+//=========================================================================
+// virtual
+void DataSupplier::validate()
+ throw( ucb::ResultSetException )
+{
+}
+
+} // namespace
diff --git a/ucbhelper/workben/myucp/myucp_datasupplier.hxx b/ucbhelper/workben/myucp/myucp_datasupplier.hxx
new file mode 100644
index 000000000000..244ecd5d5340
--- /dev/null
+++ b/ucbhelper/workben/myucp/myucp_datasupplier.hxx
@@ -0,0 +1,80 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2008 by Sun Microsystems, Inc.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * $RCSfile: myucp_datasupplier.hxx,v $
+ * $Revision: 1.7 $
+ *
+ * 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.
+ *
+ ************************************************************************/
+
+// @@@ Adjust multi-include-protection-ifdef.
+#ifndef _MYUCP_DATASUPPLIER_HXX
+#define _MYUCP_DATASUPPLIER_HXX
+
+#include "rtl/ref.hxx"
+#include "ucbhelper/resultset.hxx"
+
+// @@@ Adjust namespace name.
+namespace myucp {
+
+struct DataSupplier_Impl;
+class Content;
+
+class DataSupplier : public ucbhelper::ResultSetDataSupplier
+{
+ DataSupplier_Impl* m_pImpl;
+
+public:
+ DataSupplier( const com::sun::star::uno::Reference<
+ com::sun::star::lang::XMultiServiceFactory >& rxSMgr,
+ const rtl::Reference< Content >& rContent,
+ sal_Int32 nOpenMode );
+ virtual ~DataSupplier();
+
+ virtual rtl::OUString queryContentIdentifierString( sal_uInt32 nIndex );
+ virtual com::sun::star::uno::Reference<
+ com::sun::star::ucb::XContentIdentifier >
+ queryContentIdentifier( sal_uInt32 nIndex );
+ virtual com::sun::star::uno::Reference< com::sun::star::ucb::XContent >
+ queryContent( sal_uInt32 nIndex );
+
+ virtual sal_Bool getResult( sal_uInt32 nIndex );
+
+ virtual sal_uInt32 totalCount();
+ virtual sal_uInt32 currentCount();
+ virtual sal_Bool isCountFinal();
+
+ virtual com::sun::star::uno::Reference< com::sun::star::sdbc::XRow >
+ queryPropertyValues( sal_uInt32 nIndex );
+ virtual void releasePropertyValues( sal_uInt32 nIndex );
+
+ virtual void close();
+
+ virtual void validate()
+ throw( com::sun::star::ucb::ResultSetException );
+};
+
+}
+
+#endif
diff --git a/ucbhelper/workben/myucp/myucp_provider.cxx b/ucbhelper/workben/myucp/myucp_provider.cxx
new file mode 100644
index 000000000000..268a33c6a19a
--- /dev/null
+++ b/ucbhelper/workben/myucp/myucp_provider.cxx
@@ -0,0 +1,174 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2008 by Sun Microsystems, Inc.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * $RCSfile: myucp_provider.cxx,v $
+ * $Revision: 1.8 $
+ *
+ * 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_ucbhelper.hxx"
+
+/**************************************************************************
+ TODO
+ **************************************************************************
+
+ *************************************************************************/
+
+#include "osl/diagnose.h"
+#include "osl/mutex.hxx"
+
+#include "ucbhelper/contentidentifier.hxx"
+
+#include "myucp_provider.hxx"
+#include "myucp_content.hxx"
+
+using namespace com::sun::star;
+
+// @@@ Adjust namespace name.
+namespace myucp {
+
+//=========================================================================
+//=========================================================================
+//
+// ContentProvider Implementation.
+//
+//=========================================================================
+//=========================================================================
+
+ContentProvider::ContentProvider(
+ const uno::Reference< lang::XMultiServiceFactory >& rSMgr )
+: ::ucbhelper::ContentProviderImplHelper( rSMgr )
+{
+}
+
+//=========================================================================
+// virtual
+ContentProvider::~ContentProvider()
+{
+}
+
+//=========================================================================
+//
+// XInterface methods.
+//
+//=========================================================================
+
+// @@@ Add own interfaces.
+XINTERFACE_IMPL_3( ContentProvider,
+ lang::XTypeProvider,
+ lang::XServiceInfo,
+ ucb::XContentProvider );
+
+//=========================================================================
+//
+// XTypeProvider methods.
+//
+//=========================================================================
+
+// @@@ Add own interfaces.
+XTYPEPROVIDER_IMPL_3( ContentProvider,
+ lang::XTypeProvider,
+ lang::XServiceInfo,
+ ucb::XContentProvider );
+
+//=========================================================================
+//
+// XServiceInfo methods.
+//
+//=========================================================================
+
+// @@@ Adjust implementation name. Keep the prefix "com.sun.star.comp."!
+// @@@ Adjust service name.
+XSERVICEINFO_IMPL_1( ContentProvider,
+ rtl::OUString::createFromAscii(
+ "com.sun.star.comp.myucp.ContentProvider" ),
+ rtl::OUString::createFromAscii(
+ MYUCP_CONTENT_PROVIDER_SERVICE_NAME ) );
+
+//=========================================================================
+//
+// Service factory implementation.
+//
+//=========================================================================
+
+ONE_INSTANCE_SERVICE_FACTORY_IMPL( ContentProvider );
+
+//=========================================================================
+//
+// XContentProvider methods.
+//
+//=========================================================================
+
+// virtual
+uno::Reference< ucb::XContent > SAL_CALL ContentProvider::queryContent(
+ const uno::Reference< ucb::XContentIdentifier >& Identifier )
+ throw( ucb::IllegalIdentifierException, uno::RuntimeException )
+{
+ // Check URL scheme...
+
+ rtl::OUString aScheme( rtl::OUString::createFromAscii( MYUCP_URL_SCHEME ) );
+ if ( !Identifier->getContentProviderScheme().equalsIgnoreAsciiCase( aScheme ) )
+ throw ucb::IllegalIdentifierException();
+
+ // @@@ Further id checks may go here...
+#if 0
+ if ( id-check-failes )
+ throw ucb::IllegalIdentifierException();
+#endif
+
+ // @@@ Id normalization may go here...
+#if 0
+ // Normalize URL and create new Id.
+ rtl::OUString aCanonicURL = xxxxx( Identifier->getContentIdentifier() );
+ uno::Reference< ucb::XContentIdentifier > xCanonicId
+ = new ::ucbhelper::ContentIdentifier( m_xSMgr, aCanonicURL );
+#else
+ uno::Reference< ucb::XContentIdentifier > xCanonicId = Identifier;
+#endif
+
+ osl::MutexGuard aGuard( m_aMutex );
+
+ // Check, if a content with given id already exists...
+ uno::Reference< ucb::XContent > xContent
+ = queryExistingContent( xCanonicId ).get();
+ if ( xContent.is() )
+ return xContent;
+
+ // @@@ Decision, which content implementation to instanciate may be
+ // made here ( in case you have different content classes ).
+
+ // Create a new content.
+
+ xContent = new Content( m_xSMgr, this, xCanonicId );
+ registerNewContent( xContent );
+
+ if ( !xContent->getIdentifier().is() )
+ throw ucb::IllegalIdentifierException();
+
+ return xContent;
+}
+
+} // namespace
diff --git a/ucbhelper/workben/myucp/myucp_provider.hxx b/ucbhelper/workben/myucp/myucp_provider.hxx
new file mode 100644
index 000000000000..505bf16c8e4a
--- /dev/null
+++ b/ucbhelper/workben/myucp/myucp_provider.hxx
@@ -0,0 +1,98 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2008 by Sun Microsystems, Inc.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * $RCSfile: myucp_provider.hxx,v $
+ * $Revision: 1.5 $
+ *
+ * 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.
+ *
+ ************************************************************************/
+
+// @@@ Adjust multi-include-protection-ifdef.
+#ifndef _MYUCP_PROVIDER_HXX
+#define _MYUCP_PROVIDER_HXX
+
+#include "ucbhelper/providerhelper.hxx"
+
+// @@@ Adjust namespace name.
+namespace myucp {
+
+//=========================================================================
+
+// @@@ Adjust defines.
+
+// UNO service name for the provider. This name will be used by the UCB to
+// create instances of the provider. Prefix with reversed company domain name.
+#define MYUCP_CONTENT_PROVIDER_SERVICE_NAME \
+ "com.sun.star.ucb.MyContentProvider"
+#define MYUCP_CONTENT_PROVIDER_SERVICE_NAME_LENGTH 34
+
+// URL scheme. This is the scheme the provider will be able to create
+// contents for. The UCB will select the provider ( i.e. in order to create
+// contents ) according to this scheme.
+#define MYUCP_URL_SCHEME \
+ "vnd.sun.star.myucp"
+#define MYUCP_URL_SCHEME_LENGTH 18
+
+// UCB Content Type.
+#define MYUCP_CONTENT_TYPE \
+ "application/" MYUCP_URL_SCHEME "-content"
+
+//=========================================================================
+
+class ContentProvider : public ::ucbhelper::ContentProviderImplHelper
+{
+public:
+ ContentProvider( const ::com::sun::star::uno::Reference<
+ ::com::sun::star::lang::XMultiServiceFactory >& rSMgr );
+ virtual ~ContentProvider();
+
+ // XInterface
+ XINTERFACE_DECL()
+
+ // XTypeProvider
+ XTYPEPROVIDER_DECL()
+
+ // XServiceInfo
+ XSERVICEINFO_DECL()
+
+ // XContentProvider
+ virtual ::com::sun::star::uno::Reference<
+ ::com::sun::star::ucb::XContent > SAL_CALL
+ queryContent( const ::com::sun::star::uno::Reference<
+ ::com::sun::star::ucb::XContentIdentifier >& Identifier )
+ throw( ::com::sun::star::ucb::IllegalIdentifierException,
+ ::com::sun::star::uno::RuntimeException );
+
+ //////////////////////////////////////////////////////////////////////
+ // Additional interfaces
+ //////////////////////////////////////////////////////////////////////
+
+ //////////////////////////////////////////////////////////////////////
+ // Non-interface methods.
+ //////////////////////////////////////////////////////////////////////
+};
+
+}
+
+#endif
diff --git a/ucbhelper/workben/myucp/myucp_resultset.cxx b/ucbhelper/workben/myucp/myucp_resultset.cxx
new file mode 100644
index 000000000000..3a96041f6b6e
--- /dev/null
+++ b/ucbhelper/workben/myucp/myucp_resultset.cxx
@@ -0,0 +1,100 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2008 by Sun Microsystems, Inc.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * $RCSfile: myucp_resultset.cxx,v $
+ * $Revision: 1.7 $
+ *
+ * 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_ucbhelper.hxx"
+
+/**************************************************************************
+ TODO
+ **************************************************************************
+
+ - This implementation is not a dynamic result set!!! It only implements
+ the necessary interfaces, but never recognizes/notifies changes!!!
+
+ *************************************************************************/
+
+#include "myucp_datasupplier.hxx"
+#include "myucp_resultset.hxx"
+
+using namespace com::sun::star;
+
+// @@@ Adjust namespace name.
+namespace myucp {
+
+//=========================================================================
+//=========================================================================
+//
+// DynamicResultSet Implementation.
+//
+//=========================================================================
+//=========================================================================
+
+DynamicResultSet::DynamicResultSet(
+ const uno::Reference< lang::XMultiServiceFactory >& rxSMgr,
+ const rtl::Reference< Content >& rxContent,
+ const ucb::OpenCommandArgument2& rCommand,
+ const uno::Reference< ucb::XCommandEnvironment >& rxEnv )
+: ResultSetImplHelper( rxSMgr, rCommand ),
+ m_xContent( rxContent ),
+ m_xEnv( rxEnv )
+{
+}
+
+//=========================================================================
+//
+// Non-interface methods.
+//
+//=========================================================================
+
+void DynamicResultSet::initStatic()
+{
+ m_xResultSet1
+ = new ::ucbhelper::ResultSet( m_xSMgr,
+ m_aCommand.Properties,
+ new DataSupplier( m_xSMgr,
+ m_xContent,
+ m_aCommand.Mode ),
+ m_xEnv );
+}
+
+//=========================================================================
+void DynamicResultSet::initDynamic()
+{
+ m_xResultSet1
+ = new ::ucbhelper::ResultSet( m_xSMgr,
+ m_aCommand.Properties,
+ new DataSupplier( m_xSMgr,
+ m_xContent,
+ m_aCommand.Mode ),
+ m_xEnv );
+ m_xResultSet2 = m_xResultSet1;
+}
+
+}
diff --git a/ucbhelper/workben/myucp/myucp_resultset.hxx b/ucbhelper/workben/myucp/myucp_resultset.hxx
new file mode 100644
index 000000000000..703c2ded4907
--- /dev/null
+++ b/ucbhelper/workben/myucp/myucp_resultset.hxx
@@ -0,0 +1,65 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2008 by Sun Microsystems, Inc.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * $RCSfile: myucp_resultset.hxx,v $
+ * $Revision: 1.6 $
+ *
+ * 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.
+ *
+ ************************************************************************/
+
+// @@@ Adjust multi-include-protection-ifdef.
+#ifndef _MYUCP_RESULTSET_HXX
+#define _MYUCP_RESULTSET_HXX
+
+#include "rtl/ref.hxx"
+#include "ucbhelper/resultsethelper.hxx"
+
+#include "myucp_content.hxx"
+
+// @@@ Adjust namespace name.
+namespace myucp {
+
+class DynamicResultSet : public ::ucbhelper::ResultSetImplHelper
+{
+ rtl::Reference< Content > m_xContent;
+ com::sun::star::uno::Reference<
+ com::sun::star::ucb::XCommandEnvironment > m_xEnv;
+
+private:
+ virtual void initStatic();
+ virtual void initDynamic();
+
+public:
+ DynamicResultSet(
+ const com::sun::star::uno::Reference<
+ com::sun::star::lang::XMultiServiceFactory >& rxSMgr,
+ const rtl::Reference< Content >& rxContent,
+ const com::sun::star::ucb::OpenCommandArgument2& rCommand,
+ const com::sun::star::uno::Reference<
+ com::sun::star::ucb::XCommandEnvironment >& rxEnv );
+};
+
+}
+
+#endif
diff --git a/ucbhelper/workben/myucp/myucp_services.cxx b/ucbhelper/workben/myucp/myucp_services.cxx
new file mode 100644
index 000000000000..f5692706c43f
--- /dev/null
+++ b/ucbhelper/workben/myucp/myucp_services.cxx
@@ -0,0 +1,139 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2008 by Sun Microsystems, Inc.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * $RCSfile: myucp_services.cxx,v $
+ * $Revision: 1.6 $
+ *
+ * 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_ucbhelper.hxx"
+
+#include "com/sun/star/lang/XMultiServiceFactory.hpp"
+#include "com/sun/star/lang/XSingleServiceFactory.hpp"
+#include "com/sun/star/registry/XRegistryKey.hpp"
+
+#include "myucp_provider.hxx"
+
+using namespace com::sun::star;
+
+namespace {
+
+//=========================================================================
+sal_Bool writeInfo( void * pRegistryKey,
+ const rtl::OUString & rImplementationName,
+ uno::Sequence< rtl::OUString > const & rServiceNames )
+{
+ rtl::OUString aKeyName( rtl::OUString::createFromAscii( "/" ) );
+ aKeyName += rImplementationName;
+ aKeyName += rtl::OUString::createFromAscii( "/UNO/SERVICES" );
+
+ uno::Reference< registry::XRegistryKey > xKey;
+ try
+ {
+ xKey = static_cast< registry::XRegistryKey * >(
+ pRegistryKey )->createKey( aKeyName );
+ }
+ catch ( registry::InvalidRegistryException const & )
+ {
+ }
+
+ if ( !xKey.is() )
+ return sal_False;
+
+ sal_Bool bSuccess = sal_True;
+
+ for ( sal_Int32 n = 0; n < rServiceNames.getLength(); ++n )
+ {
+ try
+ {
+ xKey->createKey( rServiceNames[ n ] );
+ }
+ catch ( registry::InvalidRegistryException const & )
+ {
+ bSuccess = sal_False;
+ break;
+ }
+ }
+ return bSuccess;
+}
+
+}
+
+//=========================================================================
+extern "C" void SAL_CALL component_getImplementationEnvironment(
+ const sal_Char ** ppEnvTypeName, uno_Environment ** /*ppEnv*/ )
+{
+ *ppEnvTypeName = CPPU_CURRENT_LANGUAGE_BINDING_NAME;
+}
+
+//=========================================================================
+extern "C" sal_Bool SAL_CALL component_writeInfo(
+ void * /*pServiceManager*/, void * pRegistryKey )
+{
+ return pRegistryKey &&
+
+ //////////////////////////////////////////////////////////////////////
+ // Write info into registry.
+ //////////////////////////////////////////////////////////////////////
+
+ // @@@ Adjust namespace names.
+ writeInfo( pRegistryKey,
+ ::myucp::ContentProvider::getImplementationName_Static(),
+ ::myucp::ContentProvider::getSupportedServiceNames_Static() );
+}
+
+//=========================================================================
+extern "C" void * SAL_CALL component_getFactory(
+ const sal_Char * pImplName, void * pServiceManager, void * /*pRegistryKey*/ )
+{
+ void * pRet = 0;
+
+ uno::Reference< lang::XMultiServiceFactory > xSMgr(
+ reinterpret_cast< lang::XMultiServiceFactory * >( pServiceManager ) );
+ uno::Reference< lang::XSingleServiceFactory > xFactory;
+
+ //////////////////////////////////////////////////////////////////////
+ // Create factory, if implementation name matches.
+ //////////////////////////////////////////////////////////////////////
+
+ // @@@ Adjust namespace names.
+ if ( ::myucp::ContentProvider::getImplementationName_Static().
+ compareToAscii( pImplName ) == 0 )
+ {
+ xFactory = ::myucp::ContentProvider::createServiceFactory( xSMgr );
+ }
+
+ //////////////////////////////////////////////////////////////////////
+
+ if ( xFactory.is() )
+ {
+ xFactory->acquire();
+ pRet = xFactory.get();
+ }
+
+ return pRet;
+}
+
diff --git a/ucbhelper/workben/ucbexplorer/bmp/document.bmp b/ucbhelper/workben/ucbexplorer/bmp/document.bmp
new file mode 100644
index 000000000000..63baf47eca46
--- /dev/null
+++ b/ucbhelper/workben/ucbexplorer/bmp/document.bmp
Binary files differ
diff --git a/ucbhelper/workben/ucbexplorer/bmp/fldclose.bmp b/ucbhelper/workben/ucbexplorer/bmp/fldclose.bmp
new file mode 100644
index 000000000000..c0f26b337f7a
--- /dev/null
+++ b/ucbhelper/workben/ucbexplorer/bmp/fldclose.bmp
Binary files differ
diff --git a/ucbhelper/workben/ucbexplorer/bmp/fldopen.bmp b/ucbhelper/workben/ucbexplorer/bmp/fldopen.bmp
new file mode 100644
index 000000000000..f38643510e78
--- /dev/null
+++ b/ucbhelper/workben/ucbexplorer/bmp/fldopen.bmp
Binary files differ
diff --git a/ucbhelper/workben/ucbexplorer/bmp/link.bmp b/ucbhelper/workben/ucbexplorer/bmp/link.bmp
new file mode 100644
index 000000000000..0269a76d98d0
--- /dev/null
+++ b/ucbhelper/workben/ucbexplorer/bmp/link.bmp
Binary files differ
diff --git a/ucbhelper/workben/ucbexplorer/makefile.mk b/ucbhelper/workben/ucbexplorer/makefile.mk
new file mode 100644
index 000000000000..eb3007349281
--- /dev/null
+++ b/ucbhelper/workben/ucbexplorer/makefile.mk
@@ -0,0 +1,75 @@
+#*************************************************************************
+#
+# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+#
+# Copyright 2008 by Sun Microsystems, Inc.
+#
+# OpenOffice.org - a multi-platform office productivity suite
+#
+# $RCSfile: makefile.mk,v $
+#
+# $Revision: 1.8 $
+#
+# 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.
+#
+#*************************************************************************
+
+PRJ=..$/..
+
+PRJNAME=ucbhelper
+TARGET=ucbexplorer
+TARGETTYPE=GUI
+LIBTARGET=NO
+ENABLE_EXCEPTIONS=TRUE
+
+# --- Settings ---
+
+.INCLUDE : settings.mk
+
+# --- Files ---
+
+OBJFILES=$(OBJ)$/$(TARGET).obj
+
+SRS1NAME=$(TARGET)
+SRC1FILES=$(TARGET).src
+
+#
+# UCBEXPLORER
+#
+
+APP1TARGET=$(TARGET)
+
+RESLIB1NAME=$(TARGET)
+RESLIB1SRSFILES=$(SRS)$/$(TARGET).srs
+
+APP1OBJS=$(OBJ)$/$(TARGET).obj
+APP1RES=$(RES)$/$(TARGET).res
+
+APP1STDLIBS=$(SALLIB) \
+ $(CPPULIB) \
+ $(CPPUHELPERLIB) \
+ $(TOOLSLIB) \
+ $(SVTOOLLIB) \
+ $(COMPHELPERLIB) \
+ $(UCBHELPERLIB) \
+ $(VCLLIB)
+
+# --- Targets ---
+
+.INCLUDE : target.mk
+
diff --git a/ucbhelper/workben/ucbexplorer/ucbexplorer.cxx b/ucbhelper/workben/ucbexplorer/ucbexplorer.cxx
new file mode 100644
index 000000000000..51490ed40296
--- /dev/null
+++ b/ucbhelper/workben/ucbexplorer/ucbexplorer.cxx
@@ -0,0 +1,1199 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2008 by Sun Microsystems, Inc.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * $RCSfile: ucbexplorer.cxx,v $
+ * $Revision: 1.18 $
+ *
+ * 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_ucbhelper.hxx"
+#include <cppuhelper/weak.hxx>
+#include <cppuhelper/bootstrap.hxx>
+#include <comphelper/processfactory.hxx>
+#include <com/sun/star/beans/PropertyAttribute.hpp>
+#include <com/sun/star/beans/XPropertySetInfo.hpp>
+#include <com/sun/star/io/XActiveDataSink.hpp>
+#include <com/sun/star/lang/XComponent.hpp>
+#include <com/sun/star/sdbc/XResultSet.hpp>
+#ifndef _COM_SUN_STAR_UCB_XCOMMMANDINFO_HPP_
+#include <com/sun/star/ucb/XCommandInfo.hpp>
+#endif
+#include <com/sun/star/ucb/XContentAccess.hpp>
+#include <com/sun/star/ucb/XContentCreator.hpp>
+#include <com/sun/star/ucb/CommandAbortedException.hpp>
+#include <com/sun/star/ucb/ContentInfoAttribute.hpp>
+
+#include "rtl/ref.hxx"
+#include <ucbhelper/content.hxx>
+#include <ucbhelper/contentbroker.hxx>
+#include <ucbhelper/commandenvironment.hxx>
+#include <svtools/svtreebx.hxx>
+#include <vcl/wrkwin.hxx>
+#include <vcl/svapp.hxx>
+#include <vcl/menu.hxx>
+#include <vcl/dialog.hxx>
+#include <vcl/fixed.hxx>
+#include <vcl/group.hxx>
+#ifndef _SV_BUTTON_HXX
+#include <vcl/button.hxx>
+#endif
+#include <vcl/msgbox.hxx>
+#include <ucbhelper/macros.hxx>
+#include <ucbhelper/configurationkeys.hxx>
+
+#ifndef _UCBEXPLORER_HRC
+#include "ucbexplorer.hrc"
+#endif
+
+using namespace com::sun::star;
+using namespace com::sun::star::beans;
+using namespace com::sun::star::io;
+using namespace com::sun::star::lang;
+using namespace com::sun::star::sdbc;
+using namespace com::sun::star::task;
+using namespace com::sun::star::ucb;
+using namespace com::sun::star::uno;
+using namespace rtl;
+
+//=========================================================================
+//
+// class TestDataSink.
+//
+//=========================================================================
+
+class TestDataSink : public cppu::OWeakObject, public XActiveDataSink
+{
+ uno::Reference< XInputStream > m_xStream;
+
+public:
+// TestDataSink() {}
+// virtual ~TestDataSink();
+
+ // XInterface methods
+ virtual Any SAL_CALL queryInterface( const Type & rType )
+ throw( RuntimeException );
+ virtual void SAL_CALL acquire()
+ throw ();
+ virtual void SAL_CALL release()
+ throw ();
+
+ // XActiveDataSink methods.
+ virtual void SAL_CALL setInputStream(
+ const uno::Reference< XInputStream >& aStream )
+ throw( RuntimeException );
+ virtual uno::Reference< XInputStream > SAL_CALL getInputStream()
+ throw( RuntimeException );
+};
+
+//=========================================================================
+//
+// class StringInputDialog.
+//
+//=========================================================================
+
+class StringInputDialog : public ModalDialog
+{
+private:
+ FixedText m_aNameText;
+ Edit m_aNameEdit;
+ GroupBox m_aNameGroup;
+ OKButton m_aOKBtn;
+ CancelButton m_aCancelBtn;
+ HelpButton m_aHelpBtn;
+
+ DECL_LINK( OKHdl, Button * );
+ DECL_LINK( NameHdl, Edit * );
+
+public:
+ StringInputDialog( const String& rTitle,
+ const String& rDefaultText,
+ String* pGroupName = 0 );
+ String GetValue() const { return m_aNameEdit.GetText(); }
+ void SetValue( const String& rNewName ) { m_aNameEdit.SetText( rNewName ); }
+};
+
+//=========================================================================
+//
+// class UcbExplorerListBoxEntry.
+//
+//=========================================================================
+
+class UcbExplorerListBoxEntry : public SvLBoxEntry
+{
+ friend class UcbExplorerTreeListBox;
+
+ enum EntryType { FOLDER, DOCUMENT, LINK };
+
+ ::ucb::Content m_aContent;
+ EntryType m_eType;
+
+public:
+ UcbExplorerListBoxEntry();
+ virtual ~UcbExplorerListBoxEntry();
+
+ BOOL createNewContent( const ContentInfo& rInfo,
+ ::ucb::Content& rNewContent );
+};
+
+//=========================================================================
+//
+// class UcbExplorerTreeListBox.
+//
+//=========================================================================
+
+class UcbExplorerTreeListBox : public SvTreeListBox
+{
+ Bitmap m_aFolderClosed;
+ Bitmap m_aFolderOpened;
+ Bitmap m_aDocument;
+ Bitmap m_aLink;
+
+private:
+ virtual SvLBoxEntry* CreateEntry() const;
+ virtual void RequestingChilds( SvLBoxEntry* pParent );
+
+public:
+ UcbExplorerTreeListBox( Window* pParent, WinBits nWinStyle = 0 );
+ virtual ~UcbExplorerTreeListBox();
+
+ virtual void Command( const CommandEvent& rCEvt );
+
+ UcbExplorerListBoxEntry*
+ InsertEntry( ::ucb::Content& rContent, SvLBoxEntry* pParent );
+ UcbExplorerListBoxEntry*
+ InsertEntry( const String& rURL, SvLBoxEntry* pParent = 0 );
+};
+
+//=========================================================================
+//
+// class UcbExplorerWindow.
+//
+//=========================================================================
+
+class UcbExplorerWindow : public WorkWindow
+{
+ friend class MyApp;
+
+ UcbExplorerTreeListBox m_aTree;
+
+public:
+ UcbExplorerWindow( Window *pParent, WinBits nWinStyle );
+ virtual ~UcbExplorerWindow();
+
+ virtual void Resize();
+};
+
+//=========================================================================
+//
+// class MyApp.
+//
+//=========================================================================
+
+class MyApp : public Application
+{
+public:
+ virtual void Main();
+};
+
+//=========================================================================
+//
+// TestDataSink implementation.
+//
+//=========================================================================
+
+// virtual
+Any SAL_CALL TestDataSink::queryInterface( const Type & rType )
+ throw( RuntimeException )
+{
+ Any aRet = cppu::queryInterface(
+ rType,
+ static_cast< XActiveDataSink * >( this ) );
+ return aRet.hasValue() ? aRet : OWeakObject::queryInterface( rType );
+}
+
+//=========================================================================
+// virtual
+void SAL_CALL TestDataSink::acquire()
+ throw()
+{
+ OWeakObject::acquire();
+}
+
+//=========================================================================
+// virtual
+void SAL_CALL TestDataSink::release()
+ throw()
+{
+ OWeakObject::release();
+}
+
+//=========================================================================
+// virtual
+void SAL_CALL TestDataSink::setInputStream(
+ const uno::Reference< XInputStream >& aStream )
+ throw( RuntimeException )
+{
+ m_xStream = aStream;
+}
+
+//=========================================================================
+// virtual
+uno::Reference< XInputStream > SAL_CALL TestDataSink::getInputStream()
+ throw( RuntimeException )
+{
+ return m_xStream;
+}
+
+//=========================================================================
+//
+// StringInputDialog implementation.
+//
+//=========================================================================
+
+StringInputDialog::StringInputDialog( const String& rTitle,
+ const String& rDefaultText,
+ String* pGroupName )
+: ModalDialog( 0, ResId( DLG_STRINGINPUT ) ),
+ m_aNameText ( this, ResId( FT_STRINGINPUT_DLG_NAME ) ),
+ m_aNameEdit ( this, ResId( ED_STRINGINPUT_DLG_NAME ) ),
+ m_aNameGroup( this, ResId( GB_STRINGINPUT_DLG_NAME ) ),
+ m_aOKBtn ( this, ResId( BT_STRINGINPUT_DLG_OK ) ),
+ m_aCancelBtn( this, ResId( BT_STRINGINPUT_DLG_CANCEL ) ),
+ m_aHelpBtn ( this, ResId( BT_STRINGINPUT_DLG_HELP ) )
+{
+ FreeResource();
+ SetText( rTitle );
+ m_aNameEdit.SetText( rDefaultText );
+ m_aOKBtn.SetClickHdl( LINK( this, StringInputDialog, OKHdl ) );
+ m_aNameEdit.SetModifyHdl( LINK( this, StringInputDialog, NameHdl ) );
+
+ if ( pGroupName )
+ m_aNameGroup.SetText( *pGroupName );
+};
+
+//=========================================================================
+IMPL_LINK( StringInputDialog, OKHdl, Button *, EMPTYARG )
+{
+ // trim the strings
+ m_aNameEdit.SetText(
+ m_aNameEdit.GetText().EraseLeadingChars().EraseTrailingChars() );
+ EndDialog( RET_OK );
+ return 1;
+}
+
+//=========================================================================
+IMPL_LINK( StringInputDialog, NameHdl, Edit *, EMPTYARG )
+{
+/*
+ // trim the strings
+ String aName = m_aNameEdit.GetText();
+ aName.EraseLeadingChars().EraseTrailingChars();
+ if ( aName.Len() )
+ {
+ if ( !m_aOKBtn.IsEnabled() )
+ m_aOKBtn.Enable( TRUE );
+ }
+ else
+ {
+ if ( m_aOKBtn.IsEnabled() )
+ m_aOKBtn.Enable( FALSE );
+ }
+*/
+ return 0;
+}
+
+//=========================================================================
+//
+// UcbExplorerListBoxEntry implementation.
+//
+//=========================================================================
+
+UcbExplorerListBoxEntry::UcbExplorerListBoxEntry()
+{
+}
+
+//=========================================================================
+// virtual
+UcbExplorerListBoxEntry::~UcbExplorerListBoxEntry()
+{
+}
+
+//=========================================================================
+BOOL UcbExplorerListBoxEntry::createNewContent( const ContentInfo& rInfo,
+ ::ucb::Content& rNewContent )
+{
+ sal_Int32 nCount = rInfo.Properties.getLength();
+ Sequence< Any > aPropValues( nCount );
+ Sequence< OUString > aPropNames( nCount );
+
+ if ( nCount > 0 )
+ {
+ // Collect property values.
+
+ Any* pValues = aPropValues.getArray();
+ const Property* pProps = rInfo.Properties.getConstArray();
+ for ( sal_Int32 n = 0; n < nCount; ++n )
+ {
+ const OUString& rName = pProps[ n ].Name;
+ StringInputDialog* pDlg = new StringInputDialog( rName, rName );
+ USHORT nRet = pDlg->Execute();
+ if ( nRet == RET_OK )
+ {
+ OUString aValue( pDlg->GetValue() );
+
+ // Convert value according to supplied type info...
+
+ const Type& rType = pProps[ n ].Type;
+
+ if ( rType == getCppuType(
+ static_cast< const OUString * >( 0 ) ) )
+ {
+ // string
+ pValues[ n ] <<= aValue;
+ }
+ else if ( rType == getCppuType(
+ static_cast< const sal_Int32 * >( 0 ) ) )
+ {
+ // long
+ pValues[ n ] <<= aValue.toInt32();
+ }
+ else if ( rType == getCppuType(
+ static_cast< const sal_Int16 * >( 0 ) ) )
+ {
+ // short
+ pValues[ n ] <<= sal_Int16( aValue.toInt32() ) ;
+ }
+ else if ( rType == getCppuBooleanType() )
+ {
+ // boolean
+ pValues[ n ] <<= sal_Bool( aValue.toChar() ) ;
+ }
+ else if ( rType == getCppuCharType() )
+ {
+ // char
+ pValues[ n ] <<= aValue.toChar();
+ }
+ else if ( rType == getCppuType(
+ static_cast< const sal_Int8 * >( 0 ) ) )
+ {
+ // byte
+ pValues[ n ] <<= sal_Int8( aValue.toChar() ) ;
+ }
+ else if ( rType == getCppuType(
+ static_cast< const sal_Int64 * >( 0 ) ) )
+ {
+ // hyper
+ pValues[ n ] <<= aValue.toInt64();
+ }
+ else if ( rType == getCppuType(
+ static_cast< const float * >( 0 ) ) )
+ {
+ // float
+ pValues[ n ] <<= aValue.toFloat();
+ }
+ else if ( rType == getCppuType(
+ static_cast< const double * >( 0 ) ) )
+ {
+ // double
+ pValues[ n ] <<= aValue.toDouble();
+ }
+ else
+ {
+ // See com/sun/star/ucb/ContentInfo.idl
+ DBG_ERROR( "UcbExplorerListBoxEntry::createNewContent - "
+ "Invlid type for bootstrap property!" );
+ }
+ }
+
+ delete pDlg;
+
+ if ( nRet != RET_OK )
+ return FALSE;
+
+ aPropNames[ n ] = rName;
+ }
+ }
+
+ uno::Reference< XInputStream > xData;
+
+ if ( rInfo.Attributes & ContentInfoAttribute::INSERT_WITH_INPUTSTREAM )
+ {
+ // Let the user specify the URL of a content containing the
+ // data to supply to the new content.
+
+ StringInputDialog* pDlg = new StringInputDialog(
+ OUString::createFromAscii(
+ "Document Data Source URL" ),
+ OUString() );
+ USHORT nRet = pDlg->Execute();
+ if ( nRet == RET_OK )
+ {
+ // Create a content object for the given URL.
+
+ OUString aSourceURL( pDlg->GetValue() );
+ if ( aSourceURL.getLength() == 0 )
+ {
+ DBG_ERROR( "UcbExplorerListBoxEntry::createNewContent - "
+ "No document data URL!" );
+ return FALSE;
+ }
+
+ try
+ {
+ uno::Reference< XCommandEnvironment > xEnv;
+
+ ::ucb::ContentBroker* pBroker = ::ucb::ContentBroker::get();
+ if ( pBroker )
+ {
+ uno::Reference< XInteractionHandler > xInteractionHandler(
+ pBroker->getServiceManager()->createInstance(
+ OUString::createFromAscii(
+ "com.sun.star.task.InteractionHandler" ) ),
+ UNO_QUERY );
+
+ uno::Reference< XProgressHandler > xProgressHandler
+ /* = new ProgressHandler( *pBroker ) */ ;
+
+ xEnv = new ::ucb::CommandEnvironment( xInteractionHandler,
+ xProgressHandler );
+ }
+
+ ::ucb::Content aSourceContent( aSourceURL, xEnv );
+
+ // Get source data.
+ rtl::Reference< TestDataSink > xSourceData = new TestDataSink;
+ aSourceContent.openStream( xSourceData.getBodyPtr() );
+ xData = xSourceData->getInputStream();
+ }
+ catch ( ContentCreationException const & )
+ {
+ DBG_ERROR( "UcbExplorerListBoxEntry::createNewContent - "
+ "No content for document data!" );
+ return FALSE;
+ }
+ catch ( CommandAbortedException const & )
+ {
+ return FALSE;
+ }
+ catch ( RuntimeException const & )
+ {
+ throw;
+ }
+ catch ( Exception const & )
+ {
+ return FALSE;
+ }
+ }
+
+ delete pDlg;
+
+ if ( nRet != RET_OK )
+ return FALSE;
+ }
+
+ // Create new content.
+
+ ULONG n = Application::ReleaseSolarMutex();
+ BOOL bRet = sal_False;
+
+ try
+ {
+ bRet = m_aContent.insertNewContent(
+ rInfo.Type, aPropNames, aPropValues, xData, rNewContent );
+ }
+ catch ( CommandAbortedException const & )
+ {
+ }
+ catch ( RuntimeException const & )
+ {
+ throw;
+ }
+ catch ( Exception const & )
+ {
+ }
+
+ Application::AcquireSolarMutex( n );
+ return bRet;
+}
+
+//=========================================================================
+//
+// UcbExplorerTreeListBox implementation.
+//
+//=========================================================================
+
+UcbExplorerTreeListBox::UcbExplorerTreeListBox(
+ Window* pParent, WinBits nWinStyle )
+: SvTreeListBox( pParent, nWinStyle ),
+ m_aFolderClosed( ResId( BMP_FOLDER_CLOSED ) ),
+ m_aFolderOpened( ResId( BMP_FOLDER_OPENED ) ),
+ m_aDocument( ResId( BMP_DOCUMENT ) ),
+ m_aLink( ResId( BMP_LINK ) )
+{
+}
+
+//=========================================================================
+// virtual
+UcbExplorerTreeListBox::~UcbExplorerTreeListBox()
+{
+}
+
+//=========================================================================
+// virtual
+SvLBoxEntry* UcbExplorerTreeListBox::CreateEntry() const
+{
+ return new UcbExplorerListBoxEntry();
+}
+
+//=========================================================================
+// virtual
+void UcbExplorerTreeListBox::RequestingChilds( SvLBoxEntry* pParent )
+{
+ UcbExplorerListBoxEntry* pEntry
+ = static_cast< UcbExplorerListBoxEntry * >( pParent );
+ if ( !pEntry->HasChilds() )
+ {
+ switch ( pEntry->m_eType )
+ {
+ case UcbExplorerListBoxEntry::FOLDER:
+ {
+ ULONG n = Application::ReleaseSolarMutex();
+
+ try
+ {
+ Sequence< OUString > aPropertyNames( 0 );
+// OUString* pNames = aPropertyNames.getArray();
+// pNames[ 0 ] = OUString::createFromAscii( "Title" );
+
+ uno::Reference< XResultSet > xResultSet
+ = pEntry->m_aContent.createCursor(
+ aPropertyNames,
+ ::ucb::INCLUDE_FOLDERS_AND_DOCUMENTS );
+ uno::Reference< XContentAccess > xContentAccess(
+ xResultSet, UNO_QUERY );
+
+ if ( xResultSet.is() && xContentAccess.is() )
+ {
+ while ( xResultSet->next() )
+ {
+ Application::AcquireSolarMutex( n );
+
+ InsertEntry(
+ xContentAccess->queryContentIdentifierString(),
+ pParent );
+
+ n = Application::ReleaseSolarMutex();
+ }
+ }
+ }
+ catch ( CommandAbortedException const & )
+ {
+ }
+ catch ( RuntimeException const & )
+ {
+ throw;
+ }
+ catch ( Exception const & )
+ {
+ }
+
+ Application::AcquireSolarMutex( n );
+ break;
+ }
+
+ case UcbExplorerListBoxEntry::DOCUMENT:
+ break;
+
+ case UcbExplorerListBoxEntry::LINK:
+ break;
+
+ default:
+ break;
+ }
+ }
+}
+
+//=========================================================================
+// virtual
+void UcbExplorerTreeListBox::Command( const CommandEvent& rCEvt )
+{
+ if ( rCEvt.GetCommand() == COMMAND_CONTEXTMENU )
+ {
+ const Point& rPos = rCEvt.GetMousePosPixel();
+ UcbExplorerListBoxEntry* pEntry
+ = static_cast< UcbExplorerListBoxEntry * >(
+ GetEntry( rPos, TRUE ) );
+ if ( pEntry )
+ {
+ PopupMenu* pMenu = new PopupMenu( ResId( MENU_POPUP ) );
+ PopupMenu* pNewMenu = 0;
+
+// pMenu->SetSelectHdl( LINK( this,
+// SfxCommonTemplateDialog_Impl,
+// MenuSelectHdl ) );
+
+ //////////////////////////////////////////////////////////////
+ // Configure "New"
+ //////////////////////////////////////////////////////////////
+
+ uno::Reference< XContentCreator > xCreator(
+ pEntry->m_aContent.get(), UNO_QUERY );
+ Sequence< ContentInfo > aInfo;
+ BOOL bCanCreate = xCreator.is();
+ if ( bCanCreate )
+ {
+ aInfo = xCreator->queryCreatableContentsInfo();
+ const ContentInfo* pInfo = aInfo.getConstArray();
+ sal_Int32 nCount = aInfo.getLength();
+ bCanCreate = ( nCount > 0 );
+
+ pNewMenu = new PopupMenu;
+ pMenu->SetPopupMenu( MENU_NEW, pNewMenu );
+
+ for ( sal_Int32 n = 0; n < nCount; ++n )
+ {
+ const ContentInfo& rInfo = pInfo[ n ];
+ pNewMenu->InsertItem( 20000 + n + 1, rInfo.Type );
+ }
+ }
+
+ pMenu->EnableItem( MENU_NEW, bCanCreate );
+
+ //////////////////////////////////////////////////////////////
+ // Configure "Rename"
+ //////////////////////////////////////////////////////////////
+
+ sal_Bool bEnable = sal_False;
+
+ try
+ {
+ Property aProp =
+ pEntry->m_aContent.getProperties()->getPropertyByName(
+ OUString::createFromAscii( "Title" ) );
+ bEnable = !( aProp.Attributes & PropertyAttribute::READONLY );
+ }
+ catch( UnknownPropertyException const & )
+ {
+ // getPropertyByName
+ bEnable = sal_False;
+ }
+ catch ( CommandAbortedException const & )
+ {
+ }
+ catch ( RuntimeException const & )
+ {
+ throw;
+ }
+ catch ( Exception const & )
+ {
+ }
+
+ pMenu->EnableItem( MENU_RENAME, bEnable );
+
+ //////////////////////////////////////////////////////////////
+ // Configure "Delete"
+ //////////////////////////////////////////////////////////////
+
+ try
+ {
+ pMenu->EnableItem( MENU_DELETE,
+ pEntry->m_aContent
+ .getCommands()->hasCommandByName(
+ OUString::createFromAscii(
+ "delete" ) ) );
+ }
+ catch ( CommandAbortedException const & )
+ {
+ }
+ catch ( RuntimeException const & )
+ {
+ throw;
+ }
+ catch ( Exception const & )
+ {
+ }
+
+ //////////////////////////////////////////////////////////////
+ // Execute menu.
+ //////////////////////////////////////////////////////////////
+
+ USHORT nSelected = pMenu->Execute( this, rPos );
+ switch ( nSelected )
+ {
+// case MENU_NEW:
+// break;
+
+ case MENU_RENAME:
+ {
+ OUString aNewTitle;
+
+ try
+ {
+ pEntry->m_aContent.getPropertyValue(
+ OUString::createFromAscii( "Title" ) )
+ >>= aNewTitle;
+ }
+ catch ( CommandAbortedException const & )
+ {
+ }
+ catch ( RuntimeException const & )
+ {
+ throw;
+ }
+ catch ( Exception const & )
+ {
+ }
+
+ StringInputDialog* pDlg
+ = new StringInputDialog(
+ OUString::createFromAscii( "Title" ),
+ aNewTitle );
+
+ USHORT nRet = pDlg->Execute();
+
+ Any aValue;
+
+ if ( nRet == RET_OK )
+ {
+ aNewTitle = pDlg->GetValue();
+ aValue <<= aNewTitle;
+ }
+
+ delete pDlg;
+
+ if ( nRet != RET_OK )
+ break;
+
+ sal_Bool bOK = sal_False;
+
+ ULONG n = Application::ReleaseSolarMutex();
+
+ try
+ {
+ pEntry->m_aContent.setPropertyValue(
+ OUString::createFromAscii( "Title" ),
+ aValue );
+ bOK = sal_True;
+ }
+ catch ( CommandAbortedException const & )
+ {
+ }
+ catch ( RuntimeException const & )
+ {
+ throw;
+ }
+ catch ( Exception const & )
+ {
+ }
+
+ Application::AcquireSolarMutex( n );
+
+ if ( bOK )
+ {
+ OUString aText( aNewTitle );
+ OUString aTargetURL;
+ try
+ {
+ pEntry->m_aContent.getPropertyValue(
+ OUString::createFromAscii( "TargetURL" ) )
+ >>= aTargetURL;
+ }
+ catch ( CommandAbortedException const & )
+ {
+ }
+ catch ( RuntimeException const & )
+ {
+ throw;
+ }
+ catch ( Exception const & )
+ {
+ // The property is optional!
+ }
+
+ if ( aTargetURL.getLength() > 0 )
+ {
+ // Insert link.
+ aText += OUString::createFromAscii( " --> " );
+ aText += aTargetURL;
+ }
+
+ SetEntryText( pEntry, aText );
+ }
+ break;
+ }
+
+ case MENU_DELETE:
+ {
+ ULONG n = Application::ReleaseSolarMutex();
+ sal_Bool bOK = sal_True;
+
+ try
+ {
+ pEntry->m_aContent.executeCommand(
+ OUString::createFromAscii( "delete" ),
+ makeAny( sal_True ) );
+ }
+ catch ( CommandAbortedException const & )
+ {
+ bOK = sal_False;
+ }
+ catch ( RuntimeException const & )
+ {
+ throw;
+ }
+ catch ( Exception const & )
+ {
+ bOK = sal_False;
+ }
+
+ Application::AcquireSolarMutex( n );
+
+ if ( bOK )
+ RemoveSelection();
+
+ break;
+ }
+
+ default:
+ {
+ if ( ( nSelected > 20000 ) &&
+ ( ( nSelected - 20000 ) <= aInfo.getLength() ) )
+ {
+ // New-menu entry selected.
+
+ ::ucb::Content aNewContent;
+ if ( pEntry->createNewContent(
+ aInfo.getConstArray()[ nSelected - 20001 ],
+ aNewContent ) )
+ {
+ if ( !IsExpanded( pEntry ) )
+ Expand( pEntry );
+ else
+ InsertEntry( aNewContent, pEntry );
+ }
+ }
+ break;
+ }
+ }
+
+ delete pNewMenu;
+ delete pMenu;
+ return;
+ }
+ }
+
+ SvTreeListBox::Command( rCEvt );
+}
+
+//=========================================================================
+UcbExplorerListBoxEntry* UcbExplorerTreeListBox::InsertEntry(
+ ::ucb::Content& rContent,
+ SvLBoxEntry* pParent )
+{
+ try
+ {
+ OUString aTitle;
+ rContent.getPropertyValue(
+ OUString::createFromAscii( "Title" ) ) >>= aTitle;
+ if ( !aTitle.getLength() )
+ aTitle = OUString::createFromAscii( "/" );
+
+ UcbExplorerListBoxEntry* pEntry = 0;
+
+ if ( rContent.isFolder() )
+ {
+ // Insert folder.
+ pEntry = static_cast< UcbExplorerListBoxEntry * >(
+ SvTreeListBox::InsertEntry( aTitle,
+ m_aFolderOpened,
+ m_aFolderClosed,
+ pParent,
+ TRUE ) );
+ pEntry->m_eType = UcbExplorerListBoxEntry::FOLDER;
+ }
+ else
+ {
+ OUString aTargetURL;
+ try
+ {
+ rContent.getPropertyValue(
+ OUString::createFromAscii( "TargetURL" ) ) >>= aTargetURL;
+ }
+ catch ( CommandAbortedException const & )
+ {
+ }
+ catch ( RuntimeException const & )
+ {
+ throw;
+ }
+ catch ( Exception const & )
+ {
+ // The property is optional!
+ }
+
+ if ( aTargetURL.getLength() > 0 )
+ {
+ // Insert link.
+ aTitle += OUString::createFromAscii( " --> " );
+ aTitle += aTargetURL;
+ pEntry = static_cast< UcbExplorerListBoxEntry * >(
+ SvTreeListBox::InsertEntry( aTitle,
+ m_aLink,
+ m_aLink,
+ pParent,
+ TRUE ) );
+ pEntry->m_eType = UcbExplorerListBoxEntry::LINK;
+ }
+ else
+ {
+ // Insert Document
+ pEntry = static_cast< UcbExplorerListBoxEntry * >(
+ SvTreeListBox::InsertEntry( aTitle,
+ m_aDocument,
+ m_aDocument,
+ pParent,
+ TRUE ) );
+ pEntry->m_eType = UcbExplorerListBoxEntry::DOCUMENT;
+ }
+ }
+
+ pEntry->m_aContent = rContent;
+ return pEntry;
+ }
+ catch ( CommandAbortedException const & )
+ {
+ }
+ catch ( Exception const & )
+ {
+ }
+
+ return 0;
+}
+
+//=========================================================================
+UcbExplorerListBoxEntry* UcbExplorerTreeListBox::InsertEntry(
+ const String& rURL,
+ SvLBoxEntry* pParent )
+{
+ try
+ {
+ uno::Reference< XCommandEnvironment > xEnv;
+
+ ::ucb::ContentBroker* pBroker = ::ucb::ContentBroker::get();
+ if ( pBroker )
+ {
+ uno::Reference< XInteractionHandler > xInteractionHandler(
+ pBroker->getServiceManager()->createInstance(
+ OUString::createFromAscii(
+ "com.sun.star.task.InteractionHandler" ) ),
+ UNO_QUERY );
+
+ uno::Reference< XProgressHandler > xProgressHandler
+ /* = new ProgressHandler( *pBroker ) */ ;
+
+ xEnv = new ::ucb::CommandEnvironment( xInteractionHandler,
+ xProgressHandler );
+ }
+
+ ::ucb::Content aContent( rURL, xEnv );
+ return InsertEntry( aContent, pParent );
+ }
+ catch ( ContentCreationException const & )
+ {
+ }
+
+ return 0;
+}
+
+//=========================================================================
+//
+// UcbExplorerWindow implementation.
+//
+//=========================================================================
+
+UcbExplorerWindow::UcbExplorerWindow( Window *pParent, WinBits nWinStyle )
+: WorkWindow( pParent, nWinStyle ),
+ m_aTree( this, WB_HSCROLL )
+{
+ Font aTreeFont( m_aTree.GetFont() );
+ aTreeFont.SetName( String( RTL_CONSTASCII_USTRINGPARAM("Courier") ) );
+ aTreeFont.SetFamily( FAMILY_MODERN );
+ aTreeFont.SetPitch( PITCH_FIXED );
+ aTreeFont.SetSize( Size( 0, 12 ) );
+
+ m_aTree.SetFont( aTreeFont );
+ m_aTree.SetIndent( 20 );
+ m_aTree.SetPosPixel( Point( 0, 0 ) );
+
+ m_aTree.Show();
+}
+
+//-------------------------------------------------------------------------
+// virtual
+UcbExplorerWindow::~UcbExplorerWindow()
+{
+}
+
+//-------------------------------------------------------------------------
+// virtual
+void UcbExplorerWindow::Resize()
+{
+ m_aTree.SetSizePixel( GetOutputSizePixel() );
+}
+
+//=========================================================================
+//
+// MyApp implementation.
+//
+//=========================================================================
+
+// virtual
+void MyApp::Main()
+{
+ //////////////////////////////////////////////////////////////////////
+ // Initialize local Service Manager and basic services.
+ //////////////////////////////////////////////////////////////////////
+
+ uno::Reference< XMultiServiceFactory > xFac;
+ try
+ {
+ uno::Reference< XComponentContext > xCtx(
+ cppu::defaultBootstrap_InitialComponentContext() );
+ if ( !xCtx.is() )
+ {
+ DBG_ERROR( "Error creating initial component context!" );
+ return;
+ }
+
+ xFac = uno::Reference< XMultiServiceFactory >(
+ xCtx->getServiceManager(), UNO_QUERY );
+
+ if ( !xFac.is() )
+ {
+ DBG_ERROR( "No service manager!" );
+ return;
+ }
+ }
+ catch ( com::sun::star::uno::Exception const & )
+ {
+ DBG_ERROR( "Exception during creation of initial component context!" );
+ return;
+ }
+
+ comphelper::setProcessServiceFactory( xFac );
+
+ unO::Reference< XComponent > xComponent( xFac, UNO_QUERY );
+
+ //////////////////////////////////////////////////////////////////////
+ // Create UCB.
+ //////////////////////////////////////////////////////////////////////
+
+#if 1
+ // Init UCB (Read configuration from registry)
+ Sequence< Any > aArgs( 2 );
+ aArgs[ 0 ] <<= OUString::createFromAscii( UCB_CONFIGURATION_KEY1_LOCAL );
+ aArgs[ 1 ] <<= OUString::createFromAscii( UCB_CONFIGURATION_KEY2_OFFICE );
+ sal_Bool bSuccess = ::ucb::ContentBroker::initialize( xFac, aArgs );
+#else
+ // Init UCB (Use provided configuration data)
+ ::ucb::ContentProviderDataList aProviders;
+ aProviders.push_back(
+ ::ucb::ContentProviderData(
+ OUString::createFromAscii( "com.sun.star.ucb.FileContentProvider" ),
+ OUString::createFromAscii( "file" ),
+ OUString() ) );
+ sal_Bool bSuccess = ::ucb::ContentBroker::initialize( xFac, aProviders );
+#endif
+
+ if ( !bSuccess )
+ {
+ DBG_ERROR( "Error creating UCB!" );
+ return;
+ }
+
+ //////////////////////////////////////////////////////////////////////
+ // Create/init/show app window.
+ //////////////////////////////////////////////////////////////////////
+
+ ResMgr* pMgr = ResMgr::CreateResMgr( CREATEVERSIONRESMGR( ucbexplorer ) );
+ Resource::SetResManager( pMgr );
+
+ UcbExplorerWindow aAppWin( 0, WB_APP | WB_STDWORK );
+
+ MenuBar aMBMain( ResId( MENU_MAIN ) );
+
+ // Check for command line params
+#if 0
+ for ( int i = 0; i < GetCommandLineParamCount(); ++i )
+ {
+ String aPara = GetCommandLineParam( i );
+ }
+#endif
+
+ String aRootURL = GetCommandLineParam( 0 );
+ if ( aRootURL.Len() == 0 )
+ aRootURL = UniString::CreateFromAscii(
+ RTL_CONSTASCII_STRINGPARAM( "vnd.sun.star.hier:/" ) );
+
+ String aTitle( ResId( TEXT_TITLEBAR ) );
+ aTitle.AppendAscii( RTL_CONSTASCII_STRINGPARAM( " - " ) );
+ aTitle += aRootURL;
+
+ aAppWin.SetText( aTitle );
+
+ aAppWin.SetPosSizePixel( 0, 0, 500, 750 );
+
+ aAppWin.Show();
+
+ aAppWin.m_aTree.InsertEntry( aRootURL );
+
+ //////////////////////////////////////////////////////////////////////
+ // Execute app.
+ //////////////////////////////////////////////////////////////////////
+
+ Execute();
+
+ //////////////////////////////////////////////////////////////////////
+ // Cleanup.
+ //////////////////////////////////////////////////////////////////////
+
+ // m_aTree holds UCB contents!
+ aAppWin.m_aTree.Clear();
+
+ ::ucb::ContentBroker::deinitialize();
+
+ if ( xComponent.is() )
+ xComponent->dispose();
+}
+
+//=========================================================================
+//
+// The Application.
+//
+//=========================================================================
+
+MyApp aMyApp;
+
diff --git a/ucbhelper/workben/ucbexplorer/ucbexplorer.hrc b/ucbhelper/workben/ucbexplorer/ucbexplorer.hrc
new file mode 100644
index 000000000000..42ef0732c0e5
--- /dev/null
+++ b/ucbhelper/workben/ucbexplorer/ucbexplorer.hrc
@@ -0,0 +1,68 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2008 by Sun Microsystems, Inc.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * $RCSfile: ucbexplorer.hrc,v $
+ * $Revision: 1.3 $
+ *
+ * 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.
+ *
+ ************************************************************************/
+//=========================================================================
+//
+// UCB Explorer ( resource identifiers )
+//
+// (C) 2000 StarOffice Entwicklungs GmbH, Hamburg, Germany
+//
+// $Author: rt $ $Date: 2008-04-10 16:19:47 $Revision$
+//
+//=========================================================================
+
+#ifndef _UCBEXPLORER_HRC
+#define _UCBEXPLORER_HRC
+
+#define MENU_MAIN 1000
+#define MENU_FILE 100
+#define MENU_EXIT 10
+
+#define MENU_POPUP 1001
+#define MENU_NEW 10
+#define MENU_RENAME 11
+#define MENU_DELETE 12
+
+#define TEXT_TITLEBAR 5000
+
+#define BMP_FOLDER_CLOSED 6001
+#define BMP_FOLDER_OPENED 6002
+#define BMP_DOCUMENT 6003
+#define BMP_LINK 6004
+
+#define DLG_STRINGINPUT 7000
+#define FT_STRINGINPUT_DLG_NAME 10
+#define ED_STRINGINPUT_DLG_NAME 11
+#define GB_STRINGINPUT_DLG_NAME 12
+#define BT_STRINGINPUT_DLG_OK 13
+#define BT_STRINGINPUT_DLG_CANCEL 14
+#define BT_STRINGINPUT_DLG_HELP 15
+
+
+#endif /* !_UCBEXPLORER_HRC */
diff --git a/ucbhelper/workben/ucbexplorer/ucbexplorer.src b/ucbhelper/workben/ucbexplorer/ucbexplorer.src
new file mode 100644
index 000000000000..14d4b8ee8770
--- /dev/null
+++ b/ucbhelper/workben/ucbexplorer/ucbexplorer.src
@@ -0,0 +1,159 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2008 by Sun Microsystems, Inc.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * $RCSfile: ucbexplorer.src,v $
+ * $Revision: 1.4 $
+ *
+ * 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.
+ *
+ ************************************************************************/
+//=========================================================================
+//
+// UCB Explorer ( resources )
+//
+// (C) 2000 StarOffice Entwicklungs GmbH, Hamburg, Germany
+//
+// $Author: rt $ $Date: 2008-04-10 16:20:05 $Revision$
+//
+//=========================================================================
+
+#include "ucbexplorer.hrc"
+
+Menu MENU_MAIN
+{
+ ItemList =
+
+ {
+ MenuItem
+ {
+ Identifier = MENU_FILE ;
+ Text [ en-US ] = "~File" ;
+ SubMenu = Menu
+ {
+ ItemList =
+
+ {
+ MenuItem
+ {
+ Identifier = MENU_EXIT ;
+ Text [ en-US ] = "~Exit" ;
+ AccelKey = KeyCode
+ {
+ Function = KEYFUNC_QUIT ;
+ };
+ };
+ };
+ };
+ };
+ };
+};
+
+Menu MENU_POPUP
+{
+ ItemList =
+
+ {
+ MenuItem
+ {
+ Identifier = MENU_NEW ;
+ Text [ en-US ] = "~New" ;
+ };
+ MenuItem
+ {
+ Identifier = MENU_RENAME ;
+ Text [ en-US ] = "~Rename" ;
+ };
+ MenuItem
+ {
+ Identifier = MENU_DELETE ;
+ Text [ en-US ] = "~Delete" ;
+ };
+ };
+};
+
+Bitmap BMP_FOLDER_CLOSED
+{
+ File = "bmp/fldclose.bmp" ;
+};
+Bitmap BMP_FOLDER_OPENED
+{
+ File = "bmp/fldopen.bmp" ;
+};
+Bitmap BMP_DOCUMENT
+{
+ File = "bmp/document.bmp" ;
+};
+Bitmap BMP_LINK
+{
+ File = "bmp/link.bmp" ;
+};
+
+ModalDialog DLG_STRINGINPUT
+{
+ Border = TRUE ;
+ Moveable = TRUE ;
+ OutputSize = TRUE ;
+ SVLook = TRUE ;
+ Size = MAP_APPFONT ( 218 , 44 ) ;
+ FixedText FT_STRINGINPUT_DLG_NAME
+ {
+ Pos = MAP_APPFONT ( 12 , 18 ) ;
+ Size = MAP_APPFONT ( 28 , 10 ) ;
+ Text [ en-US ] = "~Value" ;
+ };
+ Edit ED_STRINGINPUT_DLG_NAME
+ {
+ Pos = MAP_APPFONT ( 40 , 16 ) ;
+ Size = MAP_APPFONT ( 110 , 12 ) ;
+ Border = TRUE ;
+ Left = TRUE ;
+ };
+ GroupBox GB_STRINGINPUT_DLG_NAME
+ {
+ Group = TRUE ;
+ Pos = MAP_APPFONT ( 6 , 3 ) ;
+ Size = MAP_APPFONT ( 150 , 36 ) ;
+ };
+ OKButton BT_STRINGINPUT_DLG_OK
+ {
+ Pos = MAP_APPFONT ( 162 , 6 ) ;
+ Size = MAP_APPFONT ( 50 , 14 ) ;
+ DefButton = TRUE ;
+ };
+ CancelButton BT_STRINGINPUT_DLG_CANCEL
+ {
+ Pos = MAP_APPFONT ( 162 , 23 ) ;
+ Size = MAP_APPFONT ( 50 , 14 ) ;
+ };
+ HelpButton BT_STRINGINPUT_DLG_HELP
+ {
+ Pos = MAP_APPFONT ( 162 , 200 ) ;
+ Size = MAP_APPFONT ( 50 , 14 ) ;
+ };
+};
+
+String TEXT_TITLEBAR
+{
+ Text [ en-US ] = "UCB Explorer" ;
+};
+