/**************************************************************
 * 
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance
 * with the License.  You may obtain a copy of the License at
 * 
 *   http://www.apache.org/licenses/LICENSE-2.0
 * 
 * Unless required by applicable law or agreed to in writing,
 * software distributed under the License is distributed on an
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 * KIND, either express or implied.  See the License for the
 * specific language governing permissions and limitations
 * under the License.
 * 
 *************************************************************/

// MARKER(update_precomp.py): autogen include statement, do not remove
#include "precompiled_sw.hxx"

#define _SVSTDARR_STRINGS
#include <com/sun/star/uno/Sequence.h>
#include <com/sun/star/uno/Exception.hpp>
#include <com/sun/star/ucb/XContentIdentifier.hpp>
#include <com/sun/star/ucb/XContentProvider.hpp>
#include <com/sun/star/ucb/XCommandEnvironment.hpp>
#include <com/sun/star/ucb/TransferInfo.hpp>
#include <com/sun/star/ucb/NameClash.hdl>
#include <com/sun/star/sdbc/XResultSet.hpp>
#include <com/sun/star/sdbc/XRow.hpp>
#include <com/sun/star/lang/XMultiServiceFactory.hpp>
#include <comphelper/processfactory.hxx>
#include <comphelper/types.hxx>
#include <tools/urlobj.hxx>
#include <tools/datetime.hxx>
#include <tools/debug.hxx>
#include <ucbhelper/contentidentifier.hxx>
#include <ucbhelper/contentbroker.hxx>
#include <ucbhelper/content.hxx>
#include <svl/svstdarr.hxx>
#include <swunohelper.hxx>
#include <swunodef.hxx>
#include <errhdl.hxx>

//UUUU
#include <svx/xfillit0.hxx>
#include <svl/itemset.hxx>

namespace SWUnoHelper 
{

sal_Int32 GetEnumAsInt32( const UNO_NMSPC::Any& rVal )
{
	sal_Int32 eVal;
	try
	{
		eVal = comphelper::getEnumAsINT32( rVal );
	}
	catch( UNO_NMSPC::Exception & )
	{
		eVal = 0;
		ASSERT( sal_False, "can't get EnumAsInt32" );
	}
	return eVal;
}


// methods for UCB actions
sal_Bool UCB_DeleteFile( const String& rURL )
{
	sal_Bool bRemoved;
	try
    {
		ucbhelper::Content aTempContent( rURL,
								STAR_REFERENCE( ucb::XCommandEnvironment )());
		aTempContent.executeCommand(
						rtl::OUString::createFromAscii( "delete" ),
						UNO_NMSPC::makeAny( sal_Bool( sal_True ) ) );
		bRemoved = sal_True;
    }
    catch( UNO_NMSPC::Exception& )
    {
		bRemoved = sal_False;
		ASSERT( sal_False, "Exeception from executeCommand( delete )" );
    }
	return bRemoved;
}

sal_Bool UCB_CopyFile( const String& rURL, const String& rNewURL, sal_Bool bCopyIsMove )
{
	sal_Bool bCopyCompleted = sal_True;
	try
	{
		INetURLObject aURL( rNewURL );
		String sName( aURL.GetName() );
		aURL.removeSegment();
		String sMainURL( aURL.GetMainURL(INetURLObject::NO_DECODE) );

		ucbhelper::Content aTempContent( sMainURL,
								STAR_REFERENCE( ucb::XCommandEnvironment )());

		UNO_NMSPC::Any aAny;
		STAR_NMSPC::ucb::TransferInfo aInfo;
		aInfo.NameClash = STAR_NMSPC::ucb::NameClash::ERROR;
		aInfo.NewTitle = sName;
		aInfo.SourceURL = rURL;
		aInfo.MoveData = bCopyIsMove;
		aAny <<= aInfo;
		aTempContent.executeCommand(
							rtl::OUString::createFromAscii( "transfer" ),
                        	aAny );
	}
	catch( UNO_NMSPC::Exception& )
	{
		ASSERT( sal_False, "Exeception from executeCommand( transfer )" );
    	bCopyCompleted = sal_False;
	}
	return bCopyCompleted;
}

sal_Bool UCB_IsCaseSensitiveFileName( const String& rURL )
{
	sal_Bool bCaseSensitive;
	try
	{
		STAR_REFERENCE( lang::XMultiServiceFactory ) xMSF =
									comphelper::getProcessServiceFactory();

		INetURLObject aTempObj( rURL );
		aTempObj.SetBase( aTempObj.GetBase().toAsciiLowerCase() );
		STAR_REFERENCE( ucb::XContentIdentifier ) xRef1 = new
				ucbhelper::ContentIdentifier( xMSF,
							aTempObj.GetMainURL( INetURLObject::NO_DECODE ));

		aTempObj.SetBase(aTempObj.GetBase().toAsciiUpperCase());
		STAR_REFERENCE( ucb::XContentIdentifier ) xRef2 = new
				ucbhelper::ContentIdentifier( xMSF,
							aTempObj.GetMainURL( INetURLObject::NO_DECODE ));

		STAR_REFERENCE( ucb::XContentProvider ) xProv =
				ucbhelper::ContentBroker::get()->getContentProviderInterface();

		sal_Int32 nCompare = xProv->compareContentIds( xRef1, xRef2 );
		bCaseSensitive = 0 != nCompare;
	}
	catch( UNO_NMSPC::Exception& )
	{
		bCaseSensitive = sal_False;
		ASSERT( sal_False, "Exeception from compareContentIds()" );
	}
	return bCaseSensitive;
}

sal_Bool UCB_IsReadOnlyFileName( const String& rURL )
{
	sal_Bool bIsReadOnly = sal_False;
	try
	{
		ucbhelper::Content aCnt( rURL, STAR_REFERENCE( ucb::XCommandEnvironment )());
		UNO_NMSPC::Any aAny = aCnt.getPropertyValue(
							rtl::OUString::createFromAscii( "IsReadOnly" ));
		if(aAny.hasValue())
			bIsReadOnly = *(sal_Bool*)aAny.getValue();
	}
	catch( UNO_NMSPC::Exception& )
	{
		bIsReadOnly = sal_False;
	}
	return bIsReadOnly;
}

sal_Bool UCB_IsFile( const String& rURL )
{
    sal_Bool bExists = sal_False;
    try
    {
        ::ucbhelper::Content aContent( rURL, STAR_REFERENCE( ucb::XCommandEnvironment )() );
        bExists = aContent.isDocument();
    }
    catch (UNO_NMSPC::Exception &)
    {
    }
    return bExists;
}

sal_Bool UCB_IsDirectory( const String& rURL )
{
    sal_Bool bExists = sal_False;
    try
    {
        ::ucbhelper::Content aContent( rURL, STAR_REFERENCE( ucb::XCommandEnvironment )() );
        bExists = aContent.isFolder();
    }
    catch (UNO_NMSPC::Exception &)
    {
    }
    return bExists;
} 

