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