diff options
author | sb <sb@openoffice.org> | 2009-12-02 14:57:12 +0100 |
---|---|---|
committer | sb <sb@openoffice.org> | 2009-12-02 14:57:12 +0100 |
commit | f81c3dd85ef2ebc0a9c129a17156fbeb38fb0b02 (patch) | |
tree | 6de66f7d6a46610ee48b28f9d052c5b1aaec6351 | |
parent | a472204849c6aed1e745381fdf99f222a08cb78d (diff) |
sb111: #i101955# configmgr::update::insertExtensionXcuFile should notify configuration listeners
-rw-r--r-- | configmgr/source/components.cxx | 29 | ||||
-rw-r--r-- | configmgr/source/components.hxx | 8 | ||||
-rw-r--r-- | configmgr/source/update.cxx | 16 | ||||
-rw-r--r-- | configmgr/source/xcdparser.cxx | 2 | ||||
-rw-r--r-- | configmgr/source/xcuparser.cxx | 58 | ||||
-rw-r--r-- | configmgr/source/xcuparser.hxx | 4 |
6 files changed, 73 insertions, 44 deletions
diff --git a/configmgr/source/components.cxx b/configmgr/source/components.cxx index 8553bc8bd88c..219a5210d0a0 100644 --- a/configmgr/source/components.cxx +++ b/configmgr/source/components.cxx @@ -84,22 +84,27 @@ struct UnresolvedListItem { typedef std::list< UnresolvedListItem > UnresolvedList; -void parseXcsFile(rtl::OUString const & url, int layer, Data * data) +void parseXcsFile(rtl::OUString const & url, int layer, Data * data, + Modifications * modifications) SAL_THROW(( css::container::NoSuchElementException, css::uno::RuntimeException)) { + OSL_ASSERT(modifications == 0); (void) modifications; OSL_VERIFY( rtl::Reference< ParseManager >( new ParseManager(url, new XcsParser(layer, data)))->parse()); } -void parseXcuFile(rtl::OUString const & url, int layer, Data * data) +void parseXcuFile( + rtl::OUString const & url, int layer, Data * data, + Modifications * modifications) SAL_THROW(( css::container::NoSuchElementException, css::uno::RuntimeException)) { OSL_VERIFY( rtl::Reference< ParseManager >( - new ParseManager(url, new XcuParser(layer, data)))->parse()); + new ParseManager(url, new XcuParser(layer, data, modifications)))-> + parse()); } rtl::OUString expand(rtl::OUString const & str) { @@ -208,7 +213,7 @@ void Components::insertExtensionXcsFile( bool shared, rtl::OUString const & fileUri) { try { - parseXcsFile(fileUri, shared ? 9 : 13, &data_); + parseXcsFile(fileUri, shared ? 9 : 13, &data_, 0); } catch (css::container::NoSuchElementException & e) { throw css::uno::RuntimeException( (rtl::OUString( @@ -220,10 +225,11 @@ void Components::insertExtensionXcsFile( } void Components::insertExtensionXcuFile( - bool shared, rtl::OUString const & fileUri) + bool shared, rtl::OUString const & fileUri, Modifications * modifications) { + OSL_ASSERT(modifications != 0); try { - parseXcuFile(fileUri, shared ? 10 : 14, &data_); + parseXcuFile(fileUri, shared ? 10 : 14, &data_, modifications); } catch (css::container::NoSuchElementException & e) { throw css::uno::RuntimeException( (rtl::OUString( @@ -391,7 +397,7 @@ Components::~Components() {} void Components::parseFiles( int layer, rtl::OUString const & extension, - void (* parseFile)(rtl::OUString const &, int, Data *), + void (* parseFile)(rtl::OUString const &, int, Data *, Modifications *), rtl::OUString const & url, bool recursive) { osl::Directory dir(url); @@ -441,7 +447,7 @@ void Components::parseFiles( file.match(extension, file.getLength() - extension.getLength())) { try { - (*parseFile)(stat.getFileURL(), layer, &data_); + (*parseFile)(stat.getFileURL(), layer, &data_, 0); } catch (css::container::NoSuchElementException & e) { throw css::uno::RuntimeException( (rtl::OUString( @@ -456,7 +462,8 @@ void Components::parseFiles( } void Components::parseFileList( - int layer, void (* parseFile)(rtl::OUString const &, int, Data *), + int layer, + void (* parseFile)(rtl::OUString const &, int, Data *, Modifications *), rtl::OUString const & urls, rtl::Bootstrap const & ini) { for (sal_Int32 i = 0;;) { @@ -464,7 +471,7 @@ void Components::parseFileList( if (url.getLength() != 0) { ini.expandMacrosFrom(url); //TODO: detect failure try { - (*parseFile)(url, layer, &data_); + (*parseFile)(url, layer, &data_, 0); } catch (css::container::NoSuchElementException & e) { throw css::uno::RuntimeException( (rtl::OUString( @@ -623,7 +630,7 @@ rtl::OUString Components::getModificationFileUrl() const { void Components::parseModificationLayer() { try { - parseXcuFile(getModificationFileUrl(), Data::NO_LAYER, &data_); + parseXcuFile(getModificationFileUrl(), Data::NO_LAYER, &data_, 0); } catch (css::container::NoSuchElementException &) { OSL_TRACE( "configmgr user registrymodifications.xcu does not (yet) exist"); diff --git a/configmgr/source/components.hxx b/configmgr/source/components.hxx index c37d44701d61..ad7c227a9bc6 100644 --- a/configmgr/source/components.hxx +++ b/configmgr/source/components.hxx @@ -94,7 +94,9 @@ public: void insertExtensionXcsFile(bool shared, rtl::OUString const & fileUri); - void insertExtensionXcuFile(bool shared, rtl::OUString const & fileUri); + void insertExtensionXcuFile( + bool shared, rtl::OUString const & fileUri, + Modifications * modifications); com::sun::star::beans::Optional< com::sun::star::uno::Any > getExternalValue(rtl::OUString const & descriptor); @@ -108,12 +110,12 @@ private: void parseFiles( int layer, rtl::OUString const & extension, - void (* parseFile)(rtl::OUString const &, int, Data *), + void (* parseFile)(rtl::OUString const &, int, Data *, Modifications *), rtl::OUString const & url, bool recursive); void parseFileList( int layer, - void (* parseFile)(rtl::OUString const &, int, Data *), + void (* parseFile)(rtl::OUString const &, int, Data *, Modifications *), rtl::OUString const & urls, rtl::Bootstrap const & ini); void parseXcdFiles(int layer, rtl::OUString const & url); diff --git a/configmgr/source/update.cxx b/configmgr/source/update.cxx index 52df4f25eca7..dafd8148b504 100644 --- a/configmgr/source/update.cxx +++ b/configmgr/source/update.cxx @@ -32,10 +32,14 @@ #include "configmgr/update.hxx" #include "osl/mutex.hxx" +#include "rtl/ref.hxx" #include "rtl/ustring.hxx" +#include "broadcaster.hxx" #include "components.hxx" #include "lock.hxx" +#include "modifications.hxx" +#include "rootaccess.hxx" namespace configmgr { @@ -47,8 +51,16 @@ void insertExtensionXcsFile(bool shared, rtl::OUString const & fileUri) { } void insertExtensionXcuFile(bool shared, rtl::OUString const & fileUri) { - osl::MutexGuard g(lock); - Components::getSingleton().insertExtensionXcuFile(shared, fileUri); + Broadcaster bc; + { + osl::MutexGuard g(lock); + Modifications mods; + Components::getSingleton().insertExtensionXcuFile( + shared, fileUri, &mods); + Components::getSingleton().initGlobalBroadcaster( + mods, rtl::Reference< RootAccess >(), &bc); + } + bc.send(); } } diff --git a/configmgr/source/xcdparser.cxx b/configmgr/source/xcdparser.cxx index 1acd81b2cbac..b72f8df33d7c 100644 --- a/configmgr/source/xcdparser.cxx +++ b/configmgr/source/xcdparser.cxx @@ -139,7 +139,7 @@ bool XcdParser::startElement( if (ns == XmlReader::NAMESPACE_OOR && name.equals(RTL_CONSTASCII_STRINGPARAM("component-data"))) { - nestedParser_ = new XcuParser(layer_ + 1, data_); + nestedParser_ = new XcuParser(layer_ + 1, data_, 0); nesting_ = 1; return nestedParser_->startElement(reader, ns, name); } diff --git a/configmgr/source/xcuparser.cxx b/configmgr/source/xcuparser.cxx index 948ebffcdaeb..13b61e0a4e68 100644 --- a/configmgr/source/xcuparser.cxx +++ b/configmgr/source/xcuparser.cxx @@ -67,8 +67,14 @@ namespace css = com::sun::star; } -XcuParser::XcuParser(int layer, Data * data): valueParser_(layer), data_(data) -{} +XcuParser::XcuParser(int layer, Data * data, Modifications * modifications): + valueParser_(layer), data_(data), modifications_(modifications) +{ + if (layer == Data::NO_LAYER) { + OSL_ASSERT(modifications_ == 0); + modifications_ = &data_->modifications; + } +} XcuParser::~XcuParser() {} @@ -352,7 +358,7 @@ void XcuParser::handleComponentData(XmlReader & reader) { node->getFinalized()); node->setFinalized(finalizedLayer); state_.push(State(node, finalizedLayer < valueParser_.getLayer())); - if (valueParser_.getLayer() == Data::NO_LAYER) { + if (modifications_ != 0) { OSL_ASSERT(modificationPath_.empty()); modificationPath_.push_back(componentName_); } @@ -393,7 +399,7 @@ void XcuParser::handleItem(XmlReader & reader) { } OSL_ASSERT(!modificationPath_.empty()); componentName_ = modificationPath_.front(); - if (valueParser_.getLayer() != Data::NO_LAYER) { + if (modifications_ == 0) { modificationPath_.clear(); } state_.push(State(node, finalizedLayer < valueParser_.getLayer())); @@ -564,9 +570,9 @@ void XcuParser::handleLocpropValue( valueParser_.separator_ = separator; valueParser_.start(locprop, name); } - if (!modificationPath_.empty()) { + if (modifications_ != 0) { modificationPath_.push_back(name); - data_->modifications.add(modificationPath_); + modifications_->add(modificationPath_); modificationPath_.pop_back(); } break; @@ -577,9 +583,9 @@ void XcuParser::handleLocpropValue( locprop->getMembers().erase(i); } state_.push(State()); - if (!modificationPath_.empty()) { + if (modifications_ != 0) { modificationPath_.push_back(name); - data_->modifications.add(modificationPath_); + modifications_->add(modificationPath_); modificationPath_.pop_back(); } break; @@ -689,9 +695,9 @@ void XcuParser::handleUnknownGroupProp( prop->setFinalized(valueParser_.getLayer()); } state_.push(State(prop, name, state_.top().locked)); - if (!modificationPath_.empty()) { + if (modifications_ != 0) { modificationPath_.push_back(name); - data_->modifications.add(modificationPath_); + modifications_->add(modificationPath_); } } break; @@ -739,9 +745,9 @@ void XcuParser::handlePlainGroupProp( property, (state_.top().locked || finalizedLayer < valueParser_.getLayer()))); - if (!modificationPath_.empty()) { + if (modifications_ != 0) { modificationPath_.push_back(name); - data_->modifications.add(modificationPath_); + modifications_->add(modificationPath_); } break; case OPERATION_REMOVE: @@ -756,9 +762,9 @@ void XcuParser::handlePlainGroupProp( } group->getMembers().erase(propertyIndex); state_.push(State()); // ignore children - if (!modificationPath_.empty()) { + if (modifications_ != 0) { modificationPath_.push_back(name); - data_->modifications.add(modificationPath_); + modifications_->add(modificationPath_); modificationPath_.pop_back(); } break; @@ -796,7 +802,7 @@ void XcuParser::handleLocalizedGroupProp( property, (state_.top().locked || finalizedLayer < valueParser_.getLayer()))); - if (!modificationPath_.empty()) { + if (modifications_ != 0) { modificationPath_.push_back(name); } break; @@ -812,9 +818,9 @@ void XcuParser::handleLocalizedGroupProp( replacement, name, (state_.top().locked || finalizedLayer < valueParser_.getLayer()))); - if (!modificationPath_.empty()) { + if (modifications_ != 0) { modificationPath_.push_back(name); - data_->modifications.add(modificationPath_); + modifications_->add(modificationPath_); } } break; @@ -889,7 +895,7 @@ void XcuParser::handleGroupNode( State( child, state_.top().locked || finalizedLayer < valueParser_.getLayer())); - if (!modificationPath_.empty()) { + if (modifications_ != 0) { modificationPath_.push_back(name); } } @@ -996,7 +1002,7 @@ void XcuParser::handleSetNode(XmlReader & reader, SetNode * set) { i->second, (state_.top().locked || finalizedLayer < valueParser_.getLayer()))); - if (!modificationPath_.empty()) { + if (modifications_ != 0) { modificationPath_.push_back(name); } } @@ -1010,9 +1016,9 @@ void XcuParser::handleSetNode(XmlReader & reader, SetNode * set) { member->setFinalized(finalizedLayer); member->setMandatory(mandatoryLayer); state_.push(State(member, name, false)); - if (!modificationPath_.empty()) { + if (modifications_ != 0) { modificationPath_.push_back(name); - data_->modifications.add(modificationPath_); + modifications_->add(modificationPath_); } } break; @@ -1027,9 +1033,9 @@ void XcuParser::handleSetNode(XmlReader & reader, SetNode * set) { member->setFinalized(finalizedLayer); member->setMandatory(mandatoryLayer); state_.push(State(member, name, false)); - if (!modificationPath_.empty()) { + if (modifications_ != 0) { modificationPath_.push_back(name); - data_->modifications.add(modificationPath_); + modifications_->add(modificationPath_); } } } else { @@ -1038,7 +1044,7 @@ void XcuParser::handleSetNode(XmlReader & reader, SetNode * set) { i->second, (state_.top().locked || finalizedLayer < valueParser_.getLayer()))); - if (!modificationPath_.empty()) { + if (modifications_ != 0) { modificationPath_.push_back(name); } } @@ -1053,9 +1059,9 @@ void XcuParser::handleSetNode(XmlReader & reader, SetNode * set) { set->getMembers().erase(i); } state_.push(State()); - if (!modificationPath_.empty()) { + if (modifications_ != 0) { modificationPath_.push_back(name); - data_->modifications.add(modificationPath_); + modifications_->add(modificationPath_); modificationPath_.pop_back(); } break; diff --git a/configmgr/source/xcuparser.hxx b/configmgr/source/xcuparser.hxx index 169ce1deeda8..fb27d3573032 100644 --- a/configmgr/source/xcuparser.hxx +++ b/configmgr/source/xcuparser.hxx @@ -50,6 +50,7 @@ namespace configmgr { class GroupNode; class LocalizedPropertyNode; +class Modifications; class PropertyNode; class SetNode; struct Data; @@ -57,7 +58,7 @@ struct Span; class XcuParser: public Parser { public: - XcuParser(int layer, Data * data); + XcuParser(int layer, Data * data, Modifications * modifications); private: virtual ~XcuParser(); @@ -131,6 +132,7 @@ private: ValueParser valueParser_; Data * data_; + Modifications * modifications_; rtl::OUString componentName_; StateStack state_; Path modificationPath_; |