	// get a list of files from the folder of the URL
	// options: pExtension = 0 -> all, else this specific extension
	// 			pDateTime != 0 -> returns also the modified date/time of
	//                       the files in a SvPtrarr -->
	//                       !! objects must be deleted from the caller!!
sal_Bool UCB_GetFileListOfFolder( const String& rURL, SvStrings& rList,
								const String* pExtension,
								SvPtrarr* pDateTimeList )
{
	sal_Bool bOk = sal_False;
	try
	{
		ucbhelper::Content aCnt( rURL, STAR_REFERENCE( ucb::XCommandEnvironment )());
		STAR_REFERENCE( sdbc::XResultSet ) xResultSet;

		sal_uInt16 nSeqSize = pDateTimeList ? 2 : 1;
		UNO_NMSPC::Sequence < rtl::OUString > aProps( nSeqSize );
		rtl::OUString* pProps = aProps.getArray();
		pProps[ 0 ] = rtl::OUString::createFromAscii( "Title" );
		if( pDateTimeList )
			pProps[ 1 ] = rtl::OUString::createFromAscii( "DateModified" );

    	try
    	{
        	xResultSet = aCnt.createCursor( aProps, ::ucbhelper::INCLUDE_DOCUMENTS_ONLY );
    	}
    	catch( UNO_NMSPC::Exception& )
    	{
        	DBG_ERRORFILE( "create cursor failed!" );
    	}

    	if( xResultSet.is() )
    	{
			STAR_REFERENCE( sdbc::XRow ) xRow( xResultSet, UNO_NMSPC::UNO_QUERY );
			xub_StrLen nExtLen = pExtension ? pExtension->Len() : 0;
        	try
        	{
            	if( xResultSet->first() )
            	{
                	do {
						String sTitle( xRow->getString( 1 ) );
						if( !nExtLen ||
							( sTitle.Len() > nExtLen &&
							  sTitle.Equals( *pExtension,
							  			sTitle.Len() - nExtLen, nExtLen )) )
						{
							String* pStr = new String( sTitle );
							rList.Insert( pStr, rList.Count() );

							if( pDateTimeList )
							{
								STAR_NMSPC::util::DateTime aStamp = xRow->getTimestamp(2);
								::DateTime* pDateTime = new ::DateTime(
										::Date( aStamp.Day,
												aStamp.Month,
												aStamp.Year ),
										::Time( aStamp.Hours,
												aStamp.Minutes,
												aStamp.Seconds,
												aStamp.HundredthSeconds ));
								void* p = pDateTime;
								pDateTimeList->Insert( p,
													pDateTimeList->Count() );
							}
						}

					} while( xResultSet->next() );
				}
				bOk = sal_True;
			}
            catch( UNO_NMSPC::Exception& )
            {
                DBG_ERRORFILE( "Exception caught!" );
            }
		}
	}
	catch( UNO_NMSPC::Exception& )
	{
		DBG_ERRORFILE( "Exception caught!" );
		bOk = sal_False;
    }
	return bOk;
}

//UUUU
bool needToMapFillItemsToSvxBrushItemTypes(const SfxItemSet& rSet)
{
    const XFillStyleItem* pXFillStyleItem(static_cast< const XFillStyleItem*  >(rSet.GetItem(XATTR_FILLSTYLE, false)));

    if(!pXFillStyleItem)
    {
        return false;
    }

    // here different FillStyles can be excluded for export; it will depend on the
    // quality these fallbacks can reach. That again is done in getSvxBrushItemFromSourceSet,
    // take a look there how the superset of DrawObject FillStyles is mapped to SvxBrushItem.
    // For now, take them all - except XFILL_NONE

    if(XFILL_NONE != pXFillStyleItem->GetValue())
    {
        return true;
    }

    // if(XFILL_SOLID == pXFillStyleItem->GetValue() || XFILL_BITMAP == pXFillStyleItem->GetValue())
    // {
    //     return true;
    // }

    return false;
}

}

// eof
