* We need to call xmlInitParser() before using it in a multi-threaded
way (according to the libxml2 doc).
* Better to use 'rEntity' which references the one stored in the vector
rather than 'entity' whose copy gets stored in the vector. On Windows
at least 'rEntity' and 'entity' hold different parser pointer values.
* Free the parser before popping the entity. Popping the entity first then
freeing the parser using its pointer value stored in the entity looks
weird.
Change-Id: I6b64a6d8ac9c1d4fea8339d8fb2d38dfffbba47b
SAX interface is not required to provide the whole node content in one
characters() call (e.g. if there's an entity that needs decoding). However
it's easier to consumers to assume this (e.g. writerfilter's
DomainMapper::lcl_utext() handles datecontrol that way), and expat apparently
never used this. However this can happen with libxml2, so ensure such consumers
still work.
Change-Id: Ib564f372fbea8451f84553a6d49a07d091a950e9
Using SAX2 interface provides element/attribute names split into prefix/name,
and provides namespaces/urls, so FastSaxParserImpl::callbackStartElement()
does not have to figure out these on its own (and additionally libxml2
spends a noticeable portion in xmlStrdup() when not in SAX2 mode).
The switch saves about 5-10% time.
Change-Id: Idd424d7cc9b30c248179a5bad8ec79dbfc62e765
This contained an rtl_Sequence complete with horror internal
allocator, caught red-handed serializing threaded loading to no
good purpose.
Change-Id: I837b2c17e4f70fd6a49bed33ad74a7d79f98f35c
Not an ideal solution; ideally we should not throw the exceptions,
and stop the parser as soon as something bad like this happens; but
hopefully exception throwing is reasonable exceptional.
Change-Id: If619592533b2929c671e2b03eb8a83480bd92c54
...mostly done with a rewriting Clang plugin, with just some manual tweaking
necessary to fix poor macro usage.
Change-Id: I71fa20213e86be10de332ece0aa273239df7b61a
This is much better approach compared to the callback function, as it allows
passing arguments to the c++ constructor directly, while still allowing some
additional initialization after having acquired the instance.
Change-Id: I5a0f981915dd58f1522ee6054e53a3550b29d624
Many of the initalizations (in eg. framework) have to be done on an
acquire()'d object, so instead of doing the initialization directly, return
the initialization member function back to the createInstance() /
createInstanceWithContext() / ... and perform the initialization there.
As a sideeffect, I belive the calling initialize() from servicemanager is not
that much a hack any more - whoever converts the implementation to be
constructor-base has the choice to provide the callback, or still initialize
through XInitialization, where the callback is preferred by servicemanager
when it exists.
Change-Id: I8a87b75c54c1441ca0f184967d31ff4902fc4081
Most of the constructors are supposed to be only a call of
new TheInstance(arguments)
or an equivalent; so let's just change the constructor caller accordingly, to
accept unacquired new instance.
If there are exceptions that need to do more heavy lifting, they do not have
to use the constructor feature, or there can be a wrapper for the real
implementation, doing the additional work in their (C++) constructor.
Change-Id: I035c378778aeda60d15af4e56ca3761c586d5ded
There is no need to use different styles for writing the same thing.
It also makes it easier in future to use search & replace.
But of course, there are also some more complicated functions.
Change-Id: I773da20378af0e0d5a27689d3903df7063fb8ac0
boost::optional appears to show up rather heavily on many profiles.
We already use mnElementToken == DONTKNOW to flag / use these guys.
Change-Id: Ibf2b0167f259cc601da2fb9703e880b78e60886e
amazingly std::stack::top() takes 146 pseudo-cycles to do not much,
so instead cache the result in a single pointer in lieu of burning
that code.
Change-Id: Ie326be47da6cbad0850e5f1026a1632bb840b6b8
Remove erroneous assert: maSavedException is indeed empty for
XML parser reported exceptions. Clean cut/paste code, and comment.
Change-Id: Ia538bcc87a7efcd079d3021e00ac4d2eb62f3e8d
...to directly call constructor functions of ComponentContext-based C++
implementations of (non-single-instance) UNO services. The case where these
calls would need to be bridged across different environments (e.g., from gcc3
to gcc3:affine) is not yet implemented.
bootstrap.component and expwrap.component are adapted accordingly as a proof-of-
concept (which had previously been adapted to use the prefix="direct" feature,
which may become unnecessary again in the end, depending on how to handle
single-instance services/singletons). More to follow.
Change-Id: I18682d75bcd29d3d427e31331b4ce8161dbb846d
Useful when we just need to check if the stream has a certain namespace
defined. Calling getNamespaceURL() may throw SAXException in such case.
Change-Id: Ib2b7b202492390158270d87bab95d1793c9d8a70