diff options
-rw-r--r-- | cppuhelper/source/servicefactory.cxx | 73 | ||||
-rwxr-xr-x | stoc/source/simpleregistry/textualservices.cxx | 68 |
2 files changed, 65 insertions, 76 deletions
diff --git a/cppuhelper/source/servicefactory.cxx b/cppuhelper/source/servicefactory.cxx index 57eae9a51087..bcc58b74af59 100644 --- a/cppuhelper/source/servicefactory.cxx +++ b/cppuhelper/source/servicefactory.cxx @@ -28,13 +28,9 @@ // MARKER(update_precomp.py): autogen include statement, do not remove #include "precompiled_cppuhelper.hxx" -#if OSL_DEBUG_LEVEL > 0 -#include <stdio.h> -#endif #include <vector> #include "rtl/string.hxx" -#include "rtl/ustrbuf.hxx" #include "rtl/bootstrap.hxx" #include "osl/diagnose.h" #include "osl/file.h" @@ -46,6 +42,7 @@ #include "cppuhelper/servicefactory.hxx" #include "cppuhelper/bootstrap.hxx" +#include "com/sun/star/uno/DeploymentException.hpp" #include "com/sun/star/uno/XComponentContext.hpp" #include "com/sun/star/lang/XInitialization.hpp" #include "com/sun/star/lang/XSingleServiceFactory.hpp" @@ -64,6 +61,7 @@ using namespace ::rtl; using namespace ::osl; using namespace ::com::sun::star; using namespace ::com::sun::star::uno; +namespace css = com::sun::star; namespace cppu { @@ -417,39 +415,42 @@ Reference< XComponentContext > bootstrapInitialContext( keys.getConstArray(); for ( sal_Int32 nPos = keys.getLength(); nPos--; ) { - Reference< registry::XRegistryKey > const & xKey2 = - pKeys[ nPos ]; - try - { - OUStringBuffer buf( 32 ); - buf.appendAscii( - RTL_CONSTASCII_STRINGPARAM("/singletons/") ); - buf.append( - xKey2->getKeyName().copy( - sizeof("/SINGLETONS") /* -\0 +'/' */ ) ); - entry.name = buf.makeStringAndClear(); - entry.value <<= xKey2->getStringValue(); - context_values.push_back( entry ); - } - catch (Exception & rExc) - { -#if OSL_DEBUG_LEVEL > 0 - OString aStr( - OUStringToOString( - xKey2->getKeyName().copy( 11 ), - RTL_TEXTENCODING_ASCII_US ) ); - OString aStr2( - OUStringToOString( - rExc.Message, RTL_TEXTENCODING_ASCII_US ) ); - fprintf( - stderr, - "### failed reading singleton [%s]" - " service name from registry: %s\n", - aStr.getStr(), aStr2.getStr() ); -#else - (void) rExc; // avoid warning about unused variable -#endif + css::uno::Sequence< rtl::OUString > impls( + css::uno::Reference< css::registry::XRegistryKey >( + pKeys[nPos]->openKey( + rtl::OUString( + RTL_CONSTASCII_USTRINGPARAM( + "REGISTERED_BY"))), + css::uno::UNO_SET_THROW)->getAsciiListValue()); + switch (impls.getLength()) { + case 0: + throw css::uno::DeploymentException( + (pKeys[nPos]->getKeyName() + + rtl::OUString( + RTL_CONSTASCII_USTRINGPARAM( + "/REGISTERED_BY is empty"))), + css::uno::Reference< css::uno::XInterface >()); + case 1: + break; + default: + OSL_TRACE( + ("arbitrarily chosing \"%s\" among multiple" + " implementations for \"%s\""), + rtl::OUStringToOString( + impls[0], RTL_TEXTENCODING_UTF8).getStr(), + rtl::OUStringToOString( + pKeys[nPos]->getKeyName(), + RTL_TEXTENCODING_UTF8).getStr()); + break; } + context_values.push_back( + ContextEntry_Init( + (rtl::OUString( + RTL_CONSTASCII_USTRINGPARAM("/singletons/")) + + pKeys[nPos]->getKeyName().copy( + RTL_CONSTASCII_LENGTH("/SINGLETONS/"))), + css::uno::makeAny(impls[0]), + true)); } } } diff --git a/stoc/source/simpleregistry/textualservices.cxx b/stoc/source/simpleregistry/textualservices.cxx index 44315b689dc7..462007b6cf7b 100755 --- a/stoc/source/simpleregistry/textualservices.cxx +++ b/stoc/source/simpleregistry/textualservices.cxx @@ -67,18 +67,8 @@ struct Implementation { typedef std::map< rtl::OUString, Implementation > Implementations; -struct Service { - std::vector< rtl::OUString > implementations; -}; - -typedef std::map< rtl::OUString, Service > Services; - -struct Singleton { - rtl::OUString service; - std::vector< rtl::OUString > implementations; -}; - -typedef std::map< rtl::OUString, Singleton > Singletons; +typedef std::map< rtl::OUString, std::vector< rtl::OUString > > + ImplementationMap; } @@ -86,8 +76,8 @@ class Data: public salhelper::SimpleReferenceObject, private boost::noncopyable { public: Implementations implementations; - Services services; - Singletons singletons; + ImplementationMap services; + ImplementationMap singletons; }; namespace { @@ -124,9 +114,7 @@ Parser::Parser(rtl::OUString const & uri, rtl::Reference< Data > const & data): "http://openoffice.org/2010/uno-components"))); enum State { STATE_BEGIN, STATE_END, STATE_COMPONENTS, STATE_COMPONENT_INITIAL, - STATE_COMPONENT, STATE_IMPLEMENTATION_INITIAL, - STATE_IMPLEMENTATION_SERVICE, STATE_IMPLEMENTATION_SINGLETON, - STATE_SERVICE, STATE_SINGLETON }; + STATE_COMPONENT, STATE_IMPLEMENTATION, STATE_SERVICE, STATE_SINGLETON }; for (State state = STATE_BEGIN;;) { xmlreader::Span name; int nsId; @@ -185,7 +173,7 @@ Parser::Parser(rtl::OUString const & uri, rtl::Reference< Data > const & data): name.equals(RTL_CONSTASCII_STRINGPARAM("implementation"))) { handleImplementation(); - state = STATE_IMPLEMENTATION_INITIAL; + state = STATE_IMPLEMENTATION; break; } throw css::registry::InvalidRegistryException( @@ -194,23 +182,19 @@ Parser::Parser(rtl::OUString const & uri, rtl::Reference< Data > const & data): RTL_CONSTASCII_USTRINGPARAM( ": unexpected item in <component>"))), css::uno::Reference< css::uno::XInterface >()); - case STATE_IMPLEMENTATION_INITIAL: - case STATE_IMPLEMENTATION_SERVICE: - case STATE_IMPLEMENTATION_SINGLETON: + case STATE_IMPLEMENTATION: if (res == xmlreader::XmlReader::RESULT_END) { state = STATE_COMPONENT; break; } - if (state != STATE_IMPLEMENTATION_SINGLETON && - res == xmlreader::XmlReader::RESULT_BEGIN && nsId == ucNsId && + if (res == xmlreader::XmlReader::RESULT_BEGIN && nsId == ucNsId && name.equals(RTL_CONSTASCII_STRINGPARAM("service"))) { handleService(); state = STATE_SERVICE; break; } - if (state != STATE_IMPLEMENTATION_INITIAL && - res == xmlreader::XmlReader::RESULT_BEGIN && nsId == ucNsId && + if (res == xmlreader::XmlReader::RESULT_BEGIN && nsId == ucNsId && name.equals(RTL_CONSTASCII_STRINGPARAM("singleton"))) { handleSingleton(); @@ -225,7 +209,7 @@ Parser::Parser(rtl::OUString const & uri, rtl::Reference< Data > const & data): css::uno::Reference< css::uno::XInterface >()); case STATE_SERVICE: if (res == xmlreader::XmlReader::RESULT_END) { - state = STATE_IMPLEMENTATION_SERVICE; + state = STATE_IMPLEMENTATION; break; } throw css::registry::InvalidRegistryException( @@ -236,7 +220,7 @@ Parser::Parser(rtl::OUString const & uri, rtl::Reference< Data > const & data): css::uno::Reference< css::uno::XInterface >()); case STATE_SINGLETON: if (res == xmlreader::XmlReader::RESULT_END) { - state = STATE_IMPLEMENTATION_SINGLETON; + state = STATE_IMPLEMENTATION; break; } throw css::registry::InvalidRegistryException( @@ -345,15 +329,13 @@ void Parser::handleImplementation() { void Parser::handleService() { rtl::OUString name = getNameAttribute(); data_->implementations[attrImplementation_].services.push_back(name); - data_->services[name].implementations.push_back(attrImplementation_); + data_->services[name].push_back(attrImplementation_); } void Parser::handleSingleton() { rtl::OUString name = getNameAttribute(); data_->implementations[attrImplementation_].singletons.push_back(name); - data_->singletons[name].service = - data_->implementations[attrImplementation_].services[0]; - data_->singletons[name].implementations.push_back(attrImplementation_); + data_->singletons[name].push_back(attrImplementation_); } rtl::OUString Parser::getNameAttribute() { @@ -710,10 +692,10 @@ css::uno::Sequence< rtl::OUString > Key::getAsciiListValue() throw ( std::vector< rtl::OUString > const * list; switch (state) { case STATE_SERVICE: - list = &data_->services[path_[1]].implementations; + list = &data_->services[path_[1]]; break; case STATE_REGISTEREDBY: - list = &data_->singletons[path_[1]].implementations; + list = &data_->singletons[path_[1]]; break; default: throw css::registry::InvalidValueException( @@ -761,17 +743,23 @@ rtl::OUString Key::getStringValue() throw ( OSL_VERIFY(find(rtl::OUString(), 0, &state, 0)); switch (state) { case STATE_IMPLEMENTATION_SINGLETON: - return data_->implementations[path_[1]].services[0]; case STATE_SINGLETON: - return data_->singletons[path_[1]].service; - default: - throw css::registry::InvalidValueException( + throw css::registry::InvalidRegistryException( rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.registry.SimpleRegistry textual services key" - " getStringValue: wrong type")), + " getStringValue: does not associate singletons with" + " services")), static_cast< OWeakObject * >(this)); } + // default case extracted from switch to avoid erroneous compiler warnings + // on Solaris: + throw css::registry::InvalidValueException( + rtl::OUString( + RTL_CONSTASCII_USTRINGPARAM( + "com.sun.star.registry.SimpleRegistry textual services key" + " getStringValue: wrong type")), + static_cast< OWeakObject * >(this)); } void Key::setStringValue(rtl::OUString const &) @@ -1163,7 +1151,7 @@ css::uno::Sequence< rtl::OUString > Key::getChildren() { css::uno::Sequence< rtl::OUString > seq( static_cast< sal_Int32 >(data_->services.size())); sal_Int32 i = 0; - for (Services::iterator j(data_->services.begin()); + for (ImplementationMap::iterator j(data_->services.begin()); j != data_->services.end(); ++j) { seq[i++] = j->first; @@ -1183,7 +1171,7 @@ css::uno::Sequence< rtl::OUString > Key::getChildren() { css::uno::Sequence< rtl::OUString > seq( static_cast< sal_Int32 >(data_->singletons.size())); sal_Int32 i = 0; - for (Singletons::iterator j(data_->singletons.begin()); + for (ImplementationMap::iterator j(data_->singletons.begin()); j != data_->singletons.end(); ++j) { seq[i++] = j->first; |