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