office-gobmx/sfx2/source/bastyp/helper.cxx
2011-09-06 08:52:37 +01:00

347 lines
12 KiB
C++

/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
/*************************************************************************
*
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* Copyright 2000, 2010 Oracle and/or its affiliates.
*
* OpenOffice.org - a multi-platform office productivity suite
*
* This file is part of OpenOffice.org.
*
* OpenOffice.org is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License version 3
* only, as published by the Free Software Foundation.
*
* OpenOffice.org is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License version 3 for more details
* (a copy is included in the LICENSE file that accompanied this code).
*
* You should have received a copy of the GNU Lesser General Public License
* version 3 along with OpenOffice.org. If not, see
* <http://www.openoffice.org/license.html>
* for a copy of the LGPLv3 License.
*
************************************************************************/
// MARKER(update_precomp.py): autogen include statement, do not remove
#include "precompiled_sfx2.hxx"
#include "helper.hxx"
#include <com/sun/star/lang/XMultiServiceFactory.hpp>
#include <com/sun/star/sdbc/XResultSet.hpp>
#include <com/sun/star/sdbc/XRow.hpp>
#include <com/sun/star/ucb/CommandAbortedException.hpp>
#include <com/sun/star/ucb/IllegalIdentifierException.hpp>
#include <com/sun/star/ucb/NameClash.hpp>
#include <com/sun/star/ucb/NumberedSortingInfo.hpp>
#include <com/sun/star/ucb/TransferInfo.hpp>
#include <com/sun/star/ucb/XAnyCompareFactory.hpp>
#include <com/sun/star/ucb/XCommandInfo.hpp>
#include <com/sun/star/ucb/XContentAccess.hpp>
#include <com/sun/star/ucb/XDynamicResultSet.hpp>
#include <com/sun/star/ucb/XSortedDynamicResultSetFactory.hpp>
#include <com/sun/star/util/DateTime.hpp>
#include <com/sun/star/io/XInputStream.hpp>
#include <unotools/localedatawrapper.hxx>
#include <rtl/strbuf.hxx>
#include <tools/ref.hxx>
#include <tools/debug.hxx>
#include <tools/urlobj.hxx>
#include <tools/datetime.hxx>
#include <vcl/svapp.hxx>
#include <ucbhelper/content.hxx>
#include <ucbhelper/commandenvironment.hxx>
#include <comphelper/processfactory.hxx>
#include <osl/file.hxx>
#include <vector>
using namespace com::sun::star;
using namespace comphelper;
using namespace osl;
using ::std::vector;
using ::rtl::OUString;
using ::rtl::OStringBuffer;
using ::rtl::OStringToOUString;
typedef vector< OUString* > StringList_Impl;
#define CONVERT_DATETIME( aUnoDT, aToolsDT ) \
aToolsDT = DateTime( Date( aUnoDT.Day, aUnoDT.Month, aUnoDT.Year ), \
Time( aUnoDT.Hours, aUnoDT.Minutes, aUnoDT.Seconds, aUnoDT.HundredthSeconds ) );
void AppendDateTime_Impl( const util::DateTime rDT,
String& rRow, const LocaleDataWrapper& rWrapper )
{
DateTime aDT;
CONVERT_DATETIME( rDT, aDT );
String aDateStr = rWrapper.getDate( aDT );
aDateStr += String::CreateFromAscii( ", " );
aDateStr += rWrapper.getTime( aDT );
rRow += aDateStr;
}
// -----------------------------------------------------------------------
uno::Sequence < OUString > SfxContentHelper::GetResultSet( const String& rURL )
{
StringList_Impl* pList = NULL;
try
{
::ucbhelper::Content aCnt( rURL, uno::Reference< ucb::XCommandEnvironment >() );
uno::Reference< sdbc::XResultSet > xResultSet;
uno::Reference< ucb::XDynamicResultSet > xDynResultSet;
uno::Sequence< OUString > aProps(3);
OUString* pProps = aProps.getArray();
pProps[0] = OUString(RTL_CONSTASCII_USTRINGPARAM("Title"));
pProps[1] = OUString(RTL_CONSTASCII_USTRINGPARAM("ContentType"));
pProps[2] = OUString(RTL_CONSTASCII_USTRINGPARAM("IsFolder"));
try
{
xDynResultSet = aCnt.createDynamicCursor( aProps, ::ucbhelper::INCLUDE_FOLDERS_AND_DOCUMENTS );
if ( xDynResultSet.is() )
xResultSet = xDynResultSet->getStaticResultSet();
}
catch( const ucb::CommandAbortedException& )
{
DBG_ERRORFILE( "createCursor: CommandAbortedException" );
}
catch( const uno::Exception& )
{
DBG_ERRORFILE( "createCursor: Any other exception" );
}
if ( xResultSet.is() )
{
pList = new StringList_Impl();
uno::Reference< sdbc::XRow > xRow( xResultSet, uno::UNO_QUERY );
uno::Reference< ucb::XContentAccess > xContentAccess( xResultSet, uno::UNO_QUERY );
try
{
while ( xResultSet->next() )
{
String aTitle( xRow->getString(1) );
String aType( xRow->getString(2) );
String aRow = aTitle;
aRow += '\t';
aRow += aType;
aRow += '\t';
aRow += String( xContentAccess->queryContentIdentifierString() );
OUString* pRow = new OUString( aRow );
pList->push_back( pRow );
}
}
catch( const ucb::CommandAbortedException& )
{
DBG_ERRORFILE( "XContentAccess::next(): CommandAbortedException" );
}
catch( const uno::Exception& )
{
DBG_ERRORFILE( "XContentAccess::next(): Any other exception" );
}
}
}
catch( const uno::Exception& e )
{
(void) e;
DBG_ERRORFILE(
rtl::OUStringToOString(
(rtl::OUString(
RTL_CONSTASCII_USTRINGPARAM(
"GetResultSet: Any other exception: ")) +
e.Message),
RTL_TEXTENCODING_UTF8).
getStr());
}
if ( pList )
{
size_t nCount = pList->size();
uno::Sequence < OUString > aRet( nCount );
OUString* pRet = aRet.getArray();
for ( size_t i = 0; i < nCount; ++i )
{
OUString* pEntry = pList->at(i);
pRet[i] = *( pEntry );
delete pEntry;
}
pList->clear();
delete pList;
return aRet;
}
else
return uno::Sequence < OUString > ();
}
// -----------------------------------------------------------------------
uno::Sequence< OUString > SfxContentHelper::GetHelpTreeViewContents( const String& rURL )
{
StringList_Impl* pProperties = NULL;
try
{
uno::Reference< lang::XMultiServiceFactory > xFactory = ::comphelper::getProcessServiceFactory();
uno::Reference< task::XInteractionHandler > xInteractionHandler = uno::Reference< task::XInteractionHandler > (
xFactory->createInstance( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("com.sun.star.task.InteractionHandler") ) ), uno::UNO_QUERY );
::ucbhelper::Content aCnt( rURL, new ::ucbhelper::CommandEnvironment( xInteractionHandler, uno::Reference< ucb::XProgressHandler >() ) );
uno::Reference< sdbc::XResultSet > xResultSet;
uno::Sequence< OUString > aProps(2);
OUString* pProps = aProps.getArray();
pProps[0] = OUString(RTL_CONSTASCII_USTRINGPARAM("Title"));
pProps[1] = OUString(RTL_CONSTASCII_USTRINGPARAM("IsFolder"));
try
{
uno::Reference< ucb::XDynamicResultSet > xDynResultSet;
xDynResultSet = aCnt.createDynamicCursor( aProps, ::ucbhelper::INCLUDE_FOLDERS_AND_DOCUMENTS );
if ( xDynResultSet.is() )
xResultSet = xDynResultSet->getStaticResultSet();
}
catch( const ucb::CommandAbortedException& )
{
}
catch( const uno::Exception& )
{
}
if ( xResultSet.is() )
{
pProperties = new StringList_Impl();
uno::Reference< sdbc::XRow > xRow( xResultSet, uno::UNO_QUERY );
uno::Reference< ucb::XContentAccess > xContentAccess( xResultSet, uno::UNO_QUERY );
try
{
while ( xResultSet->next() )
{
String aTitle( xRow->getString(1) );
sal_Bool bFolder = xRow->getBoolean(2);
String aRow = aTitle;
aRow += '\t';
aRow += String( xContentAccess->queryContentIdentifierString() );
aRow += '\t';
aRow += bFolder ? '1' : '0';
OUString* pRow = new OUString( aRow );
pProperties->push_back( pRow );
}
}
catch( const ucb::CommandAbortedException& )
{
}
catch( const uno::Exception& )
{
}
}
}
catch( const uno::Exception& )
{
}
if ( pProperties )
{
size_t nCount = pProperties->size();
uno::Sequence < OUString > aRet( nCount );
OUString* pRet = aRet.getArray();
for ( size_t i = 0; i < nCount; ++i )
{
OUString* pProperty = pProperties->at(i);
pRet[i] = *( pProperty );
delete pProperty;
}
pProperties->clear();
delete pProperties;
return aRet;
}
else
return uno::Sequence < OUString > ();
}
// -----------------------------------------------------------------------
String SfxContentHelper::GetActiveHelpString( const String& rURL )
{
String aRet;
try
{
uno::Reference< lang::XMultiServiceFactory > xFactory = ::comphelper::getProcessServiceFactory();
uno::Reference< task::XInteractionHandler > xInteractionHandler = uno::Reference< task::XInteractionHandler > (
xFactory->createInstance( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("com.sun.star.task.InteractionHandler") ) ), uno::UNO_QUERY );
::ucbhelper::Content aCnt( rURL, new ::ucbhelper::CommandEnvironment( xInteractionHandler, uno::Reference< ucb::XProgressHandler >() ) );
// open the "active help" stream
uno::Reference< io::XInputStream > xStream = aCnt.openStream();
// and convert it to a String
uno::Sequence< sal_Int8 > lData;
sal_Int32 nRead = xStream->readBytes( lData, 1024 );
while ( nRead > 0 )
{
OStringBuffer sBuffer( nRead );
for( sal_Int32 i = 0; i < nRead; ++i )
sBuffer.append( (sal_Char)lData[i] );
OUString sString = OStringToOUString( sBuffer.makeStringAndClear(), RTL_TEXTENCODING_UTF8 );
aRet += String( sString );
nRead = xStream->readBytes( lData, 1024 );
}
}
catch( const uno::Exception& )
{
}
return aRet;
}
// -----------------------------------------------------------------------
sal_Bool SfxContentHelper::IsHelpErrorDocument( const String& rURL )
{
sal_Bool bRet = sal_False;
try
{
::ucbhelper::Content aCnt( INetURLObject( rURL ).GetMainURL( INetURLObject::NO_DECODE ),
uno::Reference< ucb::XCommandEnvironment > () );
if ( !( aCnt.getPropertyValue( OUString(RTL_CONSTASCII_USTRINGPARAM("IsErrorDocument")) ) >>= bRet ) )
{
DBG_ERRORFILE( "Property 'IsErrorDocument' is missing" );
}
}
catch( const uno::Exception& )
{
}
return bRet;
}
// -----------------------------------------------------------------------
sal_uIntPtr SfxContentHelper::GetSize( const String& rContent )
{
sal_uIntPtr nSize = 0;
sal_Int64 nTemp = 0;
INetURLObject aObj( rContent );
DBG_ASSERT( aObj.GetProtocol() != INET_PROT_NOT_VALID, "Invalid URL!" );
try
{
::ucbhelper::Content aCnt( aObj.GetMainURL( INetURLObject::NO_DECODE ), uno::Reference< ucb::XCommandEnvironment > () );
aCnt.getPropertyValue( OUString(RTL_CONSTASCII_USTRINGPARAM("Size")) ) >>= nTemp;
}
catch( const ucb::CommandAbortedException& )
{
DBG_ERRORFILE( "CommandAbortedException" );
}
catch( const uno::Exception& )
{
DBG_ERRORFILE( "Any other exception" );
}
nSize = (sal_uInt32)nTemp;
return nSize;
}
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */