2010-10-12 15:53:47 +02:00
|
|
|
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
|
2006-10-30 07:35:42 +00:00
|
|
|
/*************************************************************************
|
|
|
|
*
|
2008-04-11 13:05:56 +00:00
|
|
|
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
2006-10-30 07:35:42 +00:00
|
|
|
*
|
2010-02-12 15:01:35 +01:00
|
|
|
* Copyright 2000, 2010 Oracle and/or its affiliates.
|
2006-10-30 07:35:42 +00:00
|
|
|
*
|
2008-04-11 13:05:56 +00:00
|
|
|
* OpenOffice.org - a multi-platform office productivity suite
|
2006-10-30 07:35:42 +00:00
|
|
|
*
|
2008-04-11 13:05:56 +00:00
|
|
|
* This file is part of OpenOffice.org.
|
2006-10-30 07:35:42 +00:00
|
|
|
*
|
2008-04-11 13:05:56 +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.
|
2006-10-30 07:35:42 +00:00
|
|
|
*
|
2008-04-11 13:05:56 +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).
|
2006-10-30 07:35:42 +00:00
|
|
|
*
|
2008-04-11 13:05:56 +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.
|
2006-10-30 07:35:42 +00:00
|
|
|
*
|
|
|
|
************************************************************************/
|
|
|
|
|
|
|
|
|
|
|
|
// MARKER(update_precomp.py): autogen include statement, do not remove
|
|
|
|
#include "precompiled_xmlhelp.hxx"
|
|
|
|
|
2001-07-11 14:35:25 +00:00
|
|
|
#include <string.h>
|
2001-07-17 07:19:42 +00:00
|
|
|
#include <rtl/ustrbuf.hxx>
|
2010-10-10 19:46:48 -05:00
|
|
|
#include <osl/diagnose.h>
|
2001-07-10 17:56:36 +00:00
|
|
|
#include "tvread.hxx"
|
2004-09-08 15:15:14 +00:00
|
|
|
#include <expat.h>
|
2001-07-11 14:35:25 +00:00
|
|
|
#include <osl/file.hxx>
|
2001-07-12 12:32:24 +00:00
|
|
|
#include <com/sun/star/frame/XConfigManager.hpp>
|
|
|
|
#include <com/sun/star/beans/PropertyValue.hpp>
|
|
|
|
|
2008-02-26 06:46:59 +00:00
|
|
|
#include <comphelper/processfactory.hxx>
|
|
|
|
#include <com/sun/star/beans/XPropertySet.hpp>
|
|
|
|
#include "com/sun/star/deployment/thePackageManagerFactory.hpp"
|
|
|
|
#include <com/sun/star/util/XMacroExpander.hpp>
|
|
|
|
#include <com/sun/star/uri/XUriReferenceFactory.hpp>
|
|
|
|
#include <com/sun/star/uri/XVndSunStarExpandUrl.hpp>
|
2009-05-15 12:21:35 +00:00
|
|
|
#include <comphelper/locale.hxx>
|
2008-02-26 06:46:59 +00:00
|
|
|
|
2001-07-12 12:32:24 +00:00
|
|
|
namespace treeview {
|
|
|
|
|
|
|
|
|
|
|
|
class TVDom
|
|
|
|
{
|
|
|
|
friend class TVChildTarget;
|
|
|
|
friend class TVRead;
|
|
|
|
|
|
|
|
public:
|
|
|
|
|
|
|
|
TVDom( TVDom* arent = 0 )
|
2006-06-19 23:42:44 +00:00
|
|
|
: kind( other ),
|
|
|
|
parent( arent ),
|
|
|
|
childs( 0 )
|
2001-07-12 12:32:24 +00:00
|
|
|
{
|
|
|
|
}
|
|
|
|
|
|
|
|
~TVDom()
|
|
|
|
{
|
|
|
|
for( unsigned i = 0; i < childs.size(); ++i )
|
|
|
|
delete childs[i];
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
TVDom* newChild()
|
|
|
|
{
|
|
|
|
childs.push_back( new TVDom( this ) );
|
|
|
|
return childs.back();
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
TVDom* getParent() const
|
|
|
|
{
|
2001-10-22 09:55:31 +00:00
|
|
|
if( parent )
|
|
|
|
return parent;
|
|
|
|
else
|
|
|
|
return const_cast<TVDom*>(this); // I am my own parent, if I am the root
|
2001-07-12 12:32:24 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
enum Kind {
|
|
|
|
tree_view,
|
|
|
|
tree_node,
|
|
|
|
tree_leaf,
|
|
|
|
other
|
|
|
|
};
|
|
|
|
|
|
|
|
bool isLeaf() const { return kind == TVDom::tree_leaf; }
|
|
|
|
void setKind( Kind ind ) { kind = ind; }
|
|
|
|
Kind getKind( ) const { return kind; }
|
|
|
|
|
|
|
|
|
|
|
|
void setApplication( const char* appl )
|
|
|
|
{
|
|
|
|
application = rtl::OUString( (sal_Char*)(appl),
|
|
|
|
strlen( appl ),
|
|
|
|
RTL_TEXTENCODING_UTF8 );
|
|
|
|
}
|
|
|
|
|
|
|
|
void setTitle( const char* itle )
|
|
|
|
{
|
2005-03-23 12:04:52 +00:00
|
|
|
title += rtl::OUString( (sal_Char*)(itle),
|
|
|
|
strlen( itle ),
|
|
|
|
RTL_TEXTENCODING_UTF8 );
|
2001-07-12 12:32:24 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
void setTitle( const XML_Char* itle,int len )
|
|
|
|
{
|
2005-03-23 12:04:52 +00:00
|
|
|
title += rtl::OUString( (sal_Char*)(itle),
|
|
|
|
len,
|
|
|
|
RTL_TEXTENCODING_UTF8 );
|
2001-07-12 12:32:24 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
void setId( const char* d )
|
|
|
|
{
|
|
|
|
id = rtl::OUString( (sal_Char*)(d),
|
|
|
|
strlen( d ),
|
|
|
|
RTL_TEXTENCODING_UTF8 );
|
|
|
|
}
|
|
|
|
|
|
|
|
void setAnchor( const char* nchor )
|
|
|
|
{
|
|
|
|
anchor = rtl::OUString( (sal_Char*)(nchor),
|
|
|
|
strlen( nchor ),
|
|
|
|
RTL_TEXTENCODING_UTF8 );
|
|
|
|
}
|
|
|
|
|
|
|
|
rtl::OUString getTargetURL()
|
|
|
|
{
|
|
|
|
if( ! targetURL.getLength() )
|
|
|
|
{
|
2001-07-17 07:19:42 +00:00
|
|
|
sal_Int32 len;
|
2006-10-12 10:28:52 +00:00
|
|
|
for ( const TVDom* p = this;; p = p->parent )
|
|
|
|
{
|
|
|
|
len = p->application.getLength();
|
|
|
|
if ( len != 0 )
|
|
|
|
break;
|
|
|
|
}
|
2001-07-12 12:32:24 +00:00
|
|
|
|
2001-07-17 07:19:42 +00:00
|
|
|
rtl::OUStringBuffer strBuff( 22 + len + id.getLength() );
|
|
|
|
strBuff.appendAscii(
|
2004-08-30 16:27:58 +00:00
|
|
|
"vnd.sun.star.help://"
|
|
|
|
).append(id);
|
2001-07-17 07:19:42 +00:00
|
|
|
|
|
|
|
targetURL = strBuff.makeStringAndClear();
|
2001-07-12 12:32:24 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
return targetURL;
|
|
|
|
}
|
|
|
|
|
|
|
|
private:
|
|
|
|
|
|
|
|
Kind kind;
|
|
|
|
rtl::OUString application;
|
|
|
|
rtl::OUString title;
|
|
|
|
rtl::OUString id;
|
|
|
|
rtl::OUString anchor;
|
|
|
|
rtl::OUString targetURL;
|
|
|
|
|
|
|
|
TVDom *parent;
|
|
|
|
std::vector< TVDom* > childs;
|
|
|
|
};
|
|
|
|
|
|
|
|
}
|
|
|
|
|
2001-07-11 14:35:25 +00:00
|
|
|
|
2001-07-10 17:56:36 +00:00
|
|
|
|
|
|
|
using namespace treeview;
|
|
|
|
using namespace com::sun::star;
|
|
|
|
using namespace com::sun::star::uno;
|
2001-07-12 12:32:24 +00:00
|
|
|
using namespace com::sun::star::beans;
|
2001-07-10 17:56:36 +00:00
|
|
|
using namespace com::sun::star::lang;
|
|
|
|
using namespace com::sun::star::util;
|
2001-07-12 12:32:24 +00:00
|
|
|
using namespace com::sun::star::frame;
|
2001-07-10 17:56:36 +00:00
|
|
|
using namespace com::sun::star::container;
|
2008-02-26 06:46:59 +00:00
|
|
|
using namespace com::sun::star::deployment;
|
2001-07-10 17:56:36 +00:00
|
|
|
|
|
|
|
|
2001-10-31 12:53:36 +00:00
|
|
|
ConfigData::ConfigData()
|
2010-11-05 14:38:22 +00:00
|
|
|
: prodName(RTL_CONSTASCII_USTRINGPARAM("%PRODUCTNAME")),
|
|
|
|
prodVersion(RTL_CONSTASCII_USTRINGPARAM("%PRODUCTVERSION")),
|
|
|
|
vendName(RTL_CONSTASCII_USTRINGPARAM("%VENDORNAME")),
|
|
|
|
vendVersion(RTL_CONSTASCII_USTRINGPARAM("%VENDORVERSION")),
|
|
|
|
vendShort(RTL_CONSTASCII_USTRINGPARAM("%VENDORSHORT"))
|
2001-10-31 12:53:36 +00:00
|
|
|
{
|
|
|
|
}
|
2001-07-10 17:56:36 +00:00
|
|
|
|
2001-10-31 12:03:33 +00:00
|
|
|
void SAL_CALL ConfigData::replaceName( rtl::OUString& oustring ) const
|
|
|
|
{
|
2001-10-31 12:53:36 +00:00
|
|
|
sal_Int32 idx = -1,k = 0,off;
|
2001-10-31 12:03:33 +00:00
|
|
|
bool cap = false;
|
|
|
|
rtl::OUStringBuffer aStrBuf( 0 );
|
|
|
|
|
|
|
|
while( ( idx = oustring.indexOf( sal_Unicode('%'),++idx ) ) != -1 )
|
|
|
|
{
|
2001-10-31 12:53:36 +00:00
|
|
|
if( oustring.indexOf( prodName,idx ) == idx )
|
2001-10-31 12:03:33 +00:00
|
|
|
off = PRODUCTNAME;
|
2001-10-31 12:53:36 +00:00
|
|
|
else if( oustring.indexOf( prodVersion,idx ) == idx )
|
2001-10-31 12:03:33 +00:00
|
|
|
off = PRODUCTVERSION;
|
2001-10-31 12:53:36 +00:00
|
|
|
else if( oustring.indexOf( vendName,idx ) == idx )
|
2001-10-31 12:03:33 +00:00
|
|
|
off = VENDORNAME;
|
2001-10-31 12:53:36 +00:00
|
|
|
else if( oustring.indexOf( vendVersion,idx ) == idx )
|
2001-10-31 12:03:33 +00:00
|
|
|
off = VENDORVERSION;
|
2001-10-31 12:53:36 +00:00
|
|
|
else if( oustring.indexOf( vendShort,idx ) == idx )
|
2001-10-31 12:03:33 +00:00
|
|
|
off = VENDORSHORT;
|
|
|
|
else
|
2001-10-31 12:53:36 +00:00
|
|
|
off = -1;
|
2001-10-31 12:03:33 +00:00
|
|
|
|
2001-10-31 12:53:36 +00:00
|
|
|
if( off != -1 )
|
2001-10-31 12:03:33 +00:00
|
|
|
{
|
|
|
|
if( ! cap )
|
|
|
|
{
|
|
|
|
cap = true;
|
|
|
|
aStrBuf.ensureCapacity( 256 );
|
|
|
|
}
|
|
|
|
|
|
|
|
aStrBuf.append( &oustring.getStr()[k],idx - k );
|
|
|
|
aStrBuf.append( m_vReplacement[off] );
|
2001-10-31 12:53:36 +00:00
|
|
|
k = idx + m_vAdd[off];
|
2001-10-31 12:03:33 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
if( cap )
|
|
|
|
{
|
|
|
|
if( k < oustring.getLength() )
|
|
|
|
aStrBuf.append( &oustring.getStr()[k],oustring.getLength()-k );
|
|
|
|
oustring = aStrBuf.makeStringAndClear();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
2001-07-10 17:56:36 +00:00
|
|
|
|
|
|
|
//////////////////////////////////////////////////////////////////////////
|
|
|
|
// XInterface
|
|
|
|
//////////////////////////////////////////////////////////////////////////
|
|
|
|
|
|
|
|
|
|
|
|
void SAL_CALL
|
2001-07-12 14:48:32 +00:00
|
|
|
TVBase::acquire(
|
2001-07-10 17:56:36 +00:00
|
|
|
void )
|
2001-10-26 10:42:02 +00:00
|
|
|
throw()
|
2001-07-10 17:56:36 +00:00
|
|
|
{
|
|
|
|
OWeakObject::acquire();
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void SAL_CALL
|
2001-07-12 14:48:32 +00:00
|
|
|
TVBase::release(
|
2001-07-10 17:56:36 +00:00
|
|
|
void )
|
2001-10-26 10:42:02 +00:00
|
|
|
throw()
|
2001-07-10 17:56:36 +00:00
|
|
|
{
|
|
|
|
OWeakObject::release();
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
Any SAL_CALL
|
2001-07-12 14:48:32 +00:00
|
|
|
TVBase::queryInterface(
|
2001-07-10 17:56:36 +00:00
|
|
|
const Type& rType )
|
|
|
|
throw( RuntimeException )
|
|
|
|
{
|
|
|
|
Any aRet = cppu::queryInterface( rType,
|
|
|
|
SAL_STATIC_CAST( XTypeProvider*, this ),
|
|
|
|
SAL_STATIC_CAST( XNameAccess*, this ),
|
|
|
|
SAL_STATIC_CAST( XHierarchicalNameAccess*, this ),
|
|
|
|
SAL_STATIC_CAST( XChangesNotifier*, this ),
|
|
|
|
SAL_STATIC_CAST( XComponent*, this ) );
|
|
|
|
|
|
|
|
return aRet.hasValue() ? aRet : OWeakObject::queryInterface( rType );
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
|
|
//
|
|
|
|
// XTypeProvider methods.
|
|
|
|
|
2001-07-12 14:48:32 +00:00
|
|
|
XTYPEPROVIDER_IMPL_5( TVBase,
|
2001-07-10 17:56:36 +00:00
|
|
|
XTypeProvider,
|
|
|
|
XNameAccess,
|
|
|
|
XHierarchicalNameAccess,
|
|
|
|
XChangesNotifier,
|
|
|
|
XComponent );
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2001-07-12 14:48:32 +00:00
|
|
|
|
|
|
|
|
|
|
|
// TVRead
|
|
|
|
|
|
|
|
|
|
|
|
TVRead::TVRead( const ConfigData& configData,TVDom* tvDom )
|
|
|
|
{
|
|
|
|
if( ! tvDom )
|
|
|
|
return;
|
|
|
|
|
|
|
|
Title = tvDom->title;
|
2001-10-31 12:03:33 +00:00
|
|
|
configData.replaceName( Title );
|
2001-07-12 14:48:32 +00:00
|
|
|
if( tvDom->isLeaf() )
|
|
|
|
{
|
|
|
|
TargetURL = ( tvDom->getTargetURL() + configData.appendix );
|
|
|
|
if( tvDom->anchor.getLength() )
|
2010-11-05 14:38:22 +00:00
|
|
|
TargetURL += ( rtl::OUString(RTL_CONSTASCII_USTRINGPARAM( "#" )) +
|
2001-07-12 14:48:32 +00:00
|
|
|
tvDom->anchor );
|
|
|
|
}
|
|
|
|
else
|
|
|
|
Children = new TVChildTarget( configData,tvDom );
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
TVRead::~TVRead()
|
|
|
|
{
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2001-07-10 17:56:36 +00:00
|
|
|
// XNameAccess
|
|
|
|
|
|
|
|
Any SAL_CALL
|
|
|
|
TVRead::getByName( const rtl::OUString& aName )
|
|
|
|
throw( NoSuchElementException,
|
|
|
|
WrappedTargetException,
|
2001-07-11 14:35:25 +00:00
|
|
|
RuntimeException )
|
2001-07-10 17:56:36 +00:00
|
|
|
{
|
2001-07-11 14:35:25 +00:00
|
|
|
bool found( true );
|
2001-07-10 17:56:36 +00:00
|
|
|
Any aAny;
|
|
|
|
if( aName.compareToAscii( "Title" ) == 0 )
|
|
|
|
aAny <<= Title;
|
|
|
|
else if( aName.compareToAscii( "TargetURL" ) == 0 )
|
|
|
|
aAny <<= TargetURL;
|
2001-07-11 14:35:25 +00:00
|
|
|
else if( aName.compareToAscii( "Children" ) == 0 )
|
2001-07-10 17:56:36 +00:00
|
|
|
{
|
2001-07-11 14:35:25 +00:00
|
|
|
cppu::OWeakObject* p = Children.get();
|
|
|
|
aAny <<= Reference< XInterface >( p );
|
2001-07-10 17:56:36 +00:00
|
|
|
}
|
2001-07-11 14:35:25 +00:00
|
|
|
else
|
|
|
|
found = false;
|
2001-07-10 17:56:36 +00:00
|
|
|
|
2001-07-11 14:35:25 +00:00
|
|
|
if( found )
|
|
|
|
return aAny;
|
|
|
|
|
|
|
|
throw NoSuchElementException();
|
2001-07-10 17:56:36 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Sequence< rtl::OUString > SAL_CALL
|
|
|
|
TVRead::getElementNames( )
|
|
|
|
throw( RuntimeException )
|
|
|
|
{
|
2001-07-11 14:35:25 +00:00
|
|
|
Sequence< rtl::OUString > seq( 3 );
|
|
|
|
|
2010-11-05 14:38:22 +00:00
|
|
|
seq[0] = rtl::OUString(RTL_CONSTASCII_USTRINGPARAM( "Title" ));
|
|
|
|
seq[1] = rtl::OUString(RTL_CONSTASCII_USTRINGPARAM( "TargetURL" ));
|
|
|
|
seq[2] = rtl::OUString(RTL_CONSTASCII_USTRINGPARAM( "Children" ));
|
2001-07-10 17:56:36 +00:00
|
|
|
|
|
|
|
return seq;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
sal_Bool SAL_CALL
|
|
|
|
TVRead::hasByName( const rtl::OUString& aName )
|
|
|
|
throw( RuntimeException )
|
|
|
|
{
|
|
|
|
if( aName.compareToAscii( "Title" ) == 0 ||
|
2001-07-11 14:35:25 +00:00
|
|
|
aName.compareToAscii( "TargetURL" ) == 0 ||
|
|
|
|
aName.compareToAscii( "Children" ) == 0 )
|
2001-07-10 17:56:36 +00:00
|
|
|
return true;
|
|
|
|
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// XHierarchicalNameAccess
|
|
|
|
|
|
|
|
Any SAL_CALL
|
|
|
|
TVRead::getByHierarchicalName( const rtl::OUString& aName )
|
|
|
|
throw( NoSuchElementException,
|
|
|
|
RuntimeException )
|
|
|
|
{
|
|
|
|
sal_Int32 idx;
|
|
|
|
rtl::OUString name( aName );
|
2001-07-11 14:35:25 +00:00
|
|
|
|
|
|
|
if( ( idx = name.indexOf( sal_Unicode( '/' ) ) ) != -1 &&
|
|
|
|
name.copy( 0,idx ).compareToAscii( "Children" ) == 0 )
|
|
|
|
return Children->getByHierarchicalName( name.copy( 1 + idx ) );
|
|
|
|
|
|
|
|
return getByName( name );
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
sal_Bool SAL_CALL
|
|
|
|
TVRead::hasByHierarchicalName( const rtl::OUString& aName )
|
|
|
|
throw( RuntimeException )
|
|
|
|
{
|
|
|
|
sal_Int32 idx;
|
|
|
|
rtl::OUString name( aName );
|
|
|
|
|
|
|
|
if( ( idx = name.indexOf( sal_Unicode( '/' ) ) ) != -1 &&
|
|
|
|
name.copy( 0,idx ).compareToAscii( "Children" ) == 0 )
|
|
|
|
return Children->hasByHierarchicalName( name.copy( 1 + idx ) );
|
|
|
|
|
|
|
|
return hasByName( name );
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**************************************************************************/
|
|
|
|
/* */
|
|
|
|
/* TVChildTarget */
|
|
|
|
/* */
|
|
|
|
/**************************************************************************/
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2006-06-19 23:42:44 +00:00
|
|
|
extern "C" void start_handler(void *userData,
|
2001-07-11 14:35:25 +00:00
|
|
|
const XML_Char *name,
|
|
|
|
const XML_Char **atts)
|
|
|
|
{
|
2001-07-12 12:32:24 +00:00
|
|
|
TVDom::Kind kind;
|
2001-07-11 14:35:25 +00:00
|
|
|
|
2001-07-12 12:32:24 +00:00
|
|
|
if( strcmp( name,"help_section" ) == 0 ||
|
|
|
|
strcmp( name,"node" ) == 0 )
|
|
|
|
kind = TVDom::tree_node;
|
|
|
|
else if( strcmp( name,"topic" ) == 0 )
|
|
|
|
kind = TVDom::tree_leaf;
|
|
|
|
else
|
|
|
|
return;
|
2001-07-11 14:35:25 +00:00
|
|
|
|
2001-07-12 12:32:24 +00:00
|
|
|
TVDom **tvDom = static_cast< TVDom** >( userData );
|
|
|
|
TVDom *p;
|
|
|
|
p = *tvDom;
|
2001-07-11 14:35:25 +00:00
|
|
|
|
2001-07-12 13:35:29 +00:00
|
|
|
*tvDom = p->newChild();
|
|
|
|
p = *tvDom;
|
2001-07-11 14:35:25 +00:00
|
|
|
|
2001-07-12 12:32:24 +00:00
|
|
|
p->setKind( kind );
|
|
|
|
while( *atts )
|
|
|
|
{
|
|
|
|
if( strcmp( *atts,"application" ) == 0 )
|
|
|
|
p->setApplication( *(atts+1) );
|
|
|
|
else if( strcmp( *atts,"title" ) == 0 )
|
|
|
|
p->setTitle( *(atts+1) );
|
|
|
|
else if( strcmp( *atts,"id" ) == 0 )
|
|
|
|
p->setId( *(atts+1) );
|
|
|
|
else if( strcmp( *atts,"anchor" ) == 0 )
|
|
|
|
p->setAnchor( *(atts+1) );
|
|
|
|
|
|
|
|
atts+=2;
|
2001-07-11 14:35:25 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2006-06-19 23:42:44 +00:00
|
|
|
extern "C" void end_handler(void *userData,
|
2001-07-11 14:35:25 +00:00
|
|
|
const XML_Char *name )
|
|
|
|
{
|
2006-06-19 23:42:44 +00:00
|
|
|
(void)name;
|
|
|
|
|
2001-07-12 12:32:24 +00:00
|
|
|
TVDom **tvDom = static_cast< TVDom** >( userData );
|
2001-07-12 13:35:29 +00:00
|
|
|
*tvDom = (*tvDom)->getParent();
|
2001-07-11 14:35:25 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
2006-06-19 23:42:44 +00:00
|
|
|
extern "C" void data_handler( void *userData,
|
2001-07-11 14:35:25 +00:00
|
|
|
const XML_Char *s,
|
|
|
|
int len)
|
|
|
|
{
|
2001-07-12 12:32:24 +00:00
|
|
|
TVDom **tvDom = static_cast< TVDom** >( userData );
|
|
|
|
if( (*tvDom)->isLeaf() )
|
|
|
|
(*tvDom)->setTitle( s,len );
|
2001-07-11 14:35:25 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
2001-07-12 12:32:24 +00:00
|
|
|
|
|
|
|
TVChildTarget::TVChildTarget( const ConfigData& configData,TVDom* tvDom )
|
2001-07-11 14:35:25 +00:00
|
|
|
{
|
2001-07-12 12:32:24 +00:00
|
|
|
Elements.resize( tvDom->childs.size() );
|
|
|
|
for( unsigned i = 0; i < Elements.size(); ++i )
|
|
|
|
Elements[i] = new TVRead( configData,tvDom->childs[i] );
|
2001-07-11 14:35:25 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2001-07-12 12:32:24 +00:00
|
|
|
TVChildTarget::TVChildTarget( const Reference< XMultiServiceFactory >& xMSF )
|
2001-07-11 14:35:25 +00:00
|
|
|
{
|
2001-07-12 12:32:24 +00:00
|
|
|
ConfigData configData = init( xMSF );
|
2001-07-11 14:35:25 +00:00
|
|
|
|
2001-10-22 09:55:31 +00:00
|
|
|
if( ! configData.locale.getLength() ||
|
|
|
|
! configData.system.getLength() )
|
2001-07-12 12:32:24 +00:00
|
|
|
return;
|
2001-07-11 14:35:25 +00:00
|
|
|
|
2001-10-22 09:55:31 +00:00
|
|
|
sal_uInt64 ret,len = 0;
|
2008-02-26 06:46:59 +00:00
|
|
|
int j = configData.vFileURL.size();
|
2001-07-11 14:35:25 +00:00
|
|
|
|
2001-07-12 12:32:24 +00:00
|
|
|
TVDom tvDom;
|
|
|
|
TVDom* pTVDom = &tvDom;
|
2001-07-11 14:35:25 +00:00
|
|
|
|
2001-10-22 09:55:31 +00:00
|
|
|
while( j )
|
|
|
|
{
|
2008-02-26 06:46:59 +00:00
|
|
|
len = configData.vFileLen[--j];
|
2001-10-22 09:55:31 +00:00
|
|
|
char* s = new char[ int(len) ]; // the buffer to hold the installed files
|
2008-02-26 06:46:59 +00:00
|
|
|
osl::File aFile( configData.vFileURL[j] );
|
2001-10-22 09:55:31 +00:00
|
|
|
aFile.open( OpenFlag_Read );
|
|
|
|
aFile.read( s,len,ret );
|
|
|
|
aFile.close();
|
|
|
|
|
|
|
|
XML_Parser parser = XML_ParserCreate( 0 );
|
|
|
|
XML_SetElementHandler( parser,
|
|
|
|
start_handler,
|
|
|
|
end_handler );
|
|
|
|
XML_SetCharacterDataHandler( parser,
|
|
|
|
data_handler);
|
|
|
|
XML_SetUserData( parser,&pTVDom ); // does not return this
|
|
|
|
|
|
|
|
int parsed = XML_Parse( parser,s,int( len ),j==0 );
|
2006-06-19 23:42:44 +00:00
|
|
|
(void)parsed;
|
2008-02-26 06:46:59 +00:00
|
|
|
OSL_ENSURE( parsed, "TVChildTarget::TVChildTarget(): Tree file parsing failed" );
|
2001-10-22 09:55:31 +00:00
|
|
|
|
|
|
|
XML_ParserFree( parser );
|
|
|
|
delete[] s;
|
|
|
|
}
|
2001-07-12 12:32:24 +00:00
|
|
|
|
|
|
|
// now TVDom holds the relevant information
|
|
|
|
|
|
|
|
Elements.resize( tvDom.childs.size() );
|
|
|
|
for( unsigned i = 0; i < Elements.size(); ++i )
|
|
|
|
Elements[i] = new TVRead( configData,tvDom.childs[i] );
|
2001-07-11 14:35:25 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
TVChildTarget::~TVChildTarget()
|
|
|
|
{
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Any SAL_CALL
|
|
|
|
TVChildTarget::getByName( const rtl::OUString& aName )
|
|
|
|
throw( NoSuchElementException,
|
|
|
|
WrappedTargetException,
|
|
|
|
RuntimeException )
|
|
|
|
{
|
2001-07-12 14:33:36 +00:00
|
|
|
rtl::OUString num( aName.getStr()+2,aName.getLength()-4 );
|
|
|
|
sal_Int32 idx = num.toInt32() - 1;
|
2001-07-11 14:35:25 +00:00
|
|
|
if( idx < 0 || Elements.size() <= sal_uInt32( idx ) )
|
|
|
|
throw NoSuchElementException();
|
|
|
|
|
|
|
|
Any aAny;
|
|
|
|
cppu::OWeakObject* p = Elements[idx].get();
|
|
|
|
aAny <<= Reference< XInterface >( p );
|
|
|
|
return aAny;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Sequence< rtl::OUString > SAL_CALL
|
|
|
|
TVChildTarget::getElementNames( )
|
|
|
|
throw( RuntimeException )
|
|
|
|
{
|
|
|
|
Sequence< rtl::OUString > seq( Elements.size() );
|
|
|
|
for( unsigned i = 0; i < Elements.size(); ++i )
|
|
|
|
seq[i] = rtl::OUString::valueOf( sal_Int32( 1+i ) );
|
|
|
|
|
|
|
|
return seq;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
sal_Bool SAL_CALL
|
|
|
|
TVChildTarget::hasByName( const rtl::OUString& aName )
|
|
|
|
throw( RuntimeException )
|
|
|
|
{
|
2001-07-12 14:33:36 +00:00
|
|
|
rtl::OUString num( aName.getStr()+2,aName.getLength()-4 );
|
|
|
|
sal_Int32 idx = num.toInt32() - 1;
|
2001-07-11 14:35:25 +00:00
|
|
|
if( idx < 0 || Elements.size() <= sal_uInt32( idx ) )
|
|
|
|
return false;
|
|
|
|
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// XHierarchicalNameAccess
|
|
|
|
|
|
|
|
Any SAL_CALL
|
|
|
|
TVChildTarget::getByHierarchicalName( const rtl::OUString& aName )
|
|
|
|
throw( NoSuchElementException,
|
|
|
|
RuntimeException )
|
|
|
|
{
|
|
|
|
sal_Int32 idx;
|
|
|
|
rtl::OUString name( aName );
|
|
|
|
|
2001-07-10 17:56:36 +00:00
|
|
|
if( ( idx = name.indexOf( sal_Unicode( '/' ) ) ) != -1 )
|
|
|
|
{
|
2001-07-12 14:33:36 +00:00
|
|
|
rtl::OUString num( name.getStr()+2,idx-4 );
|
|
|
|
sal_Int32 pref = num.toInt32() - 1;
|
2001-07-11 14:35:25 +00:00
|
|
|
|
|
|
|
if( pref < 0 || Elements.size() <= sal_uInt32( pref ) )
|
2001-07-10 17:56:36 +00:00
|
|
|
throw NoSuchElementException();
|
|
|
|
|
2001-07-11 14:35:25 +00:00
|
|
|
return Elements[pref]->getByHierarchicalName( name.copy( 1 + idx ) );
|
|
|
|
}
|
|
|
|
else
|
|
|
|
return getByName( name );
|
2001-07-10 17:56:36 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
sal_Bool SAL_CALL
|
2001-07-11 14:35:25 +00:00
|
|
|
TVChildTarget::hasByHierarchicalName( const rtl::OUString& aName )
|
2001-07-10 17:56:36 +00:00
|
|
|
throw( RuntimeException )
|
|
|
|
{
|
|
|
|
sal_Int32 idx;
|
|
|
|
rtl::OUString name( aName );
|
2001-07-11 14:35:25 +00:00
|
|
|
|
2001-07-10 17:56:36 +00:00
|
|
|
if( ( idx = name.indexOf( sal_Unicode( '/' ) ) ) != -1 )
|
|
|
|
{
|
2001-07-12 14:33:36 +00:00
|
|
|
rtl::OUString num( name.getStr()+2,idx-4 );
|
|
|
|
sal_Int32 pref = num.toInt32() - 1;
|
2001-07-11 14:35:25 +00:00
|
|
|
if( pref < 0 || Elements.size() <= sal_uInt32( pref ) )
|
2001-07-10 17:56:36 +00:00
|
|
|
return false;
|
|
|
|
|
2001-07-11 14:35:25 +00:00
|
|
|
return Elements[pref]->hasByHierarchicalName( name.copy( 1 + idx ) );
|
|
|
|
}
|
|
|
|
else
|
|
|
|
return hasByName( name );
|
2001-07-10 17:56:36 +00:00
|
|
|
}
|
2001-07-12 12:32:24 +00:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
ConfigData TVChildTarget::init( const Reference< XMultiServiceFactory >& xSMgr )
|
|
|
|
{
|
|
|
|
ConfigData configData;
|
2001-10-31 12:03:33 +00:00
|
|
|
Reference< XMultiServiceFactory > sProvider( getConfiguration(xSMgr) );
|
|
|
|
|
|
|
|
/**********************************************************************/
|
|
|
|
/* reading Office.Common */
|
|
|
|
/**********************************************************************/
|
|
|
|
|
|
|
|
Reference< XHierarchicalNameAccess > xHierAccess( getHierAccess( sProvider,
|
|
|
|
"org.openoffice.Office.Common" ) );
|
|
|
|
rtl::OUString system( getKey( xHierAccess,"Help/System" ) );
|
2005-11-11 11:17:25 +00:00
|
|
|
sal_Bool showBasic( getBooleanKey(xHierAccess,"Help/ShowBasic") );
|
2001-10-31 12:03:33 +00:00
|
|
|
rtl::OUString instPath( getKey( xHierAccess,"Path/Current/Help" ) );
|
|
|
|
if( ! instPath.getLength() )
|
2005-11-11 11:17:25 +00:00
|
|
|
// try to determine path from default
|
2010-11-05 14:38:22 +00:00
|
|
|
instPath = rtl::OUString(RTL_CONSTASCII_USTRINGPARAM( "$(instpath)/help" ));
|
2001-10-31 12:03:33 +00:00
|
|
|
|
|
|
|
// replace anything like $(instpath);
|
|
|
|
subst( xSMgr,instPath );
|
|
|
|
|
|
|
|
/**********************************************************************/
|
|
|
|
/* reading setup */
|
|
|
|
/**********************************************************************/
|
|
|
|
|
|
|
|
xHierAccess = getHierAccess( sProvider,
|
|
|
|
"org.openoffice.Setup" );
|
|
|
|
|
|
|
|
rtl::OUString productName( getKey( xHierAccess,"Product/ooName" ) );
|
2009-05-18 15:01:59 +02:00
|
|
|
rtl::OUString setupversion( getKey( xHierAccess,"Product/ooSetupVersion" ) );
|
|
|
|
rtl::OUString setupextension;
|
2009-09-17 10:46:21 +02:00
|
|
|
|
|
|
|
try
|
|
|
|
{
|
|
|
|
uno::Reference< lang::XMultiServiceFactory > xConfigProvider(
|
2010-11-05 14:38:22 +00:00
|
|
|
xSMgr ->createInstance(::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("com.sun.star.configuration.ConfigurationProvider"))), uno::UNO_QUERY_THROW);
|
2009-09-17 10:46:21 +02:00
|
|
|
|
|
|
|
uno::Sequence < uno::Any > lParams(1);
|
|
|
|
beans::PropertyValue aParam ;
|
2010-11-05 14:38:22 +00:00
|
|
|
aParam.Name = ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("nodepath"));
|
|
|
|
aParam.Value <<= ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("/org.openoffice.Setup/Product"));
|
2009-09-17 10:46:21 +02:00
|
|
|
lParams[0] = uno::makeAny(aParam);
|
|
|
|
|
|
|
|
// open it
|
|
|
|
uno::Reference< uno::XInterface > xCFG( xConfigProvider->createInstanceWithArguments(
|
2010-11-05 14:38:22 +00:00
|
|
|
::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("com.sun.star.configuration.ConfigurationAccess")),
|
2009-09-17 10:46:21 +02:00
|
|
|
lParams) );
|
|
|
|
|
|
|
|
uno::Reference< container::XNameAccess > xDirectAccess(xCFG, uno::UNO_QUERY);
|
2010-11-05 14:38:22 +00:00
|
|
|
uno::Any aRet = xDirectAccess->getByName(::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("ooSetupExtension")));
|
2009-09-17 10:46:21 +02:00
|
|
|
|
|
|
|
aRet >>= setupextension;
|
2008-07-02 08:36:35 +00:00
|
|
|
}
|
2009-09-17 10:46:21 +02:00
|
|
|
catch ( uno::Exception& )
|
|
|
|
{
|
|
|
|
}
|
|
|
|
|
2001-10-31 12:03:33 +00:00
|
|
|
rtl::OUString productVersion( setupversion +
|
2010-11-05 14:38:22 +00:00
|
|
|
rtl::OUString(RTL_CONSTASCII_USTRINGPARAM( " " )) +
|
2001-10-31 12:03:33 +00:00
|
|
|
setupextension );
|
|
|
|
rtl::OUString locale( getKey( xHierAccess,"L10N/ooLocale" ) );
|
2001-07-12 12:32:24 +00:00
|
|
|
|
|
|
|
|
2001-10-31 12:03:33 +00:00
|
|
|
// Determine fileurl from url and locale
|
2001-07-12 12:32:24 +00:00
|
|
|
rtl::OUString url;
|
|
|
|
osl::FileBase::RC errFile = osl::FileBase::getFileURLFromSystemPath( instPath,url );
|
2001-10-31 12:03:33 +00:00
|
|
|
if( errFile != osl::FileBase::E_None ) return configData;
|
2001-07-12 12:32:24 +00:00
|
|
|
if( url.lastIndexOf( sal_Unicode( '/' ) ) != url.getLength() - 1 )
|
2010-11-05 14:38:22 +00:00
|
|
|
url += rtl::OUString(RTL_CONSTASCII_USTRINGPARAM( "/" ));
|
2001-07-12 12:32:24 +00:00
|
|
|
rtl::OUString ret;
|
|
|
|
sal_Int32 idx;
|
|
|
|
osl::DirectoryItem aDirItem;
|
|
|
|
if( osl::FileBase::E_None == osl::DirectoryItem::get( url + locale,aDirItem ) )
|
|
|
|
ret = locale;
|
|
|
|
else if( ( ( idx = locale.indexOf( '-' ) ) != -1 ||
|
|
|
|
( idx = locale.indexOf( '_' ) ) != -1 ) &&
|
|
|
|
osl::FileBase::E_None == osl::DirectoryItem::get( url + locale.copy( 0,idx ),
|
|
|
|
aDirItem ) )
|
|
|
|
ret = locale.copy( 0,idx );
|
2006-11-01 12:50:18 +00:00
|
|
|
else
|
|
|
|
{
|
2010-11-05 14:38:22 +00:00
|
|
|
locale = rtl::OUString(RTL_CONSTASCII_USTRINGPARAM( "en-US" ));
|
|
|
|
ret = rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("en"));
|
2006-11-01 12:50:18 +00:00
|
|
|
}
|
2001-10-22 09:55:31 +00:00
|
|
|
url = url + ret;
|
2001-07-12 12:32:24 +00:00
|
|
|
|
2001-10-22 09:55:31 +00:00
|
|
|
// first of all, try do determine whether there are any *.tree files present
|
2001-07-12 12:32:24 +00:00
|
|
|
|
2008-02-26 06:46:59 +00:00
|
|
|
// Start with extensions to set them at the end of the list
|
|
|
|
TreeFileIterator aTreeIt( locale );
|
|
|
|
rtl::OUString aTreeFile;
|
|
|
|
sal_Int32 nFileSize;
|
|
|
|
while( (aTreeFile = aTreeIt.nextTreeFile( nFileSize ) ).getLength() > 0 )
|
|
|
|
{
|
|
|
|
configData.vFileLen.push_back( nFileSize );
|
|
|
|
configData.vFileURL.push_back( aTreeFile );
|
|
|
|
}
|
|
|
|
|
2001-10-22 09:55:31 +00:00
|
|
|
osl::Directory aDirectory( url );
|
2005-11-11 11:17:25 +00:00
|
|
|
osl::FileStatus aFileStatus( FileStatusMask_FileName | FileStatusMask_FileSize | FileStatusMask_FileURL );
|
2001-10-22 09:55:31 +00:00
|
|
|
if( osl::Directory::E_None == aDirectory.open() )
|
|
|
|
{
|
2008-02-26 06:46:59 +00:00
|
|
|
int idx_ = 0;
|
2005-11-11 11:17:25 +00:00
|
|
|
rtl::OUString aFileUrl, aFileName;
|
2001-10-22 09:55:31 +00:00
|
|
|
while( aDirectory.getNextItem( aDirItem ) == osl::FileBase::E_None &&
|
|
|
|
aDirItem.getFileStatus( aFileStatus ) == osl::FileBase::E_None &&
|
2005-11-11 11:17:25 +00:00
|
|
|
aFileStatus.isValid( FileStatusMask_FileURL ) &&
|
|
|
|
aFileStatus.isValid( FileStatusMask_FileName ) )
|
|
|
|
{
|
2001-10-22 09:55:31 +00:00
|
|
|
aFileUrl = aFileStatus.getFileURL();
|
2005-11-11 11:17:25 +00:00
|
|
|
aFileName = aFileStatus.getFileName();
|
2006-06-19 23:42:44 +00:00
|
|
|
idx_ = aFileName.lastIndexOf( sal_Unicode( '.' ) );
|
|
|
|
if( idx_ == -1 )
|
2005-11-11 11:17:25 +00:00
|
|
|
continue;
|
2001-10-22 09:55:31 +00:00
|
|
|
|
2005-11-11 11:17:25 +00:00
|
|
|
const sal_Unicode* str = aFileName.getStr();
|
2001-10-22 09:55:31 +00:00
|
|
|
|
2006-06-19 23:42:44 +00:00
|
|
|
if( aFileName.getLength() == idx_ + 5 &&
|
|
|
|
( str[idx_ + 1] == 't' || str[idx_ + 1] == 'T' ) &&
|
|
|
|
( str[idx_ + 2] == 'r' || str[idx_ + 2] == 'R' ) &&
|
|
|
|
( str[idx_ + 3] == 'e' || str[idx_ + 3] == 'E' ) &&
|
|
|
|
( str[idx_ + 4] == 'e' || str[idx_ + 4] == 'E' ) )
|
2005-11-11 11:17:25 +00:00
|
|
|
{
|
2001-11-08 15:42:46 +00:00
|
|
|
OSL_ENSURE( aFileStatus.isValid( FileStatusMask_FileSize ),
|
|
|
|
"invalid file size" );
|
2005-11-11 11:17:25 +00:00
|
|
|
|
2006-06-19 23:42:44 +00:00
|
|
|
rtl::OUString baseName = aFileName.copy(0,idx_).toAsciiLowerCase();
|
2005-11-11 11:17:25 +00:00
|
|
|
if(! showBasic && baseName.compareToAscii("sbasic") == 0 )
|
|
|
|
continue;
|
2010-11-26 15:09:17 +01:00
|
|
|
osl::File aFile( aFileUrl );
|
|
|
|
if( osl::FileBase::E_None == aFile.open( OpenFlag_Read ) )
|
|
|
|
{
|
|
|
|
sal_uInt64 nSize;
|
|
|
|
aFile.getSize( nSize );
|
|
|
|
configData.vFileLen.push_back( aFileStatus.getFileSize() );
|
|
|
|
configData.vFileURL.push_back( aFileUrl );
|
|
|
|
aFile.close();
|
|
|
|
}
|
2005-11-11 11:17:25 +00:00
|
|
|
}
|
|
|
|
}
|
2001-10-22 09:55:31 +00:00
|
|
|
aDirectory.close();
|
|
|
|
}
|
|
|
|
|
2001-10-31 12:53:36 +00:00
|
|
|
configData.m_vAdd[0] = 12;
|
|
|
|
configData.m_vAdd[1] = 15;
|
|
|
|
configData.m_vAdd[2] = 11;
|
|
|
|
configData.m_vAdd[3] = 14;
|
|
|
|
configData.m_vAdd[4] = 12;
|
2001-10-31 12:03:33 +00:00
|
|
|
configData.m_vReplacement[0] = productName;
|
|
|
|
configData.m_vReplacement[1] = productVersion;
|
2009-05-18 15:01:59 +02:00
|
|
|
// m_vReplacement[2...4] (vendorName/-Version/-Short) are empty strings
|
2001-07-12 12:32:24 +00:00
|
|
|
|
2001-10-31 12:03:33 +00:00
|
|
|
configData.system = system;
|
2001-07-12 12:32:24 +00:00
|
|
|
configData.locale = locale;
|
2001-10-22 09:55:31 +00:00
|
|
|
configData.appendix =
|
2010-11-05 14:38:22 +00:00
|
|
|
rtl::OUString(RTL_CONSTASCII_USTRINGPARAM( "?Language=" )) +
|
2001-10-22 09:55:31 +00:00
|
|
|
configData.locale +
|
2010-11-05 14:38:22 +00:00
|
|
|
rtl::OUString(RTL_CONSTASCII_USTRINGPARAM( "&System=" )) +
|
2004-08-30 16:27:58 +00:00
|
|
|
configData.system +
|
2010-11-05 14:38:22 +00:00
|
|
|
rtl::OUString(RTL_CONSTASCII_USTRINGPARAM( "&UseDB=no" )) ;
|
2001-10-22 09:55:31 +00:00
|
|
|
|
2001-07-12 12:32:24 +00:00
|
|
|
return configData;
|
|
|
|
}
|
2001-10-31 12:03:33 +00:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Reference< XMultiServiceFactory >
|
|
|
|
TVChildTarget::getConfiguration(const Reference< XMultiServiceFactory >& m_xSMgr) const
|
|
|
|
{
|
|
|
|
Reference< XMultiServiceFactory > sProvider;
|
|
|
|
if( m_xSMgr.is() )
|
|
|
|
{
|
|
|
|
try
|
|
|
|
{
|
|
|
|
rtl::OUString sProviderService =
|
2010-11-05 14:38:22 +00:00
|
|
|
rtl::OUString(RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.configuration.ConfigurationProvider" ));
|
2001-10-31 12:03:33 +00:00
|
|
|
sProvider =
|
|
|
|
Reference< XMultiServiceFactory >(
|
2009-11-10 10:33:11 +01:00
|
|
|
m_xSMgr->createInstance( sProviderService ),
|
2001-10-31 12:03:33 +00:00
|
|
|
UNO_QUERY );
|
|
|
|
}
|
|
|
|
catch( const com::sun::star::uno::Exception& )
|
|
|
|
{
|
|
|
|
OSL_ENSURE( sProvider.is(),"cant instantiate configuration" );
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return sProvider;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Reference< XHierarchicalNameAccess >
|
|
|
|
TVChildTarget::getHierAccess( const Reference< XMultiServiceFactory >& sProvider,
|
|
|
|
const char* file ) const
|
|
|
|
{
|
|
|
|
Reference< XHierarchicalNameAccess > xHierAccess;
|
|
|
|
|
|
|
|
if( sProvider.is() )
|
|
|
|
{
|
|
|
|
Sequence< Any > seq(1);
|
|
|
|
rtl::OUString sReaderService =
|
2010-11-05 14:38:22 +00:00
|
|
|
rtl::OUString(RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.configuration.ConfigurationAccess" ));
|
2001-10-31 12:03:33 +00:00
|
|
|
|
|
|
|
seq[0] <<= rtl::OUString::createFromAscii( file );
|
|
|
|
|
|
|
|
try
|
|
|
|
{
|
|
|
|
xHierAccess =
|
|
|
|
Reference< XHierarchicalNameAccess >
|
|
|
|
( sProvider->createInstanceWithArguments( sReaderService,seq ),
|
|
|
|
UNO_QUERY );
|
|
|
|
}
|
|
|
|
catch( const com::sun::star::uno::Exception& )
|
|
|
|
{
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return xHierAccess;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
rtl::OUString
|
|
|
|
TVChildTarget::getKey( const Reference< XHierarchicalNameAccess >& xHierAccess,
|
|
|
|
const char* key ) const
|
|
|
|
{
|
|
|
|
rtl::OUString instPath;
|
|
|
|
if( xHierAccess.is() )
|
|
|
|
{
|
|
|
|
Any aAny;
|
|
|
|
try
|
|
|
|
{
|
|
|
|
aAny =
|
|
|
|
xHierAccess->getByHierarchicalName( rtl::OUString::createFromAscii( key ) );
|
|
|
|
}
|
|
|
|
catch( const com::sun::star::container::NoSuchElementException& )
|
|
|
|
{
|
|
|
|
}
|
|
|
|
aAny >>= instPath;
|
|
|
|
}
|
|
|
|
return instPath;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2005-11-11 11:17:25 +00:00
|
|
|
sal_Bool
|
|
|
|
TVChildTarget::getBooleanKey(const Reference<
|
|
|
|
XHierarchicalNameAccess >& xHierAccess,
|
|
|
|
const char* key) const
|
|
|
|
{
|
|
|
|
sal_Bool ret = sal_False;
|
|
|
|
if( xHierAccess.is() )
|
|
|
|
{
|
|
|
|
Any aAny;
|
|
|
|
try
|
|
|
|
{
|
|
|
|
aAny =
|
|
|
|
xHierAccess->getByHierarchicalName(
|
|
|
|
rtl::OUString::createFromAscii(key));
|
|
|
|
}
|
|
|
|
catch( const com::sun::star::container::NoSuchElementException& )
|
|
|
|
{
|
|
|
|
}
|
|
|
|
aAny >>= ret;
|
|
|
|
}
|
|
|
|
return ret;
|
|
|
|
}
|
|
|
|
|
2001-10-31 12:03:33 +00:00
|
|
|
|
|
|
|
void TVChildTarget::subst( const Reference< XMultiServiceFactory >& m_xSMgr,
|
|
|
|
rtl::OUString& instpath ) const
|
|
|
|
{
|
|
|
|
Reference< XConfigManager > xCfgMgr;
|
|
|
|
if( m_xSMgr.is() )
|
|
|
|
{
|
|
|
|
try
|
|
|
|
{
|
|
|
|
xCfgMgr =
|
|
|
|
Reference< XConfigManager >(
|
2010-11-05 14:38:22 +00:00
|
|
|
m_xSMgr->createInstance( rtl::OUString(RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.config.SpecialConfigManager" )) ),
|
2001-10-31 12:03:33 +00:00
|
|
|
UNO_QUERY );
|
|
|
|
}
|
2006-10-12 10:28:52 +00:00
|
|
|
catch( const com::sun::star::uno::Exception& )
|
2001-10-31 12:03:33 +00:00
|
|
|
{
|
|
|
|
OSL_ENSURE( xCfgMgr.is()," cant instantiate the special config manager " );
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
OSL_ENSURE( xCfgMgr.is(), "specialconfigmanager not found\n" );
|
|
|
|
|
|
|
|
if( xCfgMgr.is() )
|
|
|
|
instpath = xCfgMgr->substituteVariables( instpath );
|
|
|
|
}
|
2008-02-26 06:46:59 +00:00
|
|
|
|
|
|
|
|
|
|
|
//===================================================================
|
|
|
|
// class ExtensionIteratorBase
|
|
|
|
|
2010-11-05 14:38:22 +00:00
|
|
|
static rtl::OUString aSlash(RTL_CONSTASCII_USTRINGPARAM("/"));
|
|
|
|
static rtl::OUString aHelpFilesBaseName(RTL_CONSTASCII_USTRINGPARAM("help"));
|
|
|
|
static rtl::OUString aHelpMediaType(RTL_CONSTASCII_USTRINGPARAM( "application/vnd.sun.star.help"));
|
2008-02-26 06:46:59 +00:00
|
|
|
|
|
|
|
ExtensionIteratorBase::ExtensionIteratorBase( const rtl::OUString& aLanguage )
|
|
|
|
: m_eState( USER_EXTENSIONS )
|
|
|
|
, m_aLanguage( aLanguage )
|
|
|
|
{
|
|
|
|
init();
|
|
|
|
}
|
|
|
|
|
|
|
|
void ExtensionIteratorBase::init()
|
|
|
|
{
|
|
|
|
Reference< XMultiServiceFactory > xFactory = comphelper::getProcessServiceFactory();
|
|
|
|
Reference< XPropertySet > xProps( xFactory, UNO_QUERY );
|
|
|
|
OSL_ASSERT( xProps.is() );
|
|
|
|
if (xProps.is())
|
|
|
|
{
|
|
|
|
xProps->getPropertyValue(
|
|
|
|
::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("DefaultContext") ) ) >>= m_xContext;
|
|
|
|
OSL_ASSERT( m_xContext.is() );
|
|
|
|
}
|
|
|
|
if( !m_xContext.is() )
|
|
|
|
{
|
|
|
|
throw RuntimeException(
|
2010-11-05 14:38:22 +00:00
|
|
|
::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM( "ExtensionIteratorBase::init(), no XComponentContext" )),
|
2008-02-26 06:46:59 +00:00
|
|
|
Reference< XInterface >() );
|
|
|
|
}
|
|
|
|
|
|
|
|
Reference< XMultiComponentFactory > xSMgr( m_xContext->getServiceManager(), UNO_QUERY );
|
|
|
|
m_xSFA = Reference< ucb::XSimpleFileAccess >(
|
2010-11-05 14:38:22 +00:00
|
|
|
xSMgr->createInstanceWithContext( rtl::OUString(RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.ucb.SimpleFileAccess" )),
|
2008-02-26 06:46:59 +00:00
|
|
|
m_xContext ), UNO_QUERY_THROW );
|
|
|
|
|
|
|
|
m_bUserPackagesLoaded = false;
|
|
|
|
m_bSharedPackagesLoaded = false;
|
2010-05-03 11:51:05 +02:00
|
|
|
m_bBundledPackagesLoaded = false;
|
2008-02-26 06:46:59 +00:00
|
|
|
m_iUserPackage = 0;
|
|
|
|
m_iSharedPackage = 0;
|
2010-05-03 11:51:05 +02:00
|
|
|
m_iBundledPackage = 0;
|
2008-02-26 06:46:59 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
Reference< deployment::XPackage > ExtensionIteratorBase::implGetHelpPackageFromPackage
|
|
|
|
( Reference< deployment::XPackage > xPackage, Reference< deployment::XPackage >& o_xParentPackageBundle )
|
|
|
|
{
|
|
|
|
o_xParentPackageBundle.clear();
|
|
|
|
|
|
|
|
Reference< deployment::XPackage > xHelpPackage;
|
|
|
|
if( !xPackage.is() )
|
|
|
|
return xHelpPackage;
|
|
|
|
|
|
|
|
// Check if parent package is registered
|
|
|
|
beans::Optional< beans::Ambiguous<sal_Bool> > option( xPackage->isRegistered
|
|
|
|
( Reference<task::XAbortChannel>(), Reference<ucb::XCommandEnvironment>() ) );
|
|
|
|
bool bRegistered = false;
|
|
|
|
if( option.IsPresent )
|
|
|
|
{
|
|
|
|
beans::Ambiguous<sal_Bool> const & reg = option.Value;
|
|
|
|
if( !reg.IsAmbiguous && reg.Value )
|
|
|
|
bRegistered = true;
|
|
|
|
}
|
|
|
|
if( !bRegistered )
|
|
|
|
return xHelpPackage;
|
|
|
|
|
|
|
|
if( xPackage->isBundle() )
|
|
|
|
{
|
|
|
|
Sequence< Reference< deployment::XPackage > > aPkgSeq = xPackage->getBundle
|
|
|
|
( Reference<task::XAbortChannel>(), Reference<ucb::XCommandEnvironment>() );
|
|
|
|
sal_Int32 nPkgCount = aPkgSeq.getLength();
|
|
|
|
const Reference< deployment::XPackage >* pSeq = aPkgSeq.getConstArray();
|
|
|
|
for( sal_Int32 iPkg = 0 ; iPkg < nPkgCount ; ++iPkg )
|
|
|
|
{
|
|
|
|
const Reference< deployment::XPackage > xSubPkg = pSeq[ iPkg ];
|
|
|
|
const Reference< deployment::XPackageTypeInfo > xPackageTypeInfo = xSubPkg->getPackageType();
|
|
|
|
rtl::OUString aMediaType = xPackageTypeInfo->getMediaType();
|
|
|
|
if( aMediaType.equals( aHelpMediaType ) )
|
|
|
|
{
|
|
|
|
xHelpPackage = xSubPkg;
|
|
|
|
o_xParentPackageBundle = xPackage;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
const Reference< deployment::XPackageTypeInfo > xPackageTypeInfo = xPackage->getPackageType();
|
|
|
|
rtl::OUString aMediaType = xPackageTypeInfo->getMediaType();
|
|
|
|
if( aMediaType.equals( aHelpMediaType ) )
|
|
|
|
xHelpPackage = xPackage;
|
|
|
|
}
|
|
|
|
|
|
|
|
return xHelpPackage;
|
|
|
|
}
|
|
|
|
|
|
|
|
Reference< deployment::XPackage > ExtensionIteratorBase::implGetNextUserHelpPackage
|
|
|
|
( Reference< deployment::XPackage >& o_xParentPackageBundle )
|
|
|
|
{
|
|
|
|
Reference< deployment::XPackage > xHelpPackage;
|
|
|
|
|
|
|
|
if( !m_bUserPackagesLoaded )
|
|
|
|
{
|
|
|
|
Reference< XPackageManager > xUserManager =
|
2010-11-05 14:38:22 +00:00
|
|
|
thePackageManagerFactory::get( m_xContext )->getPackageManager( rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("user")) );
|
2008-02-26 06:46:59 +00:00
|
|
|
m_aUserPackagesSeq = xUserManager->getDeployedPackages
|
|
|
|
( Reference< task::XAbortChannel >(), Reference< ucb::XCommandEnvironment >() );
|
|
|
|
|
|
|
|
m_bUserPackagesLoaded = true;
|
|
|
|
}
|
|
|
|
|
|
|
|
if( m_iUserPackage == m_aUserPackagesSeq.getLength() )
|
|
|
|
{
|
|
|
|
m_eState = SHARED_EXTENSIONS; // Later: SHARED_MODULE
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
const Reference< deployment::XPackage >* pUserPackages = m_aUserPackagesSeq.getConstArray();
|
|
|
|
Reference< deployment::XPackage > xPackage = pUserPackages[ m_iUserPackage++ ];
|
2010-10-10 19:46:48 -05:00
|
|
|
OSL_ENSURE( xPackage.is(), "ExtensionIteratorBase::implGetNextUserHelpPackage(): Invalid package" );
|
2008-02-26 06:46:59 +00:00
|
|
|
xHelpPackage = implGetHelpPackageFromPackage( xPackage, o_xParentPackageBundle );
|
|
|
|
}
|
|
|
|
|
|
|
|
return xHelpPackage;
|
|
|
|
}
|
|
|
|
|
|
|
|
Reference< deployment::XPackage > ExtensionIteratorBase::implGetNextSharedHelpPackage
|
|
|
|
( Reference< deployment::XPackage >& o_xParentPackageBundle )
|
|
|
|
{
|
|
|
|
Reference< deployment::XPackage > xHelpPackage;
|
|
|
|
|
|
|
|
if( !m_bSharedPackagesLoaded )
|
|
|
|
{
|
|
|
|
Reference< XPackageManager > xSharedManager =
|
2010-11-05 14:38:22 +00:00
|
|
|
thePackageManagerFactory::get( m_xContext )->getPackageManager( rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("shared")) );
|
2008-02-26 06:46:59 +00:00
|
|
|
m_aSharedPackagesSeq = xSharedManager->getDeployedPackages
|
|
|
|
( Reference< task::XAbortChannel >(), Reference< ucb::XCommandEnvironment >() );
|
|
|
|
|
|
|
|
m_bSharedPackagesLoaded = true;
|
|
|
|
}
|
|
|
|
|
|
|
|
if( m_iSharedPackage == m_aSharedPackagesSeq.getLength() )
|
|
|
|
{
|
2010-05-03 11:51:05 +02:00
|
|
|
m_eState = BUNDLED_EXTENSIONS;
|
2008-02-26 06:46:59 +00:00
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
const Reference< deployment::XPackage >* pSharedPackages = m_aSharedPackagesSeq.getConstArray();
|
|
|
|
Reference< deployment::XPackage > xPackage = pSharedPackages[ m_iSharedPackage++ ];
|
2010-10-10 19:46:48 -05:00
|
|
|
OSL_ENSURE( xPackage.is(), "ExtensionIteratorBase::implGetNextSharedHelpPackage(): Invalid package" );
|
2008-02-26 06:46:59 +00:00
|
|
|
xHelpPackage = implGetHelpPackageFromPackage( xPackage, o_xParentPackageBundle );
|
|
|
|
}
|
|
|
|
|
|
|
|
return xHelpPackage;
|
|
|
|
}
|
|
|
|
|
2010-05-03 11:51:05 +02:00
|
|
|
Reference< deployment::XPackage > ExtensionIteratorBase::implGetNextBundledHelpPackage
|
|
|
|
( Reference< deployment::XPackage >& o_xParentPackageBundle )
|
|
|
|
{
|
|
|
|
Reference< deployment::XPackage > xHelpPackage;
|
|
|
|
|
|
|
|
if( !m_bBundledPackagesLoaded )
|
|
|
|
{
|
|
|
|
Reference< XPackageManager > xBundledManager =
|
2010-11-05 14:38:22 +00:00
|
|
|
thePackageManagerFactory::get( m_xContext )->getPackageManager( rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("bundled")) );
|
2010-05-03 11:51:05 +02:00
|
|
|
m_aBundledPackagesSeq = xBundledManager->getDeployedPackages
|
|
|
|
( Reference< task::XAbortChannel >(), Reference< ucb::XCommandEnvironment >() );
|
|
|
|
|
|
|
|
m_bBundledPackagesLoaded = true;
|
|
|
|
}
|
|
|
|
|
|
|
|
if( m_iBundledPackage == m_aBundledPackagesSeq.getLength() )
|
|
|
|
{
|
|
|
|
m_eState = END_REACHED;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
const Reference< deployment::XPackage >* pBundledPackages = m_aBundledPackagesSeq.getConstArray();
|
|
|
|
Reference< deployment::XPackage > xPackage = pBundledPackages[ m_iBundledPackage++ ];
|
2010-10-10 19:46:48 -05:00
|
|
|
OSL_ENSURE( xPackage.is(), "ExtensionIteratorBase::implGetNextBundledHelpPackage(): Invalid package" );
|
2010-05-03 11:51:05 +02:00
|
|
|
xHelpPackage = implGetHelpPackageFromPackage( xPackage, o_xParentPackageBundle );
|
|
|
|
}
|
|
|
|
|
|
|
|
return xHelpPackage;
|
|
|
|
}
|
|
|
|
|
2009-05-15 12:21:35 +00:00
|
|
|
inline bool isLetter( sal_Unicode c )
|
|
|
|
{
|
|
|
|
bool bLetter = ((c >= 'A' && c <= 'Z') || (c >= 'a' && c <= 'z'));
|
|
|
|
return bLetter;
|
|
|
|
}
|
|
|
|
|
|
|
|
void ExtensionIteratorBase::implGetLanguageVectorFromPackage( ::std::vector< ::rtl::OUString > &rv,
|
|
|
|
com::sun::star::uno::Reference< com::sun::star::deployment::XPackage > xPackage )
|
|
|
|
{
|
|
|
|
rv.clear();
|
|
|
|
rtl::OUString aExtensionPath = xPackage->getURL();
|
2009-09-17 10:46:21 +02:00
|
|
|
Sequence< rtl::OUString > aEntrySeq = m_xSFA->getFolderContents( aExtensionPath, true );
|
2009-05-15 12:21:35 +00:00
|
|
|
|
|
|
|
const rtl::OUString* pSeq = aEntrySeq.getConstArray();
|
|
|
|
sal_Int32 nCount = aEntrySeq.getLength();
|
|
|
|
for( sal_Int32 i = 0 ; i < nCount ; ++i )
|
|
|
|
{
|
|
|
|
rtl::OUString aEntry = pSeq[i];
|
|
|
|
if( m_xSFA->isFolder( aEntry ) )
|
|
|
|
{
|
|
|
|
sal_Int32 nLastSlash = aEntry.lastIndexOf( '/' );
|
|
|
|
if( nLastSlash != -1 )
|
|
|
|
{
|
|
|
|
rtl::OUString aPureEntry = aEntry.copy( nLastSlash + 1 );
|
|
|
|
|
|
|
|
// Check language sceme
|
|
|
|
int nLen = aPureEntry.getLength();
|
|
|
|
const sal_Unicode* pc = aPureEntry.getStr();
|
|
|
|
bool bStartCanBeLanguage = ( nLen >= 2 && isLetter( pc[0] ) && isLetter( pc[1] ) );
|
|
|
|
bool bIsLanguage = bStartCanBeLanguage &&
|
|
|
|
( nLen == 2 || (nLen == 5 && pc[2] == '-' && isLetter( pc[3] ) && isLetter( pc[4] )) );
|
|
|
|
if( bIsLanguage )
|
|
|
|
rv.push_back( aPureEntry );
|
|
|
|
}
|
|
|
|
}
|
2009-09-17 10:46:21 +02:00
|
|
|
}
|
2009-05-15 12:21:35 +00:00
|
|
|
}
|
|
|
|
|
2008-02-26 06:46:59 +00:00
|
|
|
|
|
|
|
//===================================================================
|
|
|
|
// class TreeFileIterator
|
|
|
|
|
|
|
|
rtl::OUString TreeFileIterator::nextTreeFile( sal_Int32& rnFileSize )
|
|
|
|
{
|
|
|
|
rtl::OUString aRetFile;
|
|
|
|
|
|
|
|
while( !aRetFile.getLength() && m_eState != END_REACHED )
|
|
|
|
{
|
|
|
|
switch( m_eState )
|
|
|
|
{
|
|
|
|
case USER_EXTENSIONS:
|
|
|
|
{
|
|
|
|
Reference< deployment::XPackage > xParentPackageBundle;
|
|
|
|
Reference< deployment::XPackage > xHelpPackage = implGetNextUserHelpPackage( xParentPackageBundle );
|
|
|
|
if( !xHelpPackage.is() )
|
|
|
|
break;
|
|
|
|
|
|
|
|
aRetFile = implGetTreeFileFromPackage( rnFileSize, xHelpPackage );
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
|
|
|
case SHARED_EXTENSIONS:
|
|
|
|
{
|
|
|
|
Reference< deployment::XPackage > xParentPackageBundle;
|
|
|
|
Reference< deployment::XPackage > xHelpPackage = implGetNextSharedHelpPackage( xParentPackageBundle );
|
|
|
|
if( !xHelpPackage.is() )
|
|
|
|
break;
|
|
|
|
|
|
|
|
aRetFile = implGetTreeFileFromPackage( rnFileSize, xHelpPackage );
|
|
|
|
break;
|
|
|
|
}
|
2010-05-03 11:51:05 +02:00
|
|
|
case BUNDLED_EXTENSIONS:
|
|
|
|
{
|
|
|
|
Reference< deployment::XPackage > xParentPackageBundle;
|
|
|
|
Reference< deployment::XPackage > xHelpPackage = implGetNextBundledHelpPackage( xParentPackageBundle );
|
|
|
|
if( !xHelpPackage.is() )
|
|
|
|
break;
|
|
|
|
|
|
|
|
aRetFile = implGetTreeFileFromPackage( rnFileSize, xHelpPackage );
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
|
|
|
case END_REACHED:
|
2010-10-10 19:46:48 -05:00
|
|
|
OSL_ENSURE( false, "DataBaseIterator::nextTreeFile(): Invalid case END_REACHED" );
|
2008-02-26 06:46:59 +00:00
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return aRetFile;
|
|
|
|
}
|
|
|
|
|
|
|
|
rtl::OUString TreeFileIterator::expandURL( const rtl::OUString& aURL )
|
|
|
|
{
|
|
|
|
static Reference< util::XMacroExpander > xMacroExpander;
|
|
|
|
static Reference< uri::XUriReferenceFactory > xFac;
|
|
|
|
|
|
|
|
osl::MutexGuard aGuard( m_aMutex );
|
|
|
|
|
|
|
|
if( !xMacroExpander.is() || !xFac.is() )
|
|
|
|
{
|
|
|
|
Reference< XMultiComponentFactory > xSMgr( m_xContext->getServiceManager(), UNO_QUERY );
|
|
|
|
|
|
|
|
xFac = Reference< uri::XUriReferenceFactory >(
|
2010-11-05 14:38:22 +00:00
|
|
|
xSMgr->createInstanceWithContext( rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(
|
|
|
|
"com.sun.star.uri.UriReferenceFactory")), m_xContext ) , UNO_QUERY );
|
2008-02-26 06:46:59 +00:00
|
|
|
if( !xFac.is() )
|
|
|
|
{
|
|
|
|
throw RuntimeException(
|
2010-11-05 14:38:22 +00:00
|
|
|
::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM( "Databases::expand(), could not instatiate UriReferenceFactory." )),
|
2008-02-26 06:46:59 +00:00
|
|
|
Reference< XInterface >() );
|
|
|
|
}
|
|
|
|
|
|
|
|
xMacroExpander = Reference< util::XMacroExpander >(
|
|
|
|
m_xContext->getValueByName(
|
2010-11-05 14:38:22 +00:00
|
|
|
::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM( "/singletons/com.sun.star.util.theMacroExpander" )) ),
|
2008-02-26 06:46:59 +00:00
|
|
|
UNO_QUERY_THROW );
|
|
|
|
}
|
|
|
|
|
|
|
|
rtl::OUString aRetURL = aURL;
|
|
|
|
if( xMacroExpander.is() )
|
|
|
|
{
|
|
|
|
Reference< uri::XUriReference > uriRef;
|
|
|
|
for (;;)
|
|
|
|
{
|
|
|
|
uriRef = Reference< uri::XUriReference >( xFac->parse( aRetURL ), UNO_QUERY );
|
|
|
|
if ( uriRef.is() )
|
|
|
|
{
|
|
|
|
Reference < uri::XVndSunStarExpandUrl > sxUri( uriRef, UNO_QUERY );
|
|
|
|
if( !sxUri.is() )
|
|
|
|
break;
|
|
|
|
|
|
|
|
aRetURL = sxUri->expand( xMacroExpander );
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return aRetURL;
|
|
|
|
}
|
|
|
|
|
|
|
|
rtl::OUString TreeFileIterator::implGetTreeFileFromPackage
|
|
|
|
( sal_Int32& rnFileSize, Reference< deployment::XPackage > xPackage )
|
|
|
|
{
|
|
|
|
rtl::OUString aRetFile;
|
2009-05-15 12:21:35 +00:00
|
|
|
rtl::OUString aLanguage = m_aLanguage;
|
2008-02-26 06:46:59 +00:00
|
|
|
for( sal_Int32 iPass = 0 ; iPass < 2 ; ++iPass )
|
|
|
|
{
|
|
|
|
rtl::OUStringBuffer aStrBuf;
|
|
|
|
aStrBuf.append( xPackage->getURL() );
|
|
|
|
aStrBuf.append( aSlash );
|
|
|
|
aStrBuf.append( aLanguage );
|
|
|
|
aStrBuf.append( aSlash );
|
|
|
|
aStrBuf.append( aHelpFilesBaseName );
|
|
|
|
aStrBuf.appendAscii( ".tree" );
|
|
|
|
|
|
|
|
aRetFile = expandURL( aStrBuf.makeStringAndClear() );
|
|
|
|
if( iPass == 0 )
|
|
|
|
{
|
|
|
|
if( m_xSFA->exists( aRetFile ) )
|
|
|
|
break;
|
2009-05-15 12:21:35 +00:00
|
|
|
|
|
|
|
::std::vector< ::rtl::OUString > av;
|
|
|
|
implGetLanguageVectorFromPackage( av, xPackage );
|
|
|
|
::std::vector< ::rtl::OUString >::const_iterator pFound = av.end();
|
2009-09-17 10:46:21 +02:00
|
|
|
try
|
|
|
|
{
|
|
|
|
pFound = ::comphelper::Locale::getFallback( av, m_aLanguage );
|
|
|
|
}
|
2009-05-15 12:21:35 +00:00
|
|
|
catch( ::comphelper::Locale::MalFormedLocaleException& )
|
|
|
|
{}
|
2009-09-17 10:46:21 +02:00
|
|
|
if( pFound != av.end() )
|
|
|
|
aLanguage = *pFound;
|
2008-02-26 06:46:59 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
rnFileSize = 0;
|
|
|
|
if( m_xSFA->exists( aRetFile ) )
|
|
|
|
rnFileSize = m_xSFA->getSize( aRetFile );
|
|
|
|
else
|
|
|
|
aRetFile = rtl::OUString();
|
|
|
|
|
|
|
|
return aRetFile;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
2010-10-12 15:53:47 +02:00
|
|
|
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|