/**************************************************************
 * 
 * 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_xmloff.hxx"
#include <com/sun/star/lang/XTypeProvider.hpp>
#include <cppuhelper/weakref.hxx>

#ifndef _XMLOFF_SINGLEPROPERTYSETINFOCACHE_HXX
#include <xmloff/SinglePropertySetInfoCache.hxx>
#endif

using namespace ::com::sun::star::uno;
using ::com::sun::star::lang::XTypeProvider;
using ::com::sun::star::beans::XPropertySet;
using ::com::sun::star::beans::XPropertySetInfo;

sal_Bool SinglePropertySetInfoCache::hasProperty( 
		const Reference< XPropertySet >& rPropSet,
		Reference< XPropertySetInfo >& rPropSetInfo )
{
	if( !rPropSetInfo.is() )
		rPropSetInfo = rPropSet->getPropertySetInfo();
	sal_Bool bRet = sal_False, bValid = sal_False;
	Reference < XTypeProvider > xTypeProv( rPropSet, UNO_QUERY );
	Sequence< sal_Int8 > aImplId;
	if( xTypeProv.is() )
	{
		aImplId = xTypeProv->getImplementationId();
		if( aImplId.getLength() == 16 )
		{
			// The key must not be created outside this block, because it
			// keeps a reference to the property set info.
			PropertySetInfoKey aKey( rPropSetInfo, aImplId );
			iterator aIter = find( aKey );
			if( aIter != end() )
			{
				bRet = (*aIter).second;
				bValid = sal_True;
			}
		}
	}
	if( !bValid )
	{
		bRet = rPropSetInfo->hasPropertyByName( sName );
		if( xTypeProv.is() && aImplId.getLength() == 16 )
		{
			// Check whether the property set info is destroyed if it is
			// assigned to a weak reference only. If it is destroyed, then
			// every instance of getPropertySetInfo returns a new object.
			// Such property set infos must not be cached.
			WeakReference < XPropertySetInfo > xWeakInfo( rPropSetInfo );
			rPropSetInfo = 0;
			rPropSetInfo = xWeakInfo;
			if( rPropSetInfo.is() )
			{
				PropertySetInfoKey aKey( rPropSetInfo, aImplId );
				value_type aValue( aKey, bRet );
				insert( aValue );
			}
		}
	}

	return bRet;
}
