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