/************************************************************** * * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you under the Apache License, Version 2.0 (the * "License"); you may not use this file except in compliance * with the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, * software distributed under the License is distributed on an * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * KIND, either express or implied. See the License for the * specific language governing permissions and limitations * under the License. * *************************************************************/ #ifndef _UCBHELPER_CONTENT_HXX_ #define _UCBHELPER_CONTENT_HXX_ #include #include #include #include #include #include #include #include #include #include #include #include #include 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 rtl; using namespace osl; template 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_