/**************************************************************
 *
 * 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_svl.hxx"

#include <svl/folderrestriction.hxx>
#include "osl/process.h"
#include "tools/urlobj.hxx"
#include "unotools/localfilehelper.hxx"

//-----------------------------------------------------------------------------

static void convertStringListToUrls (
	const String& _rColonSeparatedList, ::std::vector< String >& _rTokens, bool _bFinalSlash )
{
	const sal_Unicode s_cSeparator =
#if defined(WNT)
		';'
#else
		':'
#endif
            ;
	xub_StrLen nTokens = _rColonSeparatedList.GetTokenCount( s_cSeparator );
	_rTokens.resize( 0 ); _rTokens.reserve( nTokens );
	for ( xub_StrLen i=0; i<nTokens; ++i )
	{
		// the current token in the list
		String sCurrentToken = _rColonSeparatedList.GetToken( i, s_cSeparator );
		if ( !sCurrentToken.Len() )
			continue;

		INetURLObject aCurrentURL;

		String sURL;
		if ( ::utl::LocalFileHelper::ConvertPhysicalNameToURL( sCurrentToken, sURL ) )
			aCurrentURL = INetURLObject( sURL );
		else
		{
			// smart URL parsing, assuming FILE protocol
			aCurrentURL = INetURLObject( sCurrentToken, INET_PROT_FILE );
		}

		if ( _bFinalSlash )
			aCurrentURL.setFinalSlash( );
		else
			aCurrentURL.removeFinalSlash( );
		_rTokens.push_back( aCurrentURL.GetMainURL( INetURLObject::NO_DECODE ) );
	}
}

/** retrieves the value of an environment variable
	@return <TRUE/> if and only if the retrieved string value is not empty
*/
static bool getEnvironmentValue( const sal_Char* _pAsciiEnvName, ::rtl::OUString& _rValue )
{
	_rValue = ::rtl::OUString();
	::rtl::OUString sEnvName = ::rtl::OUString::createFromAscii( _pAsciiEnvName );
	osl_getEnvironment( sEnvName.pData, &_rValue.pData );
	return _rValue.getLength() != 0;
}

//-----------------------------------------------------------------------------

namespace svt
{

    void getUnrestrictedFolders( ::std::vector< String >& _rFolders )
    {
        _rFolders.resize( 0 );
        ::rtl::OUString sRestrictedPathList;
        if ( getEnvironmentValue( "RestrictedPath", sRestrictedPathList ) )
		{
            // append a final slash. This ensures that when we later on check
            // for unrestricted paths, we don't allow paths like "/home/user35" just because
            // "/home/user3" is allowed - with the final slash, we make it "/home/user3/".
            convertStringListToUrls( sRestrictedPathList, _rFolders, true );
		}
    }

} // namespace svt
