diff options
Diffstat (limited to 'ucbhelper/workben')
20 files changed, 4015 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..0d7f273fe877 --- /dev/null +++ b/ucbhelper/workben/myucp/makefile.mk @@ -0,0 +1,89 @@ +#************************************************************************* +# +# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. +# +# Copyright 2000, 2010 Oracle and/or its affiliates. +# +# OpenOffice.org - a multi-platform office productivity suite +# +# This file is part of OpenOffice.org. +# +# OpenOffice.org is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License version 3 +# only, as published by the Free Software Foundation. +# +# OpenOffice.org is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License version 3 for more details +# (a copy is included in the LICENSE file that accompanied this code). +# +# You should have received a copy of the GNU Lesser General Public License +# version 3 along with OpenOffice.org. If not, see +# <http://www.openoffice.org/license.html> +# for a copy of the LGPLv3 License. +# +#************************************************************************* + +# @@@ 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..bea998b60f28 --- /dev/null +++ b/ucbhelper/workben/myucp/myucp_content.cxx @@ -0,0 +1,983 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2000, 2010 Oracle and/or its affiliates. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * <http://www.openoffice.org/license.html> + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +// MARKER(update_precomp.py): autogen include statement, do not remove +#include "precompiled_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..0645b0262683 --- /dev/null +++ b/ucbhelper/workben/myucp/myucp_content.hxx @@ -0,0 +1,191 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2000, 2010 Oracle and/or its affiliates. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * <http://www.openoffice.org/license.html> + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +// @@@ 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..d6981fd2f598 --- /dev/null +++ b/ucbhelper/workben/myucp/myucp_contentcaps.cxx @@ -0,0 +1,223 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2000, 2010 Oracle and/or its affiliates. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * <http://www.openoffice.org/license.html> + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +// MARKER(update_precomp.py): autogen include statement, do not remove +#include "precompiled_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..467d7ec0c505 --- /dev/null +++ b/ucbhelper/workben/myucp/myucp_datasupplier.cxx @@ -0,0 +1,398 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2000, 2010 Oracle and/or its affiliates. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * <http://www.openoffice.org/license.html> + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +// MARKER(update_precomp.py): autogen include statement, do not remove +#include "precompiled_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..7d4cea7ec09e --- /dev/null +++ b/ucbhelper/workben/myucp/myucp_datasupplier.hxx @@ -0,0 +1,77 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2000, 2010 Oracle and/or its affiliates. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * <http://www.openoffice.org/license.html> + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +// @@@ 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..9fa3c1625fc2 --- /dev/null +++ b/ucbhelper/workben/myucp/myucp_provider.cxx @@ -0,0 +1,171 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2000, 2010 Oracle and/or its affiliates. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * <http://www.openoffice.org/license.html> + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +// MARKER(update_precomp.py): autogen include statement, do not remove +#include "precompiled_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..5fd9fe31ffad --- /dev/null +++ b/ucbhelper/workben/myucp/myucp_provider.hxx @@ -0,0 +1,95 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2000, 2010 Oracle and/or its affiliates. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * <http://www.openoffice.org/license.html> + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +// @@@ 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..d5d45ddfb97c --- /dev/null +++ b/ucbhelper/workben/myucp/myucp_resultset.cxx @@ -0,0 +1,97 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2000, 2010 Oracle and/or its affiliates. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * <http://www.openoffice.org/license.html> + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +// MARKER(update_precomp.py): autogen include statement, do not remove +#include "precompiled_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..3430e944cb13 --- /dev/null +++ b/ucbhelper/workben/myucp/myucp_resultset.hxx @@ -0,0 +1,62 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2000, 2010 Oracle and/or its affiliates. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * <http://www.openoffice.org/license.html> + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +// @@@ 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..a0cd8a00925b --- /dev/null +++ b/ucbhelper/workben/myucp/myucp_services.cxx @@ -0,0 +1,136 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2000, 2010 Oracle and/or its affiliates. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * <http://www.openoffice.org/license.html> + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +// MARKER(update_precomp.py): autogen include statement, do not remove +#include "precompiled_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 Binary files differnew file mode 100644 index 000000000000..63baf47eca46 --- /dev/null +++ b/ucbhelper/workben/ucbexplorer/bmp/document.bmp diff --git a/ucbhelper/workben/ucbexplorer/bmp/fldclose.bmp b/ucbhelper/workben/ucbexplorer/bmp/fldclose.bmp Binary files differnew file mode 100644 index 000000000000..c0f26b337f7a --- /dev/null +++ b/ucbhelper/workben/ucbexplorer/bmp/fldclose.bmp diff --git a/ucbhelper/workben/ucbexplorer/bmp/fldopen.bmp b/ucbhelper/workben/ucbexplorer/bmp/fldopen.bmp Binary files differnew file mode 100644 index 000000000000..f38643510e78 --- /dev/null +++ b/ucbhelper/workben/ucbexplorer/bmp/fldopen.bmp diff --git a/ucbhelper/workben/ucbexplorer/bmp/link.bmp b/ucbhelper/workben/ucbexplorer/bmp/link.bmp Binary files differnew file mode 100644 index 000000000000..0269a76d98d0 --- /dev/null +++ b/ucbhelper/workben/ucbexplorer/bmp/link.bmp diff --git a/ucbhelper/workben/ucbexplorer/makefile.mk b/ucbhelper/workben/ucbexplorer/makefile.mk new file mode 100644 index 000000000000..f8c1272e6760 --- /dev/null +++ b/ucbhelper/workben/ucbexplorer/makefile.mk @@ -0,0 +1,71 @@ +#************************************************************************* +# +# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. +# +# Copyright 2000, 2010 Oracle and/or its affiliates. +# +# OpenOffice.org - a multi-platform office productivity suite +# +# This file is part of OpenOffice.org. +# +# OpenOffice.org is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License version 3 +# only, as published by the Free Software Foundation. +# +# OpenOffice.org is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License version 3 for more details +# (a copy is included in the LICENSE file that accompanied this code). +# +# You should have received a copy of the GNU Lesser General Public License +# version 3 along with OpenOffice.org. If not, see +# <http://www.openoffice.org/license.html> +# for a copy of the LGPLv3 License. +# +#************************************************************************* + +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..4ca6cb71881d --- /dev/null +++ b/ucbhelper/workben/ucbexplorer/ucbexplorer.cxx @@ -0,0 +1,1200 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2000, 2010 Oracle and/or its affiliates. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * <http://www.openoffice.org/license.html> + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +// MARKER(update_precomp.py): autogen include statement, do not remove +#include "precompiled_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> +#include <com/sun/star/ucb/XCommandInfo.hpp> +#include <com/sun/star/ucb/XContentAccess.hpp> +#include <com/sun/star/ucb/CommandAbortedException.hpp> +#include <com/sun/star/ucb/ContentInfo.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> +#include <vcl/button.hxx> +#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( ResMgr& rResMgr, + 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 }; + + ::ucbhelper::Content m_aContent; + EntryType m_eType; + +public: + UcbExplorerListBoxEntry(); + virtual ~UcbExplorerListBoxEntry(); + + BOOL createNewContent( const ContentInfo& rInfo, + ::ucbhelper::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( ResMgr & rResMgr, Window* pParent, WinBits nWinStyle = 0 ); + virtual ~UcbExplorerTreeListBox(); + + virtual void Command( const CommandEvent& rCEvt ); + + UcbExplorerListBoxEntry* + InsertEntry( ::ucbhelper::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( ResMgr & rResMgr, 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( ResMgr& rResMgr, + const String& rTitle, + const String& rDefaultText, + String* pGroupName ) + : ModalDialog( 0, ResId( DLG_STRINGINPUT, rResMgr ) ), + m_aNameText ( this, ResId( FT_STRINGINPUT_DLG_NAME, rResMgr ) ), + m_aNameEdit ( this, ResId( ED_STRINGINPUT_DLG_NAME, rResMgr ) ), + m_aNameGroup( this, ResId( GB_STRINGINPUT_DLG_NAME, rResMgr ) ), + m_aOKBtn ( this, ResId( BT_STRINGINPUT_DLG_OK, rResMgr ) ), + m_aCancelBtn( this, ResId( BT_STRINGINPUT_DLG_CANCEL, rResMgr ) ), + m_aHelpBtn ( this, ResId( BT_STRINGINPUT_DLG_HELP, rResMgr ) ) +{ + 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, + ::ucbhelper::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; + + std::auto_ptr< ResMgr > xManager( + ResMgr::CreateResMgr( CREATEVERSIONRESMGR_NAME( ucbexplorer ) ) ); + StringInputDialog* pDlg = new StringInputDialog( *xManager.get(), 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. + + std::auto_ptr< ResMgr > xManager( + ResMgr::CreateResMgr( CREATEVERSIONRESMGR_NAME( ucbexplorer ) ) ); + StringInputDialog* pDlg = new StringInputDialog( + *xManager.get(), + 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; + + ::ucbhelper::ContentBroker* pBroker = ::ucbhelper::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 ::ucbhelper::CommandEnvironment( xInteractionHandler, + xProgressHandler ); + } + + ::ucbhelper::Content aSourceContent( aSourceURL, xEnv ); + + // Get source data. + rtl::Reference< TestDataSink > xSourceData = new TestDataSink; + aSourceContent.openStream( xSourceData.get() ); + 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( ResMgr & rResMgr, + Window* pParent, + WinBits nWinStyle ) +: SvTreeListBox( pParent, nWinStyle ), + m_aFolderClosed( ResId( BMP_FOLDER_CLOSED, rResMgr ) ), + m_aFolderOpened( ResId( BMP_FOLDER_OPENED, rResMgr ) ), + m_aDocument( ResId( BMP_DOCUMENT, rResMgr ) ), + m_aLink( ResId( BMP_LINK, rResMgr ) ) +{ +} + +//========================================================================= +// 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, + ::ucbhelper::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 ) + { + std::auto_ptr< ResMgr > xManager( + ResMgr::CreateResMgr( CREATEVERSIONRESMGR_NAME( ucbexplorer ) ) ); + PopupMenu* pMenu = new PopupMenu( ResId( MENU_POPUP, *xManager.get() ) ); + PopupMenu* pNewMenu = 0; + +// pMenu->SetSelectHdl( LINK( this, +// SfxCommonTemplateDialog_Impl, +// MenuSelectHdl ) ); + + ////////////////////////////////////////////////////////////// + // Configure "New" + ////////////////////////////////////////////////////////////// + + Sequence< ContentInfo > aInfo + = pEntry->m_aContent.queryCreatableContentsInfo(); + const ContentInfo* pInfo = aInfo.getConstArray(); + sal_Int32 nCount = aInfo.getLength(); + BOOL 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 & ) + { + } + + std::auto_ptr< ResMgr > xManager( + ResMgr::CreateResMgr( CREATEVERSIONRESMGR_NAME( ucbexplorer ) ) ); + StringInputDialog* pDlg + = new StringInputDialog( + *xManager.get(), + 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. + + ::ucbhelper::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( + ::ucbhelper::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; + + ::ucbhelper::ContentBroker* pBroker = ::ucbhelper::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 ::ucbhelper::CommandEnvironment( xInteractionHandler, + xProgressHandler ); + } + + ::ucbhelper::Content aContent( rURL, xEnv ); + return InsertEntry( aContent, pParent ); + } + catch ( ContentCreationException const & ) + { + } + + return 0; +} + +//========================================================================= +// +// UcbExplorerWindow implementation. +// +//========================================================================= + +UcbExplorerWindow::UcbExplorerWindow( ResMgr & rResMgr, Window *pParent, WinBits nWinStyle ) +: WorkWindow( pParent, nWinStyle ), + m_aTree( rResMgr, 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 = ::ucbhelper::ContentBroker::initialize( xFac, aArgs ); +#else + // Init UCB (Use provided configuration data) + ::ucbhelper::ContentProviderDataList aProviders; + aProviders.push_back( + ::ucbhelper::ContentProviderData( + OUString::createFromAscii( "com.sun.star.ucb.FileContentProvider" ), + OUString::createFromAscii( "file" ), + OUString() ) ); + sal_Bool bSuccess = ::ucbhelper::ContentBroker::initialize( xFac, aProviders ); +#endif + + if ( !bSuccess ) + { + DBG_ERROR( "Error creating UCB!" ); + return; + } + + ////////////////////////////////////////////////////////////////////// + // Create/init/show app window. + ////////////////////////////////////////////////////////////////////// + + std::auto_ptr< ResMgr > xManager( + ResMgr::CreateResMgr( CREATEVERSIONRESMGR_NAME( ucbexplorer ) ) ); + + UcbExplorerWindow aAppWin( *xManager.get(), 0, WB_APP | WB_STDWORK ); + + MenuBar aMBMain( ResId( MENU_MAIN, *xManager.get() ) ); + + // 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, *xManager.get() ) ); + 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(); + + ::ucbhelper::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..e93730da99ef --- /dev/null +++ b/ucbhelper/workben/ucbexplorer/ucbexplorer.hrc @@ -0,0 +1,65 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2000, 2010 Oracle and/or its affiliates. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * <http://www.openoffice.org/license.html> + * for a copy of the LGPLv3 License. + * + ************************************************************************/ +//========================================================================= +// +// 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..4bee5900eaaf --- /dev/null +++ b/ucbhelper/workben/ucbexplorer/ucbexplorer.src @@ -0,0 +1,149 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2000, 2010 Oracle and/or its affiliates. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * <http://www.openoffice.org/license.html> + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +#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" ; +}; + |