8546c324ff
Change-Id: I122669d4ffaf72fb1d5f6fccc98e8a648f31aa23 Reviewed-on: https://gerrit.libreoffice.org/3490 Tested-by: LibreOffice gerrit bot <gerrit@libreoffice.org> Reviewed-by: David Tardon <dtardon@redhat.com> Tested-by: David Tardon <dtardon@redhat.com>
219 lines
6.5 KiB
C++
219 lines
6.5 KiB
C++
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
|
|
/*
|
|
* This file is part of the LibreOffice project.
|
|
*
|
|
* This Source Code Form is subject to the terms of the Mozilla Public
|
|
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
|
*
|
|
* This file incorporates work covered by the following license notice:
|
|
*
|
|
* 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 .
|
|
*/
|
|
|
|
#include <sot/factory.hxx>
|
|
#include <tools/debug.hxx>
|
|
#include <tools/string.hxx>
|
|
#include <sot/object.hxx>
|
|
#include <sot/sotdata.hxx>
|
|
#include <comphelper/classids.hxx>
|
|
#include <rtl/instance.hxx>
|
|
#include <rtl/strbuf.hxx>
|
|
|
|
/************** class SotData_Impl *********************************************/
|
|
/*************************************************************************
|
|
|* SotData_Impl::SotData_Impl
|
|
|*
|
|
|* Beschreibung
|
|
*************************************************************************/
|
|
SotData_Impl::SotData_Impl()
|
|
: nSvObjCount( 0 )
|
|
, pFactoryList( NULL )
|
|
, pSotObjectFactory( NULL )
|
|
, pSotStorageStreamFactory( NULL )
|
|
, pSotStorageFactory( NULL )
|
|
, pDataFlavorList( NULL )
|
|
{
|
|
}
|
|
|
|
SotData_Impl::~SotData_Impl()
|
|
{
|
|
if (pDataFlavorList)
|
|
{
|
|
for( tDataFlavorList::iterator aI = pDataFlavorList->begin(),
|
|
aEnd = pDataFlavorList->end(); aI != aEnd; ++aI)
|
|
{
|
|
delete *aI;
|
|
}
|
|
delete pDataFlavorList;
|
|
}
|
|
delete pFactoryList;
|
|
}
|
|
|
|
/*************************************************************************
|
|
|* SOTDATA()
|
|
|*
|
|
|* Beschreibung
|
|
*************************************************************************/
|
|
namespace { struct ImplData : public rtl::Static<SotData_Impl, ImplData> {}; }
|
|
SotData_Impl * SOTDATA()
|
|
{
|
|
return &ImplData::get();
|
|
}
|
|
|
|
/************** class SotFactory *****************************************/
|
|
/*************************************************************************
|
|
|* SotFactory::SotFactory()
|
|
|*
|
|
|* Beschreibung
|
|
*************************************************************************/
|
|
TYPEINIT0(SotFactory);
|
|
|
|
SotFactory::SotFactory( const SvGlobalName & rName,
|
|
const String & rClassName,
|
|
CreateInstanceType pCreateFuncP )
|
|
: SvGlobalName ( rName )
|
|
, nSuperCount ( 0 )
|
|
, pSuperClasses ( NULL )
|
|
, pCreateFunc ( pCreateFuncP )
|
|
, aClassName ( rClassName )
|
|
{
|
|
#ifdef DBG_UTIL
|
|
SvGlobalName aEmptyName;
|
|
if( aEmptyName != *this )
|
|
{ // wegen Sfx-BasicFactories
|
|
DBG_ASSERT( aEmptyName != *this, "create factory without SvGlobalName" );
|
|
if( Find( *this ) )
|
|
{
|
|
OSL_FAIL( "create factories with the same unique name" );
|
|
}
|
|
}
|
|
#endif
|
|
SotData_Impl * pSotData = SOTDATA();
|
|
if( !pSotData->pFactoryList )
|
|
pSotData->pFactoryList = new SotFactoryList();
|
|
// muss nach hinten, wegen Reihenfolge beim zerstoeren
|
|
pSotData->pFactoryList->push_back( this );
|
|
}
|
|
|
|
|
|
//=========================================================================
|
|
SotFactory::~SotFactory()
|
|
{
|
|
delete [] pSuperClasses;
|
|
}
|
|
|
|
/*************************************************************************
|
|
|* SotFactory::Find()
|
|
|*
|
|
|* Beschreibung
|
|
*************************************************************************/
|
|
const SotFactory* SotFactory::Find( const SvGlobalName & rFactName )
|
|
{
|
|
SvGlobalName aEmpty;
|
|
SotData_Impl * pSotData = SOTDATA();
|
|
if( rFactName != aEmpty && pSotData->pFactoryList )
|
|
{
|
|
for ( size_t i = 0, n = pSotData->pFactoryList->size(); i < n; ++i ) {
|
|
SotFactory* pFact = (*pSotData->pFactoryList)[ i ];
|
|
if( *pFact == rFactName )
|
|
return pFact;
|
|
}
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
/*************************************************************************
|
|
|* SotFactory::PutSuperClass()
|
|
|*
|
|
|* Beschreibung
|
|
*************************************************************************/
|
|
void SotFactory::PutSuperClass( const SotFactory * pFact )
|
|
{
|
|
nSuperCount++;
|
|
if( !pSuperClasses )
|
|
pSuperClasses = new const SotFactory * [ nSuperCount ];
|
|
else
|
|
{
|
|
const SotFactory ** pTmp = new const SotFactory * [ nSuperCount ];
|
|
memcpy( (void *)pTmp, (void *)pSuperClasses,
|
|
sizeof( void * ) * (nSuperCount -1) );
|
|
delete [] pSuperClasses;
|
|
pSuperClasses = pTmp;
|
|
}
|
|
pSuperClasses[ nSuperCount -1 ] = pFact;
|
|
}
|
|
|
|
|
|
/*************************************************************************
|
|
|* SotFactory::IncSvObjectCount()
|
|
|*
|
|
|* Beschreibung
|
|
*************************************************************************/
|
|
void SotFactory::IncSvObjectCount( SotObject * pObj )
|
|
{
|
|
SotData_Impl * pSotData = SOTDATA();
|
|
pSotData->nSvObjCount++;
|
|
|
|
if( pObj )
|
|
pSotData->aObjectList.push_back( pObj );
|
|
}
|
|
|
|
|
|
/*************************************************************************
|
|
|* SotFactory::DecSvObjectCount()
|
|
|*
|
|
|* Beschreibung
|
|
*************************************************************************/
|
|
void SotFactory::DecSvObjectCount( SotObject * pObj )
|
|
{
|
|
SotData_Impl * pSotData = SOTDATA();
|
|
pSotData->nSvObjCount--;
|
|
if( pObj )
|
|
pSotData->aObjectList.remove( pObj );
|
|
if( !pSotData->nSvObjCount )
|
|
{
|
|
//keine internen und externen Referenzen mehr
|
|
}
|
|
}
|
|
|
|
/*************************************************************************
|
|
|* SotFactory::CreateInstance()
|
|
|*
|
|
|* Beschreibung
|
|
*************************************************************************/
|
|
void * SotFactory::CreateInstance( SotObject ** ppObj ) const
|
|
{
|
|
DBG_ASSERT( pCreateFunc, "SotFactory::CreateInstance: pCreateFunc == 0" );
|
|
return pCreateFunc( ppObj );
|
|
}
|
|
|
|
/*************************************************************************
|
|
|* SotFactory::Is()
|
|
|*
|
|
|* Beschreibung
|
|
*************************************************************************/
|
|
sal_Bool SotFactory::Is( const SotFactory * pSuperCl ) const
|
|
{
|
|
if( this == pSuperCl )
|
|
return sal_True;
|
|
|
|
for( sal_uInt16 i = 0; i < nSuperCount; i++ )
|
|
{
|
|
if( pSuperClasses[ i ]->Is( pSuperCl ) )
|
|
return sal_True;
|
|
}
|
|
return sal_False;
|
|
}
|
|
|
|
|
|
|
|
|
|
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|