1 /**************************************************************
2 *
3 * Licensed to the Apache Software Foundation (ASF) under one
4 * or more contributor license agreements. See the NOTICE file
5 * distributed with this work for additional information
6 * regarding copyright ownership. The ASF licenses this file
7 * to you under the Apache License, Version 2.0 (the
8 * "License"); you may not use this file except in compliance
9 * with the License. You may obtain a copy of the License at
10 *
11 * http://www.apache.org/licenses/LICENSE-2.0
12 *
13 * Unless required by applicable law or agreed to in writing,
14 * software distributed under the License is distributed on an
15 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16 * KIND, either express or implied. See the License for the
17 * specific language governing permissions and limitations
18 * under the License.
19 *
20 *************************************************************/
21
22
23
24 // MARKER(update_precomp.py): autogen include statement, do not remove
25 #include "precompiled_sfx2.hxx"
26
27 #include "helper.hxx"
28 #include <com/sun/star/lang/XMultiServiceFactory.hpp>
29 #include <com/sun/star/sdbc/XResultSet.hpp>
30 #include <com/sun/star/sdbc/XRow.hpp>
31 #include <com/sun/star/ucb/CommandAbortedException.hpp>
32 #include <com/sun/star/ucb/IllegalIdentifierException.hpp>
33 #include <com/sun/star/ucb/NameClash.hpp>
34 #include <com/sun/star/ucb/NumberedSortingInfo.hpp>
35 #include <com/sun/star/ucb/TransferInfo.hpp>
36 #include <com/sun/star/ucb/XAnyCompareFactory.hpp>
37 #include <com/sun/star/ucb/XCommandInfo.hpp>
38 #include <com/sun/star/ucb/XContentAccess.hpp>
39 #include <com/sun/star/ucb/XDynamicResultSet.hpp>
40 #include <com/sun/star/ucb/XSortedDynamicResultSetFactory.hpp>
41 #include <com/sun/star/util/DateTime.hpp>
42 #include <com/sun/star/io/XInputStream.hpp>
43 #include <unotools/localedatawrapper.hxx>
44 #include <rtl/strbuf.hxx>
45
46 #include <tools/ref.hxx>
47 #include <tools/debug.hxx>
48 #include <tools/urlobj.hxx>
49 #include <tools/datetime.hxx>
50 #include <vcl/svapp.hxx>
51 #include <ucbhelper/content.hxx>
52 #include <ucbhelper/commandenvironment.hxx>
53 #include <comphelper/processfactory.hxx>
54 #include <osl/file.hxx>
55
56 using namespace com::sun::star;
57 using namespace rtl;
58 using namespace comphelper;
59 using namespace osl;
60
DECLARE_LIST(StringList_Impl,OUString *)61 DECLARE_LIST( StringList_Impl, OUString* )
62
63 #define CONVERT_DATETIME( aUnoDT, aToolsDT ) \
64 aToolsDT = DateTime( Date( aUnoDT.Day, aUnoDT.Month, aUnoDT.Year ), \
65 Time( aUnoDT.Hours, aUnoDT.Minutes, aUnoDT.Seconds, aUnoDT.HundredthSeconds ) );
66
67 void AppendDateTime_Impl( const util::DateTime rDT,
68 String& rRow, const LocaleDataWrapper& rWrapper )
69 {
70 DateTime aDT;
71 CONVERT_DATETIME( rDT, aDT );
72 String aDateStr = rWrapper.getDate( aDT );
73 aDateStr += String::CreateFromAscii( ", " );
74 aDateStr += rWrapper.getTime( aDT );
75 rRow += aDateStr;
76 }
77
78 // SfxContentHelper ------------------------------------------------------
79
Transfer_Impl(const String & rSource,const String & rDest,sal_Bool bMoveData,sal_Int32 nNameClash)80 sal_Bool SfxContentHelper::Transfer_Impl( const String& rSource, const String& rDest, sal_Bool bMoveData, sal_Int32 nNameClash )
81 {
82 sal_Bool bRet = sal_True, bKillSource = sal_False;
83 INetURLObject aSourceObj( rSource );
84 DBG_ASSERT( aSourceObj.GetProtocol() != INET_PROT_NOT_VALID, "Invalid URL!" );
85
86 INetURLObject aDestObj( rDest );
87 DBG_ASSERT( aDestObj.GetProtocol() != INET_PROT_NOT_VALID, "Invalid URL!" );
88 if ( bMoveData && aSourceObj.GetProtocol() != aDestObj.GetProtocol() )
89 {
90 bMoveData = sal_False;
91 bKillSource = sal_True;
92 }
93 String aName = aDestObj.getName();
94 aDestObj.removeSegment();
95 aDestObj.setFinalSlash();
96
97 try
98 {
99 ::ucbhelper::Content aDestPath( aDestObj.GetMainURL( INetURLObject::NO_DECODE ), uno::Reference< ucb::XCommandEnvironment > () );
100 uno::Reference< ucb::XCommandInfo > xInfo = aDestPath.getCommands();
101 OUString aTransferName = OUString::createFromAscii( "transfer" );
102 if ( xInfo->hasCommandByName( aTransferName ) )
103 {
104 aDestPath.executeCommand( aTransferName, uno::makeAny(
105 ucb::TransferInfo( bMoveData, aSourceObj.GetMainURL( INetURLObject::NO_DECODE ), aName, nNameClash ) ) );
106 }
107 else
108 {
109 DBG_ERRORFILE( "transfer command not available" );
110 }
111 }
112 catch( ucb::CommandAbortedException& )
113 {
114 bRet = sal_False;
115 }
116 catch( uno::Exception& )
117 {
118 DBG_ERRORFILE( "Any other exception" );
119 bRet = sal_False;
120 }
121
122 if ( bKillSource )
123 SfxContentHelper::Kill( rSource );
124
125 return bRet;
126 }
127
128 // -----------------------------------------------------------------------
129
IsDocument(const String & rContent)130 sal_Bool SfxContentHelper::IsDocument( const String& rContent )
131 {
132 sal_Bool bRet = sal_False;
133 INetURLObject aObj( rContent );
134 DBG_ASSERT( aObj.GetProtocol() != INET_PROT_NOT_VALID, "Invalid URL!" );
135
136 try
137 {
138 ::ucbhelper::Content aCnt( aObj.GetMainURL( INetURLObject::NO_DECODE ), uno::Reference< ucb::XCommandEnvironment > () );
139 bRet = aCnt.isDocument();
140 }
141 catch( ucb::CommandAbortedException& )
142 {
143 DBG_WARNING( "CommandAbortedException" );
144 }
145 catch( ucb::IllegalIdentifierException& )
146 {
147 DBG_WARNING( "IllegalIdentifierException" );
148 }
149 catch( ucb::ContentCreationException& )
150 {
151 DBG_WARNING( "IllegalIdentifierException" );
152 }
153 catch( uno::Exception& )
154 {
155 DBG_ERRORFILE( "Any other exception" );
156 }
157
158 return bRet;
159 }
160
161 // -----------------------------------------------------------------------
162
IsFolder(const String & rContent)163 sal_Bool SfxContentHelper::IsFolder( const String& rContent )
164 {
165 sal_Bool bRet = sal_False;
166 INetURLObject aObj( rContent );
167 DBG_ASSERT( aObj.GetProtocol() != INET_PROT_NOT_VALID, "Invalid URL!" );
168 try
169 {
170 ::ucbhelper::Content aCnt( aObj.GetMainURL( INetURLObject::NO_DECODE ), uno::Reference< ucb::XCommandEnvironment > () );
171 bRet = aCnt.isFolder();
172 }
173 catch( ucb::CommandAbortedException& )
174 {
175 DBG_WARNING( "CommandAbortedException" );
176 }
177 catch( ucb::IllegalIdentifierException& )
178 {
179 DBG_WARNING( "IllegalIdentifierException" );
180 }
181 catch( ucb::ContentCreationException& )
182 {
183 DBG_WARNING( "IllegalIdentifierException" );
184 }
185 catch( uno::Exception& )
186 {
187 DBG_ERRORFILE( "Any other exception" );
188 }
189
190 return bRet;
191 }
192
193 // -----------------------------------------------------------------------
194
GetTitle(const String & rContent,String & rTitle)195 sal_Bool SfxContentHelper::GetTitle( const String& rContent, String& rTitle )
196 {
197 sal_Bool bRet = sal_False;
198 INetURLObject aObj( rContent );
199 DBG_ASSERT( aObj.GetProtocol() != INET_PROT_NOT_VALID, "Invalid URL!" );
200 try
201 {
202 ::ucbhelper::Content aCnt( aObj.GetMainURL( INetURLObject::NO_DECODE ), uno::Reference< ucb::XCommandEnvironment > () );
203 OUString aTemp;
204 aCnt.getPropertyValue( OUString::createFromAscii( "Title" ) ) >>= aTemp;
205 rTitle = String( aTemp );
206 bRet = sal_True;
207 }
208 catch( ucb::CommandAbortedException& )
209 {
210 DBG_ERRORFILE( "CommandAbortedException" );
211 }
212 catch( uno::Exception& )
213 {
214 DBG_ERRORFILE( "Any other exception" );
215 }
216 return bRet;
217 }
218
219 // -----------------------------------------------------------------------
220
Kill(const String & rContent)221 sal_Bool SfxContentHelper::Kill( const String& rContent )
222 {
223 sal_Bool bRet = sal_True;
224 INetURLObject aDeleteObj( rContent );
225 DBG_ASSERT( aDeleteObj.GetProtocol() != INET_PROT_NOT_VALID, "Invalid URL!" );
226
227 try
228 {
229 ::ucbhelper::Content aCnt( aDeleteObj.GetMainURL( INetURLObject::NO_DECODE ), uno::Reference< ucb::XCommandEnvironment > () );
230 aCnt.executeCommand( OUString::createFromAscii( "delete" ), uno::makeAny( sal_Bool( sal_True ) ) );
231 }
232 catch( ucb::CommandAbortedException& )
233 {
234 DBG_WARNING( "CommandAbortedException" );
235 bRet = sal_False;
236 }
237 catch( uno::Exception& )
238 {
239 DBG_ERRORFILE( "Any other exception" );
240 bRet = sal_False;
241 }
242
243 return bRet;
244 }
245
246 // -----------------------------------------------------------------------
247
GetFolderContents(const String & rFolder,sal_Bool bFolder,sal_Bool bSorted)248 uno::Sequence < OUString > SfxContentHelper::GetFolderContents( const String& rFolder, sal_Bool bFolder, sal_Bool bSorted )
249 {
250 StringList_Impl* pFiles = NULL;
251 INetURLObject aFolderObj( rFolder );
252 DBG_ASSERT( aFolderObj.GetProtocol() != INET_PROT_NOT_VALID, "Invalid URL!" );
253 try
254 {
255 ::ucbhelper::Content aCnt( aFolderObj.GetMainURL( INetURLObject::NO_DECODE ), uno::Reference< ucb::XCommandEnvironment > () );
256 uno::Reference< sdbc::XResultSet > xResultSet;
257 uno::Sequence< OUString > aProps(2);
258 OUString* pProps = aProps.getArray();
259 pProps[0] = OUString::createFromAscii( "Title" );
260 pProps[1] = OUString::createFromAscii( "IsFolder" );
261
262 try
263 {
264 ::ucbhelper::ResultSetInclude eInclude = bFolder ? ::ucbhelper::INCLUDE_FOLDERS_AND_DOCUMENTS : ::ucbhelper::INCLUDE_DOCUMENTS_ONLY;
265 if ( !bSorted )
266 {
267 xResultSet = aCnt.createCursor( aProps, eInclude );
268 }
269 else
270 {
271 uno::Reference< ucb::XDynamicResultSet > xDynResultSet;
272 xDynResultSet = aCnt.createDynamicCursor( aProps, eInclude );
273
274 uno::Reference < ucb::XAnyCompareFactory > xFactory;
275 uno::Reference < lang::XMultiServiceFactory > xMgr = getProcessServiceFactory();
276 uno::Reference < ucb::XSortedDynamicResultSetFactory > xSRSFac(
277 xMgr->createInstance( ::rtl::OUString::createFromAscii("com.sun.star.ucb.SortedDynamicResultSetFactory") ), uno::UNO_QUERY );
278
279 uno::Sequence< ucb::NumberedSortingInfo > aSortInfo( 2 );
280 ucb::NumberedSortingInfo* pInfo = aSortInfo.getArray();
281 pInfo[ 0 ].ColumnIndex = 2;
282 pInfo[ 0 ].Ascending = sal_False;
283 pInfo[ 1 ].ColumnIndex = 1;
284 pInfo[ 1 ].Ascending = sal_True;
285
286 uno::Reference< ucb::XDynamicResultSet > xDynamicResultSet;
287 xDynamicResultSet =
288 xSRSFac->createSortedDynamicResultSet( xDynResultSet, aSortInfo, xFactory );
289 if ( xDynamicResultSet.is() )
290 {
291 xResultSet = xDynamicResultSet->getStaticResultSet();
292 }
293 }
294 }
295 catch( ucb::CommandAbortedException& )
296 {
297 DBG_ERRORFILE( "createCursor: CommandAbortedException" );
298 }
299 catch( uno::Exception& )
300 {
301 DBG_ERRORFILE( "createCursor: Any other exception" );
302 }
303
304 if ( xResultSet.is() )
305 {
306 pFiles = new StringList_Impl;
307 uno::Reference< ucb::XContentAccess > xContentAccess( xResultSet, uno::UNO_QUERY );
308 try
309 {
310 while ( xResultSet->next() )
311 {
312 OUString aId = xContentAccess->queryContentIdentifierString();
313 OUString* pFile = new OUString( aId );
314 pFiles->Insert( pFile, LIST_APPEND );
315 }
316 }
317 catch( ucb::CommandAbortedException& )
318 {
319 DBG_ERRORFILE( "XContentAccess::next(): CommandAbortedException" );
320 }
321 catch( uno::Exception& )
322 {
323 DBG_ERRORFILE( "XContentAccess::next(): Any other exception" );
324 }
325 }
326 }
327 catch( uno::Exception& )
328 {
329 DBG_ERRORFILE( "GetFolderContents: Any other exception" );
330 }
331
332 if ( pFiles )
333 {
334 sal_uIntPtr nCount = pFiles->Count();
335 uno::Sequence < OUString > aRet( nCount );
336 OUString* pRet = aRet.getArray();
337 for ( sal_uIntPtr i = 0; i < nCount; ++i )
338 {
339 OUString* pFile = pFiles->GetObject(i);
340 pRet[i] = *( pFile );
341 delete pFile;
342 }
343 delete pFiles;
344 return aRet;
345 }
346 else
347 return uno::Sequence < OUString > ();
348 }
349
350 // -----------------------------------------------------------------------
351
GetFolderContentProperties(const String & rFolder,sal_Bool bIsFolder)352 uno::Sequence < OUString > SfxContentHelper::GetFolderContentProperties( const String& rFolder, sal_Bool bIsFolder )
353 {
354 StringList_Impl* pProperties = NULL;
355 INetURLObject aFolderObj( rFolder );
356 DBG_ASSERT( aFolderObj.GetProtocol() != INET_PROT_NOT_VALID, "Invalid URL!" );
357 try
358 {
359 uno::Reference< lang::XMultiServiceFactory > xFactory = ::comphelper::getProcessServiceFactory();
360 uno::Reference< task::XInteractionHandler > xInteractionHandler = uno::Reference< task::XInteractionHandler > (
361 xFactory->createInstance( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("com.sun.star.task.InteractionHandler") ) ), uno::UNO_QUERY );
362
363 ::ucbhelper::Content aCnt( aFolderObj.GetMainURL( INetURLObject::NO_DECODE ), new ::ucbhelper::CommandEnvironment( xInteractionHandler, uno::Reference< ucb::XProgressHandler >() ) );
364 uno::Reference< sdbc::XResultSet > xResultSet;
365 uno::Sequence< OUString > aProps(5);
366 OUString* pProps = aProps.getArray();
367 pProps[0] = OUString::createFromAscii( "Title" );
368 pProps[1] = OUString::createFromAscii( "ContentType" );
369 pProps[2] = OUString::createFromAscii( "Size" );
370 pProps[3] = OUString::createFromAscii( "DateModified" );
371 pProps[4] = OUString::createFromAscii( "IsFolder" );
372
373 try
374 {
375 uno::Reference< ucb::XDynamicResultSet > xDynResultSet;
376 ::ucbhelper::ResultSetInclude eInclude = bIsFolder ? ::ucbhelper::INCLUDE_FOLDERS_AND_DOCUMENTS : ::ucbhelper::INCLUDE_DOCUMENTS_ONLY;
377 xDynResultSet = aCnt.createDynamicCursor( aProps, eInclude );
378
379 uno::Reference < ucb::XAnyCompareFactory > xCmpFactory;
380 uno::Reference < lang::XMultiServiceFactory > xMgr = getProcessServiceFactory();
381 uno::Reference < ucb::XSortedDynamicResultSetFactory > xSRSFac(
382 xMgr->createInstance( ::rtl::OUString::createFromAscii("com.sun.star.ucb.SortedDynamicResultSetFactory") ), uno::UNO_QUERY );
383
384 uno::Sequence< ucb::NumberedSortingInfo > aSortInfo( 2 );
385 ucb::NumberedSortingInfo* pInfo = aSortInfo.getArray();
386 pInfo[ 0 ].ColumnIndex = 5;
387 pInfo[ 0 ].Ascending = sal_False;
388 pInfo[ 1 ].ColumnIndex = 1;
389 pInfo[ 1 ].Ascending = sal_True;
390
391 uno::Reference< ucb::XDynamicResultSet > xDynamicResultSet;
392 xDynamicResultSet =
393 xSRSFac->createSortedDynamicResultSet( xDynResultSet, aSortInfo, xCmpFactory );
394 if ( xDynamicResultSet.is() )
395 {
396 xResultSet = xDynamicResultSet->getStaticResultSet();
397 }
398
399 // if ( xDynResultSet.is() )
400 // xResultSet = xDynResultSet->getStaticResultSet();
401 }
402 catch( ucb::CommandAbortedException& )
403 {
404 DBG_ERRORFILE( "createCursor: CommandAbortedException" );
405 }
406 catch( uno::Exception& )
407 {
408 DBG_ERRORFILE( "createCursor: Any other exception" );
409 }
410
411 if ( xResultSet.is() )
412 {
413 LocaleDataWrapper aLocaleWrapper( ::comphelper::getProcessServiceFactory(), Application::GetSettings().GetLocale() );
414 pProperties = new StringList_Impl;
415 uno::Reference< sdbc::XRow > xRow( xResultSet, uno::UNO_QUERY );
416 uno::Reference< ucb::XContentAccess > xContentAccess( xResultSet, uno::UNO_QUERY );
417 sal_uIntPtr nFolderPos = LIST_APPEND;
418
419 try
420 {
421 while ( xResultSet->next() )
422 {
423 String aTitle( xRow->getString(1) );
424 String aType( xRow->getString(2) );
425 sal_Int64 nSize = xRow->getLong(3);
426 util::DateTime aDT = xRow->getTimestamp(4);
427 sal_Bool bFolder = xRow->getBoolean(5);
428
429 String aRow = aTitle;
430 aRow += '\t';
431 //! aRow += aType;
432 //! aRow += '\t';
433 aRow += String::CreateFromInt64( nSize );
434 aRow += '\t';
435 AppendDateTime_Impl( aDT, aRow, aLocaleWrapper );
436 aRow += '\t';
437 aRow += String( xContentAccess->queryContentIdentifierString() );
438 aRow += '\t';
439 aRow += bFolder ? '1' : '0';
440 OUString* pRow = new OUString( aRow );
441 sal_uIntPtr nPos = LIST_APPEND;
442 if ( bFolder )
443 {
444 if ( LIST_APPEND == nFolderPos )
445 nFolderPos = 0;
446 else
447 nFolderPos++;
448 nPos = nFolderPos;
449 }
450 pProperties->Insert( pRow, nPos );
451 }
452 }
453 catch( ucb::CommandAbortedException& )
454 {
455 DBG_ERRORFILE( "XContentAccess::next(): CommandAbortedException" );
456 }
457 catch( uno::Exception& )
458 {
459 DBG_ERRORFILE( "XContentAccess::next(): Any other exception" );
460 }
461 }
462 }
463 catch( uno::Exception& )
464 {
465 DBG_ERRORFILE( "GetFolderContents: Any other exception" );
466 }
467
468 if ( pProperties )
469 {
470 sal_uIntPtr nCount = pProperties->Count();
471 uno::Sequence < OUString > aRet( nCount );
472 OUString* pRet = aRet.getArray();
473 for ( sal_uIntPtr i = 0; i < nCount; ++i )
474 {
475 OUString* pProperty = pProperties->GetObject(i);
476 pRet[i] = *( pProperty );
477 delete pProperty;
478 }
479 delete pProperties;
480 return aRet;
481 }
482 else
483 return uno::Sequence < OUString > ();
484 }
485
486 // -----------------------------------------------------------------------
487
GetResultSet(const String & rURL)488 uno::Sequence < OUString > SfxContentHelper::GetResultSet( const String& rURL )
489 {
490 StringList_Impl* pList = NULL;
491 try
492 {
493 ::ucbhelper::Content aCnt( rURL, uno::Reference< ucb::XCommandEnvironment >() );
494 uno::Reference< sdbc::XResultSet > xResultSet;
495 uno::Reference< ucb::XDynamicResultSet > xDynResultSet;
496 uno::Sequence< OUString > aProps(3);
497 OUString* pProps = aProps.getArray();
498 pProps[0] = OUString::createFromAscii( "Title" );
499 pProps[1] = OUString::createFromAscii( "ContentType" );
500 pProps[2] = OUString::createFromAscii( "IsFolder" );
501
502 try
503 {
504 xDynResultSet = aCnt.createDynamicCursor( aProps, ::ucbhelper::INCLUDE_FOLDERS_AND_DOCUMENTS );
505 if ( xDynResultSet.is() )
506 xResultSet = xDynResultSet->getStaticResultSet();
507 }
508 catch( ucb::CommandAbortedException& )
509 {
510 DBG_ERRORFILE( "createCursor: CommandAbortedException" );
511 }
512 catch( uno::Exception& )
513 {
514 DBG_ERRORFILE( "createCursor: Any other exception" );
515 }
516
517 if ( xResultSet.is() )
518 {
519 pList = new StringList_Impl;
520 uno::Reference< sdbc::XRow > xRow( xResultSet, uno::UNO_QUERY );
521 uno::Reference< ucb::XContentAccess > xContentAccess( xResultSet, uno::UNO_QUERY );
522
523 try
524 {
525 while ( xResultSet->next() )
526 {
527 String aTitle( xRow->getString(1) );
528 String aType( xRow->getString(2) );
529 String aRow = aTitle;
530 aRow += '\t';
531 aRow += aType;
532 aRow += '\t';
533 aRow += String( xContentAccess->queryContentIdentifierString() );
534 OUString* pRow = new OUString( aRow );
535 pList->Insert( pRow, LIST_APPEND );
536 }
537 }
538 catch( ucb::CommandAbortedException& )
539 {
540 DBG_ERRORFILE( "XContentAccess::next(): CommandAbortedException" );
541 }
542 catch( uno::Exception& )
543 {
544 DBG_ERRORFILE( "XContentAccess::next(): Any other exception" );
545 }
546 }
547 }
548 catch( uno::Exception& e )
549 {
550 (void) e;
551 DBG_ERRORFILE(
552 rtl::OUStringToOString(
553 (rtl::OUString(
554 RTL_CONSTASCII_USTRINGPARAM(
555 "GetResultSet: Any other exception: ")) +
556 e.Message),
557 RTL_TEXTENCODING_UTF8).
558 getStr());
559 }
560
561 if ( pList )
562 {
563 sal_uIntPtr nCount = pList->Count();
564 uno::Sequence < OUString > aRet( nCount );
565 OUString* pRet = aRet.getArray();
566 for ( sal_uIntPtr i = 0; i < nCount; ++i )
567 {
568 OUString* pEntry = pList->GetObject(i);
569 pRet[i] = *( pEntry );
570 delete pEntry;
571 }
572 delete pList;
573 return aRet;
574 }
575 else
576 return uno::Sequence < OUString > ();
577 }
578
579 // -----------------------------------------------------------------------
580
GetHelpTreeViewContents(const String & rURL)581 uno::Sequence< OUString > SfxContentHelper::GetHelpTreeViewContents( const String& rURL )
582 {
583 StringList_Impl* pProperties = NULL;
584 try
585 {
586 uno::Reference< lang::XMultiServiceFactory > xFactory = ::comphelper::getProcessServiceFactory();
587 uno::Reference< task::XInteractionHandler > xInteractionHandler = uno::Reference< task::XInteractionHandler > (
588 xFactory->createInstance( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("com.sun.star.task.InteractionHandler") ) ), uno::UNO_QUERY );
589
590 ::ucbhelper::Content aCnt( rURL, new ::ucbhelper::CommandEnvironment( xInteractionHandler, uno::Reference< ucb::XProgressHandler >() ) );
591 uno::Reference< sdbc::XResultSet > xResultSet;
592 uno::Sequence< OUString > aProps(2);
593 OUString* pProps = aProps.getArray();
594 pProps[0] = OUString::createFromAscii( "Title" );
595 pProps[1] = OUString::createFromAscii( "IsFolder" );
596
597 try
598 {
599 uno::Reference< ucb::XDynamicResultSet > xDynResultSet;
600 xDynResultSet = aCnt.createDynamicCursor( aProps, ::ucbhelper::INCLUDE_FOLDERS_AND_DOCUMENTS );
601 if ( xDynResultSet.is() )
602 xResultSet = xDynResultSet->getStaticResultSet();
603 }
604 catch( ucb::CommandAbortedException& )
605 {
606 }
607 catch( uno::Exception& )
608 {
609 }
610
611 if ( xResultSet.is() )
612 {
613 pProperties = new StringList_Impl;
614 uno::Reference< sdbc::XRow > xRow( xResultSet, uno::UNO_QUERY );
615 uno::Reference< ucb::XContentAccess > xContentAccess( xResultSet, uno::UNO_QUERY );
616
617 try
618 {
619 while ( xResultSet->next() )
620 {
621 String aTitle( xRow->getString(1) );
622 sal_Bool bFolder = xRow->getBoolean(2);
623 String aRow = aTitle;
624 aRow += '\t';
625 aRow += String( xContentAccess->queryContentIdentifierString() );
626 aRow += '\t';
627 aRow += bFolder ? '1' : '0';
628 OUString* pRow = new OUString( aRow );
629 pProperties->Insert( pRow, LIST_APPEND );
630 }
631 }
632 catch( ucb::CommandAbortedException& )
633 {
634 }
635 catch( uno::Exception& )
636 {
637 }
638 }
639 }
640 catch( uno::Exception& )
641 {
642 }
643
644 if ( pProperties )
645 {
646 sal_uIntPtr nCount = pProperties->Count();
647 uno::Sequence < OUString > aRet( nCount );
648 OUString* pRet = aRet.getArray();
649 for ( sal_uIntPtr i = 0; i < nCount; ++i )
650 {
651 OUString* pProperty = pProperties->GetObject(i);
652 pRet[i] = *( pProperty );
653 delete pProperty;
654 }
655 delete pProperties;
656 return aRet;
657 }
658 else
659 return uno::Sequence < OUString > ();
660 }
661
662 // -----------------------------------------------------------------------
663
GetActiveHelpString(const String & rURL)664 String SfxContentHelper::GetActiveHelpString( const String& rURL )
665 {
666 String aRet;
667 try
668 {
669 uno::Reference< lang::XMultiServiceFactory > xFactory = ::comphelper::getProcessServiceFactory();
670 uno::Reference< task::XInteractionHandler > xInteractionHandler = uno::Reference< task::XInteractionHandler > (
671 xFactory->createInstance( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("com.sun.star.task.InteractionHandler") ) ), uno::UNO_QUERY );
672 ::ucbhelper::Content aCnt( rURL, new ::ucbhelper::CommandEnvironment( xInteractionHandler, uno::Reference< ucb::XProgressHandler >() ) );
673 // open the "active help" stream
674 uno::Reference< io::XInputStream > xStream = aCnt.openStream();
675 // and convert it to a String
676 uno::Sequence< sal_Int8 > lData;
677 sal_Int32 nRead = xStream->readBytes( lData, 1024 );
678 while ( nRead > 0 )
679 {
680 OStringBuffer sBuffer( nRead );
681 for( sal_Int32 i = 0; i < nRead; ++i )
682 sBuffer.append( (sal_Char)lData[i] );
683 OUString sString = OStringToOUString( sBuffer.makeStringAndClear(), RTL_TEXTENCODING_UTF8 );
684 aRet += String( sString );
685
686 nRead = xStream->readBytes( lData, 1024 );
687 }
688 }
689 catch( uno::Exception& )
690 {
691 }
692
693 return aRet;
694 }
695
696 // -----------------------------------------------------------------------
697
IsHelpErrorDocument(const String & rURL)698 sal_Bool SfxContentHelper::IsHelpErrorDocument( const String& rURL )
699 {
700 sal_Bool bRet = sal_False;
701 try
702 {
703 ::ucbhelper::Content aCnt( INetURLObject( rURL ).GetMainURL( INetURLObject::NO_DECODE ),
704 uno::Reference< ucb::XCommandEnvironment > () );
705 if ( !( aCnt.getPropertyValue( OUString::createFromAscii( "IsErrorDocument" ) ) >>= bRet ) )
706 {
707 DBG_ERRORFILE( "Property 'IsErrorDocument' is missing" );
708 }
709 }
710 catch( uno::Exception& )
711 {
712 }
713
714 return bRet;
715 }
716
717 // -----------------------------------------------------------------------
718
CopyTo(const String & rSource,const String & rDest)719 sal_Bool SfxContentHelper::CopyTo( const String& rSource, const String& rDest )
720 {
721 return Transfer_Impl( rSource, rDest, sal_False, ucb::NameClash::ERROR );
722 }
723
724 // -----------------------------------------------------------------------
725
MoveTo(const String & rSource,const String & rDest,sal_Int32 nNameClash)726 sal_Bool SfxContentHelper::MoveTo( const String& rSource, const String& rDest, sal_Int32 nNameClash )
727 {
728 return Transfer_Impl( rSource, rDest, sal_True, nNameClash );
729 }
730
731 // -----------------------------------------------------------------------
732
MakeFolder(const String & rFolder)733 sal_Bool SfxContentHelper::MakeFolder( const String& rFolder )
734 {
735 INetURLObject aURL( rFolder );
736 DBG_ASSERT( aURL.GetProtocol() != INET_PROT_NOT_VALID, "Invalid URL!" );
737 String aTitle = aURL.getName( INetURLObject::LAST_SEGMENT, true, INetURLObject::DECODE_WITH_CHARSET );
738 aURL.removeSegment();
739 uno::Sequence < OUString > aNames(2);
740 OUString* pNames = aNames.getArray();
741 pNames[0] = OUString( RTL_CONSTASCII_USTRINGPARAM( "Title" ) );
742 pNames[1] = OUString( RTL_CONSTASCII_USTRINGPARAM( "IsFolder" ) );
743 uno::Sequence<uno::Any> aValues(2);
744 uno::Any* pValues = aValues.getArray();
745 pValues[0] = uno::makeAny( OUString( aTitle ) );
746 pValues[1] = uno::makeAny( sal_Bool( sal_True ) );
747 uno::Reference< ucb::XCommandEnvironment > aCmdEnv;
748 sal_Bool bRet = sal_False;
749 try
750 {
751 ::ucbhelper::Content aCnt( aURL.GetMainURL( INetURLObject::NO_DECODE ), aCmdEnv );
752 ::ucbhelper::Content aNewFolder;
753 OUString aType( RTL_CONSTASCII_USTRINGPARAM( "application/vnd.sun.staroffice.fsys-folder" ) );
754 bRet = aCnt.insertNewContent( aType, aNames, aValues, aNewFolder );
755 }
756 catch( ucb::CommandAbortedException& )
757 {
758 // double name?
759 }
760 catch( ucb::IllegalIdentifierException& )
761 {
762 DBG_ERRORFILE( "Illegal identifier" );
763 }
764 catch( uno::Exception& )
765 {
766 DBG_ERRORFILE( "Any other exception" );
767 }
768
769 return bRet;
770 }
771
772 // -----------------------------------------------------------------------
773
QueryDiskSpace(const String & rPath,sal_Int64 & rFreeBytes)774 ErrCode SfxContentHelper::QueryDiskSpace( const String& rPath, sal_Int64& rFreeBytes )
775 {
776 ErrCode nErr = 0;
777 rFreeBytes = 0;
778 INetURLObject aObj( rPath );
779 DBG_ASSERT( aObj.GetProtocol() != INET_PROT_NOT_VALID, "Invalid URL!" );
780 try
781 {
782 ::ucbhelper::Content aCnt( aObj.GetMainURL( INetURLObject::NO_DECODE ), uno::Reference< ucb::XCommandEnvironment > () );
783 aCnt.getPropertyValue( OUString::createFromAscii( "FreeSpace" ) ) >>= rFreeBytes;
784 }
785 catch( ucb::CommandAbortedException& )
786 {
787 DBG_ERRORFILE( "CommandAbortedException" );
788 nErr = ERRCODE_IO_GENERAL;
789 }
790 catch( uno::Exception& )
791 {
792 DBG_ERRORFILE( "Any other exception" );
793 nErr = ERRCODE_IO_GENERAL;
794 }
795 return nErr;
796 }
797
798 // -----------------------------------------------------------------------
799
GetSize(const String & rContent)800 sal_uIntPtr SfxContentHelper::GetSize( const String& rContent )
801 {
802 sal_uIntPtr nSize = 0;
803 sal_Int64 nTemp = 0;
804 INetURLObject aObj( rContent );
805 DBG_ASSERT( aObj.GetProtocol() != INET_PROT_NOT_VALID, "Invalid URL!" );
806 try
807 {
808 ::ucbhelper::Content aCnt( aObj.GetMainURL( INetURLObject::NO_DECODE ), uno::Reference< ucb::XCommandEnvironment > () );
809 aCnt.getPropertyValue( OUString::createFromAscii( "Size" ) ) >>= nTemp;
810 }
811 catch( ucb::CommandAbortedException& )
812 {
813 DBG_ERRORFILE( "CommandAbortedException" );
814 }
815 catch( uno::Exception& )
816 {
817 DBG_ERRORFILE( "Any other exception" );
818 }
819 nSize = (sal_uInt32)nTemp;
820 return nSize;
821 }
822
823 // -----------------------------------------------------------------------
824 // please don't use it (only used in appbas.cxx and appcfg.cxx)
Exists(const String & rContent)825 sal_Bool SfxContentHelper::Exists( const String& rContent )
826 {
827 sal_Bool bRet = sal_False;
828 INetURLObject aObj( rContent );
829 DBG_ASSERT( aObj.GetProtocol() != INET_PROT_NOT_VALID, "Invalid URL!" );
830
831 try
832 {
833 ::ucbhelper::Content aCnt( aObj.GetMainURL( INetURLObject::NO_DECODE ), uno::Reference< ucb::XCommandEnvironment > () );
834 // just try to get the property; if no exception is thrown, the content exists!
835 aCnt.isDocument();
836 bRet = sal_True;
837 }
838 catch( ucb::CommandAbortedException& )
839 {
840 DBG_WARNING( "CommandAbortedException" );
841 }
842 catch( ucb::IllegalIdentifierException& )
843 {
844 DBG_WARNING( "IllegalIdentifierException" );
845 }
846 catch( ucb::ContentCreationException& )
847 {
848 DBG_WARNING( "IllegalIdentifierException" );
849 }
850 catch( uno::Exception& )
851 {
852 DBG_ERRORFILE( "Any other exception" );
853 }
854
855 return bRet;
856
857 }
858
859 // -----------------------------------------------------------------------
860
Find(const String & rFolder,const String & rName,String & rFile)861 sal_Bool SfxContentHelper::Find( const String& rFolder, const String& rName, String& rFile )
862 {
863 sal_Bool bRet = sal_False;
864 rtl::OUString aFile;
865
866 if ( FileBase::searchFileURL( rName, rFolder, aFile ) == FileBase::E_None )
867 {
868 rFile = aFile;
869 bRet = sal_True;
870 }
871
872 return bRet;
873 }
874
875
876