12f86921cSAndrew Rist /************************************************************** 2cdf0e10cSrcweir * 32f86921cSAndrew Rist * Licensed to the Apache Software Foundation (ASF) under one 42f86921cSAndrew Rist * or more contributor license agreements. See the NOTICE file 52f86921cSAndrew Rist * distributed with this work for additional information 62f86921cSAndrew Rist * regarding copyright ownership. The ASF licenses this file 72f86921cSAndrew Rist * to you under the Apache License, Version 2.0 (the 82f86921cSAndrew Rist * "License"); you may not use this file except in compliance 92f86921cSAndrew Rist * with the License. You may obtain a copy of the License at 10cdf0e10cSrcweir * 112f86921cSAndrew Rist * http://www.apache.org/licenses/LICENSE-2.0 12cdf0e10cSrcweir * 132f86921cSAndrew Rist * Unless required by applicable law or agreed to in writing, 142f86921cSAndrew Rist * software distributed under the License is distributed on an 152f86921cSAndrew Rist * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 162f86921cSAndrew Rist * KIND, either express or implied. See the License for the 172f86921cSAndrew Rist * specific language governing permissions and limitations 182f86921cSAndrew Rist * under the License. 19cdf0e10cSrcweir * 202f86921cSAndrew Rist *************************************************************/ 212f86921cSAndrew Rist 222f86921cSAndrew Rist 23cdf0e10cSrcweir 24cdf0e10cSrcweir // MARKER(update_precomp.py): autogen include statement, do not remove 25*421ed02eSdamjan #include "precompiled_file.hxx" 26cdf0e10cSrcweir #ifndef INCLUDED_STL_STACK 27cdf0e10cSrcweir #include <stack> 28cdf0e10cSrcweir #define INCLUDED_STL_STACK 29cdf0e10cSrcweir #endif 30cdf0e10cSrcweir 31cdf0e10cSrcweir #include "osl/diagnose.h" 32cdf0e10cSrcweir #include <rtl/uri.hxx> 33cdf0e10cSrcweir #include <rtl/ustrbuf.hxx> 34cdf0e10cSrcweir #include <osl/time.h> 35cdf0e10cSrcweir #include <osl/file.hxx> 36cdf0e10cSrcweir #include <com/sun/star/lang/IllegalAccessException.hpp> 37cdf0e10cSrcweir #include <com/sun/star/beans/IllegalTypeException.hpp> 38cdf0e10cSrcweir #include <com/sun/star/ucb/InteractiveAugmentedIOException.hpp> 39cdf0e10cSrcweir #include <com/sun/star/ucb/InsertCommandArgument.hpp> 40cdf0e10cSrcweir #include <com/sun/star/ucb/NameClash.hpp> 41cdf0e10cSrcweir #include <com/sun/star/ucb/XContentIdentifier.hpp> 42cdf0e10cSrcweir #include <com/sun/star/lang/XComponent.hpp> 43cdf0e10cSrcweir #include <com/sun/star/ucb/XContentAccess.hpp> 44cdf0e10cSrcweir #include <com/sun/star/beans/PropertyAttribute.hpp> 45cdf0e10cSrcweir #include <com/sun/star/io/XSeekable.hpp> 46cdf0e10cSrcweir #include <com/sun/star/io/XTruncate.hpp> 47cdf0e10cSrcweir #include <com/sun/star/ucb/OpenCommandArgument.hpp> 48cdf0e10cSrcweir #include <com/sun/star/ucb/XPropertySetRegistryFactory.hpp> 49cdf0e10cSrcweir #include <com/sun/star/ucb/TransferInfo.hpp> 50cdf0e10cSrcweir #include <com/sun/star/ucb/ContentInfoAttribute.hpp> 51cdf0e10cSrcweir #include <com/sun/star/beans/PropertyChangeEvent.hpp> 52cdf0e10cSrcweir #include <com/sun/star/beans/XPropertiesChangeListener.hpp> 53cdf0e10cSrcweir #include <rtl/string.hxx> 54cdf0e10cSrcweir #include "filerror.hxx" 55cdf0e10cSrcweir #include "filglob.hxx" 56cdf0e10cSrcweir #include "filcmd.hxx" 57cdf0e10cSrcweir #include "filinpstr.hxx" 58cdf0e10cSrcweir #include "filstr.hxx" 59cdf0e10cSrcweir #include "filrset.hxx" 60cdf0e10cSrcweir #include "filrow.hxx" 61cdf0e10cSrcweir #include "filprp.hxx" 62cdf0e10cSrcweir #include "filid.hxx" 63cdf0e10cSrcweir #include "shell.hxx" 64cdf0e10cSrcweir #include "prov.hxx" 65cdf0e10cSrcweir #include "bc.hxx" 66cdf0e10cSrcweir 67cdf0e10cSrcweir 68cdf0e10cSrcweir using namespace fileaccess; 69cdf0e10cSrcweir using namespace com::sun::star; 70cdf0e10cSrcweir using namespace com::sun::star::ucb; 71cdf0e10cSrcweir 72cdf0e10cSrcweir 73cdf0e10cSrcweir shell::UnqPathData::UnqPathData() 74cdf0e10cSrcweir : properties( 0 ), 75cdf0e10cSrcweir notifier( 0 ), 76cdf0e10cSrcweir xS( 0 ), 77cdf0e10cSrcweir xC( 0 ), 78cdf0e10cSrcweir xA( 0 ) 79cdf0e10cSrcweir { 80cdf0e10cSrcweir // empty 81cdf0e10cSrcweir } 82cdf0e10cSrcweir 83cdf0e10cSrcweir 84cdf0e10cSrcweir shell::UnqPathData::UnqPathData( const UnqPathData& a ) 85cdf0e10cSrcweir : properties( a.properties ), 86cdf0e10cSrcweir notifier( a.notifier ), 87cdf0e10cSrcweir xS( a.xS ), 88cdf0e10cSrcweir xC( a.xC ), 89cdf0e10cSrcweir xA( a.xA ) 90cdf0e10cSrcweir { 91cdf0e10cSrcweir } 92cdf0e10cSrcweir 93cdf0e10cSrcweir 94cdf0e10cSrcweir shell::UnqPathData& shell::UnqPathData::operator=( UnqPathData& a ) 95cdf0e10cSrcweir { 96cdf0e10cSrcweir properties = a.properties; 97cdf0e10cSrcweir notifier = a.notifier; 98cdf0e10cSrcweir xS = a.xS; 99cdf0e10cSrcweir xC = a.xC; 100cdf0e10cSrcweir xA = a.xA; 101cdf0e10cSrcweir a.properties = 0; 102cdf0e10cSrcweir a.notifier = 0; 103cdf0e10cSrcweir a.xS = 0; 104cdf0e10cSrcweir a.xC = 0; 105cdf0e10cSrcweir a.xA = 0; 106cdf0e10cSrcweir return *this; 107cdf0e10cSrcweir } 108cdf0e10cSrcweir 109cdf0e10cSrcweir shell::UnqPathData::~UnqPathData() 110cdf0e10cSrcweir { 111cdf0e10cSrcweir if( properties ) 112cdf0e10cSrcweir delete properties; 113cdf0e10cSrcweir if( notifier ) 114cdf0e10cSrcweir delete notifier; 115cdf0e10cSrcweir } 116cdf0e10cSrcweir 117cdf0e10cSrcweir 118cdf0e10cSrcweir 119cdf0e10cSrcweir //////////////////////////////////////////////////////////////////////////////////////// 120cdf0e10cSrcweir 121cdf0e10cSrcweir 122cdf0e10cSrcweir 123cdf0e10cSrcweir 124cdf0e10cSrcweir 125cdf0e10cSrcweir shell::MyProperty::MyProperty( const rtl::OUString& __PropertyName ) 126cdf0e10cSrcweir : PropertyName( __PropertyName ) 127cdf0e10cSrcweir { 128cdf0e10cSrcweir // empty 129cdf0e10cSrcweir } 130cdf0e10cSrcweir 131cdf0e10cSrcweir 132cdf0e10cSrcweir shell::MyProperty::MyProperty( const sal_Bool& __isNative, 133cdf0e10cSrcweir const rtl::OUString& __PropertyName, 134cdf0e10cSrcweir const sal_Int32& __Handle, 135cdf0e10cSrcweir const com::sun::star::uno::Type& __Typ, 136cdf0e10cSrcweir const com::sun::star::uno::Any& __Value, 137cdf0e10cSrcweir const com::sun::star::beans::PropertyState& __State, 138cdf0e10cSrcweir const sal_Int16& __Attributes ) 139cdf0e10cSrcweir : PropertyName( __PropertyName ), 140cdf0e10cSrcweir Handle( __Handle ), 141cdf0e10cSrcweir isNative( __isNative ), 142cdf0e10cSrcweir Typ( __Typ ), 143cdf0e10cSrcweir Value( __Value ), 144cdf0e10cSrcweir State( __State ), 145cdf0e10cSrcweir Attributes( __Attributes ) 146cdf0e10cSrcweir { 147cdf0e10cSrcweir // empty 148cdf0e10cSrcweir } 149cdf0e10cSrcweir 150cdf0e10cSrcweir shell::MyProperty::~MyProperty() 151cdf0e10cSrcweir { 152cdf0e10cSrcweir // empty for now 153cdf0e10cSrcweir } 154cdf0e10cSrcweir 155cdf0e10cSrcweir 156cdf0e10cSrcweir #include "filinl.hxx" 157cdf0e10cSrcweir 158cdf0e10cSrcweir 159cdf0e10cSrcweir shell::shell( const uno::Reference< lang::XMultiServiceFactory >& xMultiServiceFactory, 160cdf0e10cSrcweir FileProvider* pProvider, sal_Bool bWithConfig ) 161cdf0e10cSrcweir : TaskManager(), 162cdf0e10cSrcweir m_bWithConfig( bWithConfig ), 163cdf0e10cSrcweir m_pProvider( pProvider ), 164cdf0e10cSrcweir m_xMultiServiceFactory( xMultiServiceFactory ), 165cdf0e10cSrcweir Title( rtl::OUString::createFromAscii( "Title" ) ), 166cdf0e10cSrcweir CasePreservingURL( 167cdf0e10cSrcweir rtl::OUString::createFromAscii( "CasePreservingURL" ) ), 168cdf0e10cSrcweir IsDocument( rtl::OUString::createFromAscii( "IsDocument" ) ), 169cdf0e10cSrcweir IsFolder( rtl::OUString::createFromAscii( "IsFolder" ) ), 170cdf0e10cSrcweir DateModified( rtl::OUString::createFromAscii( "DateModified" ) ), 171cdf0e10cSrcweir Size( rtl::OUString::createFromAscii( "Size" ) ), 172cdf0e10cSrcweir IsVolume( rtl::OUString::createFromAscii( "IsVolume" ) ), 173cdf0e10cSrcweir IsRemoveable( rtl::OUString::createFromAscii( "IsRemoveable" ) ), 174cdf0e10cSrcweir IsRemote( rtl::OUString::createFromAscii( "IsRemote" ) ), 175cdf0e10cSrcweir IsCompactDisc( rtl::OUString::createFromAscii( "IsCompactDisc" ) ), 176cdf0e10cSrcweir IsFloppy( rtl::OUString::createFromAscii( "IsFloppy" ) ), 177cdf0e10cSrcweir IsHidden( rtl::OUString::createFromAscii( "IsHidden" ) ), 178cdf0e10cSrcweir ContentType( rtl::OUString::createFromAscii( "ContentType" ) ), 179cdf0e10cSrcweir IsReadOnly( rtl::OUString::createFromAscii( "IsReadOnly" ) ), 180cdf0e10cSrcweir CreatableContentsInfo( rtl::OUString::createFromAscii( "CreatableContentsInfo" ) ), 181cdf0e10cSrcweir FolderContentType( rtl::OUString::createFromAscii( "application/vnd.sun.staroffice.fsys-folder" ) ), 182cdf0e10cSrcweir FileContentType( rtl::OUString::createFromAscii( "application/vnd.sun.staroffice.fsys-file" ) ), 183cdf0e10cSrcweir m_sCommandInfo( 9 ) 184cdf0e10cSrcweir { 185cdf0e10cSrcweir // Title 186cdf0e10cSrcweir m_aDefaultProperties.insert( MyProperty( true, 187cdf0e10cSrcweir Title, 188cdf0e10cSrcweir -1 , 189cdf0e10cSrcweir getCppuType( static_cast< rtl::OUString* >( 0 ) ), 190cdf0e10cSrcweir uno::Any(), 191cdf0e10cSrcweir beans::PropertyState_DEFAULT_VALUE, 192cdf0e10cSrcweir beans::PropertyAttribute::MAYBEVOID 193cdf0e10cSrcweir | beans::PropertyAttribute::BOUND ) ); 194cdf0e10cSrcweir 195cdf0e10cSrcweir // CasePreservingURL 196cdf0e10cSrcweir m_aDefaultProperties.insert( 197cdf0e10cSrcweir MyProperty( true, 198cdf0e10cSrcweir CasePreservingURL, 199cdf0e10cSrcweir -1 , 200cdf0e10cSrcweir getCppuType( static_cast< rtl::OUString* >( 0 ) ), 201cdf0e10cSrcweir uno::Any(), 202cdf0e10cSrcweir beans::PropertyState_DEFAULT_VALUE, 203cdf0e10cSrcweir beans::PropertyAttribute::MAYBEVOID 204cdf0e10cSrcweir | beans::PropertyAttribute::BOUND 205cdf0e10cSrcweir | beans::PropertyAttribute::READONLY ) ); 206cdf0e10cSrcweir 207cdf0e10cSrcweir 208cdf0e10cSrcweir // IsFolder 209cdf0e10cSrcweir m_aDefaultProperties.insert( MyProperty( true, 210cdf0e10cSrcweir IsFolder, 211cdf0e10cSrcweir -1 , 212cdf0e10cSrcweir getCppuType( static_cast< sal_Bool* >( 0 ) ), 213cdf0e10cSrcweir uno::Any(), 214cdf0e10cSrcweir beans::PropertyState_DEFAULT_VALUE, 215cdf0e10cSrcweir beans::PropertyAttribute::MAYBEVOID 216cdf0e10cSrcweir | beans::PropertyAttribute::BOUND 217cdf0e10cSrcweir | beans::PropertyAttribute::READONLY ) ); 218cdf0e10cSrcweir 219cdf0e10cSrcweir 220cdf0e10cSrcweir // IsDocument 221cdf0e10cSrcweir m_aDefaultProperties.insert( MyProperty( true, 222cdf0e10cSrcweir IsDocument, 223cdf0e10cSrcweir -1 , 224cdf0e10cSrcweir getCppuType( static_cast< sal_Bool* >( 0 ) ), 225cdf0e10cSrcweir uno::Any(), 226cdf0e10cSrcweir beans::PropertyState_DEFAULT_VALUE, 227cdf0e10cSrcweir beans::PropertyAttribute::MAYBEVOID 228cdf0e10cSrcweir | beans::PropertyAttribute::BOUND 229cdf0e10cSrcweir | beans::PropertyAttribute::READONLY ) ); 230cdf0e10cSrcweir 231cdf0e10cSrcweir // Removable 232cdf0e10cSrcweir m_aDefaultProperties.insert( MyProperty( true, 233cdf0e10cSrcweir IsVolume, 234cdf0e10cSrcweir -1 , 235cdf0e10cSrcweir getCppuType( static_cast< sal_Bool* >( 0 ) ), 236cdf0e10cSrcweir uno::Any(), 237cdf0e10cSrcweir beans::PropertyState_DEFAULT_VALUE, 238cdf0e10cSrcweir beans::PropertyAttribute::MAYBEVOID 239cdf0e10cSrcweir | beans::PropertyAttribute::BOUND 240cdf0e10cSrcweir | beans::PropertyAttribute::READONLY ) ); 241cdf0e10cSrcweir 242cdf0e10cSrcweir 243cdf0e10cSrcweir // Removable 244cdf0e10cSrcweir m_aDefaultProperties.insert( MyProperty( true, 245cdf0e10cSrcweir IsRemoveable, 246cdf0e10cSrcweir -1 , 247cdf0e10cSrcweir getCppuType( static_cast< sal_Bool* >( 0 ) ), 248cdf0e10cSrcweir uno::Any(), 249cdf0e10cSrcweir beans::PropertyState_DEFAULT_VALUE, 250cdf0e10cSrcweir beans::PropertyAttribute::MAYBEVOID 251cdf0e10cSrcweir | beans::PropertyAttribute::BOUND 252cdf0e10cSrcweir | beans::PropertyAttribute::READONLY ) ); 253cdf0e10cSrcweir 254cdf0e10cSrcweir // Remote 255cdf0e10cSrcweir m_aDefaultProperties.insert( MyProperty( true, 256cdf0e10cSrcweir IsRemote, 257cdf0e10cSrcweir -1 , 258cdf0e10cSrcweir getCppuType( static_cast< sal_Bool* >( 0 ) ), 259cdf0e10cSrcweir uno::Any(), 260cdf0e10cSrcweir beans::PropertyState_DEFAULT_VALUE, 261cdf0e10cSrcweir beans::PropertyAttribute::MAYBEVOID 262cdf0e10cSrcweir | beans::PropertyAttribute::BOUND 263cdf0e10cSrcweir | beans::PropertyAttribute::READONLY ) ); 264cdf0e10cSrcweir 265cdf0e10cSrcweir // CompactDisc 266cdf0e10cSrcweir m_aDefaultProperties.insert( MyProperty( true, 267cdf0e10cSrcweir IsCompactDisc, 268cdf0e10cSrcweir -1 , 269cdf0e10cSrcweir getCppuType( static_cast< sal_Bool* >( 0 ) ), 270cdf0e10cSrcweir uno::Any(), 271cdf0e10cSrcweir beans::PropertyState_DEFAULT_VALUE, 272cdf0e10cSrcweir beans::PropertyAttribute::MAYBEVOID 273cdf0e10cSrcweir | beans::PropertyAttribute::BOUND 274cdf0e10cSrcweir | beans::PropertyAttribute::READONLY ) ); 275cdf0e10cSrcweir 276cdf0e10cSrcweir // Floppy 277cdf0e10cSrcweir m_aDefaultProperties.insert( MyProperty( true, 278cdf0e10cSrcweir IsFloppy, 279cdf0e10cSrcweir -1 , 280cdf0e10cSrcweir getCppuType( static_cast< sal_Bool* >( 0 ) ), 281cdf0e10cSrcweir uno::Any(), 282cdf0e10cSrcweir beans::PropertyState_DEFAULT_VALUE, 283cdf0e10cSrcweir beans::PropertyAttribute::MAYBEVOID 284cdf0e10cSrcweir | beans::PropertyAttribute::BOUND 285cdf0e10cSrcweir | beans::PropertyAttribute::READONLY ) ); 286cdf0e10cSrcweir 287cdf0e10cSrcweir // Hidden 288cdf0e10cSrcweir m_aDefaultProperties.insert( 289cdf0e10cSrcweir MyProperty( 290cdf0e10cSrcweir true, 291cdf0e10cSrcweir IsHidden, 292cdf0e10cSrcweir -1 , 293cdf0e10cSrcweir getCppuType( static_cast< sal_Bool* >( 0 ) ), 294cdf0e10cSrcweir uno::Any(), 295cdf0e10cSrcweir beans::PropertyState_DEFAULT_VALUE, 296cdf0e10cSrcweir beans::PropertyAttribute::MAYBEVOID 297cdf0e10cSrcweir | beans::PropertyAttribute::BOUND 298cdf0e10cSrcweir #if defined( WNT ) || defined( OS2 ) 299cdf0e10cSrcweir )); 300cdf0e10cSrcweir #else 301cdf0e10cSrcweir | beans::PropertyAttribute::READONLY)); // under unix/linux only readable 302cdf0e10cSrcweir #endif 303cdf0e10cSrcweir 304cdf0e10cSrcweir 305cdf0e10cSrcweir // ContentType 306cdf0e10cSrcweir uno::Any aAny; 307cdf0e10cSrcweir aAny <<= rtl::OUString(); 308cdf0e10cSrcweir m_aDefaultProperties.insert( MyProperty( false, 309cdf0e10cSrcweir ContentType, 310cdf0e10cSrcweir -1 , 311cdf0e10cSrcweir getCppuType( static_cast< rtl::OUString* >( 0 ) ), 312cdf0e10cSrcweir aAny, 313cdf0e10cSrcweir beans::PropertyState_DEFAULT_VALUE, 314cdf0e10cSrcweir beans::PropertyAttribute::MAYBEVOID 315cdf0e10cSrcweir | beans::PropertyAttribute::BOUND 316cdf0e10cSrcweir | beans::PropertyAttribute::READONLY ) ); 317cdf0e10cSrcweir 318cdf0e10cSrcweir 319cdf0e10cSrcweir // DateModified 320cdf0e10cSrcweir m_aDefaultProperties.insert( MyProperty( true, 321cdf0e10cSrcweir DateModified, 322cdf0e10cSrcweir -1 , 323cdf0e10cSrcweir getCppuType( static_cast< util::DateTime* >( 0 ) ), 324cdf0e10cSrcweir uno::Any(), 325cdf0e10cSrcweir beans::PropertyState_DEFAULT_VALUE, 326cdf0e10cSrcweir beans::PropertyAttribute::MAYBEVOID 327cdf0e10cSrcweir | beans::PropertyAttribute::BOUND ) ); 328cdf0e10cSrcweir 329cdf0e10cSrcweir // Size 330cdf0e10cSrcweir m_aDefaultProperties.insert( MyProperty( true, 331cdf0e10cSrcweir Size, 332cdf0e10cSrcweir -1, 333cdf0e10cSrcweir getCppuType( static_cast< sal_Int64* >( 0 ) ), 334cdf0e10cSrcweir uno::Any(), 335cdf0e10cSrcweir beans::PropertyState_DEFAULT_VALUE, 336cdf0e10cSrcweir beans::PropertyAttribute::MAYBEVOID 337cdf0e10cSrcweir | beans::PropertyAttribute::BOUND ) ); 338cdf0e10cSrcweir 339cdf0e10cSrcweir // IsReadOnly 340cdf0e10cSrcweir m_aDefaultProperties.insert( MyProperty( true, 341cdf0e10cSrcweir IsReadOnly, 342cdf0e10cSrcweir -1 , 343cdf0e10cSrcweir getCppuType( static_cast< sal_Bool* >( 0 ) ), 344cdf0e10cSrcweir uno::Any(), 345cdf0e10cSrcweir beans::PropertyState_DEFAULT_VALUE, 346cdf0e10cSrcweir beans::PropertyAttribute::MAYBEVOID 347cdf0e10cSrcweir | beans::PropertyAttribute::BOUND ) ); 348cdf0e10cSrcweir 349cdf0e10cSrcweir 350cdf0e10cSrcweir // CreatableContentsInfo 351cdf0e10cSrcweir m_aDefaultProperties.insert( MyProperty( true, 352cdf0e10cSrcweir CreatableContentsInfo, 353cdf0e10cSrcweir -1 , 354cdf0e10cSrcweir getCppuType( static_cast< const uno::Sequence< ucb::ContentInfo > * >( 0 ) ), 355cdf0e10cSrcweir uno::Any(), 356cdf0e10cSrcweir beans::PropertyState_DEFAULT_VALUE, 357cdf0e10cSrcweir beans::PropertyAttribute::MAYBEVOID 358cdf0e10cSrcweir | beans::PropertyAttribute::BOUND 359cdf0e10cSrcweir | beans::PropertyAttribute::READONLY ) ); 360cdf0e10cSrcweir 361cdf0e10cSrcweir // Commands 362cdf0e10cSrcweir m_sCommandInfo[0].Name = rtl::OUString::createFromAscii( "getCommandInfo" ); 363cdf0e10cSrcweir m_sCommandInfo[0].Handle = -1; 364cdf0e10cSrcweir m_sCommandInfo[0].ArgType = getCppuVoidType(); 365cdf0e10cSrcweir 366cdf0e10cSrcweir m_sCommandInfo[1].Name = rtl::OUString::createFromAscii( "getPropertySetInfo" ); 367cdf0e10cSrcweir m_sCommandInfo[1].Handle = -1; 368cdf0e10cSrcweir m_sCommandInfo[1].ArgType = getCppuVoidType(); 369cdf0e10cSrcweir 370cdf0e10cSrcweir m_sCommandInfo[2].Name = rtl::OUString::createFromAscii( "getPropertyValues" ); 371cdf0e10cSrcweir m_sCommandInfo[2].Handle = -1; 372cdf0e10cSrcweir m_sCommandInfo[2].ArgType = getCppuType( static_cast< uno::Sequence< beans::Property >* >( 0 ) ); 373cdf0e10cSrcweir 374cdf0e10cSrcweir m_sCommandInfo[3].Name = rtl::OUString::createFromAscii( "setPropertyValues" ); 375cdf0e10cSrcweir m_sCommandInfo[3].Handle = -1; 376cdf0e10cSrcweir m_sCommandInfo[3].ArgType = getCppuType( static_cast< uno::Sequence< beans::PropertyValue >* >( 0 ) ); 377cdf0e10cSrcweir 378cdf0e10cSrcweir m_sCommandInfo[4].Name = rtl::OUString::createFromAscii( "open" ); 379cdf0e10cSrcweir m_sCommandInfo[4].Handle = -1; 380cdf0e10cSrcweir m_sCommandInfo[4].ArgType = getCppuType( static_cast< OpenCommandArgument* >( 0 ) ); 381cdf0e10cSrcweir 382cdf0e10cSrcweir m_sCommandInfo[5].Name = rtl::OUString::createFromAscii( "transfer" ); 383cdf0e10cSrcweir m_sCommandInfo[5].Handle = -1; 384cdf0e10cSrcweir m_sCommandInfo[5].ArgType = getCppuType( static_cast< TransferInfo* >( 0 ) ); 385cdf0e10cSrcweir 386cdf0e10cSrcweir m_sCommandInfo[6].Name = rtl::OUString::createFromAscii( "delete" ); 387cdf0e10cSrcweir m_sCommandInfo[6].Handle = -1; 388cdf0e10cSrcweir m_sCommandInfo[6].ArgType = getCppuType( static_cast< sal_Bool* >( 0 ) ); 389cdf0e10cSrcweir 390cdf0e10cSrcweir m_sCommandInfo[7].Name = rtl::OUString::createFromAscii( "insert" ); 391cdf0e10cSrcweir m_sCommandInfo[7].Handle = -1; 392cdf0e10cSrcweir m_sCommandInfo[7].ArgType = getCppuType( static_cast< InsertCommandArgument* > ( 0 ) ); 393cdf0e10cSrcweir 394cdf0e10cSrcweir m_sCommandInfo[7].Name = rtl::OUString::createFromAscii( "createNewContent" ); 395cdf0e10cSrcweir m_sCommandInfo[7].Handle = -1; 396cdf0e10cSrcweir m_sCommandInfo[7].ArgType = getCppuType( static_cast< ucb::ContentInfo * > ( 0 ) ); 397cdf0e10cSrcweir 398cdf0e10cSrcweir if(m_bWithConfig) 399cdf0e10cSrcweir { 400cdf0e10cSrcweir rtl::OUString Store = rtl::OUString::createFromAscii( "com.sun.star.ucb.Store" ); 401cdf0e10cSrcweir uno::Reference< XPropertySetRegistryFactory > xRegFac( 402cdf0e10cSrcweir m_xMultiServiceFactory->createInstance( Store ), 403cdf0e10cSrcweir uno::UNO_QUERY ); 404cdf0e10cSrcweir if ( xRegFac.is() ) 405cdf0e10cSrcweir { 406cdf0e10cSrcweir // Open/create a registry 407cdf0e10cSrcweir m_xFileRegistry = xRegFac->createPropertySetRegistry( rtl::OUString() ); 408cdf0e10cSrcweir } 409cdf0e10cSrcweir } 410cdf0e10cSrcweir } 411cdf0e10cSrcweir 412cdf0e10cSrcweir 413cdf0e10cSrcweir shell::~shell() 414cdf0e10cSrcweir { 415cdf0e10cSrcweir } 416cdf0e10cSrcweir 417cdf0e10cSrcweir 418cdf0e10cSrcweir /*********************************************************************************/ 419cdf0e10cSrcweir /* */ 420cdf0e10cSrcweir /* de/registerNotifier-Implementation */ 421cdf0e10cSrcweir /* */ 422cdf0e10cSrcweir /*********************************************************************************/ 423cdf0e10cSrcweir 424cdf0e10cSrcweir // 425cdf0e10cSrcweir // This two methods register and deregister a change listener for the content belonging 426cdf0e10cSrcweir // to URL aUnqPath 427cdf0e10cSrcweir // 428cdf0e10cSrcweir 429cdf0e10cSrcweir void SAL_CALL 430cdf0e10cSrcweir shell::registerNotifier( const rtl::OUString& aUnqPath, Notifier* pNotifier ) 431cdf0e10cSrcweir { 432cdf0e10cSrcweir osl::MutexGuard aGuard( m_aMutex ); 433cdf0e10cSrcweir 434cdf0e10cSrcweir ContentMap::iterator it = 435cdf0e10cSrcweir m_aContent.insert( ContentMap::value_type( aUnqPath,UnqPathData() ) ).first; 436cdf0e10cSrcweir 437cdf0e10cSrcweir if( ! it->second.notifier ) 438cdf0e10cSrcweir it->second.notifier = new NotifierList(); 439cdf0e10cSrcweir 440cdf0e10cSrcweir std::list< Notifier* >& nlist = *( it->second.notifier ); 441cdf0e10cSrcweir 442cdf0e10cSrcweir std::list<Notifier*>::iterator it1 = nlist.begin(); 443cdf0e10cSrcweir while( it1 != nlist.end() ) // Every "Notifier" only once 444cdf0e10cSrcweir { 445cdf0e10cSrcweir if( *it1 == pNotifier ) return; 446cdf0e10cSrcweir ++it1; 447cdf0e10cSrcweir } 448cdf0e10cSrcweir nlist.push_back( pNotifier ); 449cdf0e10cSrcweir } 450cdf0e10cSrcweir 451cdf0e10cSrcweir 452cdf0e10cSrcweir 453cdf0e10cSrcweir void SAL_CALL 454cdf0e10cSrcweir shell::deregisterNotifier( const rtl::OUString& aUnqPath,Notifier* pNotifier ) 455cdf0e10cSrcweir { 456cdf0e10cSrcweir osl::MutexGuard aGuard( m_aMutex ); 457cdf0e10cSrcweir 458cdf0e10cSrcweir ContentMap::iterator it = m_aContent.find( aUnqPath ); 459cdf0e10cSrcweir if( it == m_aContent.end() ) 460cdf0e10cSrcweir return; 461cdf0e10cSrcweir 462cdf0e10cSrcweir it->second.notifier->remove( pNotifier ); 463cdf0e10cSrcweir 464cdf0e10cSrcweir if( ! it->second.notifier->size() ) 465cdf0e10cSrcweir m_aContent.erase( it ); 466cdf0e10cSrcweir } 467cdf0e10cSrcweir 468cdf0e10cSrcweir 469cdf0e10cSrcweir 470cdf0e10cSrcweir /*********************************************************************************/ 471cdf0e10cSrcweir /* */ 472cdf0e10cSrcweir /* de/associate-Implementation */ 473cdf0e10cSrcweir /* */ 474cdf0e10cSrcweir /*********************************************************************************/ 475cdf0e10cSrcweir // 476cdf0e10cSrcweir // Used to associate and deassociate a new property with 477cdf0e10cSrcweir // the content belonging to URL UnqPath. 478cdf0e10cSrcweir // The default value and the the attributes are input 479cdf0e10cSrcweir // 480cdf0e10cSrcweir 481cdf0e10cSrcweir void SAL_CALL 482cdf0e10cSrcweir shell::associate( const rtl::OUString& aUnqPath, 483cdf0e10cSrcweir const rtl::OUString& PropertyName, 484cdf0e10cSrcweir const uno::Any& DefaultValue, 485cdf0e10cSrcweir const sal_Int16 Attributes ) 486cdf0e10cSrcweir throw( beans::PropertyExistException, 487cdf0e10cSrcweir beans::IllegalTypeException, 488cdf0e10cSrcweir uno::RuntimeException ) 489cdf0e10cSrcweir { 490cdf0e10cSrcweir MyProperty newProperty( false, 491cdf0e10cSrcweir PropertyName, 492cdf0e10cSrcweir -1, 493cdf0e10cSrcweir DefaultValue.getValueType(), 494cdf0e10cSrcweir DefaultValue, 495cdf0e10cSrcweir beans::PropertyState_DEFAULT_VALUE, 496cdf0e10cSrcweir Attributes ); 497cdf0e10cSrcweir 498cdf0e10cSrcweir shell::PropertySet::iterator it1 = m_aDefaultProperties.find( newProperty ); 499cdf0e10cSrcweir if( it1 != m_aDefaultProperties.end() ) 500cdf0e10cSrcweir throw beans::PropertyExistException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX ) ), uno::Reference< uno::XInterface >() ); 501cdf0e10cSrcweir 502cdf0e10cSrcweir { 503cdf0e10cSrcweir osl::MutexGuard aGuard( m_aMutex ); 504cdf0e10cSrcweir 505cdf0e10cSrcweir ContentMap::iterator it = m_aContent.insert( ContentMap::value_type( aUnqPath,UnqPathData() ) ).first; 506cdf0e10cSrcweir 507cdf0e10cSrcweir // Load the XPersistentPropertySetInfo and create it, if it does not exist 508cdf0e10cSrcweir load( it,true ); 509cdf0e10cSrcweir 510cdf0e10cSrcweir PropertySet& properties = *(it->second.properties); 511cdf0e10cSrcweir it1 = properties.find( newProperty ); 512cdf0e10cSrcweir if( it1 != properties.end() ) 513cdf0e10cSrcweir throw beans::PropertyExistException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX ) ), uno::Reference< uno::XInterface >() ); 514cdf0e10cSrcweir 515cdf0e10cSrcweir // Property does not exist 516cdf0e10cSrcweir properties.insert( newProperty ); 517cdf0e10cSrcweir it->second.xC->addProperty( PropertyName,Attributes,DefaultValue ); 518cdf0e10cSrcweir } 519cdf0e10cSrcweir notifyPropertyAdded( getPropertySetListeners( aUnqPath ), PropertyName ); 520cdf0e10cSrcweir } 521cdf0e10cSrcweir 522cdf0e10cSrcweir 523cdf0e10cSrcweir 524cdf0e10cSrcweir 525cdf0e10cSrcweir void SAL_CALL 526cdf0e10cSrcweir shell::deassociate( const rtl::OUString& aUnqPath, 527cdf0e10cSrcweir const rtl::OUString& PropertyName ) 528cdf0e10cSrcweir throw( beans::UnknownPropertyException, 529cdf0e10cSrcweir beans::NotRemoveableException, 530cdf0e10cSrcweir uno::RuntimeException ) 531cdf0e10cSrcweir { 532cdf0e10cSrcweir MyProperty oldProperty( PropertyName ); 533cdf0e10cSrcweir 534cdf0e10cSrcweir shell::PropertySet::iterator it1 = m_aDefaultProperties.find( oldProperty ); 535cdf0e10cSrcweir if( it1 != m_aDefaultProperties.end() ) 536cdf0e10cSrcweir throw beans::NotRemoveableException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX ) ), uno::Reference< uno::XInterface >() ); 537cdf0e10cSrcweir 538cdf0e10cSrcweir osl::MutexGuard aGuard( m_aMutex ); 539cdf0e10cSrcweir 540cdf0e10cSrcweir ContentMap::iterator it = m_aContent.insert( ContentMap::value_type( aUnqPath,UnqPathData() ) ).first; 541cdf0e10cSrcweir 542cdf0e10cSrcweir load( it,false ); 543cdf0e10cSrcweir 544cdf0e10cSrcweir PropertySet& properties = *(it->second.properties); 545cdf0e10cSrcweir 546cdf0e10cSrcweir it1 = properties.find( oldProperty ); 547cdf0e10cSrcweir if( it1 == properties.end() ) 548cdf0e10cSrcweir throw beans::UnknownPropertyException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX ) ), uno::Reference< uno::XInterface >() ); 549cdf0e10cSrcweir 550cdf0e10cSrcweir properties.erase( it1 ); 551cdf0e10cSrcweir 552cdf0e10cSrcweir if( it->second.xC.is() ) 553cdf0e10cSrcweir it->second.xC->removeProperty( PropertyName ); 554cdf0e10cSrcweir 555cdf0e10cSrcweir if( properties.size() == 9 ) 556cdf0e10cSrcweir { 557cdf0e10cSrcweir MyProperty ContentTProperty( ContentType ); 558cdf0e10cSrcweir 559cdf0e10cSrcweir if( properties.find( ContentTProperty )->getState() == beans::PropertyState_DEFAULT_VALUE ) 560cdf0e10cSrcweir { 561cdf0e10cSrcweir it->second.xS = 0; 562cdf0e10cSrcweir it->second.xC = 0; 563cdf0e10cSrcweir it->second.xA = 0; 564cdf0e10cSrcweir if(m_xFileRegistry.is()) 565cdf0e10cSrcweir m_xFileRegistry->removePropertySet( aUnqPath ); 566cdf0e10cSrcweir } 567cdf0e10cSrcweir } 568cdf0e10cSrcweir notifyPropertyRemoved( getPropertySetListeners( aUnqPath ), PropertyName ); 569cdf0e10cSrcweir } 570cdf0e10cSrcweir 571cdf0e10cSrcweir 572cdf0e10cSrcweir 573cdf0e10cSrcweir 574cdf0e10cSrcweir /*********************************************************************************/ 575cdf0e10cSrcweir /* */ 576cdf0e10cSrcweir /* page-Implementation */ 577cdf0e10cSrcweir /* */ 578cdf0e10cSrcweir /*********************************************************************************/ 579cdf0e10cSrcweir // 580cdf0e10cSrcweir // Given an xOutputStream, this method writes the content of the file belonging to 581cdf0e10cSrcweir // URL aUnqPath into the XOutputStream 582cdf0e10cSrcweir // 583cdf0e10cSrcweir 584cdf0e10cSrcweir 585cdf0e10cSrcweir void SAL_CALL shell::page( sal_Int32 CommandId, 586cdf0e10cSrcweir const rtl::OUString& aUnqPath, 587cdf0e10cSrcweir const uno::Reference< io::XOutputStream >& xOutputStream ) 588cdf0e10cSrcweir throw() 589cdf0e10cSrcweir { 590cdf0e10cSrcweir uno::Reference< XContentProvider > xProvider( m_pProvider ); 591cdf0e10cSrcweir osl::File aFile( aUnqPath ); 592cdf0e10cSrcweir osl::FileBase::RC err = aFile.open( OpenFlag_Read ); 593cdf0e10cSrcweir 594cdf0e10cSrcweir if( err != osl::FileBase::E_None ) 595cdf0e10cSrcweir { 596cdf0e10cSrcweir aFile.close(); 597cdf0e10cSrcweir installError( CommandId, 598cdf0e10cSrcweir TASKHANDLING_OPEN_FILE_FOR_PAGING, 599cdf0e10cSrcweir err ); 600cdf0e10cSrcweir return; 601cdf0e10cSrcweir } 602cdf0e10cSrcweir 603cdf0e10cSrcweir const sal_uInt64 bfz = 4*1024; 604cdf0e10cSrcweir sal_Int8 BFF[bfz]; 605cdf0e10cSrcweir sal_uInt64 nrc; // Retrieved number of Bytes; 606cdf0e10cSrcweir 607cdf0e10cSrcweir do 608cdf0e10cSrcweir { 609cdf0e10cSrcweir err = aFile.read( (void*) BFF,bfz,nrc ); 610cdf0e10cSrcweir if( err == osl::FileBase::E_None ) 611cdf0e10cSrcweir { 612cdf0e10cSrcweir uno::Sequence< sal_Int8 > seq( BFF, (sal_uInt32)nrc ); 613cdf0e10cSrcweir try 614cdf0e10cSrcweir { 615cdf0e10cSrcweir xOutputStream->writeBytes( seq ); 616cdf0e10cSrcweir } 617cdf0e10cSrcweir catch( io::NotConnectedException ) 618cdf0e10cSrcweir { 619cdf0e10cSrcweir installError( CommandId, 620cdf0e10cSrcweir TASKHANDLING_NOTCONNECTED_FOR_PAGING ); 621cdf0e10cSrcweir break; 622cdf0e10cSrcweir } 623cdf0e10cSrcweir catch( io::BufferSizeExceededException ) 624cdf0e10cSrcweir { 625cdf0e10cSrcweir installError( CommandId, 626cdf0e10cSrcweir TASKHANDLING_BUFFERSIZEEXCEEDED_FOR_PAGING ); 627cdf0e10cSrcweir break; 628cdf0e10cSrcweir } 629cdf0e10cSrcweir catch( io::IOException ) 630cdf0e10cSrcweir { 631cdf0e10cSrcweir installError( CommandId, 632cdf0e10cSrcweir TASKHANDLING_IOEXCEPTION_FOR_PAGING ); 633cdf0e10cSrcweir break; 634cdf0e10cSrcweir } 635cdf0e10cSrcweir } 636cdf0e10cSrcweir else 637cdf0e10cSrcweir { 638cdf0e10cSrcweir installError( CommandId, 639cdf0e10cSrcweir TASKHANDLING_READING_FILE_FOR_PAGING, 640cdf0e10cSrcweir err ); 641cdf0e10cSrcweir break; 642cdf0e10cSrcweir } 643cdf0e10cSrcweir } while( nrc == bfz ); 644cdf0e10cSrcweir 645cdf0e10cSrcweir 646cdf0e10cSrcweir aFile.close(); 647cdf0e10cSrcweir 648cdf0e10cSrcweir 649cdf0e10cSrcweir try 650cdf0e10cSrcweir { 651cdf0e10cSrcweir xOutputStream->closeOutput(); 652cdf0e10cSrcweir } 653cdf0e10cSrcweir catch( io::NotConnectedException ) 654cdf0e10cSrcweir { 655cdf0e10cSrcweir } 656cdf0e10cSrcweir catch( io::BufferSizeExceededException ) 657cdf0e10cSrcweir { 658cdf0e10cSrcweir } 659cdf0e10cSrcweir catch( io::IOException ) 660cdf0e10cSrcweir { 661cdf0e10cSrcweir } 662cdf0e10cSrcweir } 663cdf0e10cSrcweir 664cdf0e10cSrcweir 665cdf0e10cSrcweir /*********************************************************************************/ 666cdf0e10cSrcweir /* */ 667cdf0e10cSrcweir /* open-Implementation */ 668cdf0e10cSrcweir /* */ 669cdf0e10cSrcweir /*********************************************************************************/ 670cdf0e10cSrcweir // 671cdf0e10cSrcweir // Given a file URL aUnqPath, this methods returns a XInputStream which reads from the open file. 672cdf0e10cSrcweir // 673cdf0e10cSrcweir 674cdf0e10cSrcweir 675cdf0e10cSrcweir uno::Reference< io::XInputStream > SAL_CALL 676cdf0e10cSrcweir shell::open( sal_Int32 CommandId, 677cdf0e10cSrcweir const rtl::OUString& aUnqPath, 678cdf0e10cSrcweir sal_Bool bLock ) 679cdf0e10cSrcweir throw() 680cdf0e10cSrcweir { 681cdf0e10cSrcweir XInputStream_impl* xInputStream = new XInputStream_impl( this, aUnqPath, bLock ); // from filinpstr.hxx 682cdf0e10cSrcweir 683cdf0e10cSrcweir sal_Int32 ErrorCode = xInputStream->CtorSuccess(); 684cdf0e10cSrcweir 685cdf0e10cSrcweir if( ErrorCode != TASKHANDLER_NO_ERROR ) 686cdf0e10cSrcweir { 687cdf0e10cSrcweir installError( CommandId, 688cdf0e10cSrcweir ErrorCode, 689cdf0e10cSrcweir xInputStream->getMinorError() ); 690cdf0e10cSrcweir 691cdf0e10cSrcweir delete xInputStream; 692cdf0e10cSrcweir xInputStream = 0; 693cdf0e10cSrcweir } 694cdf0e10cSrcweir 695cdf0e10cSrcweir return uno::Reference< io::XInputStream >( xInputStream ); 696cdf0e10cSrcweir } 697cdf0e10cSrcweir 698cdf0e10cSrcweir 699cdf0e10cSrcweir 700cdf0e10cSrcweir 701cdf0e10cSrcweir /*********************************************************************************/ 702cdf0e10cSrcweir /* */ 703cdf0e10cSrcweir /* open for read/write access-Implementation */ 704cdf0e10cSrcweir /* */ 705cdf0e10cSrcweir /*********************************************************************************/ 706cdf0e10cSrcweir // 707cdf0e10cSrcweir // Given a file URL aUnqPath, this methods returns a XStream which can be used 708cdf0e10cSrcweir // to read and write from/to the file. 709cdf0e10cSrcweir // 710cdf0e10cSrcweir 711cdf0e10cSrcweir 712cdf0e10cSrcweir uno::Reference< io::XStream > SAL_CALL 713cdf0e10cSrcweir shell::open_rw( sal_Int32 CommandId, 714cdf0e10cSrcweir const rtl::OUString& aUnqPath, 715cdf0e10cSrcweir sal_Bool bLock ) 716cdf0e10cSrcweir throw() 717cdf0e10cSrcweir { 718cdf0e10cSrcweir XStream_impl* xStream = new XStream_impl( this, aUnqPath, bLock ); // from filstr.hxx 719cdf0e10cSrcweir 720cdf0e10cSrcweir sal_Int32 ErrorCode = xStream->CtorSuccess(); 721cdf0e10cSrcweir 722cdf0e10cSrcweir if( ErrorCode != TASKHANDLER_NO_ERROR ) 723cdf0e10cSrcweir { 724cdf0e10cSrcweir installError( CommandId, 725cdf0e10cSrcweir ErrorCode, 726cdf0e10cSrcweir xStream->getMinorError() ); 727cdf0e10cSrcweir 728cdf0e10cSrcweir delete xStream; 729cdf0e10cSrcweir xStream = 0; 730cdf0e10cSrcweir } 731cdf0e10cSrcweir return uno::Reference< io::XStream >( xStream ); 732cdf0e10cSrcweir } 733cdf0e10cSrcweir 734cdf0e10cSrcweir 735cdf0e10cSrcweir 736cdf0e10cSrcweir /*********************************************************************************/ 737cdf0e10cSrcweir /* */ 738cdf0e10cSrcweir /* ls-Implementation */ 739cdf0e10cSrcweir /* */ 740cdf0e10cSrcweir /*********************************************************************************/ 741cdf0e10cSrcweir // 742cdf0e10cSrcweir // This method returns the result set containing the the children of the directory belonging 743cdf0e10cSrcweir // to file URL aUnqPath 744cdf0e10cSrcweir // 745cdf0e10cSrcweir 746cdf0e10cSrcweir 747cdf0e10cSrcweir uno::Reference< XDynamicResultSet > SAL_CALL 748cdf0e10cSrcweir shell::ls( sal_Int32 CommandId, 749cdf0e10cSrcweir const rtl::OUString& aUnqPath, 750cdf0e10cSrcweir const sal_Int32 OpenMode, 751cdf0e10cSrcweir const uno::Sequence< beans::Property >& seq, 752cdf0e10cSrcweir const uno::Sequence< NumberedSortingInfo >& seqSort ) 753cdf0e10cSrcweir throw() 754cdf0e10cSrcweir { 755cdf0e10cSrcweir XResultSet_impl* p = new XResultSet_impl( this,aUnqPath,OpenMode,seq,seqSort ); 756cdf0e10cSrcweir 757cdf0e10cSrcweir sal_Int32 ErrorCode = p->CtorSuccess(); 758cdf0e10cSrcweir 759cdf0e10cSrcweir if( ErrorCode != TASKHANDLER_NO_ERROR ) 760cdf0e10cSrcweir { 761cdf0e10cSrcweir installError( CommandId, 762cdf0e10cSrcweir ErrorCode, 763cdf0e10cSrcweir p->getMinorError() ); 764cdf0e10cSrcweir 765cdf0e10cSrcweir delete p; 766cdf0e10cSrcweir p = 0; 767cdf0e10cSrcweir } 768cdf0e10cSrcweir 769cdf0e10cSrcweir return uno::Reference< XDynamicResultSet > ( p ); 770cdf0e10cSrcweir } 771cdf0e10cSrcweir 772cdf0e10cSrcweir 773cdf0e10cSrcweir 774cdf0e10cSrcweir 775cdf0e10cSrcweir /*********************************************************************************/ 776cdf0e10cSrcweir /* */ 777cdf0e10cSrcweir /* info_c implementation */ 778cdf0e10cSrcweir /* */ 779cdf0e10cSrcweir /*********************************************************************************/ 780cdf0e10cSrcweir // Info for commands 781cdf0e10cSrcweir 782cdf0e10cSrcweir uno::Reference< XCommandInfo > SAL_CALL 783cdf0e10cSrcweir shell::info_c() 784cdf0e10cSrcweir throw() 785cdf0e10cSrcweir { 786cdf0e10cSrcweir XCommandInfo_impl* p = new XCommandInfo_impl( this ); 787cdf0e10cSrcweir return uno::Reference< XCommandInfo >( p ); 788cdf0e10cSrcweir } 789cdf0e10cSrcweir 790cdf0e10cSrcweir 791cdf0e10cSrcweir 792cdf0e10cSrcweir 793cdf0e10cSrcweir /*********************************************************************************/ 794cdf0e10cSrcweir /* */ 795cdf0e10cSrcweir /* info_p-Implementation */ 796cdf0e10cSrcweir /* */ 797cdf0e10cSrcweir /*********************************************************************************/ 798cdf0e10cSrcweir // Info for the properties 799cdf0e10cSrcweir 800cdf0e10cSrcweir uno::Reference< beans::XPropertySetInfo > SAL_CALL 801cdf0e10cSrcweir shell::info_p( const rtl::OUString& aUnqPath ) 802cdf0e10cSrcweir throw() 803cdf0e10cSrcweir { 804cdf0e10cSrcweir osl::MutexGuard aGuard( m_aMutex ); 805cdf0e10cSrcweir XPropertySetInfo_impl* p = new XPropertySetInfo_impl( this,aUnqPath ); 806cdf0e10cSrcweir return uno::Reference< beans::XPropertySetInfo >( p ); 807cdf0e10cSrcweir } 808cdf0e10cSrcweir 809cdf0e10cSrcweir 810cdf0e10cSrcweir 811cdf0e10cSrcweir 812cdf0e10cSrcweir /*********************************************************************************/ 813cdf0e10cSrcweir /* */ 814cdf0e10cSrcweir /* setv-Implementation */ 815cdf0e10cSrcweir /* */ 816cdf0e10cSrcweir /*********************************************************************************/ 817cdf0e10cSrcweir // 818cdf0e10cSrcweir // Sets the values of the properties belonging to fileURL aUnqPath 819cdf0e10cSrcweir // 820cdf0e10cSrcweir 821cdf0e10cSrcweir 822cdf0e10cSrcweir uno::Sequence< uno::Any > SAL_CALL 823cdf0e10cSrcweir shell::setv( const rtl::OUString& aUnqPath, 824cdf0e10cSrcweir const uno::Sequence< beans::PropertyValue >& values ) 825cdf0e10cSrcweir throw() 826cdf0e10cSrcweir { 827cdf0e10cSrcweir osl::MutexGuard aGuard( m_aMutex ); 828cdf0e10cSrcweir 829cdf0e10cSrcweir sal_Int32 propChanged = 0; 830cdf0e10cSrcweir uno::Sequence< uno::Any > ret( values.getLength() ); 831cdf0e10cSrcweir uno::Sequence< beans::PropertyChangeEvent > seqChanged( values.getLength() ); 832cdf0e10cSrcweir 833cdf0e10cSrcweir shell::ContentMap::iterator it = m_aContent.find( aUnqPath ); 834cdf0e10cSrcweir PropertySet& properties = *( it->second.properties ); 835cdf0e10cSrcweir shell::PropertySet::iterator it1; 836cdf0e10cSrcweir uno::Any aAny; 837cdf0e10cSrcweir 838cdf0e10cSrcweir for( sal_Int32 i = 0; i < values.getLength(); ++i ) 839cdf0e10cSrcweir { 840cdf0e10cSrcweir MyProperty toset( values[i].Name ); 841cdf0e10cSrcweir it1 = properties.find( toset ); 842cdf0e10cSrcweir if( it1 == properties.end() ) 843cdf0e10cSrcweir { 844cdf0e10cSrcweir ret[i] <<= beans::UnknownPropertyException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX ) ), uno::Reference< uno::XInterface >() ); 845cdf0e10cSrcweir continue; 846cdf0e10cSrcweir } 847cdf0e10cSrcweir 848cdf0e10cSrcweir aAny = it1->getValue(); 849cdf0e10cSrcweir if( aAny == values[i].Value ) 850cdf0e10cSrcweir continue; // nothing needs to be changed 851cdf0e10cSrcweir 852cdf0e10cSrcweir if( it1->getAttributes() & beans::PropertyAttribute::READONLY ) 853cdf0e10cSrcweir { 854cdf0e10cSrcweir ret[i] <<= lang::IllegalAccessException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX ) ), uno::Reference< uno::XInterface >() ); 855cdf0e10cSrcweir continue; 856cdf0e10cSrcweir } 857cdf0e10cSrcweir 858cdf0e10cSrcweir seqChanged[ propChanged ].PropertyName = values[i].Name; 859cdf0e10cSrcweir seqChanged[ propChanged ].PropertyHandle = -1; 860cdf0e10cSrcweir seqChanged[ propChanged ].Further = false; 861cdf0e10cSrcweir seqChanged[ propChanged ].OldValue <<= aAny; 862cdf0e10cSrcweir seqChanged[ propChanged++ ].NewValue = values[i].Value; 863cdf0e10cSrcweir 864cdf0e10cSrcweir it1->setValue( values[i].Value ); // Put the new value into the local cash 865cdf0e10cSrcweir 866cdf0e10cSrcweir if( ! it1->IsNative() ) 867cdf0e10cSrcweir { 868cdf0e10cSrcweir // Also put logical properties into storage 869cdf0e10cSrcweir if( !it->second.xS.is() ) 870cdf0e10cSrcweir load( it,true ); 871cdf0e10cSrcweir 872cdf0e10cSrcweir if( ( values[i].Name == ContentType ) && 873cdf0e10cSrcweir it1->getState() == beans::PropertyState_DEFAULT_VALUE ) 874cdf0e10cSrcweir { // Special logic for ContentType 875cdf0e10cSrcweir // 09.07.01: Not reached anymore, because ContentType is readonly 876cdf0e10cSrcweir it1->setState( beans::PropertyState_DIRECT_VALUE ); 877cdf0e10cSrcweir it->second.xC->addProperty( values[i].Name, 878cdf0e10cSrcweir beans::PropertyAttribute::MAYBEVOID, 879cdf0e10cSrcweir values[i].Value ); 880cdf0e10cSrcweir } 881cdf0e10cSrcweir 882cdf0e10cSrcweir try 883cdf0e10cSrcweir { 884cdf0e10cSrcweir it->second.xS->setPropertyValue( values[i].Name,values[i].Value ); 885cdf0e10cSrcweir } 886cdf0e10cSrcweir catch( const uno::Exception& e ) 887cdf0e10cSrcweir { 888cdf0e10cSrcweir --propChanged; // unsuccessful setting 889cdf0e10cSrcweir ret[i] <<= e; 890cdf0e10cSrcweir } 891cdf0e10cSrcweir } 892cdf0e10cSrcweir else 893cdf0e10cSrcweir { 894cdf0e10cSrcweir // native properties 895cdf0e10cSrcweir // Setting of physical file properties 896cdf0e10cSrcweir if( values[i].Name == Size ) 897cdf0e10cSrcweir { 898cdf0e10cSrcweir sal_Int64 newSize = 0; 899cdf0e10cSrcweir if( values[i].Value >>= newSize ) 900cdf0e10cSrcweir { // valid value for the size 901cdf0e10cSrcweir osl::File aFile(aUnqPath); 902cdf0e10cSrcweir bool err = 903cdf0e10cSrcweir aFile.open(OpenFlag_Write) != osl::FileBase::E_None || 904cdf0e10cSrcweir aFile.setSize(sal_uInt64(newSize)) != osl::FileBase::E_None || 905cdf0e10cSrcweir aFile.close() != osl::FileBase::E_None; 906cdf0e10cSrcweir 907cdf0e10cSrcweir if( err ) 908cdf0e10cSrcweir { 909cdf0e10cSrcweir --propChanged; // unsuccessful setting 910cdf0e10cSrcweir uno::Sequence< uno::Any > names( 1 ); 911cdf0e10cSrcweir ret[0] <<= beans::PropertyValue( 912cdf0e10cSrcweir rtl::OUString::createFromAscii("Uri"), -1, 913cdf0e10cSrcweir uno::makeAny(aUnqPath), 914cdf0e10cSrcweir beans::PropertyState_DIRECT_VALUE); 915cdf0e10cSrcweir IOErrorCode ioError(IOErrorCode_GENERAL); 916cdf0e10cSrcweir ret[i] <<= InteractiveAugmentedIOException( 917cdf0e10cSrcweir rtl::OUString(), 918cdf0e10cSrcweir 0, 919cdf0e10cSrcweir task::InteractionClassification_ERROR, 920cdf0e10cSrcweir ioError, 921cdf0e10cSrcweir names ); 922cdf0e10cSrcweir } 923cdf0e10cSrcweir } 924cdf0e10cSrcweir else 925cdf0e10cSrcweir ret[i] <<= beans::IllegalTypeException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX ) ), uno::Reference< uno::XInterface >() ); 926cdf0e10cSrcweir } 927cdf0e10cSrcweir else if(values[i].Name == IsReadOnly || 928cdf0e10cSrcweir values[i].Name == IsHidden) 929cdf0e10cSrcweir { 930cdf0e10cSrcweir sal_Bool value = sal_False; 931cdf0e10cSrcweir if( values[i].Value >>= value ) 932cdf0e10cSrcweir { 933cdf0e10cSrcweir osl::DirectoryItem aDirItem; 934cdf0e10cSrcweir osl::FileBase::RC err = 935cdf0e10cSrcweir osl::DirectoryItem::get(aUnqPath,aDirItem); 936cdf0e10cSrcweir sal_uInt64 nAttributes(0); 937cdf0e10cSrcweir if(err == osl::FileBase::E_None) 938cdf0e10cSrcweir { 939cdf0e10cSrcweir osl::FileStatus aFileStatus(FileStatusMask_Attributes); 940cdf0e10cSrcweir err = aDirItem.getFileStatus(aFileStatus); 941cdf0e10cSrcweir if(err == osl::FileBase::E_None && 942cdf0e10cSrcweir aFileStatus.isValid(FileStatusMask_Attributes)) 943cdf0e10cSrcweir nAttributes = aFileStatus.getAttributes(); 944cdf0e10cSrcweir } 945cdf0e10cSrcweir // now we have the attributes provided all went well. 946cdf0e10cSrcweir if(err == osl::FileBase::E_None) { 947cdf0e10cSrcweir if(values[i].Name == IsReadOnly) 948cdf0e10cSrcweir { 949cdf0e10cSrcweir nAttributes &= ~(Attribute_OwnWrite | 950cdf0e10cSrcweir Attribute_GrpWrite | 951cdf0e10cSrcweir Attribute_OthWrite | 952cdf0e10cSrcweir Attribute_ReadOnly); 953cdf0e10cSrcweir if(value) 954cdf0e10cSrcweir nAttributes |= Attribute_ReadOnly; 955cdf0e10cSrcweir else 956cdf0e10cSrcweir nAttributes |= ( 957cdf0e10cSrcweir Attribute_OwnWrite | 958cdf0e10cSrcweir Attribute_GrpWrite | 959cdf0e10cSrcweir Attribute_OthWrite); 960cdf0e10cSrcweir } 961cdf0e10cSrcweir else if(values[i].Name == IsHidden) 962cdf0e10cSrcweir { 963cdf0e10cSrcweir nAttributes &= ~(Attribute_Hidden); 964cdf0e10cSrcweir if(value) 965cdf0e10cSrcweir nAttributes |= Attribute_Hidden; 966cdf0e10cSrcweir } 967cdf0e10cSrcweir err = osl::File::setAttributes( 968cdf0e10cSrcweir aUnqPath,nAttributes); 969cdf0e10cSrcweir } 970cdf0e10cSrcweir 971cdf0e10cSrcweir if( err != osl::FileBase::E_None ) 972cdf0e10cSrcweir { 973cdf0e10cSrcweir --propChanged; // unsuccessful setting 974cdf0e10cSrcweir uno::Sequence< uno::Any > names( 1 ); 975cdf0e10cSrcweir names[0] <<= beans::PropertyValue( 976cdf0e10cSrcweir rtl::OUString::createFromAscii("Uri"), -1, 977cdf0e10cSrcweir uno::makeAny(aUnqPath), 978cdf0e10cSrcweir beans::PropertyState_DIRECT_VALUE); 979cdf0e10cSrcweir IOErrorCode ioError; 980cdf0e10cSrcweir switch( err ) 981cdf0e10cSrcweir { 982cdf0e10cSrcweir case osl::FileBase::E_NOMEM: 983cdf0e10cSrcweir // not enough memory for allocating structures <br> 984cdf0e10cSrcweir ioError = IOErrorCode_OUT_OF_MEMORY; 985cdf0e10cSrcweir break; 986cdf0e10cSrcweir case osl::FileBase::E_INVAL: 987cdf0e10cSrcweir // the format of the parameters was not valid<p> 988cdf0e10cSrcweir ioError = IOErrorCode_INVALID_PARAMETER; 989cdf0e10cSrcweir break; 990cdf0e10cSrcweir case osl::FileBase::E_NAMETOOLONG: 991cdf0e10cSrcweir // File name too long<br> 992cdf0e10cSrcweir ioError = IOErrorCode_NAME_TOO_LONG; 993cdf0e10cSrcweir break; 994cdf0e10cSrcweir case osl::FileBase::E_NOENT: 995cdf0e10cSrcweir // No such file or directory<br> 996cdf0e10cSrcweir case osl::FileBase::E_NOLINK: 997cdf0e10cSrcweir // Link has been severed<br> 998cdf0e10cSrcweir ioError = IOErrorCode_NOT_EXISTING; 999cdf0e10cSrcweir break; 1000cdf0e10cSrcweir case osl::FileBase::E_ROFS: 1001cdf0e10cSrcweir // #i4735# handle ROFS transparently 1002cdf0e10cSrcweir // as ACCESS_DENIED 1003cdf0e10cSrcweir case osl::FileBase::E_PERM: 1004cdf0e10cSrcweir case osl::FileBase::E_ACCES: 1005cdf0e10cSrcweir // permission denied<br> 1006cdf0e10cSrcweir ioError = IOErrorCode_ACCESS_DENIED; 1007cdf0e10cSrcweir break; 1008cdf0e10cSrcweir case osl::FileBase::E_LOOP: 1009cdf0e10cSrcweir // Too many symbolic links encountered<br> 1010cdf0e10cSrcweir case osl::FileBase::E_FAULT: 1011cdf0e10cSrcweir // Bad address<br> 1012cdf0e10cSrcweir case osl::FileBase::E_IO: 1013cdf0e10cSrcweir // I/O error<br> 1014cdf0e10cSrcweir case osl::FileBase::E_NOSYS: 1015cdf0e10cSrcweir // Function not implemented<br> 1016cdf0e10cSrcweir case osl::FileBase::E_MULTIHOP: 1017cdf0e10cSrcweir // Multihop attempted<br> 1018cdf0e10cSrcweir case osl::FileBase::E_INTR: 1019cdf0e10cSrcweir // function call was interrupted<p> 1020cdf0e10cSrcweir default: 1021cdf0e10cSrcweir ioError = IOErrorCode_GENERAL; 1022cdf0e10cSrcweir break; 1023cdf0e10cSrcweir } 1024cdf0e10cSrcweir ret[i] <<= InteractiveAugmentedIOException( 1025cdf0e10cSrcweir rtl::OUString(), 1026cdf0e10cSrcweir 0, 1027cdf0e10cSrcweir task::InteractionClassification_ERROR, 1028cdf0e10cSrcweir ioError, 1029cdf0e10cSrcweir names ); 1030cdf0e10cSrcweir } 1031cdf0e10cSrcweir } 1032cdf0e10cSrcweir else 1033cdf0e10cSrcweir ret[i] <<= beans::IllegalTypeException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX ) ), uno::Reference< uno::XInterface >() ); 1034cdf0e10cSrcweir } 1035cdf0e10cSrcweir } 1036cdf0e10cSrcweir } // end for 1037cdf0e10cSrcweir 1038cdf0e10cSrcweir if( propChanged ) 1039cdf0e10cSrcweir { 1040cdf0e10cSrcweir seqChanged.realloc( propChanged ); 1041cdf0e10cSrcweir notifyPropertyChanges( getPropertyChangeNotifier( aUnqPath ),seqChanged ); 1042cdf0e10cSrcweir } 1043cdf0e10cSrcweir 1044cdf0e10cSrcweir return ret; 1045cdf0e10cSrcweir } 1046cdf0e10cSrcweir 1047cdf0e10cSrcweir /*********************************************************************************/ 1048cdf0e10cSrcweir /* */ 1049cdf0e10cSrcweir /* getv-Implementation */ 1050cdf0e10cSrcweir /* */ 1051cdf0e10cSrcweir /*********************************************************************************/ 1052cdf0e10cSrcweir // 1053cdf0e10cSrcweir // Reads the values of the properties belonging to fileURL aUnqPath; 1054cdf0e10cSrcweir // Returns an XRow object containing the values in the requested order. 1055cdf0e10cSrcweir // 1056cdf0e10cSrcweir 1057cdf0e10cSrcweir 1058cdf0e10cSrcweir uno::Reference< sdbc::XRow > SAL_CALL 1059cdf0e10cSrcweir shell::getv( sal_Int32 CommandId, 1060cdf0e10cSrcweir const rtl::OUString& aUnqPath, 1061cdf0e10cSrcweir const uno::Sequence< beans::Property >& properties ) 1062cdf0e10cSrcweir throw() 1063cdf0e10cSrcweir { 1064cdf0e10cSrcweir uno::Sequence< uno::Any > seq( properties.getLength() ); 1065cdf0e10cSrcweir 1066cdf0e10cSrcweir sal_Int32 n_Mask; 1067cdf0e10cSrcweir getMaskFromProperties( n_Mask,properties ); 1068cdf0e10cSrcweir osl::FileStatus aFileStatus( n_Mask ); 1069cdf0e10cSrcweir 1070cdf0e10cSrcweir osl::DirectoryItem aDirItem; 1071cdf0e10cSrcweir osl::FileBase::RC nError1 = osl::DirectoryItem::get( aUnqPath,aDirItem ); 1072cdf0e10cSrcweir if( nError1 != osl::FileBase::E_None ) 1073cdf0e10cSrcweir installError(CommandId, 1074cdf0e10cSrcweir TASKHANDLING_OPEN_FILE_FOR_PAGING, // BEAWARE, REUSED 1075cdf0e10cSrcweir nError1); 1076cdf0e10cSrcweir 1077cdf0e10cSrcweir osl::FileBase::RC nError2 = aDirItem.getFileStatus( aFileStatus ); 1078cdf0e10cSrcweir if( nError1 == osl::FileBase::E_None && 1079cdf0e10cSrcweir nError2 != osl::FileBase::E_None ) 1080cdf0e10cSrcweir installError(CommandId, 1081cdf0e10cSrcweir TASKHANDLING_OPEN_FILE_FOR_PAGING, // BEAWARE, REUSED 1082cdf0e10cSrcweir nError2); 1083cdf0e10cSrcweir 1084cdf0e10cSrcweir { 1085cdf0e10cSrcweir osl::MutexGuard aGuard( m_aMutex ); 1086cdf0e10cSrcweir 1087cdf0e10cSrcweir shell::ContentMap::iterator it = m_aContent.find( aUnqPath ); 1088cdf0e10cSrcweir commit( it,aFileStatus ); 1089cdf0e10cSrcweir 1090cdf0e10cSrcweir shell::PropertySet::iterator it1; 1091cdf0e10cSrcweir PropertySet& propset = *(it->second.properties); 1092cdf0e10cSrcweir 1093cdf0e10cSrcweir for( sal_Int32 i = 0; i < seq.getLength(); ++i ) 1094cdf0e10cSrcweir { 1095cdf0e10cSrcweir MyProperty readProp( properties[i].Name ); 1096cdf0e10cSrcweir it1 = propset.find( readProp ); 1097cdf0e10cSrcweir if( it1 == propset.end() ) 1098cdf0e10cSrcweir seq[i] = uno::Any(); 1099cdf0e10cSrcweir else 1100cdf0e10cSrcweir seq[i] = it1->getValue(); 1101cdf0e10cSrcweir } 1102cdf0e10cSrcweir } 1103cdf0e10cSrcweir 1104cdf0e10cSrcweir XRow_impl* p = new XRow_impl( this,seq ); 1105cdf0e10cSrcweir return uno::Reference< sdbc::XRow >( p ); 1106cdf0e10cSrcweir } 1107cdf0e10cSrcweir 1108cdf0e10cSrcweir 1109cdf0e10cSrcweir /********************************************************************************/ 1110cdf0e10cSrcweir /* */ 1111cdf0e10cSrcweir /* transfer-commandos */ 1112cdf0e10cSrcweir /* */ 1113cdf0e10cSrcweir /********************************************************************************/ 1114cdf0e10cSrcweir 1115cdf0e10cSrcweir 1116cdf0e10cSrcweir /********************************************************************************/ 1117cdf0e10cSrcweir /* */ 1118cdf0e10cSrcweir /* move-implementation */ 1119cdf0e10cSrcweir /* */ 1120cdf0e10cSrcweir /********************************************************************************/ 1121cdf0e10cSrcweir // 1122cdf0e10cSrcweir // Moves the content belonging to fileURL srcUnqPath to fileURL dstUnqPath. 1123cdf0e10cSrcweir // 1124cdf0e10cSrcweir 1125cdf0e10cSrcweir void SAL_CALL 1126cdf0e10cSrcweir shell::move( sal_Int32 CommandId, 1127cdf0e10cSrcweir const rtl::OUString srcUnqPath, 1128cdf0e10cSrcweir const rtl::OUString dstUnqPathIn, 1129cdf0e10cSrcweir const sal_Int32 NameClash ) 1130cdf0e10cSrcweir throw() 1131cdf0e10cSrcweir { 1132cdf0e10cSrcweir // --> #i88446# Method notifyContentExchanged( getContentExchangedEventListeners( srcUnqPath,dstUnqPath,!isDocument ) ); crashes if 1133cdf0e10cSrcweir // srcUnqPath and dstUnqPathIn are equal 1134cdf0e10cSrcweir if( srcUnqPath == dstUnqPathIn ) 1135cdf0e10cSrcweir return; 1136cdf0e10cSrcweir // <-- 1137cdf0e10cSrcweir // 1138cdf0e10cSrcweir osl::FileBase::RC nError; 1139cdf0e10cSrcweir rtl::OUString dstUnqPath( dstUnqPathIn ); 1140cdf0e10cSrcweir 1141cdf0e10cSrcweir switch( NameClash ) 1142cdf0e10cSrcweir { 1143cdf0e10cSrcweir case NameClash::KEEP: 1144cdf0e10cSrcweir { 1145cdf0e10cSrcweir nError = osl_File_move( srcUnqPath,dstUnqPath,true ); 1146cdf0e10cSrcweir if( nError != osl::FileBase::E_None && nError != osl::FileBase::E_EXIST ) 1147cdf0e10cSrcweir { 1148cdf0e10cSrcweir installError( CommandId, 1149cdf0e10cSrcweir TASKHANDLING_KEEPERROR_FOR_MOVE, 1150cdf0e10cSrcweir nError ); 1151cdf0e10cSrcweir return; 1152cdf0e10cSrcweir } 1153cdf0e10cSrcweir break; 1154cdf0e10cSrcweir } 1155cdf0e10cSrcweir case NameClash::OVERWRITE: 1156cdf0e10cSrcweir { 1157cdf0e10cSrcweir // stat to determine whether we have a symlink 1158cdf0e10cSrcweir rtl::OUString targetPath(dstUnqPath); 1159cdf0e10cSrcweir 1160cdf0e10cSrcweir osl::FileStatus aStatus(FileStatusMask_Type|FileStatusMask_LinkTargetURL); 1161cdf0e10cSrcweir osl::DirectoryItem aItem; 1162cdf0e10cSrcweir osl::DirectoryItem::get(dstUnqPath,aItem); 1163cdf0e10cSrcweir aItem.getFileStatus(aStatus); 1164cdf0e10cSrcweir 1165cdf0e10cSrcweir if( aStatus.isValid(FileStatusMask_Type) && 1166cdf0e10cSrcweir aStatus.isValid(FileStatusMask_LinkTargetURL) && 1167cdf0e10cSrcweir aStatus.getFileType() == osl::FileStatus::Link ) 1168cdf0e10cSrcweir targetPath = aStatus.getLinkTargetURL(); 1169cdf0e10cSrcweir 1170cdf0e10cSrcweir // Will do nothing if file does not exist. 1171cdf0e10cSrcweir osl::File::remove( targetPath ); 1172cdf0e10cSrcweir 1173cdf0e10cSrcweir nError = osl_File_move( srcUnqPath,targetPath ); 1174cdf0e10cSrcweir if( nError != osl::FileBase::E_None ) 1175cdf0e10cSrcweir { 1176cdf0e10cSrcweir installError( CommandId, 1177cdf0e10cSrcweir TASKHANDLING_OVERWRITE_FOR_MOVE, 1178cdf0e10cSrcweir nError ); 1179cdf0e10cSrcweir return; 1180cdf0e10cSrcweir } 1181cdf0e10cSrcweir break; 1182cdf0e10cSrcweir } 1183cdf0e10cSrcweir case NameClash::RENAME: 1184cdf0e10cSrcweir { 1185cdf0e10cSrcweir rtl::OUString newDstUnqPath; 1186cdf0e10cSrcweir nError = osl_File_move( srcUnqPath,dstUnqPath,true ); 1187cdf0e10cSrcweir if( nError == osl::FileBase::E_EXIST ) 1188cdf0e10cSrcweir { 1189cdf0e10cSrcweir // "invent" a new valid title. 1190cdf0e10cSrcweir 1191cdf0e10cSrcweir sal_Int32 nPos = -1; 1192cdf0e10cSrcweir sal_Int32 nLastDot = dstUnqPath.lastIndexOf( '.' ); 1193cdf0e10cSrcweir sal_Int32 nLastSlash = dstUnqPath.lastIndexOf( '/' ); 1194cdf0e10cSrcweir if( ( nLastSlash < nLastDot ) // dot is part of last(!) path segment 1195cdf0e10cSrcweir && ( nLastSlash != ( nLastDot - 1 ) ) ) // file name does not start with a dot 1196cdf0e10cSrcweir nPos = nLastDot; 1197cdf0e10cSrcweir else 1198cdf0e10cSrcweir nPos = dstUnqPath.getLength(); 1199cdf0e10cSrcweir 1200cdf0e10cSrcweir sal_Int32 nTry = 0; 1201cdf0e10cSrcweir 1202cdf0e10cSrcweir do 1203cdf0e10cSrcweir { 1204cdf0e10cSrcweir newDstUnqPath = dstUnqPath; 1205cdf0e10cSrcweir 1206cdf0e10cSrcweir rtl::OUString aPostFix( rtl::OUString::createFromAscii( "_" ) ); 1207cdf0e10cSrcweir aPostFix += rtl::OUString::valueOf( ++nTry ); 1208cdf0e10cSrcweir 1209cdf0e10cSrcweir newDstUnqPath = newDstUnqPath.replaceAt( nPos, 0, aPostFix ); 1210cdf0e10cSrcweir 1211cdf0e10cSrcweir nError = osl_File_move( srcUnqPath,newDstUnqPath,true ); 1212cdf0e10cSrcweir } 1213cdf0e10cSrcweir while( ( nError == osl::FileBase::E_EXIST ) && ( nTry < 10000 ) ); 1214cdf0e10cSrcweir } 1215cdf0e10cSrcweir 1216cdf0e10cSrcweir if( nError == osl::FileBase::E_EXIST ) 1217cdf0e10cSrcweir { 1218cdf0e10cSrcweir installError( CommandId, 1219cdf0e10cSrcweir TASKHANDLING_RENAME_FOR_MOVE ); 1220cdf0e10cSrcweir return; 1221cdf0e10cSrcweir } 1222cdf0e10cSrcweir else if( nError != osl::FileBase::E_None ) 1223cdf0e10cSrcweir { 1224cdf0e10cSrcweir installError( CommandId, 1225cdf0e10cSrcweir TASKHANDLING_RENAMEMOVE_FOR_MOVE, 1226cdf0e10cSrcweir nError ); 1227cdf0e10cSrcweir return; 1228cdf0e10cSrcweir } 1229cdf0e10cSrcweir else 1230cdf0e10cSrcweir dstUnqPath = newDstUnqPath; 1231cdf0e10cSrcweir 1232cdf0e10cSrcweir break; 1233cdf0e10cSrcweir } 1234cdf0e10cSrcweir case NameClash::ERROR: 1235cdf0e10cSrcweir { 1236cdf0e10cSrcweir nError = osl_File_move( srcUnqPath,dstUnqPath,true ); 1237cdf0e10cSrcweir if( nError == osl::FileBase::E_EXIST ) 1238cdf0e10cSrcweir { 1239cdf0e10cSrcweir installError( CommandId, 1240cdf0e10cSrcweir TASKHANDLING_NAMECLASH_FOR_MOVE ); 1241cdf0e10cSrcweir return; 1242cdf0e10cSrcweir } 1243cdf0e10cSrcweir else if( nError != osl::FileBase::E_None ) 1244cdf0e10cSrcweir { 1245cdf0e10cSrcweir installError( CommandId, 1246cdf0e10cSrcweir TASKHANDLING_NAMECLASHMOVE_FOR_MOVE, 1247cdf0e10cSrcweir nError ); 1248cdf0e10cSrcweir return; 1249cdf0e10cSrcweir } 1250cdf0e10cSrcweir break; 1251cdf0e10cSrcweir } 1252cdf0e10cSrcweir case NameClash::ASK: 1253cdf0e10cSrcweir default: 1254cdf0e10cSrcweir { 1255cdf0e10cSrcweir nError = osl_File_move( srcUnqPath,dstUnqPath,true ); 1256cdf0e10cSrcweir if( nError == osl::FileBase::E_EXIST ) 1257cdf0e10cSrcweir { 1258cdf0e10cSrcweir installError( CommandId, 1259cdf0e10cSrcweir TASKHANDLING_NAMECLASHSUPPORT_FOR_MOVE, 1260cdf0e10cSrcweir NameClash::ASK); 1261cdf0e10cSrcweir return; 1262cdf0e10cSrcweir } 1263cdf0e10cSrcweir } 1264cdf0e10cSrcweir break; 1265cdf0e10cSrcweir } 1266cdf0e10cSrcweir 1267cdf0e10cSrcweir // Determine, whether we have moved a file or a folder 1268cdf0e10cSrcweir osl::DirectoryItem aItem; 1269cdf0e10cSrcweir nError = osl::DirectoryItem::get( dstUnqPath,aItem ); 1270cdf0e10cSrcweir if( nError != osl::FileBase::E_None ) 1271cdf0e10cSrcweir { 1272cdf0e10cSrcweir installError( CommandId, 1273cdf0e10cSrcweir TASKHANDLING_TRANSFER_BY_MOVE_SOURCE, 1274cdf0e10cSrcweir nError ); 1275cdf0e10cSrcweir return; 1276cdf0e10cSrcweir } 1277cdf0e10cSrcweir osl::FileStatus aStatus( FileStatusMask_Type ); 1278cdf0e10cSrcweir nError = aItem.getFileStatus( aStatus ); 1279cdf0e10cSrcweir if( nError != osl::FileBase::E_None || ! aStatus.isValid( FileStatusMask_Type ) ) 1280cdf0e10cSrcweir { 1281cdf0e10cSrcweir installError( CommandId, 1282cdf0e10cSrcweir TASKHANDLING_TRANSFER_BY_MOVE_SOURCESTAT, 1283cdf0e10cSrcweir nError ); 1284cdf0e10cSrcweir return; 1285cdf0e10cSrcweir } 1286cdf0e10cSrcweir sal_Bool isDocument = ( aStatus.getFileType() == osl::FileStatus::Regular ); 1287cdf0e10cSrcweir 1288cdf0e10cSrcweir 1289cdf0e10cSrcweir copyPersistentSet( srcUnqPath,dstUnqPath,!isDocument ); 1290cdf0e10cSrcweir 1291cdf0e10cSrcweir rtl::OUString aDstParent = getParentName( dstUnqPath ); 1292cdf0e10cSrcweir rtl::OUString aDstTitle = getTitle( dstUnqPath ); 1293cdf0e10cSrcweir 1294cdf0e10cSrcweir rtl::OUString aSrcParent = getParentName( srcUnqPath ); 1295cdf0e10cSrcweir rtl::OUString aSrcTitle = getTitle( srcUnqPath ); 1296cdf0e10cSrcweir 1297cdf0e10cSrcweir notifyInsert( getContentEventListeners( aDstParent ),dstUnqPath ); 1298cdf0e10cSrcweir if( aDstParent != aSrcParent ) 1299cdf0e10cSrcweir notifyContentRemoved( getContentEventListeners( aSrcParent ),srcUnqPath ); 1300cdf0e10cSrcweir 1301cdf0e10cSrcweir notifyContentExchanged( getContentExchangedEventListeners( srcUnqPath,dstUnqPath,!isDocument ) ); 1302cdf0e10cSrcweir erasePersistentSet( srcUnqPath,!isDocument ); 1303cdf0e10cSrcweir } 1304cdf0e10cSrcweir 1305cdf0e10cSrcweir 1306cdf0e10cSrcweir 1307cdf0e10cSrcweir /********************************************************************************/ 1308cdf0e10cSrcweir /* */ 1309cdf0e10cSrcweir /* copy-implementation */ 1310cdf0e10cSrcweir /* */ 1311cdf0e10cSrcweir /********************************************************************************/ 1312cdf0e10cSrcweir // 1313cdf0e10cSrcweir // Copies the content belonging to fileURL srcUnqPath to fileURL dstUnqPath ( files and directories ) 1314cdf0e10cSrcweir // 1315cdf0e10cSrcweir 1316cdf0e10cSrcweir namespace { 1317cdf0e10cSrcweir 1318cdf0e10cSrcweir bool getType( 1319cdf0e10cSrcweir TaskManager & task, sal_Int32 id, rtl::OUString const & fileUrl, 1320cdf0e10cSrcweir osl::DirectoryItem * item, osl::FileStatus::Type * type) 1321cdf0e10cSrcweir { 1322cdf0e10cSrcweir OSL_ASSERT(item != 0 && type != 0); 1323cdf0e10cSrcweir osl::FileBase::RC err = osl::DirectoryItem::get(fileUrl, *item); 1324cdf0e10cSrcweir if (err != osl::FileBase::E_None) { 1325cdf0e10cSrcweir task.installError(id, TASKHANDLING_TRANSFER_BY_COPY_SOURCE, err); 1326cdf0e10cSrcweir return false; 1327cdf0e10cSrcweir } 1328cdf0e10cSrcweir osl::FileStatus stat(FileStatusMask_Type); 1329cdf0e10cSrcweir err = item->getFileStatus(stat); 1330cdf0e10cSrcweir if (err != osl::FileBase::E_None) { 1331cdf0e10cSrcweir task.installError(id, TASKHANDLING_TRANSFER_BY_COPY_SOURCESTAT, err); 1332cdf0e10cSrcweir return false; 1333cdf0e10cSrcweir } 1334cdf0e10cSrcweir *type = stat.getFileType(); 1335cdf0e10cSrcweir return true; 1336cdf0e10cSrcweir } 1337cdf0e10cSrcweir 1338cdf0e10cSrcweir } 1339cdf0e10cSrcweir 1340cdf0e10cSrcweir void SAL_CALL 1341cdf0e10cSrcweir shell::copy( 1342cdf0e10cSrcweir sal_Int32 CommandId, 1343cdf0e10cSrcweir const rtl::OUString srcUnqPath, 1344cdf0e10cSrcweir const rtl::OUString dstUnqPathIn, 1345cdf0e10cSrcweir sal_Int32 NameClash ) 1346cdf0e10cSrcweir throw() 1347cdf0e10cSrcweir { 1348cdf0e10cSrcweir osl::FileBase::RC nError; 1349cdf0e10cSrcweir rtl::OUString dstUnqPath( dstUnqPathIn ); 1350cdf0e10cSrcweir 1351cdf0e10cSrcweir // Resolve symbolic links within the source path. If srcUnqPath denotes a 1352cdf0e10cSrcweir // symbolic link (targeting either a file or a folder), the contents of the 1353cdf0e10cSrcweir // target is copied (recursively, in the case of a folder). However, if 1354cdf0e10cSrcweir // recursively copying the contents of a folder causes a symbolic link to be 1355cdf0e10cSrcweir // copied, the symbolic link itself is copied. 1356cdf0e10cSrcweir osl::DirectoryItem item; 1357cdf0e10cSrcweir osl::FileStatus::Type type; 1358cdf0e10cSrcweir if (!getType(*this, CommandId, srcUnqPath, &item, &type)) { 1359cdf0e10cSrcweir return; 1360cdf0e10cSrcweir } 1361cdf0e10cSrcweir rtl::OUString rslvdSrcUnqPath; 1362cdf0e10cSrcweir if (type == osl::FileStatus::Link) { 1363cdf0e10cSrcweir osl::FileStatus stat(FileStatusMask_LinkTargetURL); 1364cdf0e10cSrcweir nError = item.getFileStatus(stat); 1365cdf0e10cSrcweir if (nError != osl::FileBase::E_None) { 1366cdf0e10cSrcweir installError( 1367cdf0e10cSrcweir CommandId, TASKHANDLING_TRANSFER_BY_COPY_SOURCESTAT, nError); 1368cdf0e10cSrcweir return; 1369cdf0e10cSrcweir } 1370cdf0e10cSrcweir rslvdSrcUnqPath = stat.getLinkTargetURL(); 1371cdf0e10cSrcweir if (!getType(*this, CommandId, srcUnqPath, &item, &type)) { 1372cdf0e10cSrcweir return; 1373cdf0e10cSrcweir } 1374cdf0e10cSrcweir } else { 1375cdf0e10cSrcweir rslvdSrcUnqPath = srcUnqPath; 1376cdf0e10cSrcweir } 1377cdf0e10cSrcweir 1378cdf0e10cSrcweir sal_Bool isDocument 1379cdf0e10cSrcweir = type != osl::FileStatus::Directory && type != osl::FileStatus::Volume; 1380cdf0e10cSrcweir sal_Int32 IsWhat = isDocument ? -1 : 1; 1381cdf0e10cSrcweir 1382cdf0e10cSrcweir switch( NameClash ) 1383cdf0e10cSrcweir { 1384cdf0e10cSrcweir case NameClash::KEEP: 1385cdf0e10cSrcweir { 1386cdf0e10cSrcweir nError = copy_recursive( rslvdSrcUnqPath,dstUnqPath,IsWhat,true ); 1387cdf0e10cSrcweir if( nError != osl::FileBase::E_None && nError != osl::FileBase::E_EXIST ) 1388cdf0e10cSrcweir { 1389cdf0e10cSrcweir installError( CommandId, 1390cdf0e10cSrcweir TASKHANDLING_KEEPERROR_FOR_COPY, 1391cdf0e10cSrcweir nError ); 1392cdf0e10cSrcweir return; 1393cdf0e10cSrcweir } 1394cdf0e10cSrcweir break; 1395cdf0e10cSrcweir } 1396cdf0e10cSrcweir case NameClash::OVERWRITE: 1397cdf0e10cSrcweir { 1398cdf0e10cSrcweir // remove (..., MustExist = sal_False). 1399cdf0e10cSrcweir remove( CommandId, dstUnqPath, IsWhat, sal_False ); 1400cdf0e10cSrcweir 1401cdf0e10cSrcweir // copy. 1402cdf0e10cSrcweir nError = copy_recursive( rslvdSrcUnqPath,dstUnqPath,IsWhat,false ); 1403cdf0e10cSrcweir if( nError != osl::FileBase::E_None ) 1404cdf0e10cSrcweir { 1405cdf0e10cSrcweir installError( CommandId, 1406cdf0e10cSrcweir TASKHANDLING_OVERWRITE_FOR_COPY, 1407cdf0e10cSrcweir nError ); 1408cdf0e10cSrcweir return; 1409cdf0e10cSrcweir } 1410cdf0e10cSrcweir break; 1411cdf0e10cSrcweir } 1412cdf0e10cSrcweir case NameClash::RENAME: 1413cdf0e10cSrcweir { 1414cdf0e10cSrcweir rtl::OUString newDstUnqPath; 1415cdf0e10cSrcweir nError = copy_recursive( rslvdSrcUnqPath,dstUnqPath,IsWhat,true ); 1416cdf0e10cSrcweir 1417cdf0e10cSrcweir if( nError == osl::FileBase::E_EXIST ) 1418cdf0e10cSrcweir { 1419cdf0e10cSrcweir // "invent" a new valid title. 1420cdf0e10cSrcweir 1421cdf0e10cSrcweir sal_Int32 nPos = -1; 1422cdf0e10cSrcweir sal_Int32 nLastDot = dstUnqPath.lastIndexOf( '.' ); 1423cdf0e10cSrcweir sal_Int32 nLastSlash = dstUnqPath.lastIndexOf( '/' ); 1424cdf0e10cSrcweir if ( ( nLastSlash < nLastDot ) // dot is part of last(!) path segment 1425cdf0e10cSrcweir && ( nLastSlash != ( nLastDot - 1 ) ) ) // file name does not start with a dot 1426cdf0e10cSrcweir nPos = nLastDot; 1427cdf0e10cSrcweir else 1428cdf0e10cSrcweir nPos = dstUnqPath.getLength(); 1429cdf0e10cSrcweir 1430cdf0e10cSrcweir sal_Int32 nTry = 0; 1431cdf0e10cSrcweir 1432cdf0e10cSrcweir do 1433cdf0e10cSrcweir { 1434cdf0e10cSrcweir newDstUnqPath = dstUnqPath; 1435cdf0e10cSrcweir 1436cdf0e10cSrcweir rtl::OUString aPostFix( rtl::OUString::createFromAscii( "_" ) ); 1437cdf0e10cSrcweir aPostFix += rtl::OUString::valueOf( ++nTry ); 1438cdf0e10cSrcweir 1439cdf0e10cSrcweir newDstUnqPath = newDstUnqPath.replaceAt( nPos, 0, aPostFix ); 1440cdf0e10cSrcweir 1441cdf0e10cSrcweir nError = copy_recursive( rslvdSrcUnqPath,newDstUnqPath,IsWhat,true ); 1442cdf0e10cSrcweir } 1443cdf0e10cSrcweir while( ( nError == osl::FileBase::E_EXIST ) && ( nTry < 10000 ) ); 1444cdf0e10cSrcweir } 1445cdf0e10cSrcweir 1446cdf0e10cSrcweir if( nError == osl::FileBase::E_EXIST ) 1447cdf0e10cSrcweir { 1448cdf0e10cSrcweir installError( CommandId, 1449cdf0e10cSrcweir TASKHANDLING_RENAME_FOR_COPY ); 1450cdf0e10cSrcweir return; 1451cdf0e10cSrcweir } 1452cdf0e10cSrcweir else if( nError != osl::FileBase::E_None ) 1453cdf0e10cSrcweir { 1454cdf0e10cSrcweir installError( CommandId, 1455cdf0e10cSrcweir TASKHANDLING_RENAMEMOVE_FOR_COPY, 1456cdf0e10cSrcweir nError ); 1457cdf0e10cSrcweir return; 1458cdf0e10cSrcweir } 1459cdf0e10cSrcweir else 1460cdf0e10cSrcweir dstUnqPath = newDstUnqPath; 1461cdf0e10cSrcweir 1462cdf0e10cSrcweir break; 1463cdf0e10cSrcweir } 1464cdf0e10cSrcweir case NameClash::ERROR: 1465cdf0e10cSrcweir { 1466cdf0e10cSrcweir nError = copy_recursive( rslvdSrcUnqPath,dstUnqPath,IsWhat,true ); 1467cdf0e10cSrcweir 1468cdf0e10cSrcweir if( nError == osl::FileBase::E_EXIST ) 1469cdf0e10cSrcweir { 1470cdf0e10cSrcweir installError( CommandId, 1471cdf0e10cSrcweir TASKHANDLING_NAMECLASH_FOR_COPY ); 1472cdf0e10cSrcweir return; 1473cdf0e10cSrcweir } 1474cdf0e10cSrcweir else if( nError != osl::FileBase::E_None ) 1475cdf0e10cSrcweir { 1476cdf0e10cSrcweir installError( CommandId, 1477cdf0e10cSrcweir TASKHANDLING_NAMECLASHMOVE_FOR_COPY, 1478cdf0e10cSrcweir nError ); 1479cdf0e10cSrcweir return; 1480cdf0e10cSrcweir } 1481cdf0e10cSrcweir break; 1482cdf0e10cSrcweir } 1483cdf0e10cSrcweir case NameClash::ASK: 1484cdf0e10cSrcweir default: 1485cdf0e10cSrcweir { 1486cdf0e10cSrcweir nError = copy_recursive( rslvdSrcUnqPath,dstUnqPath,IsWhat,true ); 1487cdf0e10cSrcweir 1488cdf0e10cSrcweir if( nError == osl::FileBase::E_EXIST ) 1489cdf0e10cSrcweir { 1490cdf0e10cSrcweir installError( CommandId, 1491cdf0e10cSrcweir TASKHANDLING_NAMECLASHSUPPORT_FOR_COPY, 1492cdf0e10cSrcweir NameClash); 1493cdf0e10cSrcweir return; 1494cdf0e10cSrcweir } 1495cdf0e10cSrcweir break; 1496cdf0e10cSrcweir } 1497cdf0e10cSrcweir } 1498cdf0e10cSrcweir 1499cdf0e10cSrcweir copyPersistentSet( srcUnqPath,dstUnqPath, !isDocument ); 1500cdf0e10cSrcweir notifyInsert( getContentEventListeners( getParentName( dstUnqPath ) ),dstUnqPath ); 1501cdf0e10cSrcweir } 1502cdf0e10cSrcweir 1503cdf0e10cSrcweir 1504cdf0e10cSrcweir 1505cdf0e10cSrcweir /********************************************************************************/ 1506cdf0e10cSrcweir /* */ 1507cdf0e10cSrcweir /* remove-implementation */ 1508cdf0e10cSrcweir /* */ 1509cdf0e10cSrcweir /********************************************************************************/ 1510cdf0e10cSrcweir // 1511cdf0e10cSrcweir // Deletes the content belonging to fileURL aUnqPath( recursively in case of directory ) 1512cdf0e10cSrcweir // Return: success of operation 1513cdf0e10cSrcweir // 1514cdf0e10cSrcweir 1515cdf0e10cSrcweir 1516cdf0e10cSrcweir sal_Bool SAL_CALL 1517cdf0e10cSrcweir shell::remove( sal_Int32 CommandId, 1518cdf0e10cSrcweir const rtl::OUString& aUnqPath, 1519cdf0e10cSrcweir sal_Int32 IsWhat, 1520cdf0e10cSrcweir sal_Bool MustExist ) 1521cdf0e10cSrcweir throw() 1522cdf0e10cSrcweir { 1523cdf0e10cSrcweir sal_Int32 nMask = FileStatusMask_Type | FileStatusMask_FileURL; 1524cdf0e10cSrcweir 1525cdf0e10cSrcweir osl::DirectoryItem aItem; 1526cdf0e10cSrcweir osl::FileStatus aStatus( nMask ); 1527cdf0e10cSrcweir osl::FileBase::RC nError; 1528cdf0e10cSrcweir 1529cdf0e10cSrcweir if( IsWhat == 0 ) // Determine whether we are removing a directory or a file 1530cdf0e10cSrcweir { 1531cdf0e10cSrcweir nError = osl::DirectoryItem::get( aUnqPath, aItem ); 1532cdf0e10cSrcweir if( nError != osl::FileBase::E_None ) 1533cdf0e10cSrcweir { 1534cdf0e10cSrcweir if (MustExist) 1535cdf0e10cSrcweir { 1536cdf0e10cSrcweir installError( CommandId, 1537cdf0e10cSrcweir TASKHANDLING_NOSUCHFILEORDIR_FOR_REMOVE, 1538cdf0e10cSrcweir nError ); 1539cdf0e10cSrcweir } 1540cdf0e10cSrcweir return (!MustExist); 1541cdf0e10cSrcweir } 1542cdf0e10cSrcweir 1543cdf0e10cSrcweir nError = aItem.getFileStatus( aStatus ); 1544cdf0e10cSrcweir if( nError != osl::FileBase::E_None || ! aStatus.isValid( nMask ) ) 1545cdf0e10cSrcweir { 1546cdf0e10cSrcweir installError( CommandId, 1547cdf0e10cSrcweir TASKHANDLING_VALIDFILESTATUS_FOR_REMOVE, 1548cdf0e10cSrcweir nError != osl::FileBase::E_None ? nError : TASKHANDLER_NO_ERROR ); 1549cdf0e10cSrcweir return sal_False; 1550cdf0e10cSrcweir } 1551cdf0e10cSrcweir 1552cdf0e10cSrcweir if( aStatus.getFileType() == osl::FileStatus::Regular || 1553cdf0e10cSrcweir aStatus.getFileType() == osl::FileStatus::Link ) 1554cdf0e10cSrcweir IsWhat = -1; // RemoveFile 1555cdf0e10cSrcweir else if( aStatus.getFileType() == osl::FileStatus::Directory || 1556cdf0e10cSrcweir aStatus.getFileType() == osl::FileStatus::Volume ) 1557cdf0e10cSrcweir IsWhat = +1; // RemoveDirectory 1558cdf0e10cSrcweir } 1559cdf0e10cSrcweir 1560cdf0e10cSrcweir 1561cdf0e10cSrcweir if( IsWhat == -1 ) // Removing a file 1562cdf0e10cSrcweir { 1563cdf0e10cSrcweir nError = osl::File::remove( aUnqPath ); 1564cdf0e10cSrcweir if( nError != osl::FileBase::E_None ) 1565cdf0e10cSrcweir { 1566cdf0e10cSrcweir if (MustExist) 1567cdf0e10cSrcweir { 1568cdf0e10cSrcweir installError( CommandId, 1569cdf0e10cSrcweir TASKHANDLING_DELETEFILE_FOR_REMOVE, 1570cdf0e10cSrcweir nError ); 1571cdf0e10cSrcweir } 1572cdf0e10cSrcweir return (!MustExist); 1573cdf0e10cSrcweir } 1574cdf0e10cSrcweir else 1575cdf0e10cSrcweir { 1576cdf0e10cSrcweir notifyContentDeleted( getContentDeletedEventListeners(aUnqPath) ); 1577cdf0e10cSrcweir erasePersistentSet( aUnqPath ); // Removes from XPersistentPropertySet 1578cdf0e10cSrcweir } 1579cdf0e10cSrcweir } 1580cdf0e10cSrcweir else if( IsWhat == +1 ) // Removing a directory 1581cdf0e10cSrcweir { 1582cdf0e10cSrcweir osl::Directory aDirectory( aUnqPath ); 1583cdf0e10cSrcweir 1584cdf0e10cSrcweir nError = aDirectory.open(); 1585cdf0e10cSrcweir if( nError != osl::FileBase::E_None ) 1586cdf0e10cSrcweir { 1587cdf0e10cSrcweir if (MustExist) 1588cdf0e10cSrcweir { 1589cdf0e10cSrcweir installError( CommandId, 1590cdf0e10cSrcweir TASKHANDLING_OPENDIRECTORY_FOR_REMOVE, 1591cdf0e10cSrcweir nError ); 1592cdf0e10cSrcweir } 1593cdf0e10cSrcweir return (!MustExist); 1594cdf0e10cSrcweir } 1595cdf0e10cSrcweir 1596cdf0e10cSrcweir sal_Bool whileSuccess = sal_True; 1597cdf0e10cSrcweir sal_Int32 recurse = 0; 1598cdf0e10cSrcweir rtl::OUString name; 1599cdf0e10cSrcweir 1600cdf0e10cSrcweir nError = aDirectory.getNextItem( aItem ); 1601cdf0e10cSrcweir while( nError == osl::FileBase::E_None ) 1602cdf0e10cSrcweir { 1603cdf0e10cSrcweir nError = aItem.getFileStatus( aStatus ); 1604cdf0e10cSrcweir if( nError != osl::FileBase::E_None || ! aStatus.isValid( nMask ) ) 1605cdf0e10cSrcweir { 1606cdf0e10cSrcweir installError( CommandId, 1607cdf0e10cSrcweir TASKHANDLING_VALIDFILESTATUSWHILE_FOR_REMOVE, 1608cdf0e10cSrcweir nError != osl::FileBase::E_None ? nError : TASKHANDLER_NO_ERROR ); 1609cdf0e10cSrcweir whileSuccess = sal_False; 1610cdf0e10cSrcweir break; 1611cdf0e10cSrcweir } 1612cdf0e10cSrcweir 1613cdf0e10cSrcweir if( aStatus.getFileType() == osl::FileStatus::Regular || 1614cdf0e10cSrcweir aStatus.getFileType() == osl::FileStatus::Link ) 1615cdf0e10cSrcweir recurse = -1; 1616cdf0e10cSrcweir else if( aStatus.getFileType() == osl::FileStatus::Directory || 1617cdf0e10cSrcweir aStatus.getFileType() == osl::FileStatus::Volume ) 1618cdf0e10cSrcweir recurse = +1; 1619cdf0e10cSrcweir 1620cdf0e10cSrcweir name = aStatus.getFileURL(); 1621cdf0e10cSrcweir whileSuccess = remove( 1622cdf0e10cSrcweir CommandId, name, recurse, MustExist ); 1623cdf0e10cSrcweir if( !whileSuccess ) 1624cdf0e10cSrcweir break; 1625cdf0e10cSrcweir 1626cdf0e10cSrcweir nError = aDirectory.getNextItem( aItem ); 1627cdf0e10cSrcweir } 1628cdf0e10cSrcweir 1629cdf0e10cSrcweir aDirectory.close(); 1630cdf0e10cSrcweir 1631cdf0e10cSrcweir if( ! whileSuccess ) 1632cdf0e10cSrcweir return sal_False; // error code is installed 1633cdf0e10cSrcweir 1634cdf0e10cSrcweir if( nError != osl::FileBase::E_NOENT ) 1635cdf0e10cSrcweir { 1636cdf0e10cSrcweir installError( CommandId, 1637cdf0e10cSrcweir TASKHANDLING_DIRECTORYEXHAUSTED_FOR_REMOVE, 1638cdf0e10cSrcweir nError ); 1639cdf0e10cSrcweir return sal_False; 1640cdf0e10cSrcweir } 1641cdf0e10cSrcweir 1642cdf0e10cSrcweir nError = osl::Directory::remove( aUnqPath ); 1643cdf0e10cSrcweir if( nError != osl::FileBase::E_None ) 1644cdf0e10cSrcweir { 1645cdf0e10cSrcweir if (MustExist) 1646cdf0e10cSrcweir { 1647cdf0e10cSrcweir installError( CommandId, 1648cdf0e10cSrcweir TASKHANDLING_DELETEDIRECTORY_FOR_REMOVE, 1649cdf0e10cSrcweir nError ); 1650cdf0e10cSrcweir } 1651cdf0e10cSrcweir return (!MustExist); 1652cdf0e10cSrcweir } 1653cdf0e10cSrcweir else 1654cdf0e10cSrcweir { 1655cdf0e10cSrcweir notifyContentDeleted( getContentDeletedEventListeners(aUnqPath) ); 1656cdf0e10cSrcweir erasePersistentSet( aUnqPath ); 1657cdf0e10cSrcweir } 1658cdf0e10cSrcweir } 1659cdf0e10cSrcweir else // Don't know what to remove 1660cdf0e10cSrcweir { 1661cdf0e10cSrcweir installError( CommandId, 1662cdf0e10cSrcweir TASKHANDLING_FILETYPE_FOR_REMOVE ); 1663cdf0e10cSrcweir return sal_False; 1664cdf0e10cSrcweir } 1665cdf0e10cSrcweir 1666cdf0e10cSrcweir return sal_True; 1667cdf0e10cSrcweir } 1668cdf0e10cSrcweir 1669cdf0e10cSrcweir 1670cdf0e10cSrcweir /********************************************************************************/ 1671cdf0e10cSrcweir /* */ 1672cdf0e10cSrcweir /* mkdir-implementation */ 1673cdf0e10cSrcweir /* */ 1674cdf0e10cSrcweir /********************************************************************************/ 1675cdf0e10cSrcweir // 1676cdf0e10cSrcweir // Creates new directory with given URL, recursively if necessary 1677cdf0e10cSrcweir // Return:: success of operation 1678cdf0e10cSrcweir // 1679cdf0e10cSrcweir 1680cdf0e10cSrcweir sal_Bool SAL_CALL 1681cdf0e10cSrcweir shell::mkdir( sal_Int32 CommandId, 1682cdf0e10cSrcweir const rtl::OUString& rUnqPath, 1683cdf0e10cSrcweir sal_Bool OverWrite ) 1684cdf0e10cSrcweir throw() 1685cdf0e10cSrcweir { 1686cdf0e10cSrcweir rtl::OUString aUnqPath; 1687cdf0e10cSrcweir 1688cdf0e10cSrcweir // remove trailing slash 1689cdf0e10cSrcweir if ( rUnqPath[ rUnqPath.getLength() - 1 ] == sal_Unicode( '/' ) ) 1690cdf0e10cSrcweir aUnqPath = rUnqPath.copy( 0, rUnqPath.getLength() - 1 ); 1691cdf0e10cSrcweir else 1692cdf0e10cSrcweir aUnqPath = rUnqPath; 1693cdf0e10cSrcweir 1694cdf0e10cSrcweir osl::FileBase::RC nError = osl::Directory::create( aUnqPath ); 1695cdf0e10cSrcweir 1696cdf0e10cSrcweir switch ( nError ) 1697cdf0e10cSrcweir { 1698cdf0e10cSrcweir case osl::FileBase::E_EXIST: // Directory cannot be overwritten 1699cdf0e10cSrcweir { 1700cdf0e10cSrcweir if( !OverWrite ) 1701cdf0e10cSrcweir { 1702cdf0e10cSrcweir installError( CommandId, 1703cdf0e10cSrcweir TASKHANDLING_FOLDER_EXISTS_MKDIR ); 1704cdf0e10cSrcweir return sal_False; 1705cdf0e10cSrcweir } 1706cdf0e10cSrcweir else 1707cdf0e10cSrcweir return sal_True; 1708cdf0e10cSrcweir } 1709cdf0e10cSrcweir case osl::FileBase::E_INVAL: 1710cdf0e10cSrcweir { 1711cdf0e10cSrcweir installError(CommandId, 1712cdf0e10cSrcweir TASKHANDLING_INVALID_NAME_MKDIR); 1713cdf0e10cSrcweir return sal_False; 1714cdf0e10cSrcweir } 1715cdf0e10cSrcweir case osl::FileBase::E_None: 1716cdf0e10cSrcweir { 1717cdf0e10cSrcweir rtl::OUString aPrtPath = getParentName( aUnqPath ); 1718cdf0e10cSrcweir notifyInsert( getContentEventListeners( aPrtPath ),aUnqPath ); 1719cdf0e10cSrcweir return sal_True; 1720cdf0e10cSrcweir } 1721cdf0e10cSrcweir default: 1722cdf0e10cSrcweir return ensuredir( 1723cdf0e10cSrcweir CommandId, 1724cdf0e10cSrcweir aUnqPath, 1725cdf0e10cSrcweir TASKHANDLING_CREATEDIRECTORY_MKDIR ); 1726cdf0e10cSrcweir } 1727cdf0e10cSrcweir } 1728cdf0e10cSrcweir 1729cdf0e10cSrcweir 1730cdf0e10cSrcweir /********************************************************************************/ 1731cdf0e10cSrcweir /* */ 1732cdf0e10cSrcweir /* mkfil-implementation */ 1733cdf0e10cSrcweir /* */ 1734cdf0e10cSrcweir /********************************************************************************/ 1735cdf0e10cSrcweir // 1736cdf0e10cSrcweir // Creates new file with given URL. 1737cdf0e10cSrcweir // The content of aInputStream becomes the content of the file 1738cdf0e10cSrcweir // Return:: success of operation 1739cdf0e10cSrcweir // 1740cdf0e10cSrcweir 1741cdf0e10cSrcweir sal_Bool SAL_CALL 1742cdf0e10cSrcweir shell::mkfil( sal_Int32 CommandId, 1743cdf0e10cSrcweir const rtl::OUString& aUnqPath, 1744cdf0e10cSrcweir sal_Bool Overwrite, 1745cdf0e10cSrcweir const uno::Reference< io::XInputStream >& aInputStream ) 1746cdf0e10cSrcweir throw() 1747cdf0e10cSrcweir { 1748cdf0e10cSrcweir // return value unimportant 1749cdf0e10cSrcweir sal_Bool bSuccess = write( CommandId, 1750cdf0e10cSrcweir aUnqPath, 1751cdf0e10cSrcweir Overwrite, 1752cdf0e10cSrcweir aInputStream ); 1753cdf0e10cSrcweir if ( bSuccess ) 1754cdf0e10cSrcweir { 1755cdf0e10cSrcweir rtl::OUString aPrtPath = getParentName( aUnqPath ); 1756cdf0e10cSrcweir notifyInsert( getContentEventListeners( aPrtPath ),aUnqPath ); 1757cdf0e10cSrcweir } 1758cdf0e10cSrcweir return bSuccess; 1759cdf0e10cSrcweir } 1760cdf0e10cSrcweir 1761cdf0e10cSrcweir 1762cdf0e10cSrcweir /********************************************************************************/ 1763cdf0e10cSrcweir /* */ 1764cdf0e10cSrcweir /* write-implementation */ 1765cdf0e10cSrcweir /* */ 1766cdf0e10cSrcweir /********************************************************************************/ 1767cdf0e10cSrcweir // 1768cdf0e10cSrcweir // writes to the file with given URL. 1769cdf0e10cSrcweir // The content of aInputStream becomes the content of the file 1770cdf0e10cSrcweir // Return:: success of operation 1771cdf0e10cSrcweir // 1772cdf0e10cSrcweir 1773cdf0e10cSrcweir sal_Bool SAL_CALL 1774cdf0e10cSrcweir shell::write( sal_Int32 CommandId, 1775cdf0e10cSrcweir const rtl::OUString& aUnqPath, 1776cdf0e10cSrcweir sal_Bool OverWrite, 1777cdf0e10cSrcweir const uno::Reference< io::XInputStream >& aInputStream ) 1778cdf0e10cSrcweir throw() 1779cdf0e10cSrcweir { 1780cdf0e10cSrcweir if( ! aInputStream.is() ) 1781cdf0e10cSrcweir { 1782cdf0e10cSrcweir installError( CommandId, 1783cdf0e10cSrcweir TASKHANDLING_INPUTSTREAM_FOR_WRITE ); 1784cdf0e10cSrcweir return sal_False; 1785cdf0e10cSrcweir } 1786cdf0e10cSrcweir 1787cdf0e10cSrcweir // Create parent path, if necessary. 1788cdf0e10cSrcweir if ( ! ensuredir( CommandId, 1789cdf0e10cSrcweir getParentName( aUnqPath ), 1790cdf0e10cSrcweir TASKHANDLING_ENSUREDIR_FOR_WRITE ) ) 1791cdf0e10cSrcweir return sal_False; 1792cdf0e10cSrcweir 1793cdf0e10cSrcweir osl::FileBase::RC err; 1794cdf0e10cSrcweir osl::File aFile( aUnqPath ); 1795cdf0e10cSrcweir 1796cdf0e10cSrcweir if( OverWrite ) 1797cdf0e10cSrcweir { 1798cdf0e10cSrcweir err = aFile.open( OpenFlag_Write | OpenFlag_Create ); 1799cdf0e10cSrcweir 1800cdf0e10cSrcweir if( err != osl::FileBase::E_None ) 1801cdf0e10cSrcweir { 1802cdf0e10cSrcweir aFile.close(); 1803cdf0e10cSrcweir err = aFile.open( OpenFlag_Write ); 1804cdf0e10cSrcweir 1805cdf0e10cSrcweir if( err != osl::FileBase::E_None ) 1806cdf0e10cSrcweir { 1807cdf0e10cSrcweir installError( CommandId, 1808cdf0e10cSrcweir TASKHANDLING_NO_OPEN_FILE_FOR_OVERWRITE, 1809cdf0e10cSrcweir err ); 1810cdf0e10cSrcweir return sal_False; 1811cdf0e10cSrcweir } 1812cdf0e10cSrcweir 1813cdf0e10cSrcweir // the existing file was just opened and should be overwritten now, 1814cdf0e10cSrcweir // truncate it first 1815cdf0e10cSrcweir 1816cdf0e10cSrcweir err = aFile.setSize( 0 ); 1817cdf0e10cSrcweir if( err != osl::FileBase::E_None ) 1818cdf0e10cSrcweir { 1819cdf0e10cSrcweir installError( CommandId, 1820cdf0e10cSrcweir TASKHANDLING_FILESIZE_FOR_WRITE, 1821cdf0e10cSrcweir err ); 1822cdf0e10cSrcweir return sal_False; 1823cdf0e10cSrcweir } 1824cdf0e10cSrcweir } 1825cdf0e10cSrcweir } 1826cdf0e10cSrcweir else 1827cdf0e10cSrcweir { 1828cdf0e10cSrcweir err = aFile.open( OpenFlag_Read | OpenFlag_NoLock ); 1829cdf0e10cSrcweir if( err == osl::FileBase::E_None ) // The file exists and shall not be overwritten 1830cdf0e10cSrcweir { 1831cdf0e10cSrcweir installError( CommandId, 1832cdf0e10cSrcweir TASKHANDLING_NOREPLACE_FOR_WRITE, // Now an exception 1833cdf0e10cSrcweir err ); 1834cdf0e10cSrcweir 1835cdf0e10cSrcweir aFile.close(); 1836cdf0e10cSrcweir return sal_False; 1837cdf0e10cSrcweir } 1838cdf0e10cSrcweir 1839cdf0e10cSrcweir // as a temporary solution the creation does not lock the file at all 1840cdf0e10cSrcweir // in future it should be possible to create the file without lock explicitly 1841cdf0e10cSrcweir err = aFile.open( OpenFlag_Write | OpenFlag_Create | OpenFlag_NoLock ); 1842cdf0e10cSrcweir 1843cdf0e10cSrcweir if( err != osl::FileBase::E_None ) 1844cdf0e10cSrcweir { 1845cdf0e10cSrcweir aFile.close(); 1846cdf0e10cSrcweir installError( CommandId, 1847cdf0e10cSrcweir TASKHANDLING_NO_OPEN_FILE_FOR_WRITE, 1848cdf0e10cSrcweir err ); 1849cdf0e10cSrcweir return sal_False; 1850cdf0e10cSrcweir } 1851cdf0e10cSrcweir } 1852cdf0e10cSrcweir 1853cdf0e10cSrcweir sal_Bool bSuccess = sal_True; 1854cdf0e10cSrcweir 1855cdf0e10cSrcweir sal_uInt64 nWrittenBytes; 1856cdf0e10cSrcweir sal_Int32 nReadBytes = 0, nRequestedBytes = 32768 /*32k*/; 1857cdf0e10cSrcweir uno::Sequence< sal_Int8 > seq( nRequestedBytes ); 1858cdf0e10cSrcweir 1859cdf0e10cSrcweir do 1860cdf0e10cSrcweir { 1861cdf0e10cSrcweir try 1862cdf0e10cSrcweir { 1863cdf0e10cSrcweir nReadBytes = aInputStream->readBytes( seq, 1864cdf0e10cSrcweir nRequestedBytes ); 1865cdf0e10cSrcweir } 1866cdf0e10cSrcweir catch( const io::NotConnectedException& ) 1867cdf0e10cSrcweir { 1868cdf0e10cSrcweir installError( CommandId, 1869cdf0e10cSrcweir TASKHANDLING_NOTCONNECTED_FOR_WRITE ); 1870cdf0e10cSrcweir bSuccess = sal_False; 1871cdf0e10cSrcweir break; 1872cdf0e10cSrcweir } 1873cdf0e10cSrcweir catch( const io::BufferSizeExceededException& ) 1874cdf0e10cSrcweir { 1875cdf0e10cSrcweir installError( CommandId, 1876cdf0e10cSrcweir TASKHANDLING_BUFFERSIZEEXCEEDED_FOR_WRITE ); 1877cdf0e10cSrcweir bSuccess = sal_False; 1878cdf0e10cSrcweir break; 1879cdf0e10cSrcweir } 1880cdf0e10cSrcweir catch( const io::IOException& ) 1881cdf0e10cSrcweir { 1882cdf0e10cSrcweir installError( CommandId, 1883cdf0e10cSrcweir TASKHANDLING_IOEXCEPTION_FOR_WRITE ); 1884cdf0e10cSrcweir bSuccess = sal_False; 1885cdf0e10cSrcweir break; 1886cdf0e10cSrcweir } 1887cdf0e10cSrcweir 1888cdf0e10cSrcweir if( nReadBytes ) 1889cdf0e10cSrcweir { 1890cdf0e10cSrcweir const sal_Int8* p = seq.getConstArray(); 1891cdf0e10cSrcweir 1892cdf0e10cSrcweir err = aFile.write( ((void*)(p)), 1893cdf0e10cSrcweir sal_uInt64( nReadBytes ), 1894cdf0e10cSrcweir nWrittenBytes ); 1895cdf0e10cSrcweir 1896cdf0e10cSrcweir if( err != osl::FileBase::E_None ) 1897cdf0e10cSrcweir { 1898cdf0e10cSrcweir installError( CommandId, 1899cdf0e10cSrcweir TASKHANDLING_FILEIOERROR_FOR_WRITE, 1900cdf0e10cSrcweir err ); 1901cdf0e10cSrcweir bSuccess = sal_False; 1902cdf0e10cSrcweir break; 1903cdf0e10cSrcweir } 1904cdf0e10cSrcweir else if( nWrittenBytes != sal_uInt64( nReadBytes ) ) 1905cdf0e10cSrcweir { 1906cdf0e10cSrcweir installError( CommandId, 1907cdf0e10cSrcweir TASKHANDLING_FILEIOERROR_FOR_NO_SPACE ); 1908cdf0e10cSrcweir bSuccess = sal_False; 1909cdf0e10cSrcweir break; 1910cdf0e10cSrcweir } 1911cdf0e10cSrcweir } 1912cdf0e10cSrcweir } while( nReadBytes == nRequestedBytes ); 1913cdf0e10cSrcweir 1914cdf0e10cSrcweir err = aFile.close(); 1915cdf0e10cSrcweir if( err != osl::FileBase::E_None ) 1916cdf0e10cSrcweir { 1917cdf0e10cSrcweir installError( CommandId, 1918cdf0e10cSrcweir TASKHANDLING_FILEIOERROR_FOR_WRITE, 1919cdf0e10cSrcweir err ); 1920cdf0e10cSrcweir bSuccess = sal_False; 1921cdf0e10cSrcweir } 1922cdf0e10cSrcweir 1923cdf0e10cSrcweir return bSuccess; 1924cdf0e10cSrcweir } 1925cdf0e10cSrcweir 1926cdf0e10cSrcweir 1927cdf0e10cSrcweir 1928cdf0e10cSrcweir /*********************************************************************************/ 1929cdf0e10cSrcweir /* */ 1930cdf0e10cSrcweir /* insertDefaultProperties-Implementation */ 1931cdf0e10cSrcweir /* */ 1932cdf0e10cSrcweir /*********************************************************************************/ 1933cdf0e10cSrcweir 1934cdf0e10cSrcweir 1935cdf0e10cSrcweir void SAL_CALL shell::insertDefaultProperties( const rtl::OUString& aUnqPath ) 1936cdf0e10cSrcweir { 1937cdf0e10cSrcweir osl::MutexGuard aGuard( m_aMutex ); 1938cdf0e10cSrcweir 1939cdf0e10cSrcweir ContentMap::iterator it = 1940cdf0e10cSrcweir m_aContent.insert( ContentMap::value_type( aUnqPath,UnqPathData() ) ).first; 1941cdf0e10cSrcweir 1942cdf0e10cSrcweir load( it,false ); 1943cdf0e10cSrcweir 1944cdf0e10cSrcweir MyProperty ContentTProperty( ContentType ); 1945cdf0e10cSrcweir 1946cdf0e10cSrcweir PropertySet& properties = *(it->second.properties); 1947cdf0e10cSrcweir sal_Bool ContentNotDefau = properties.find( ContentTProperty ) != properties.end(); 1948cdf0e10cSrcweir 1949cdf0e10cSrcweir shell::PropertySet::iterator it1 = m_aDefaultProperties.begin(); 1950cdf0e10cSrcweir while( it1 != m_aDefaultProperties.end() ) 1951cdf0e10cSrcweir { 1952cdf0e10cSrcweir if( ContentNotDefau && it1->getPropertyName() == ContentType ) 1953cdf0e10cSrcweir { 1954cdf0e10cSrcweir // No insertion 1955cdf0e10cSrcweir } 1956cdf0e10cSrcweir else 1957cdf0e10cSrcweir properties.insert( *it1 ); 1958cdf0e10cSrcweir ++it1; 1959cdf0e10cSrcweir } 1960cdf0e10cSrcweir } 1961cdf0e10cSrcweir 1962cdf0e10cSrcweir 1963cdf0e10cSrcweir 1964cdf0e10cSrcweir 1965cdf0e10cSrcweir /******************************************************************************/ 1966cdf0e10cSrcweir /* */ 1967cdf0e10cSrcweir /* mapping of file urls */ 1968cdf0e10cSrcweir /* to uncpath and vice versa */ 1969cdf0e10cSrcweir /* */ 1970cdf0e10cSrcweir /******************************************************************************/ 1971cdf0e10cSrcweir 1972cdf0e10cSrcweir 1973cdf0e10cSrcweir sal_Bool SAL_CALL shell::getUnqFromUrl( const rtl::OUString& Url,rtl::OUString& Unq ) 1974cdf0e10cSrcweir { 1975cdf0e10cSrcweir if( 0 == Url.compareToAscii( "file:///" ) || 1976cdf0e10cSrcweir 0 == Url.compareToAscii( "file://localhost/" ) || 1977cdf0e10cSrcweir 0 == Url.compareToAscii( "file://127.0.0.1/" ) ) 1978cdf0e10cSrcweir { 1979cdf0e10cSrcweir Unq = rtl::OUString::createFromAscii( "file:///" ); 1980cdf0e10cSrcweir return false; 1981cdf0e10cSrcweir } 1982cdf0e10cSrcweir 1983cdf0e10cSrcweir sal_Bool err = osl::FileBase::E_None != osl::FileBase::getSystemPathFromFileURL( Url,Unq ); 1984cdf0e10cSrcweir 1985cdf0e10cSrcweir Unq = Url; 1986cdf0e10cSrcweir 1987cdf0e10cSrcweir sal_Int32 l = Unq.getLength()-1; 1988cdf0e10cSrcweir if( ! err && Unq.getStr()[ l ] == '/' && 1989cdf0e10cSrcweir Unq.indexOf( '/', RTL_CONSTASCII_LENGTH("//") ) < l ) 1990cdf0e10cSrcweir Unq = Unq.copy(0, Unq.getLength() - 1); 1991cdf0e10cSrcweir 1992cdf0e10cSrcweir return err; 1993cdf0e10cSrcweir } 1994cdf0e10cSrcweir 1995cdf0e10cSrcweir 1996cdf0e10cSrcweir 1997cdf0e10cSrcweir sal_Bool SAL_CALL shell::getUrlFromUnq( const rtl::OUString& Unq,rtl::OUString& Url ) 1998cdf0e10cSrcweir { 1999cdf0e10cSrcweir sal_Bool err = osl::FileBase::E_None != osl::FileBase::getSystemPathFromFileURL( Unq,Url ); 2000cdf0e10cSrcweir 2001cdf0e10cSrcweir Url = Unq; 2002cdf0e10cSrcweir 2003cdf0e10cSrcweir return err; 2004cdf0e10cSrcweir } 2005cdf0e10cSrcweir 2006cdf0e10cSrcweir 2007cdf0e10cSrcweir 2008cdf0e10cSrcweir // Helper function for public copy 2009cdf0e10cSrcweir 2010cdf0e10cSrcweir osl::FileBase::RC SAL_CALL 2011cdf0e10cSrcweir shell::copy_recursive( const rtl::OUString& srcUnqPath, 2012cdf0e10cSrcweir const rtl::OUString& dstUnqPath, 2013cdf0e10cSrcweir sal_Int32 TypeToCopy, 2014cdf0e10cSrcweir sal_Bool testExistBeforeCopy ) 2015cdf0e10cSrcweir throw() 2016cdf0e10cSrcweir { 2017cdf0e10cSrcweir osl::FileBase::RC err = osl::FileBase::E_None; 2018cdf0e10cSrcweir 2019cdf0e10cSrcweir if( TypeToCopy == -1 ) // Document 2020cdf0e10cSrcweir { 2021cdf0e10cSrcweir err = osl_File_copy( srcUnqPath,dstUnqPath,testExistBeforeCopy ); 2022cdf0e10cSrcweir } 2023cdf0e10cSrcweir else if( TypeToCopy == +1 ) // Folder 2024cdf0e10cSrcweir { 2025cdf0e10cSrcweir osl::Directory aDir( srcUnqPath ); 2026cdf0e10cSrcweir aDir.open(); 2027cdf0e10cSrcweir 2028cdf0e10cSrcweir err = osl::Directory::create( dstUnqPath ); 2029cdf0e10cSrcweir osl::FileBase::RC next = err; 2030cdf0e10cSrcweir if( err == osl::FileBase::E_None ) 2031cdf0e10cSrcweir { 2032cdf0e10cSrcweir sal_Int32 n_Mask = FileStatusMask_FileURL | FileStatusMask_FileName | FileStatusMask_Type; 2033cdf0e10cSrcweir 2034cdf0e10cSrcweir osl::DirectoryItem aDirItem; 2035cdf0e10cSrcweir 2036cdf0e10cSrcweir while( err == osl::FileBase::E_None && ( next = aDir.getNextItem( aDirItem ) ) == osl::FileBase::E_None ) 2037cdf0e10cSrcweir { 2038cdf0e10cSrcweir sal_Bool IsDoc = false; 2039cdf0e10cSrcweir osl::FileStatus aFileStatus( n_Mask ); 2040cdf0e10cSrcweir aDirItem.getFileStatus( aFileStatus ); 2041cdf0e10cSrcweir if( aFileStatus.isValid( FileStatusMask_Type ) ) 2042cdf0e10cSrcweir IsDoc = aFileStatus.getFileType() == osl::FileStatus::Regular; 2043cdf0e10cSrcweir 2044cdf0e10cSrcweir // Getting the information for the next recursive copy 2045cdf0e10cSrcweir sal_Int32 newTypeToCopy = IsDoc ? -1 : +1; 2046cdf0e10cSrcweir 2047cdf0e10cSrcweir rtl::OUString newSrcUnqPath; 2048cdf0e10cSrcweir if( aFileStatus.isValid( FileStatusMask_FileURL ) ) 2049cdf0e10cSrcweir newSrcUnqPath = aFileStatus.getFileURL(); 2050cdf0e10cSrcweir 2051cdf0e10cSrcweir rtl::OUString newDstUnqPath = dstUnqPath; 2052cdf0e10cSrcweir rtl::OUString tit; 2053cdf0e10cSrcweir if( aFileStatus.isValid( FileStatusMask_FileName ) ) 2054cdf0e10cSrcweir tit = rtl::Uri::encode( aFileStatus.getFileName(), 2055cdf0e10cSrcweir rtl_UriCharClassPchar, 2056cdf0e10cSrcweir rtl_UriEncodeIgnoreEscapes, 2057cdf0e10cSrcweir RTL_TEXTENCODING_UTF8 ); 2058cdf0e10cSrcweir 2059cdf0e10cSrcweir if( newDstUnqPath.lastIndexOf( sal_Unicode('/') ) != newDstUnqPath.getLength()-1 ) 2060cdf0e10cSrcweir newDstUnqPath += rtl::OUString::createFromAscii( "/" ); 2061cdf0e10cSrcweir 2062cdf0e10cSrcweir newDstUnqPath += tit; 2063cdf0e10cSrcweir 2064cdf0e10cSrcweir if ( newSrcUnqPath != dstUnqPath ) 2065cdf0e10cSrcweir err = copy_recursive( newSrcUnqPath,newDstUnqPath,newTypeToCopy,false ); 2066cdf0e10cSrcweir } 2067cdf0e10cSrcweir 2068cdf0e10cSrcweir if( err == osl::FileBase::E_None && next != osl::FileBase::E_NOENT ) 2069cdf0e10cSrcweir err = next; 2070cdf0e10cSrcweir } 2071cdf0e10cSrcweir aDir.close(); 2072cdf0e10cSrcweir } 2073cdf0e10cSrcweir 2074cdf0e10cSrcweir return err; 2075cdf0e10cSrcweir } 2076cdf0e10cSrcweir 2077cdf0e10cSrcweir 2078cdf0e10cSrcweir 2079cdf0e10cSrcweir // Helper function for mkfil,mkdir and write 2080cdf0e10cSrcweir // Creates whole path 2081cdf0e10cSrcweir // returns success of the operation 2082cdf0e10cSrcweir 2083cdf0e10cSrcweir 2084cdf0e10cSrcweir sal_Bool SAL_CALL shell::ensuredir( sal_Int32 CommandId, 2085cdf0e10cSrcweir const rtl::OUString& rUnqPath, 2086cdf0e10cSrcweir sal_Int32 errorCode ) 2087cdf0e10cSrcweir throw() 2088cdf0e10cSrcweir { 2089cdf0e10cSrcweir rtl::OUString aPath; 2090cdf0e10cSrcweir 2091cdf0e10cSrcweir if ( rUnqPath.getLength() < 1 ) 2092cdf0e10cSrcweir return sal_False; 2093cdf0e10cSrcweir 2094cdf0e10cSrcweir if ( rUnqPath[ rUnqPath.getLength() - 1 ] == sal_Unicode( '/' ) ) 2095cdf0e10cSrcweir aPath = rUnqPath.copy( 0, rUnqPath.getLength() - 1 ); 2096cdf0e10cSrcweir else 2097cdf0e10cSrcweir aPath = rUnqPath; 2098cdf0e10cSrcweir 2099cdf0e10cSrcweir 2100cdf0e10cSrcweir // HACK: create directory on a mount point with nobrowse option 2101cdf0e10cSrcweir // returns ENOSYS in any case !! 2102cdf0e10cSrcweir osl::Directory aDirectory( aPath ); 2103cdf0e10cSrcweir osl::FileBase::RC nError = aDirectory.open(); 2104cdf0e10cSrcweir aDirectory.close(); 2105cdf0e10cSrcweir 2106cdf0e10cSrcweir if( nError == osl::File::E_None ) 2107cdf0e10cSrcweir return sal_True; 2108cdf0e10cSrcweir 2109cdf0e10cSrcweir nError = osl::Directory::create( aPath ); 2110cdf0e10cSrcweir 2111cdf0e10cSrcweir if( nError == osl::File::E_None ) 2112cdf0e10cSrcweir notifyInsert( getContentEventListeners( getParentName( aPath ) ),aPath ); 2113cdf0e10cSrcweir 2114cdf0e10cSrcweir sal_Bool bSuccess = ( nError == osl::File::E_None || nError == osl::FileBase::E_EXIST ); 2115cdf0e10cSrcweir 2116cdf0e10cSrcweir if( ! bSuccess ) 2117cdf0e10cSrcweir { 2118cdf0e10cSrcweir rtl::OUString aParentDir = getParentName( aPath ); 2119cdf0e10cSrcweir 2120cdf0e10cSrcweir if ( aParentDir != aPath ) 2121cdf0e10cSrcweir { // Create first the parent directory 2122cdf0e10cSrcweir bSuccess = ensuredir( CommandId, 2123cdf0e10cSrcweir getParentName( aPath ), 2124cdf0e10cSrcweir errorCode ); 2125cdf0e10cSrcweir 2126cdf0e10cSrcweir // After parent directory structure exists try it one's more 2127cdf0e10cSrcweir 2128cdf0e10cSrcweir if ( bSuccess ) 2129cdf0e10cSrcweir { // Parent directory exists, retry creation of directory 2130cdf0e10cSrcweir nError = osl::Directory::create( aPath ); 2131cdf0e10cSrcweir 2132cdf0e10cSrcweir if( nError == osl::File::E_None ) 2133cdf0e10cSrcweir notifyInsert( getContentEventListeners( getParentName( aPath ) ),aPath ); 2134cdf0e10cSrcweir 2135cdf0e10cSrcweir bSuccess =( nError == osl::File::E_None || nError == osl::FileBase::E_EXIST ); 2136cdf0e10cSrcweir } 2137cdf0e10cSrcweir } 2138cdf0e10cSrcweir } 2139cdf0e10cSrcweir 2140cdf0e10cSrcweir if( ! bSuccess ) 2141cdf0e10cSrcweir installError( CommandId, 2142cdf0e10cSrcweir errorCode, 2143cdf0e10cSrcweir nError ); 2144cdf0e10cSrcweir 2145cdf0e10cSrcweir return bSuccess; 2146cdf0e10cSrcweir } 2147cdf0e10cSrcweir 2148cdf0e10cSrcweir 2149cdf0e10cSrcweir 2150cdf0e10cSrcweir 2151cdf0e10cSrcweir // 2152cdf0e10cSrcweir // Given a sequence of properties seq, this method determines the mask 2153cdf0e10cSrcweir // used to instantiate a osl::FileStatus, so that a call to 2154cdf0e10cSrcweir // osl::DirectoryItem::getFileStatus fills the required fields. 2155cdf0e10cSrcweir // 2156cdf0e10cSrcweir 2157cdf0e10cSrcweir 2158cdf0e10cSrcweir void SAL_CALL 2159cdf0e10cSrcweir shell::getMaskFromProperties( 2160cdf0e10cSrcweir sal_Int32& n_Mask, 2161cdf0e10cSrcweir const uno::Sequence< beans::Property >& seq ) 2162cdf0e10cSrcweir { 2163cdf0e10cSrcweir n_Mask = 0; 2164cdf0e10cSrcweir for(sal_Int32 j = 0; j < seq.getLength(); ++j) { 2165cdf0e10cSrcweir if(seq[j].Name == Title) 2166cdf0e10cSrcweir n_Mask |= FileStatusMask_FileName; 2167cdf0e10cSrcweir else if(seq[j].Name == CasePreservingURL) 2168cdf0e10cSrcweir n_Mask |= FileStatusMask_FileURL; 2169cdf0e10cSrcweir else if(seq[j].Name == IsDocument || 2170cdf0e10cSrcweir seq[j].Name == IsFolder || 2171cdf0e10cSrcweir seq[j].Name == IsVolume || 2172cdf0e10cSrcweir seq[j].Name == IsRemoveable || 2173cdf0e10cSrcweir seq[j].Name == IsRemote || 2174cdf0e10cSrcweir seq[j].Name == IsCompactDisc || 2175cdf0e10cSrcweir seq[j].Name == IsFloppy || 2176cdf0e10cSrcweir seq[j].Name == ContentType) 2177cdf0e10cSrcweir n_Mask |= (FileStatusMask_Type | FileStatusMask_LinkTargetURL); 2178cdf0e10cSrcweir else if(seq[j].Name == Size) 2179cdf0e10cSrcweir n_Mask |= (FileStatusMask_FileSize | 2180cdf0e10cSrcweir FileStatusMask_Type | 2181cdf0e10cSrcweir FileStatusMask_LinkTargetURL); 2182cdf0e10cSrcweir else if(seq[j].Name == IsHidden || 2183cdf0e10cSrcweir seq[j].Name == IsReadOnly) 2184cdf0e10cSrcweir n_Mask |= FileStatusMask_Attributes; 2185cdf0e10cSrcweir else if(seq[j].Name == DateModified) 2186cdf0e10cSrcweir n_Mask |= FileStatusMask_ModifyTime; 2187cdf0e10cSrcweir // n_Mask = FileStatusMask_FileURL; 2188cdf0e10cSrcweir // n_Mask |= FileStatusMask_LinkTargetURL; 2189cdf0e10cSrcweir // n_Mask |= FileStatusMask_FileName; 2190cdf0e10cSrcweir // n_Mask |= FileStatusMask_Type; 2191cdf0e10cSrcweir // n_Mask |= FileStatusMask_ModifyTime; 2192cdf0e10cSrcweir // n_Mask |= FileStatusMask_FileSize; 2193cdf0e10cSrcweir // n_Mask |= FileStatusMask_Attributes; 2194cdf0e10cSrcweir } 2195cdf0e10cSrcweir } 2196cdf0e10cSrcweir 2197cdf0e10cSrcweir 2198cdf0e10cSrcweir 2199cdf0e10cSrcweir /*********************************************************************************/ 2200cdf0e10cSrcweir /* */ 2201cdf0e10cSrcweir /* load-Implementation */ 2202cdf0e10cSrcweir /* */ 2203cdf0e10cSrcweir /*********************************************************************************/ 2204cdf0e10cSrcweir // 2205cdf0e10cSrcweir // Load the properties from configuration, if create == true create them. 2206cdf0e10cSrcweir // The Properties are stored under the url belonging to it->first. 2207cdf0e10cSrcweir // 2208cdf0e10cSrcweir 2209cdf0e10cSrcweir void SAL_CALL 2210cdf0e10cSrcweir shell::load( const ContentMap::iterator& it, sal_Bool create ) 2211cdf0e10cSrcweir { 2212cdf0e10cSrcweir if( ! it->second.properties ) 2213cdf0e10cSrcweir it->second.properties = new PropertySet; 2214cdf0e10cSrcweir 2215cdf0e10cSrcweir if( ( ! it->second.xS.is() || 2216cdf0e10cSrcweir ! it->second.xC.is() || 2217cdf0e10cSrcweir ! it->second.xA.is() ) 2218cdf0e10cSrcweir && m_xFileRegistry.is() ) 2219cdf0e10cSrcweir { 2220cdf0e10cSrcweir 2221cdf0e10cSrcweir uno::Reference< ucb::XPersistentPropertySet > xS = m_xFileRegistry->openPropertySet( it->first,create ); 2222cdf0e10cSrcweir if( xS.is() ) 2223cdf0e10cSrcweir { 2224cdf0e10cSrcweir uno::Reference< beans::XPropertyContainer > xC( xS,uno::UNO_QUERY ); 2225cdf0e10cSrcweir uno::Reference< beans::XPropertyAccess > xA( xS,uno::UNO_QUERY ); 2226cdf0e10cSrcweir 2227cdf0e10cSrcweir it->second.xS = xS; 2228cdf0e10cSrcweir it->second.xC = xC; 2229cdf0e10cSrcweir it->second.xA = xA; 2230cdf0e10cSrcweir 2231cdf0e10cSrcweir // Now put in all values in the storage in the local hash; 2232cdf0e10cSrcweir 2233cdf0e10cSrcweir PropertySet& properties = *(it->second.properties); 2234cdf0e10cSrcweir uno::Sequence< beans::Property > seq = xS->getPropertySetInfo()->getProperties(); 2235cdf0e10cSrcweir 2236cdf0e10cSrcweir for( sal_Int32 i = 0; i < seq.getLength(); ++i ) 2237cdf0e10cSrcweir { 2238cdf0e10cSrcweir MyProperty readProp( false, 2239cdf0e10cSrcweir seq[i].Name, 2240cdf0e10cSrcweir seq[i].Handle, 2241cdf0e10cSrcweir seq[i].Type, 2242cdf0e10cSrcweir xS->getPropertyValue( seq[i].Name ), 2243cdf0e10cSrcweir beans::PropertyState_DIRECT_VALUE, 2244cdf0e10cSrcweir seq[i].Attributes ); 2245cdf0e10cSrcweir if( properties.find( readProp ) == properties.end() ) 2246cdf0e10cSrcweir properties.insert( readProp ); 2247cdf0e10cSrcweir } 2248cdf0e10cSrcweir } 2249cdf0e10cSrcweir else if( create ) 2250cdf0e10cSrcweir { 2251cdf0e10cSrcweir // Catastrophic error 2252cdf0e10cSrcweir } 2253cdf0e10cSrcweir } 2254cdf0e10cSrcweir } 2255cdf0e10cSrcweir 2256cdf0e10cSrcweir 2257cdf0e10cSrcweir 2258cdf0e10cSrcweir 2259cdf0e10cSrcweir /*********************************************************************************/ 2260cdf0e10cSrcweir /* */ 2261cdf0e10cSrcweir /* commit-Implementation */ 2262cdf0e10cSrcweir /* */ 2263cdf0e10cSrcweir /*********************************************************************************/ 2264cdf0e10cSrcweir // Commit inserts the determined properties in the filestatus object into 2265cdf0e10cSrcweir // the internal map, so that is possible to determine on a subsequent 2266cdf0e10cSrcweir // setting of file properties which properties have changed without filestat 2267cdf0e10cSrcweir 2268cdf0e10cSrcweir 2269cdf0e10cSrcweir void SAL_CALL 2270cdf0e10cSrcweir shell::commit( const shell::ContentMap::iterator& it, 2271cdf0e10cSrcweir const osl::FileStatus& aFileStatus ) 2272cdf0e10cSrcweir { 2273cdf0e10cSrcweir uno::Any aAny; 2274cdf0e10cSrcweir uno::Any emptyAny; 2275cdf0e10cSrcweir shell::PropertySet::iterator it1; 2276cdf0e10cSrcweir 2277cdf0e10cSrcweir if( it->second.properties == 0 ) 2278cdf0e10cSrcweir { 2279cdf0e10cSrcweir rtl::OUString aPath = it->first; 2280cdf0e10cSrcweir insertDefaultProperties( aPath ); 2281cdf0e10cSrcweir } 2282cdf0e10cSrcweir 2283cdf0e10cSrcweir PropertySet& properties = *( it->second.properties ); 2284cdf0e10cSrcweir 2285cdf0e10cSrcweir it1 = properties.find( MyProperty( Title ) ); 2286cdf0e10cSrcweir if( it1 != properties.end() ) 2287cdf0e10cSrcweir { 2288cdf0e10cSrcweir if( aFileStatus.isValid( FileStatusMask_FileName ) ) 2289cdf0e10cSrcweir { 2290cdf0e10cSrcweir aAny <<= aFileStatus.getFileName(); 2291cdf0e10cSrcweir it1->setValue( aAny ); 2292cdf0e10cSrcweir } 2293cdf0e10cSrcweir } 2294cdf0e10cSrcweir 2295cdf0e10cSrcweir it1 = properties.find( MyProperty( CasePreservingURL ) ); 2296cdf0e10cSrcweir if( it1 != properties.end() ) 2297cdf0e10cSrcweir { 2298cdf0e10cSrcweir if( aFileStatus.isValid( FileStatusMask_FileURL ) ) 2299cdf0e10cSrcweir { 2300cdf0e10cSrcweir aAny <<= aFileStatus.getFileURL(); 2301cdf0e10cSrcweir it1->setValue( aAny ); 2302cdf0e10cSrcweir } 2303cdf0e10cSrcweir } 2304cdf0e10cSrcweir 2305cdf0e10cSrcweir 2306cdf0e10cSrcweir sal_Bool isDirectory,isFile,isVolume,isRemoveable,isRemote,isFloppy,isCompactDisc; 2307cdf0e10cSrcweir 2308cdf0e10cSrcweir sal_Int64 dirSize = 0; 2309cdf0e10cSrcweir 2310cdf0e10cSrcweir if( aFileStatus.isValid( FileStatusMask_FileSize ) ) 2311cdf0e10cSrcweir dirSize = aFileStatus.getFileSize(); 2312cdf0e10cSrcweir 2313cdf0e10cSrcweir if( aFileStatus.isValid( FileStatusMask_Type ) ) 2314cdf0e10cSrcweir { 2315cdf0e10cSrcweir if( osl::FileStatus::Link == aFileStatus.getFileType() && 2316cdf0e10cSrcweir aFileStatus.isValid( FileStatusMask_LinkTargetURL ) ) 2317cdf0e10cSrcweir { 2318cdf0e10cSrcweir osl::DirectoryItem aDirItem; 2319cdf0e10cSrcweir osl::FileStatus aFileStatus2( FileStatusMask_Type ); 2320cdf0e10cSrcweir if( osl::FileBase::E_None == osl::DirectoryItem::get( aFileStatus.getLinkTargetURL(),aDirItem ) && 2321cdf0e10cSrcweir osl::FileBase::E_None == aDirItem.getFileStatus( aFileStatus2 ) && 2322cdf0e10cSrcweir aFileStatus2.isValid( FileStatusMask_Type ) ) 2323cdf0e10cSrcweir { 2324cdf0e10cSrcweir isVolume = osl::FileStatus::Volume == aFileStatus2.getFileType(); 2325cdf0e10cSrcweir isDirectory = 2326cdf0e10cSrcweir osl::FileStatus::Volume == aFileStatus2.getFileType() || 2327cdf0e10cSrcweir osl::FileStatus::Directory == aFileStatus2.getFileType(); 2328cdf0e10cSrcweir isFile = 2329cdf0e10cSrcweir osl::FileStatus::Regular == aFileStatus2.getFileType(); 2330cdf0e10cSrcweir 2331cdf0e10cSrcweir if( aFileStatus2.isValid( FileStatusMask_FileSize ) ) 2332cdf0e10cSrcweir dirSize = aFileStatus2.getFileSize(); 2333cdf0e10cSrcweir } 2334cdf0e10cSrcweir else 2335cdf0e10cSrcweir { 233686e1cf34SPedro Giffuni // extremely ugly, but otherwise default construction 2337cdf0e10cSrcweir // of aDirItem and aFileStatus2 2338cdf0e10cSrcweir // before the preciding if 2339cdf0e10cSrcweir isVolume = osl::FileStatus::Volume == aFileStatus.getFileType(); 2340cdf0e10cSrcweir isDirectory = 2341cdf0e10cSrcweir osl::FileStatus::Volume == aFileStatus.getFileType() || 2342cdf0e10cSrcweir osl::FileStatus::Directory == aFileStatus.getFileType(); 2343cdf0e10cSrcweir isFile = 2344cdf0e10cSrcweir osl::FileStatus::Regular == aFileStatus.getFileType(); 2345cdf0e10cSrcweir } 2346cdf0e10cSrcweir } 2347cdf0e10cSrcweir else 2348cdf0e10cSrcweir { 2349cdf0e10cSrcweir isVolume = osl::FileStatus::Volume == aFileStatus.getFileType(); 2350cdf0e10cSrcweir isDirectory = 2351cdf0e10cSrcweir osl::FileStatus::Volume == aFileStatus.getFileType() || 2352cdf0e10cSrcweir osl::FileStatus::Directory == aFileStatus.getFileType(); 2353cdf0e10cSrcweir isFile = 2354cdf0e10cSrcweir osl::FileStatus::Regular == aFileStatus.getFileType(); 2355cdf0e10cSrcweir } 2356cdf0e10cSrcweir 2357cdf0e10cSrcweir it1 = properties.find( MyProperty( IsVolume ) ); 2358cdf0e10cSrcweir if( it1 != properties.end() ) 2359cdf0e10cSrcweir it1->setValue( uno::makeAny( isVolume ) ); 2360cdf0e10cSrcweir 2361cdf0e10cSrcweir it1 = properties.find( MyProperty( IsFolder ) ); 2362cdf0e10cSrcweir if( it1 != properties.end() ) 2363cdf0e10cSrcweir it1->setValue( uno::makeAny( isDirectory ) ); 2364cdf0e10cSrcweir 2365cdf0e10cSrcweir it1 = properties.find( MyProperty( IsDocument ) ); 2366cdf0e10cSrcweir if( it1 != properties.end() ) 2367cdf0e10cSrcweir it1->setValue( uno::makeAny( isFile ) ); 2368cdf0e10cSrcweir 2369cdf0e10cSrcweir osl::VolumeInfo aVolumeInfo( VolumeInfoMask_Attributes ); 2370cdf0e10cSrcweir if( isVolume && 2371cdf0e10cSrcweir osl::FileBase::E_None == osl::Directory::getVolumeInfo( it->first,aVolumeInfo ) && 2372cdf0e10cSrcweir aVolumeInfo.isValid( VolumeInfoMask_Attributes ) ) 2373cdf0e10cSrcweir { 2374cdf0e10cSrcweir // Retrieve the flags; 2375cdf0e10cSrcweir isRemote = aVolumeInfo.getRemoteFlag(); 2376cdf0e10cSrcweir isRemoveable = aVolumeInfo.getRemoveableFlag(); 2377cdf0e10cSrcweir isCompactDisc = aVolumeInfo.getCompactDiscFlag(); 2378cdf0e10cSrcweir isFloppy = aVolumeInfo.getFloppyDiskFlag(); 2379cdf0e10cSrcweir 2380cdf0e10cSrcweir it1 = properties.find( MyProperty( IsRemote ) ); 2381cdf0e10cSrcweir if( it1 != properties.end() ) 2382cdf0e10cSrcweir it1->setValue( uno::makeAny( isRemote ) ); 2383cdf0e10cSrcweir 2384cdf0e10cSrcweir it1 = properties.find( MyProperty( IsRemoveable ) ); 2385cdf0e10cSrcweir if( it1 != properties.end() ) 2386cdf0e10cSrcweir it1->setValue( uno::makeAny( isRemoveable ) ); 2387cdf0e10cSrcweir 2388cdf0e10cSrcweir it1 = properties.find( MyProperty( IsCompactDisc ) ); 2389cdf0e10cSrcweir if( it1 != properties.end() ) 2390cdf0e10cSrcweir it1->setValue( uno::makeAny( isCompactDisc ) ); 2391cdf0e10cSrcweir 2392cdf0e10cSrcweir it1 = properties.find( MyProperty( IsFloppy ) ); 2393cdf0e10cSrcweir if( it1 != properties.end() ) 2394cdf0e10cSrcweir it1->setValue( uno::makeAny( isFloppy ) ); 2395cdf0e10cSrcweir } 2396cdf0e10cSrcweir else 2397cdf0e10cSrcweir { 2398cdf0e10cSrcweir sal_Bool dummy = false; 2399cdf0e10cSrcweir aAny <<= dummy; 2400cdf0e10cSrcweir it1 = properties.find( MyProperty( IsRemote ) ); 2401cdf0e10cSrcweir if( it1 != properties.end() ) 2402cdf0e10cSrcweir it1->setValue( aAny ); 2403cdf0e10cSrcweir 2404cdf0e10cSrcweir it1 = properties.find( MyProperty( IsRemoveable ) ); 2405cdf0e10cSrcweir if( it1 != properties.end() ) 2406cdf0e10cSrcweir it1->setValue( aAny ); 2407cdf0e10cSrcweir 2408cdf0e10cSrcweir it1 = properties.find( MyProperty( IsCompactDisc ) ); 2409cdf0e10cSrcweir if( it1 != properties.end() ) 2410cdf0e10cSrcweir it1->setValue( aAny ); 2411cdf0e10cSrcweir 2412cdf0e10cSrcweir it1 = properties.find( MyProperty( IsFloppy ) ); 2413cdf0e10cSrcweir if( it1 != properties.end() ) 2414cdf0e10cSrcweir it1->setValue( aAny ); 2415cdf0e10cSrcweir } 2416cdf0e10cSrcweir } 2417cdf0e10cSrcweir else 2418cdf0e10cSrcweir { 2419cdf0e10cSrcweir isDirectory = sal_False; 2420cdf0e10cSrcweir } 2421cdf0e10cSrcweir 2422cdf0e10cSrcweir it1 = properties.find( MyProperty( Size ) ); 2423cdf0e10cSrcweir if( it1 != properties.end() ) 2424cdf0e10cSrcweir it1->setValue( uno::makeAny( dirSize ) ); 2425cdf0e10cSrcweir 2426cdf0e10cSrcweir it1 = properties.find( MyProperty( IsReadOnly ) ); 2427cdf0e10cSrcweir if( it1 != properties.end() ) 2428cdf0e10cSrcweir { 2429cdf0e10cSrcweir if( aFileStatus.isValid( FileStatusMask_Attributes ) ) 2430cdf0e10cSrcweir { 2431cdf0e10cSrcweir sal_uInt64 Attr = aFileStatus.getAttributes(); 2432cdf0e10cSrcweir sal_Bool readonly = ( Attr & Attribute_ReadOnly ) != 0; 2433cdf0e10cSrcweir it1->setValue( uno::makeAny( readonly ) ); 2434cdf0e10cSrcweir } 2435cdf0e10cSrcweir } 2436cdf0e10cSrcweir 2437cdf0e10cSrcweir it1 = properties.find( MyProperty( IsHidden ) ); 2438cdf0e10cSrcweir if( it1 != properties.end() ) 2439cdf0e10cSrcweir { 2440cdf0e10cSrcweir if( aFileStatus.isValid( FileStatusMask_Attributes ) ) 2441cdf0e10cSrcweir { 2442cdf0e10cSrcweir sal_uInt64 Attr = aFileStatus.getAttributes(); 2443cdf0e10cSrcweir sal_Bool ishidden = ( Attr & Attribute_Hidden ) != 0; 2444cdf0e10cSrcweir it1->setValue( uno::makeAny( ishidden ) ); 2445cdf0e10cSrcweir } 2446cdf0e10cSrcweir } 2447cdf0e10cSrcweir 2448cdf0e10cSrcweir it1 = properties.find( MyProperty( DateModified ) ); 2449cdf0e10cSrcweir if( it1 != properties.end() ) 2450cdf0e10cSrcweir { 2451cdf0e10cSrcweir if( aFileStatus.isValid( FileStatusMask_ModifyTime ) ) 2452cdf0e10cSrcweir { 2453cdf0e10cSrcweir TimeValue temp = aFileStatus.getModifyTime(); 2454cdf0e10cSrcweir 2455cdf0e10cSrcweir // Convert system time to local time (for EA) 2456cdf0e10cSrcweir TimeValue myLocalTime; 2457cdf0e10cSrcweir osl_getLocalTimeFromSystemTime( &temp, &myLocalTime ); 2458cdf0e10cSrcweir 2459cdf0e10cSrcweir oslDateTime myDateTime; 2460cdf0e10cSrcweir osl_getDateTimeFromTimeValue( &myLocalTime, &myDateTime ); 2461cdf0e10cSrcweir util::DateTime aDateTime; 2462cdf0e10cSrcweir 2463cdf0e10cSrcweir aDateTime.HundredthSeconds = (unsigned short)(myDateTime.NanoSeconds / 10000000); 2464cdf0e10cSrcweir aDateTime.Seconds = myDateTime.Seconds; 2465cdf0e10cSrcweir aDateTime.Minutes = myDateTime.Minutes; 2466cdf0e10cSrcweir aDateTime.Hours = myDateTime.Hours; 2467cdf0e10cSrcweir aDateTime.Day = myDateTime.Day; 2468cdf0e10cSrcweir aDateTime.Month = myDateTime.Month; 2469cdf0e10cSrcweir aDateTime.Year = myDateTime.Year; 2470cdf0e10cSrcweir it1->setValue( uno::makeAny( aDateTime ) ); 2471cdf0e10cSrcweir } 2472cdf0e10cSrcweir } 2473cdf0e10cSrcweir 2474cdf0e10cSrcweir it1 = properties.find( MyProperty( CreatableContentsInfo ) ); 2475cdf0e10cSrcweir if( it1 != properties.end() ) 2476cdf0e10cSrcweir it1->setValue( uno::makeAny( 2477cdf0e10cSrcweir isDirectory || !aFileStatus.isValid( FileStatusMask_Type ) 2478cdf0e10cSrcweir ? queryCreatableContentsInfo() 2479cdf0e10cSrcweir : uno::Sequence< ucb::ContentInfo >() ) ); 2480cdf0e10cSrcweir } 2481cdf0e10cSrcweir 2482cdf0e10cSrcweir 2483cdf0e10cSrcweir // Special optimized method for getting the properties of a 2484cdf0e10cSrcweir // directoryitem, which is returned by osl::DirectoryItem::getNextItem() 2485cdf0e10cSrcweir 2486cdf0e10cSrcweir 2487cdf0e10cSrcweir uno::Reference< sdbc::XRow > SAL_CALL 2488cdf0e10cSrcweir shell::getv( 2489cdf0e10cSrcweir Notifier* pNotifier, 2490cdf0e10cSrcweir const uno::Sequence< beans::Property >& properties, 2491cdf0e10cSrcweir osl::DirectoryItem& aDirItem, 2492cdf0e10cSrcweir rtl::OUString& aUnqPath, 2493cdf0e10cSrcweir sal_Bool& aIsRegular ) 2494cdf0e10cSrcweir { 2495cdf0e10cSrcweir uno::Sequence< uno::Any > seq( properties.getLength() ); 2496cdf0e10cSrcweir 2497cdf0e10cSrcweir sal_Int32 n_Mask; 2498cdf0e10cSrcweir getMaskFromProperties( n_Mask,properties ); 2499cdf0e10cSrcweir 2500cdf0e10cSrcweir // Always retrieve the type and the target URL because item might be a link 2501cdf0e10cSrcweir osl::FileStatus aFileStatus( n_Mask | 2502cdf0e10cSrcweir FileStatusMask_FileURL | 2503cdf0e10cSrcweir FileStatusMask_Type | 2504cdf0e10cSrcweir FileStatusMask_LinkTargetURL ); 2505cdf0e10cSrcweir aDirItem.getFileStatus( aFileStatus ); 2506cdf0e10cSrcweir aUnqPath = aFileStatus.getFileURL(); 2507cdf0e10cSrcweir 2508cdf0e10cSrcweir // If the directory item type is a link retrieve the type of the target 2509cdf0e10cSrcweir 2510cdf0e10cSrcweir if ( aFileStatus.getFileType() == osl::FileStatus::Link ) 2511cdf0e10cSrcweir { 2512cdf0e10cSrcweir // Assume failure 2513cdf0e10cSrcweir aIsRegular = false; 2514cdf0e10cSrcweir osl::FileBase::RC result = osl::FileBase::E_INVAL; 2515cdf0e10cSrcweir osl::DirectoryItem aTargetItem; 2516cdf0e10cSrcweir osl::DirectoryItem::get( aFileStatus.getLinkTargetURL(), aTargetItem ); 2517cdf0e10cSrcweir if ( aTargetItem.is() ) 2518cdf0e10cSrcweir { 2519cdf0e10cSrcweir osl::FileStatus aTargetStatus( FileStatusMask_Type ); 2520cdf0e10cSrcweir 2521cdf0e10cSrcweir if ( osl::FileBase::E_None == 2522cdf0e10cSrcweir ( result = aTargetItem.getFileStatus( aTargetStatus ) ) ) 2523cdf0e10cSrcweir aIsRegular = 2524cdf0e10cSrcweir aTargetStatus.getFileType() == osl::FileStatus::Regular; 2525cdf0e10cSrcweir } 2526cdf0e10cSrcweir } 2527cdf0e10cSrcweir else 2528cdf0e10cSrcweir aIsRegular = aFileStatus.getFileType() == osl::FileStatus::Regular; 2529cdf0e10cSrcweir 2530cdf0e10cSrcweir registerNotifier( aUnqPath,pNotifier ); 2531cdf0e10cSrcweir insertDefaultProperties( aUnqPath ); 2532cdf0e10cSrcweir { 2533cdf0e10cSrcweir osl::MutexGuard aGuard( m_aMutex ); 2534cdf0e10cSrcweir 2535cdf0e10cSrcweir shell::ContentMap::iterator it = m_aContent.find( aUnqPath ); 2536cdf0e10cSrcweir commit( it,aFileStatus ); 2537cdf0e10cSrcweir 2538cdf0e10cSrcweir shell::PropertySet::iterator it1; 2539cdf0e10cSrcweir PropertySet& propset = *(it->second.properties); 2540cdf0e10cSrcweir 2541cdf0e10cSrcweir for( sal_Int32 i = 0; i < seq.getLength(); ++i ) 2542cdf0e10cSrcweir { 2543cdf0e10cSrcweir MyProperty readProp( properties[i].Name ); 2544cdf0e10cSrcweir it1 = propset.find( readProp ); 2545cdf0e10cSrcweir if( it1 == propset.end() ) 2546cdf0e10cSrcweir seq[i] = uno::Any(); 2547cdf0e10cSrcweir else 2548cdf0e10cSrcweir seq[i] = it1->getValue(); 2549cdf0e10cSrcweir } 2550cdf0e10cSrcweir } 2551cdf0e10cSrcweir deregisterNotifier( aUnqPath,pNotifier ); 2552cdf0e10cSrcweir 2553cdf0e10cSrcweir XRow_impl* p = new XRow_impl( this,seq ); 2554cdf0e10cSrcweir return uno::Reference< sdbc::XRow >( p ); 2555cdf0e10cSrcweir } 2556cdf0e10cSrcweir 2557cdf0e10cSrcweir 2558cdf0e10cSrcweir 2559cdf0e10cSrcweir 2560cdf0e10cSrcweir 2561cdf0e10cSrcweir 2562cdf0e10cSrcweir // EventListener 2563cdf0e10cSrcweir 2564cdf0e10cSrcweir 2565cdf0e10cSrcweir std::list< ContentEventNotifier* >* SAL_CALL 2566cdf0e10cSrcweir shell::getContentEventListeners( const rtl::OUString& aName ) 2567cdf0e10cSrcweir { 2568cdf0e10cSrcweir std::list< ContentEventNotifier* >* p = new std::list< ContentEventNotifier* >; 2569cdf0e10cSrcweir std::list< ContentEventNotifier* >& listeners = *p; 2570cdf0e10cSrcweir { 2571cdf0e10cSrcweir osl::MutexGuard aGuard( m_aMutex ); 2572cdf0e10cSrcweir shell::ContentMap::iterator it = m_aContent.find( aName ); 2573cdf0e10cSrcweir if( it != m_aContent.end() && it->second.notifier ) 2574cdf0e10cSrcweir { 2575cdf0e10cSrcweir std::list<Notifier*>& listOfNotifiers = *( it->second.notifier ); 2576cdf0e10cSrcweir std::list<Notifier*>::iterator it1 = listOfNotifiers.begin(); 2577cdf0e10cSrcweir while( it1 != listOfNotifiers.end() ) 2578cdf0e10cSrcweir { 2579cdf0e10cSrcweir Notifier* pointer = *it1; 2580cdf0e10cSrcweir ContentEventNotifier* notifier = pointer->cCEL(); 2581cdf0e10cSrcweir if( notifier ) 2582cdf0e10cSrcweir listeners.push_back( notifier ); 2583cdf0e10cSrcweir ++it1; 2584cdf0e10cSrcweir } 2585cdf0e10cSrcweir } 2586cdf0e10cSrcweir } 2587cdf0e10cSrcweir return p; 2588cdf0e10cSrcweir } 2589cdf0e10cSrcweir 2590cdf0e10cSrcweir 2591cdf0e10cSrcweir 2592cdf0e10cSrcweir std::list< ContentEventNotifier* >* SAL_CALL 2593cdf0e10cSrcweir shell::getContentDeletedEventListeners( const rtl::OUString& aName ) 2594cdf0e10cSrcweir { 2595cdf0e10cSrcweir std::list< ContentEventNotifier* >* p = new std::list< ContentEventNotifier* >; 2596cdf0e10cSrcweir std::list< ContentEventNotifier* >& listeners = *p; 2597cdf0e10cSrcweir { 2598cdf0e10cSrcweir osl::MutexGuard aGuard( m_aMutex ); 2599cdf0e10cSrcweir shell::ContentMap::iterator it = m_aContent.find( aName ); 2600cdf0e10cSrcweir if( it != m_aContent.end() && it->second.notifier ) 2601cdf0e10cSrcweir { 2602cdf0e10cSrcweir std::list<Notifier*>& listOfNotifiers = *( it->second.notifier ); 2603cdf0e10cSrcweir std::list<Notifier*>::iterator it1 = listOfNotifiers.begin(); 2604cdf0e10cSrcweir while( it1 != listOfNotifiers.end() ) 2605cdf0e10cSrcweir { 2606cdf0e10cSrcweir Notifier* pointer = *it1; 2607cdf0e10cSrcweir ContentEventNotifier* notifier = pointer->cDEL(); 2608cdf0e10cSrcweir if( notifier ) 2609cdf0e10cSrcweir listeners.push_back( notifier ); 2610cdf0e10cSrcweir ++it1; 2611cdf0e10cSrcweir } 2612cdf0e10cSrcweir } 2613cdf0e10cSrcweir } 2614cdf0e10cSrcweir return p; 2615cdf0e10cSrcweir } 2616cdf0e10cSrcweir 2617cdf0e10cSrcweir 2618cdf0e10cSrcweir void SAL_CALL 2619cdf0e10cSrcweir shell::notifyInsert( std::list< ContentEventNotifier* >* listeners,const rtl::OUString& aChildName ) 2620cdf0e10cSrcweir { 2621cdf0e10cSrcweir std::list< ContentEventNotifier* >::iterator it = listeners->begin(); 2622cdf0e10cSrcweir while( it != listeners->end() ) 2623cdf0e10cSrcweir { 2624cdf0e10cSrcweir (*it)->notifyChildInserted( aChildName ); 2625cdf0e10cSrcweir delete (*it); 2626cdf0e10cSrcweir ++it; 2627cdf0e10cSrcweir } 2628cdf0e10cSrcweir delete listeners; 2629cdf0e10cSrcweir } 2630cdf0e10cSrcweir 2631cdf0e10cSrcweir 2632cdf0e10cSrcweir void SAL_CALL 2633cdf0e10cSrcweir shell::notifyContentDeleted( std::list< ContentEventNotifier* >* listeners ) 2634cdf0e10cSrcweir { 2635cdf0e10cSrcweir std::list< ContentEventNotifier* >::iterator it = listeners->begin(); 2636cdf0e10cSrcweir while( it != listeners->end() ) 2637cdf0e10cSrcweir { 2638cdf0e10cSrcweir (*it)->notifyDeleted(); 2639cdf0e10cSrcweir delete (*it); 2640cdf0e10cSrcweir ++it; 2641cdf0e10cSrcweir } 2642cdf0e10cSrcweir delete listeners; 2643cdf0e10cSrcweir } 2644cdf0e10cSrcweir 2645cdf0e10cSrcweir 2646cdf0e10cSrcweir void SAL_CALL 2647cdf0e10cSrcweir shell::notifyContentRemoved( std::list< ContentEventNotifier* >* listeners, 2648cdf0e10cSrcweir const rtl::OUString& aChildName ) 2649cdf0e10cSrcweir { 2650cdf0e10cSrcweir std::list< ContentEventNotifier* >::iterator it = listeners->begin(); 2651cdf0e10cSrcweir while( it != listeners->end() ) 2652cdf0e10cSrcweir { 2653cdf0e10cSrcweir (*it)->notifyRemoved( aChildName ); 2654cdf0e10cSrcweir delete (*it); 2655cdf0e10cSrcweir ++it; 2656cdf0e10cSrcweir } 2657cdf0e10cSrcweir delete listeners; 2658cdf0e10cSrcweir } 2659cdf0e10cSrcweir 2660cdf0e10cSrcweir 2661cdf0e10cSrcweir 2662cdf0e10cSrcweir 2663cdf0e10cSrcweir std::list< PropertySetInfoChangeNotifier* >* SAL_CALL 2664cdf0e10cSrcweir shell::getPropertySetListeners( const rtl::OUString& aName ) 2665cdf0e10cSrcweir { 2666cdf0e10cSrcweir std::list< PropertySetInfoChangeNotifier* >* p = new std::list< PropertySetInfoChangeNotifier* >; 2667cdf0e10cSrcweir std::list< PropertySetInfoChangeNotifier* >& listeners = *p; 2668cdf0e10cSrcweir { 2669cdf0e10cSrcweir osl::MutexGuard aGuard( m_aMutex ); 2670cdf0e10cSrcweir shell::ContentMap::iterator it = m_aContent.find( aName ); 2671cdf0e10cSrcweir if( it != m_aContent.end() && it->second.notifier ) 2672cdf0e10cSrcweir { 2673cdf0e10cSrcweir std::list<Notifier*>& listOfNotifiers = *( it->second.notifier ); 2674cdf0e10cSrcweir std::list<Notifier*>::iterator it1 = listOfNotifiers.begin(); 2675cdf0e10cSrcweir while( it1 != listOfNotifiers.end() ) 2676cdf0e10cSrcweir { 2677cdf0e10cSrcweir Notifier* pointer = *it1; 2678cdf0e10cSrcweir PropertySetInfoChangeNotifier* notifier = pointer->cPSL(); 2679cdf0e10cSrcweir if( notifier ) 2680cdf0e10cSrcweir listeners.push_back( notifier ); 2681cdf0e10cSrcweir ++it1; 2682cdf0e10cSrcweir } 2683cdf0e10cSrcweir } 2684cdf0e10cSrcweir } 2685cdf0e10cSrcweir return p; 2686cdf0e10cSrcweir } 2687cdf0e10cSrcweir 2688cdf0e10cSrcweir 2689cdf0e10cSrcweir void SAL_CALL 2690cdf0e10cSrcweir shell::notifyPropertyAdded( std::list< PropertySetInfoChangeNotifier* >* listeners, 2691cdf0e10cSrcweir const rtl::OUString& aPropertyName ) 2692cdf0e10cSrcweir { 2693cdf0e10cSrcweir std::list< PropertySetInfoChangeNotifier* >::iterator it = listeners->begin(); 2694cdf0e10cSrcweir while( it != listeners->end() ) 2695cdf0e10cSrcweir { 2696cdf0e10cSrcweir (*it)->notifyPropertyAdded( aPropertyName ); 2697cdf0e10cSrcweir delete (*it); 2698cdf0e10cSrcweir ++it; 2699cdf0e10cSrcweir } 2700cdf0e10cSrcweir delete listeners; 2701cdf0e10cSrcweir } 2702cdf0e10cSrcweir 2703cdf0e10cSrcweir 2704cdf0e10cSrcweir void SAL_CALL 2705cdf0e10cSrcweir shell::notifyPropertyRemoved( std::list< PropertySetInfoChangeNotifier* >* listeners, 2706cdf0e10cSrcweir const rtl::OUString& aPropertyName ) 2707cdf0e10cSrcweir { 2708cdf0e10cSrcweir std::list< PropertySetInfoChangeNotifier* >::iterator it = listeners->begin(); 2709cdf0e10cSrcweir while( it != listeners->end() ) 2710cdf0e10cSrcweir { 2711cdf0e10cSrcweir (*it)->notifyPropertyRemoved( aPropertyName ); 2712cdf0e10cSrcweir delete (*it); 2713cdf0e10cSrcweir ++it; 2714cdf0e10cSrcweir } 2715cdf0e10cSrcweir delete listeners; 2716cdf0e10cSrcweir } 2717cdf0e10cSrcweir 2718cdf0e10cSrcweir 2719cdf0e10cSrcweir 2720cdf0e10cSrcweir std::vector< std::list< ContentEventNotifier* >* >* SAL_CALL 2721cdf0e10cSrcweir shell::getContentExchangedEventListeners( const rtl::OUString aOldPrefix, 2722cdf0e10cSrcweir const rtl::OUString aNewPrefix, 2723cdf0e10cSrcweir sal_Bool withChilds ) 2724cdf0e10cSrcweir { 2725cdf0e10cSrcweir 2726cdf0e10cSrcweir std::vector< std::list< ContentEventNotifier* >* >* aVectorOnHeap = 2727cdf0e10cSrcweir new std::vector< std::list< ContentEventNotifier* >* >; 2728cdf0e10cSrcweir std::vector< std::list< ContentEventNotifier* >* >& aVector = *aVectorOnHeap; 2729cdf0e10cSrcweir 2730cdf0e10cSrcweir sal_Int32 count; 2731cdf0e10cSrcweir rtl::OUString aOldName; 2732cdf0e10cSrcweir rtl::OUString aNewName; 2733cdf0e10cSrcweir std::vector< rtl::OUString > oldChildList; 2734cdf0e10cSrcweir 2735cdf0e10cSrcweir { 2736cdf0e10cSrcweir osl::MutexGuard aGuard( m_aMutex ); 2737cdf0e10cSrcweir 2738cdf0e10cSrcweir if( ! withChilds ) 2739cdf0e10cSrcweir { 2740cdf0e10cSrcweir aOldName = aOldPrefix; 2741cdf0e10cSrcweir aNewName = aNewPrefix; 2742cdf0e10cSrcweir count = 1; 2743cdf0e10cSrcweir } 2744cdf0e10cSrcweir else 2745cdf0e10cSrcweir { 2746cdf0e10cSrcweir ContentMap::iterator itnames = m_aContent.begin(); 2747cdf0e10cSrcweir while( itnames != m_aContent.end() ) 2748cdf0e10cSrcweir { 2749cdf0e10cSrcweir if( isChild( aOldPrefix,itnames->first ) ) 2750cdf0e10cSrcweir { 2751cdf0e10cSrcweir oldChildList.push_back( itnames->first ); 2752cdf0e10cSrcweir } 2753cdf0e10cSrcweir ++itnames; 2754cdf0e10cSrcweir } 2755cdf0e10cSrcweir count = oldChildList.size(); 2756cdf0e10cSrcweir } 2757cdf0e10cSrcweir 2758cdf0e10cSrcweir 2759cdf0e10cSrcweir for( sal_Int32 j = 0; j < count; ++j ) 2760cdf0e10cSrcweir { 2761cdf0e10cSrcweir std::list< ContentEventNotifier* >* p = new std::list< ContentEventNotifier* >; 2762cdf0e10cSrcweir std::list< ContentEventNotifier* >& listeners = *p; 2763cdf0e10cSrcweir 2764cdf0e10cSrcweir if( withChilds ) 2765cdf0e10cSrcweir { 2766cdf0e10cSrcweir aOldName = oldChildList[j]; 2767cdf0e10cSrcweir aNewName = newName( aNewPrefix,aOldPrefix,aOldName ); 2768cdf0e10cSrcweir } 2769cdf0e10cSrcweir 2770cdf0e10cSrcweir shell::ContentMap::iterator itold = m_aContent.find( aOldName ); 2771cdf0e10cSrcweir if( itold != m_aContent.end() ) 2772cdf0e10cSrcweir { 2773cdf0e10cSrcweir shell::ContentMap::iterator itnew = m_aContent.insert( 2774cdf0e10cSrcweir ContentMap::value_type( aNewName,UnqPathData() ) ).first; 2775cdf0e10cSrcweir 2776cdf0e10cSrcweir // copy Ownership also 2777cdf0e10cSrcweir delete itnew->second.properties; 2778cdf0e10cSrcweir itnew->second.properties = itold->second.properties; 2779cdf0e10cSrcweir itold->second.properties = 0; 2780cdf0e10cSrcweir 2781cdf0e10cSrcweir // copy existing list 2782cdf0e10cSrcweir std::list< Notifier* >* copyList = itnew->second.notifier; 2783cdf0e10cSrcweir itnew->second.notifier = itold->second.notifier; 2784cdf0e10cSrcweir itold->second.notifier = 0; 2785cdf0e10cSrcweir 2786cdf0e10cSrcweir m_aContent.erase( itold ); 2787cdf0e10cSrcweir 2788cdf0e10cSrcweir if( itnew != m_aContent.end() && itnew->second.notifier ) 2789cdf0e10cSrcweir { 2790cdf0e10cSrcweir std::list<Notifier*>& listOfNotifiers = *( itnew->second.notifier ); 2791cdf0e10cSrcweir std::list<Notifier*>::iterator it1 = listOfNotifiers.begin(); 2792cdf0e10cSrcweir while( it1 != listOfNotifiers.end() ) 2793cdf0e10cSrcweir { 2794cdf0e10cSrcweir Notifier* pointer = *it1; 2795cdf0e10cSrcweir ContentEventNotifier* notifier = pointer->cEXC( aNewName ); 2796cdf0e10cSrcweir if( notifier ) 2797cdf0e10cSrcweir listeners.push_back( notifier ); 2798cdf0e10cSrcweir ++it1; 2799cdf0e10cSrcweir } 2800cdf0e10cSrcweir } 2801cdf0e10cSrcweir 2802cdf0e10cSrcweir // Merge with preexisting notifiers 2803cdf0e10cSrcweir // However, these may be in status BaseContent::Deleted 2804cdf0e10cSrcweir if( copyList != 0 ) 2805cdf0e10cSrcweir { 2806cdf0e10cSrcweir std::list< Notifier* >::iterator copyIt = copyList->begin(); 2807cdf0e10cSrcweir while( copyIt != copyList->end() ) 2808cdf0e10cSrcweir { 2809cdf0e10cSrcweir itnew->second.notifier->push_back( *copyIt ); 2810cdf0e10cSrcweir ++copyIt; 2811cdf0e10cSrcweir } 2812cdf0e10cSrcweir } 2813cdf0e10cSrcweir delete copyList; 2814cdf0e10cSrcweir } 2815cdf0e10cSrcweir aVector.push_back( p ); 2816cdf0e10cSrcweir } 2817cdf0e10cSrcweir } 2818cdf0e10cSrcweir 2819cdf0e10cSrcweir return aVectorOnHeap; 2820cdf0e10cSrcweir } 2821cdf0e10cSrcweir 2822cdf0e10cSrcweir 2823cdf0e10cSrcweir 2824cdf0e10cSrcweir void SAL_CALL 2825cdf0e10cSrcweir shell::notifyContentExchanged( std::vector< std::list< ContentEventNotifier* >* >* listeners_vec ) 2826cdf0e10cSrcweir { 2827cdf0e10cSrcweir std::list< ContentEventNotifier* >* listeners; 2828cdf0e10cSrcweir for( sal_uInt32 i = 0; i < listeners_vec->size(); ++i ) 2829cdf0e10cSrcweir { 2830cdf0e10cSrcweir listeners = (*listeners_vec)[i]; 2831cdf0e10cSrcweir std::list< ContentEventNotifier* >::iterator it = listeners->begin(); 2832cdf0e10cSrcweir while( it != listeners->end() ) 2833cdf0e10cSrcweir { 2834cdf0e10cSrcweir (*it)->notifyExchanged(); 2835cdf0e10cSrcweir delete (*it); 2836cdf0e10cSrcweir ++it; 2837cdf0e10cSrcweir } 2838cdf0e10cSrcweir delete listeners; 2839cdf0e10cSrcweir } 2840cdf0e10cSrcweir delete listeners_vec; 2841cdf0e10cSrcweir } 2842cdf0e10cSrcweir 2843cdf0e10cSrcweir 2844cdf0e10cSrcweir 2845cdf0e10cSrcweir std::list< PropertyChangeNotifier* >* SAL_CALL 2846cdf0e10cSrcweir shell::getPropertyChangeNotifier( const rtl::OUString& aName ) 2847cdf0e10cSrcweir { 2848cdf0e10cSrcweir std::list< PropertyChangeNotifier* >* p = new std::list< PropertyChangeNotifier* >; 2849cdf0e10cSrcweir std::list< PropertyChangeNotifier* >& listeners = *p; 2850cdf0e10cSrcweir { 2851cdf0e10cSrcweir osl::MutexGuard aGuard( m_aMutex ); 2852cdf0e10cSrcweir shell::ContentMap::iterator it = m_aContent.find( aName ); 2853cdf0e10cSrcweir if( it != m_aContent.end() && it->second.notifier ) 2854cdf0e10cSrcweir { 2855cdf0e10cSrcweir std::list<Notifier*>& listOfNotifiers = *( it->second.notifier ); 2856cdf0e10cSrcweir std::list<Notifier*>::iterator it1 = listOfNotifiers.begin(); 2857cdf0e10cSrcweir while( it1 != listOfNotifiers.end() ) 2858cdf0e10cSrcweir { 2859cdf0e10cSrcweir Notifier* pointer = *it1; 2860cdf0e10cSrcweir PropertyChangeNotifier* notifier = pointer->cPCL(); 2861cdf0e10cSrcweir if( notifier ) 2862cdf0e10cSrcweir listeners.push_back( notifier ); 2863cdf0e10cSrcweir ++it1; 2864cdf0e10cSrcweir } 2865cdf0e10cSrcweir } 2866cdf0e10cSrcweir } 2867cdf0e10cSrcweir return p; 2868cdf0e10cSrcweir } 2869cdf0e10cSrcweir 2870cdf0e10cSrcweir 2871cdf0e10cSrcweir void SAL_CALL shell::notifyPropertyChanges( std::list< PropertyChangeNotifier* >* listeners, 2872cdf0e10cSrcweir const uno::Sequence< beans::PropertyChangeEvent >& seqChanged ) 2873cdf0e10cSrcweir { 2874cdf0e10cSrcweir std::list< PropertyChangeNotifier* >::iterator it = listeners->begin(); 2875cdf0e10cSrcweir while( it != listeners->end() ) 2876cdf0e10cSrcweir { 2877cdf0e10cSrcweir (*it)->notifyPropertyChanged( seqChanged ); 2878cdf0e10cSrcweir delete (*it); 2879cdf0e10cSrcweir ++it; 2880cdf0e10cSrcweir } 2881cdf0e10cSrcweir delete listeners; 2882cdf0e10cSrcweir } 2883cdf0e10cSrcweir 2884cdf0e10cSrcweir 2885cdf0e10cSrcweir 2886cdf0e10cSrcweir 2887cdf0e10cSrcweir /********************************************************************************/ 2888cdf0e10cSrcweir /* remove persistent propertyset */ 2889cdf0e10cSrcweir /********************************************************************************/ 2890cdf0e10cSrcweir 2891cdf0e10cSrcweir void SAL_CALL 2892cdf0e10cSrcweir shell::erasePersistentSet( const rtl::OUString& aUnqPath, 2893cdf0e10cSrcweir sal_Bool withChilds ) 2894cdf0e10cSrcweir { 2895cdf0e10cSrcweir if( ! m_xFileRegistry.is() ) 2896cdf0e10cSrcweir { 2897cdf0e10cSrcweir OSL_ASSERT( m_xFileRegistry.is() ); 2898cdf0e10cSrcweir return; 2899cdf0e10cSrcweir } 2900cdf0e10cSrcweir 2901cdf0e10cSrcweir uno::Sequence< rtl::OUString > seqNames; 2902cdf0e10cSrcweir 2903cdf0e10cSrcweir if( withChilds ) 2904cdf0e10cSrcweir { 2905cdf0e10cSrcweir uno::Reference< container::XNameAccess > xName( m_xFileRegistry,uno::UNO_QUERY ); 2906cdf0e10cSrcweir seqNames = xName->getElementNames(); 2907cdf0e10cSrcweir } 2908cdf0e10cSrcweir 2909cdf0e10cSrcweir sal_Int32 count = withChilds ? seqNames.getLength() : 1; 2910cdf0e10cSrcweir 2911cdf0e10cSrcweir rtl::OUString 2912cdf0e10cSrcweir old_Name = aUnqPath; 2913cdf0e10cSrcweir 2914cdf0e10cSrcweir for( sal_Int32 j = 0; j < count; ++j ) 2915cdf0e10cSrcweir { 2916cdf0e10cSrcweir if( withChilds && ! ( isChild( old_Name,seqNames[j] ) ) ) 2917cdf0e10cSrcweir continue; 2918cdf0e10cSrcweir 2919cdf0e10cSrcweir if( withChilds ) 2920cdf0e10cSrcweir { 2921cdf0e10cSrcweir old_Name = seqNames[j]; 2922cdf0e10cSrcweir } 2923cdf0e10cSrcweir 2924cdf0e10cSrcweir { 2925cdf0e10cSrcweir // Release possible references 2926cdf0e10cSrcweir osl::MutexGuard aGuard( m_aMutex ); 2927cdf0e10cSrcweir ContentMap::iterator it = m_aContent.find( old_Name ); 2928cdf0e10cSrcweir if( it != m_aContent.end() ) 2929cdf0e10cSrcweir { 2930cdf0e10cSrcweir it->second.xS = 0; 2931cdf0e10cSrcweir it->second.xC = 0; 2932cdf0e10cSrcweir it->second.xA = 0; 2933cdf0e10cSrcweir 2934cdf0e10cSrcweir delete it->second.properties; 2935cdf0e10cSrcweir it->second.properties = 0; 2936cdf0e10cSrcweir } 2937cdf0e10cSrcweir } 2938cdf0e10cSrcweir 2939cdf0e10cSrcweir if( m_xFileRegistry.is() ) 2940cdf0e10cSrcweir m_xFileRegistry->removePropertySet( old_Name ); 2941cdf0e10cSrcweir } 2942cdf0e10cSrcweir } 2943cdf0e10cSrcweir 2944cdf0e10cSrcweir 2945cdf0e10cSrcweir 2946cdf0e10cSrcweir 2947cdf0e10cSrcweir /********************************************************************************/ 2948cdf0e10cSrcweir /* copy persistent propertyset */ 2949cdf0e10cSrcweir /* from srcUnqPath to dstUnqPath */ 2950cdf0e10cSrcweir /********************************************************************************/ 2951cdf0e10cSrcweir 2952cdf0e10cSrcweir 2953cdf0e10cSrcweir void SAL_CALL 2954cdf0e10cSrcweir shell::copyPersistentSet( const rtl::OUString& srcUnqPath, 2955cdf0e10cSrcweir const rtl::OUString& dstUnqPath, 2956cdf0e10cSrcweir sal_Bool withChilds ) 2957cdf0e10cSrcweir { 2958cdf0e10cSrcweir if( ! m_xFileRegistry.is() ) 2959cdf0e10cSrcweir { 2960cdf0e10cSrcweir OSL_ASSERT( m_xFileRegistry.is() ); 2961cdf0e10cSrcweir return; 2962cdf0e10cSrcweir } 2963cdf0e10cSrcweir 2964cdf0e10cSrcweir uno::Sequence< rtl::OUString > seqNames; 2965cdf0e10cSrcweir 2966cdf0e10cSrcweir if( withChilds ) 2967cdf0e10cSrcweir { 2968cdf0e10cSrcweir uno::Reference< container::XNameAccess > xName( m_xFileRegistry,uno::UNO_QUERY ); 2969cdf0e10cSrcweir seqNames = xName->getElementNames(); 2970cdf0e10cSrcweir } 2971cdf0e10cSrcweir 2972cdf0e10cSrcweir sal_Int32 count = withChilds ? seqNames.getLength() : 1; 2973cdf0e10cSrcweir 2974cdf0e10cSrcweir rtl::OUString 2975cdf0e10cSrcweir old_Name = srcUnqPath, 2976cdf0e10cSrcweir new_Name = dstUnqPath; 2977cdf0e10cSrcweir 2978cdf0e10cSrcweir for( sal_Int32 j = 0; j < count; ++j ) 2979cdf0e10cSrcweir { 2980cdf0e10cSrcweir if( withChilds && ! ( isChild( srcUnqPath,seqNames[j] ) ) ) 2981cdf0e10cSrcweir continue; 2982cdf0e10cSrcweir 2983cdf0e10cSrcweir if( withChilds ) 2984cdf0e10cSrcweir { 2985cdf0e10cSrcweir old_Name = seqNames[j]; 2986cdf0e10cSrcweir new_Name = newName( dstUnqPath,srcUnqPath,old_Name ); 2987cdf0e10cSrcweir } 2988cdf0e10cSrcweir 2989cdf0e10cSrcweir uno::Reference< XPersistentPropertySet > x_src; 2990cdf0e10cSrcweir 2991cdf0e10cSrcweir if( m_xFileRegistry.is() ) 2992cdf0e10cSrcweir { 2993cdf0e10cSrcweir x_src = m_xFileRegistry->openPropertySet( old_Name,false ); 2994cdf0e10cSrcweir m_xFileRegistry->removePropertySet( new_Name ); 2995cdf0e10cSrcweir } 2996cdf0e10cSrcweir 2997cdf0e10cSrcweir if( x_src.is() ) 2998cdf0e10cSrcweir { 2999cdf0e10cSrcweir uno::Sequence< beans::Property > seqProperty = 3000cdf0e10cSrcweir x_src->getPropertySetInfo()->getProperties(); 3001cdf0e10cSrcweir 3002cdf0e10cSrcweir if( seqProperty.getLength() ) 3003cdf0e10cSrcweir { 3004cdf0e10cSrcweir uno::Reference< XPersistentPropertySet > 3005cdf0e10cSrcweir x_dstS = m_xFileRegistry->openPropertySet( new_Name,true ); 3006cdf0e10cSrcweir uno::Reference< beans::XPropertyContainer > 3007cdf0e10cSrcweir x_dstC( x_dstS,uno::UNO_QUERY ); 3008cdf0e10cSrcweir 3009cdf0e10cSrcweir for( sal_Int32 i = 0; i < seqProperty.getLength(); ++i ) 3010cdf0e10cSrcweir { 3011cdf0e10cSrcweir x_dstC->addProperty( seqProperty[i].Name, 3012cdf0e10cSrcweir seqProperty[i].Attributes, 3013cdf0e10cSrcweir x_src->getPropertyValue( seqProperty[i].Name ) ); 3014cdf0e10cSrcweir } 3015cdf0e10cSrcweir } 3016cdf0e10cSrcweir } 3017cdf0e10cSrcweir } // end for( sal_Int... 3018cdf0e10cSrcweir } 3019cdf0e10cSrcweir 3020cdf0e10cSrcweir uno::Sequence< ucb::ContentInfo > shell::queryCreatableContentsInfo() 3021cdf0e10cSrcweir { 3022cdf0e10cSrcweir uno::Sequence< ucb::ContentInfo > seq(2); 3023cdf0e10cSrcweir 3024cdf0e10cSrcweir // file 3025cdf0e10cSrcweir seq[0].Type = FileContentType; 3026cdf0e10cSrcweir seq[0].Attributes = ucb::ContentInfoAttribute::INSERT_WITH_INPUTSTREAM 3027cdf0e10cSrcweir | ucb::ContentInfoAttribute::KIND_DOCUMENT; 3028cdf0e10cSrcweir 3029cdf0e10cSrcweir uno::Sequence< beans::Property > props( 1 ); 3030cdf0e10cSrcweir props[0] = beans::Property( 3031cdf0e10cSrcweir rtl::OUString::createFromAscii( "Title" ), 3032cdf0e10cSrcweir -1, 3033cdf0e10cSrcweir getCppuType( static_cast< rtl::OUString* >( 0 ) ), 3034cdf0e10cSrcweir beans::PropertyAttribute::MAYBEVOID 3035cdf0e10cSrcweir | beans::PropertyAttribute::BOUND ); 3036cdf0e10cSrcweir seq[0].Properties = props; 3037cdf0e10cSrcweir 3038cdf0e10cSrcweir // folder 3039cdf0e10cSrcweir seq[1].Type = FolderContentType; 3040cdf0e10cSrcweir seq[1].Attributes = ucb::ContentInfoAttribute::KIND_FOLDER; 3041cdf0e10cSrcweir seq[1].Properties = props; 3042cdf0e10cSrcweir return seq; 3043cdf0e10cSrcweir } 3044cdf0e10cSrcweir 3045cdf0e10cSrcweir /*******************************************************************************/ 3046cdf0e10cSrcweir /* */ 3047cdf0e10cSrcweir /* some misceancellous static functions */ 3048cdf0e10cSrcweir /* */ 3049cdf0e10cSrcweir /*******************************************************************************/ 3050cdf0e10cSrcweir 3051cdf0e10cSrcweir void SAL_CALL 3052cdf0e10cSrcweir shell::getScheme( rtl::OUString& Scheme ) 3053cdf0e10cSrcweir { 3054cdf0e10cSrcweir Scheme = rtl::OUString::createFromAscii( "file" ); 3055cdf0e10cSrcweir } 3056cdf0e10cSrcweir 3057cdf0e10cSrcweir rtl::OUString SAL_CALL 3058cdf0e10cSrcweir shell::getImplementationName_static( void ) 3059cdf0e10cSrcweir { 3060cdf0e10cSrcweir return rtl::OUString::createFromAscii( "com.sun.star.comp.ucb.FileProvider" ); 3061cdf0e10cSrcweir } 3062cdf0e10cSrcweir 3063cdf0e10cSrcweir 3064cdf0e10cSrcweir uno::Sequence< rtl::OUString > SAL_CALL 3065cdf0e10cSrcweir shell::getSupportedServiceNames_static( void ) 3066cdf0e10cSrcweir { 3067cdf0e10cSrcweir rtl::OUString Supported = rtl::OUString::createFromAscii( "com.sun.star.ucb.FileContentProvider" ) ; 3068cdf0e10cSrcweir com::sun::star::uno::Sequence< rtl::OUString > Seq( &Supported,1 ); 3069cdf0e10cSrcweir return Seq; 3070cdf0e10cSrcweir } 3071