2008-01-17 07:06:10 +00:00
|
|
|
/*************************************************************************
|
|
|
|
*
|
2008-04-10 14:13:28 +00:00
|
|
|
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
2008-01-17 07:06:10 +00:00
|
|
|
*
|
2008-04-10 14:13:28 +00:00
|
|
|
* Copyright 2008 by Sun Microsystems, Inc.
|
2008-01-17 07:06:10 +00:00
|
|
|
*
|
2008-04-10 14:13:28 +00:00
|
|
|
* OpenOffice.org - a multi-platform office productivity suite
|
2008-01-17 07:06:10 +00:00
|
|
|
*
|
2008-04-10 14:13:28 +00:00
|
|
|
* $RCSfile: relations.cxx,v $
|
|
|
|
* $Revision: 1.4 $
|
2008-01-17 07:06:10 +00:00
|
|
|
*
|
2008-04-10 14:13:28 +00:00
|
|
|
* This file is part of OpenOffice.org.
|
2008-01-17 07:06:10 +00:00
|
|
|
*
|
2008-04-10 14:13:28 +00:00
|
|
|
* 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.
|
2008-01-17 07:06:10 +00:00
|
|
|
*
|
2008-04-10 14:13:28 +00:00
|
|
|
* 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).
|
2008-01-17 07:06:10 +00:00
|
|
|
*
|
2008-04-10 14:13:28 +00:00
|
|
|
* 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.
|
2008-01-17 07:06:10 +00:00
|
|
|
*
|
|
|
|
************************************************************************/
|
|
|
|
|
|
|
|
#include "oox/core/relations.hxx"
|
|
|
|
#include "oox/helper/helper.hxx"
|
|
|
|
|
|
|
|
using ::rtl::OUString;
|
|
|
|
|
|
|
|
namespace oox {
|
|
|
|
namespace core {
|
|
|
|
|
|
|
|
// ============================================================================
|
|
|
|
|
2008-03-05 17:14:58 +00:00
|
|
|
Relations::Relations( const OUString& rBasePath ) :
|
|
|
|
maBasePath( rBasePath )
|
|
|
|
{
|
|
|
|
}
|
|
|
|
|
2008-01-17 07:06:10 +00:00
|
|
|
const Relation* Relations::getRelationFromRelId( const OUString& rId ) const
|
|
|
|
{
|
|
|
|
const_iterator aIt = find( rId );
|
|
|
|
return (aIt == end()) ? 0 : &aIt->second;
|
|
|
|
}
|
|
|
|
|
|
|
|
const Relation* Relations::getRelationFromType( const OUString& rType ) const
|
|
|
|
{
|
|
|
|
for( const_iterator aIt = begin(), aEnd = end(); aIt != aEnd; ++aIt )
|
|
|
|
if( aIt->second.maType == rType )
|
|
|
|
return &aIt->second;
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
RelationsRef Relations::getRelationsFromType( const OUString& rType ) const
|
|
|
|
{
|
2008-03-05 17:14:58 +00:00
|
|
|
RelationsRef xRelations( new Relations( maBasePath ) );
|
2008-01-17 07:06:10 +00:00
|
|
|
for( const_iterator aIt = begin(), aEnd = end(); aIt != aEnd; ++aIt )
|
|
|
|
if( aIt->second.maType == rType )
|
|
|
|
(*xRelations)[ aIt->first ] = aIt->second;
|
|
|
|
return xRelations;
|
|
|
|
}
|
|
|
|
|
|
|
|
OUString Relations::getTargetFromRelId( const OUString& rRelId ) const
|
|
|
|
{
|
|
|
|
if( const Relation* pRelation = getRelationFromRelId( rRelId ) )
|
|
|
|
return pRelation->maTarget;
|
|
|
|
return OUString();
|
|
|
|
}
|
|
|
|
|
|
|
|
OUString Relations::getTargetFromType( const OUString& rType ) const
|
|
|
|
{
|
|
|
|
if( const Relation* pRelation = getRelationFromType( rType ) )
|
|
|
|
return pRelation->maTarget;
|
|
|
|
return OUString();
|
|
|
|
}
|
|
|
|
|
2008-03-05 17:14:58 +00:00
|
|
|
OUString Relations::getFragmentPathFromTarget( const OUString& rTarget ) const
|
2008-01-17 07:06:10 +00:00
|
|
|
{
|
|
|
|
const sal_Unicode cDirSep = '/';
|
|
|
|
|
|
|
|
// no target, no fragment path
|
|
|
|
if( rTarget.getLength() == 0 )
|
|
|
|
return OUString();
|
|
|
|
|
|
|
|
// absolute target, or empty fragment path -> return target
|
2008-03-05 17:14:58 +00:00
|
|
|
if( (rTarget[ 0 ] == cDirSep) || (maBasePath.getLength() == 0) )
|
2008-01-17 07:06:10 +00:00
|
|
|
return rTarget;
|
|
|
|
|
2008-03-05 17:14:58 +00:00
|
|
|
sal_Int32 nLastSepPos = maBasePath.lastIndexOf( cDirSep );
|
|
|
|
OUString aPath = (nLastSepPos < 0) ? maBasePath : maBasePath.copy( 0, nLastSepPos );
|
2008-01-17 07:06:10 +00:00
|
|
|
|
|
|
|
const OUString sBack = CREATE_OUSTRING( "../" );
|
|
|
|
|
|
|
|
// First, count the number of "../"'s found in relative path string.
|
|
|
|
sal_Int32 nCount = 0, nPos = 0;
|
|
|
|
while ( true )
|
|
|
|
{
|
|
|
|
nPos = rTarget.indexOf(sBack, nCount*3);
|
|
|
|
if ( nPos != nCount*3 )
|
|
|
|
break;
|
|
|
|
++nCount;
|
|
|
|
}
|
|
|
|
|
|
|
|
// Now, reduce the base path's directory level by the count.
|
|
|
|
for ( sal_Int32 i = 0; i < nCount; ++i )
|
|
|
|
{
|
|
|
|
sal_Int32 pos = aPath.lastIndexOf(cDirSep);
|
|
|
|
if ( pos < 0 )
|
|
|
|
// This is unexpected. Bail out.
|
|
|
|
return rTarget;
|
|
|
|
aPath = aPath.copy( 0, pos );
|
|
|
|
}
|
|
|
|
|
|
|
|
aPath += OUString( cDirSep );
|
|
|
|
aPath += rTarget.copy( nCount*3 );
|
|
|
|
return aPath;
|
|
|
|
}
|
|
|
|
|
2008-03-05 17:14:58 +00:00
|
|
|
OUString Relations::getFragmentPathFromRelId( const OUString& rRelId ) const
|
2008-01-17 07:06:10 +00:00
|
|
|
{
|
2008-03-05 17:14:58 +00:00
|
|
|
return getFragmentPathFromTarget( getTargetFromRelId( rRelId ) );
|
2008-01-17 07:06:10 +00:00
|
|
|
}
|
|
|
|
|
2008-03-05 17:14:58 +00:00
|
|
|
OUString Relations::getFragmentPathFromType( const OUString& rType ) const
|
2008-01-17 07:06:10 +00:00
|
|
|
{
|
2008-03-05 17:14:58 +00:00
|
|
|
return getFragmentPathFromTarget( getTargetFromType( rType ) );
|
2008-01-17 07:06:10 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
// ============================================================================
|
|
|
|
|
|
|
|
} // namespace core
|
|
|
|
} // namespace oox
|
|
|
|
|