office-gobmx/extensions/inc/ucbhelper/ext_content.hxx
2011-02-26 01:14:41 +01:00

332 lines
12 KiB
C++

/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
/*************************************************************************
*
* 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.
*
************************************************************************/
#ifndef _UCBHELPER_CONTENT_HXX_
#define _UCBHELPER_CONTENT_HXX_
#include <rtl/string.hxx>
#include <rtl/ustring>
#include <osl/mutex.hxx>
#include <osl/thread.h>
#include <cppuhelper/weak.hxx>
#include <com/sun/star/ucb/XCommandTaskProcessor.hpp>
#include <com/sun/star/ucb/XCommandInfo.hpp>
#include <com/sun/star/ucb/XContent.hpp>
#include <com/sun/star/ucb/XPropertyTaskProcessor.hpp>
#include <com/sun/star/ucb/XContentIdentifier.hpp>
#include <com/sun/star/beans/XPropertiesChangeListener.hpp>
#include <com/sun/star/lang/XComponent.hpp>
#include <list>
using namespace cppu;
using namespace com::sun::star::ucb;
using namespace com::sun::star::uno;
using namespace com::sun::star::beans;
using namespace com::sun::star::lang;
using namespace std;
using namespace osl;
using ::rtl::OUString;
template <class Type> class safe_list : public osl::Mutex, public std::list< Type > {};
class OSimpleContentIdentifier : public OWeakObject,
public XContentIdentifier
{
private:
OUString Identifier;
OUString ProviderScheme;
public:
OSimpleContentIdentifier( const OUString& rIdentifier, const OUString& rProviderScheme );
// XInterface
virtual Any SAL_CALL queryInterface( const Type &type ) throw( RuntimeException );
virtual void SAL_CALL acquire() throw(RuntimeException);
virtual void SAL_CALL release() throw(RuntimeException);
// XContentIdentifier
virtual OUString SAL_CALL getContentIdentifier() throw(RuntimeException);
virtual OUString SAL_CALL getContentProviderScheme() throw(RuntimeException);
};
//---------------------------------------------------------------------------
//
// FileSystemContent
//
//---------------------------------------------------------------------------
class OContent :
public OWeakObject,
public XContent,
public XCommandTaskProcessor,
public XPropertyTaskProcessor,
public XCommandInfo,
public XPropertySetInfo,
public XComponent
{
public:
struct PropertyChangeEventInfo
{
OUString Name;
long Handle;
PropertyChangeEventInfo() : Handle( -1 ) {}
inline int operator ==( const PropertyChangeEventInfo& crInfo ) const
{ return Handle == crInfo.Handle && Handle > 0 || Name == crInfo.Name; }
#ifdef __SUNPRO_CC
inline int operator <( const PropertyChangeEventInfo& crInfo ) const
{ return Handle != crInfo.Handle ? Handle < crInfo.Handle : Name < crInfo.Name; }
#endif
};
struct PropertyChangeListenerInfo
{
Reference< XPropertiesChangeListener > xListener;
list< PropertyChangeEventInfo > aEventInfos;
inline int operator ==( const PropertyChangeListenerInfo& crInfo ) const
{ return xListener == crInfo.xListener; }
#ifdef __SUNPRO_CC
inline int operator <( const PropertyChangeListenerInfo& crInfo ) const
{ return xListener < crInfo.xListener; }
#endif
};
protected:
Sequence< PropertyChangeEvent > matchListenerEvents( const Sequence< PropertyChangeEvent >& crEvents, const PropertyChangeListenerInfo & crInfo );
safe_list< Reference< XContentEventListener > > m_aContentListeners;
safe_list< Reference< XEventListener > > m_aComponentListeners;
safe_list< PropertyChangeListenerInfo > m_aPropertyChangeListeners;
public:
virtual ~OContent() {}
virtual void broadcastContentEvent( const ContentEvent & crEvent );
virtual void broadcastPropertiesChangeEvents( const Sequence< PropertyChangeEvent >& crEvents );
// To be implemented by inheritents
virtual Any doCommand( const Command & crCommand ) = 0;
// XInterface
virtual Any SAL_CALL queryInterface( const Type &type ) throw( RuntimeException );
virtual void SAL_CALL acquire() throw(RuntimeException);
virtual void SAL_CALL release() throw(RuntimeException);
// XContent
virtual void SAL_CALL addContentEventListener( const Reference< XContentEventListener >& rListener ) throw();
virtual void SAL_CALL removeContentEventListener( const Reference< XContentEventListener >& rListener ) throw();
// XComponent
virtual void SAL_CALL dispose() throw();
virtual void SAL_CALL addEventListener( const Reference< XEventListener >& xListener ) throw();
virtual void SAL_CALL removeEventListener( const Reference< XEventListener >& xListener ) throw();
// XCommmandTaskProcessor
virtual Reference< XCommandInfo > SAL_CALL getCommandsInfo() throw();
// XCommandInfo
virtual CommandInfo SAL_CALL getCommandInfoByName( const OUString& rName ) throw( UnsupportedCommandException );
virtual CommandInfo SAL_CALL getCommandInfoByHandle( long nHandle ) throw( UnsupportedCommandException );
virtual sal_Bool SAL_CALL hasCommandByName( const OUString& rName ) throw();
virtual sal_Bool SAL_CALL hasCommandByHandle( long nHandle ) throw();
// XPropertyTaskProcessor
virtual Reference< XPropertySetInfo > SAL_CALL getPropertySetInfo() throw();
// XPropertySetInfo
virtual Property SAL_CALL getPropertyByName( const OUString& Name ) throw( UnknownPropertyException );
virtual sal_Bool SAL_CALL hasPropertyByName( const OUString& Name ) throw();
virtual void SAL_CALL addPropertiesChangeListener( const Sequence< OUString >& Names, const Reference< XPropertiesChangeListener >& xListener ) throw();
virtual void SAL_CALL removePropertiesChangeListener( const Sequence< OUString >& Names, const Reference< XPropertiesChangeListener >& xListener ) throw();
};
//---------------------------------------------------------------------------
//
// FolderContent
//
//---------------------------------------------------------------------------
// supported Commands
static const sal_Int32 OPEN = 0;
static const sal_Int32 CLOSE = 1;
class OFolderContent : public OContent
{
protected:
// Already provided children
safe_list< XContent > m_aChildList;
// OContent
virtual Any doCommand( const Command & crCommand );
// new methods, can be overloaded
virtual Any doOpenCommand();
virtual Any doCloseCommand();
// To be implemented by inheritants
virtual Sequence< XContent > getAllChildren() = 0;
public:
// XCommmandTaskProcessor
virtual Reference< XCommandTask > SAL_CALL createCommandTask(const Command& rCommand, const Reference< XContentTaskEnvironment >& rEnvironment ) throw();
// XCommandInfo
virtual Sequence< CommandInfo > SAL_CALL getCommands() throw();
};
//---------------------------------------------------------------------------
//
// OContentTask
//
//---------------------------------------------------------------------------
class OContentTask :
public OWeakObject,
public XContentTask
{
Guard< OContent > m_aContentGuard;
protected:
OContent *m_pContent;
Reference< XContentTaskEnvironment > m_xEnvironment;
ContentTaskStatus m_eStatus;
oslThread m_aThread;
static void executeWorker( void * );
virtual ContentTaskStatus setStatus( ContentTaskStatus eStatus );
// To be implemented by inheritants
virtual void doExecute() = 0;
public:
OContentTask( const Reference< XContentTaskEnvironment >& xEnv, OContent *pContent );
virtual ~OContentTask();
// XInterface
virtual Any SAL_CALL queryInterface( const Type &type ) throw( RuntimeException );
virtual void SAL_CALL acquire() throw(RuntimeException);
virtual void SAL_CALL release() throw(RuntimeException);
// XContentTask
virtual void SAL_CALL start() throw();
virtual void SAL_CALL execute() throw( Exception );
virtual void SAL_CALL abort() throw();
virtual ContentTaskStatus SAL_CALL getStatus() throw();
virtual Reference< XContentTaskEnvironment > SAL_CALL getEnvironment() throw();
};
//---------------------------------------------------------------------------
//
// OCommandTask
//
//---------------------------------------------------------------------------
class OCommandTask :
public OContentTask,
public XCommandTask
{
protected:
Command m_aCommand;
Any m_aResult;
public:
OCommandTask( const Reference< XContentTaskEnvironment >& xEnv, OContent *pContent, const Command& rCommand );
virtual ~OCommandTask();
virtual void doExecute();
// XInterface
virtual Any SAL_CALL queryInterface( const Type &type ) throw( RuntimeException );
virtual void SAL_CALL acquire() throw(RuntimeException);
virtual void SAL_CALL release() throw(RuntimeException);
// XContentTask
virtual void SAL_CALL start() throw();
virtual void SAL_CALL execute() throw( Exception );
virtual void SAL_CALL abort() throw();
virtual ContentTaskStatus SAL_CALL getStatus() throw();
virtual Reference< XContentTaskEnvironment > SAL_CALL getEnvironment() throw();
// XCommandTask
virtual Command SAL_CALL getCommand() throw();
virtual Any SAL_CALL getResult() throw();
};
//---------------------------------------------------------------------------
//
// OPropertyTask
//
//---------------------------------------------------------------------------
class OPropertyTask :
public OContentTask,
public XPropertyTask
{
protected:
Sequence< PropertyValueInfo > m_aProperties;
PropertyTaskType m_eType;
public:
OPropertyTask(const Reference< XContentTaskEnvironment >& Environment, OContent *pContent, const Sequence< PropertyValue >& Properties, PropertyTaskType Type );
virtual ~OPropertyTask();
virtual void doExecute();
// To be implemented by inheritants
virtual Any setPropertyValue( PropertyValueInfo & rProperty ) = 0;
virtual void getPropertyValue( PropertyValueInfo & rProperty ) = 0;
// XInterface
virtual Any SAL_CALL queryInterface( const Type &type ) throw( RuntimeException );
virtual void SAL_CALL acquire() throw(RuntimeException);
virtual void SAL_CALL release() throw(RuntimeException);
// XContentTask
virtual void SAL_CALL start() throw();
virtual void SAL_CALL execute() throw( Exception );
virtual void SAL_CALL abort() throw();
virtual ContentTaskStatus SAL_CALL getStatus() throw();
virtual Reference< XContentTaskEnvironment > SAL_CALL getEnvironment() throw();
// XPropertyTask
PropertyTaskType SAL_CALL getType() throw();
Sequence< PropertyValueInfo > SAL_CALL getProperties() throw();
};
#endif // _UCBHELPER_CONTENT_HXX_
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */