22 #include <osl/file.hxx>
23 #include <com/sun/star/deployment/DeploymentException.hpp>
24 #include <com/sun/star/uno/XComponentContext.hpp>
25 #include <com/sun/star/xml/dom/DocumentBuilder.hpp>
26 #include <com/sun/star/xml/xpath/XPathAPI.hpp>
27 #include <com/sun/star/io/XActiveDataSource.hpp>
28 #include <com/sun/star/io/XActiveDataControl.hpp>
41 Reference<css::uno::XComponentContext>
const &
xContext,
42 OUString
const & url):
50 const Reference<css::io::XActiveDataSource> xDataSource(
m_doc,css::uno::UNO_QUERY_THROW);
51 std::vector<sal_Int8>
bytes;
53 const Reference<css::io::XActiveDataControl> xDataControl(
m_doc,css::uno::UNO_QUERY_THROW);
54 xDataControl->start();
56 const Reference<css::io::XInputStream> xData(
66 const Reference<css::xml::dom::XDocumentBuilder> xDocBuilder(
69 ::osl::DirectoryItem item;
70 ::osl::File::RC
err = ::osl::DirectoryItem::get(
m_urlDb, item);
71 if (err == ::osl::File::E_None)
74 m_urlDb, css::uno::Reference<css::ucb::XCommandEnvironment>(),
76 Reference<css::io::XInputStream> xIn = descContent.
openStream();
77 m_doc = xDocBuilder->parse(xIn);
79 else if (err == ::osl::File::E_NOENT)
82 m_doc = xDocBuilder->newDocument();
83 const Reference<css::xml::dom::XElement> rootNode =
87 m_doc->appendChild(Reference<css::xml::dom::XNode>(
88 rootNode, UNO_QUERY_THROW));
92 throw css::uno::RuntimeException(
93 "Extension manager could not access database file:"
97 throw css::uno::RuntimeException(
98 "Extension manager could not get root node of data base file: "
121 const Reference<css::xml::dom::XDocument> doc =
getDocument();
122 const Reference<css::xml::dom::XNode> root = doc->getFirstChild();
123 const Reference<css::xml::xpath::XXPathAPI> xpathApi =
getXPathAPI();
125 const Reference<css::xml::dom::XNode> aNode =
126 xpathApi->selectSingleNode(root, sXPathExpression);
130 root->removeChild(aNode);
134 #if OSL_DEBUG_LEVEL > 0
136 const Reference<css::xml::dom::XNode> nextNode =
137 xpathApi->selectSingleNode(root, sXPathExpression);
138 OSL_ASSERT(! nextNode.is());
141 catch(
const css::uno::Exception &)
144 throw css::deployment::DeploymentException(
145 "Extension Manager: failed to write data entry in backend db: " +
154 OUString sExpression =
169 Reference<css::xml::dom::XElement> entry(
getKeyElement(url), UNO_QUERY);
172 entry->setAttribute(
"revoked",
"true");
176 catch(
const css::uno::Exception &)
179 throw css::deployment::DeploymentException(
180 "Extension Manager: failed to revoke data entry in backend db: " +
190 Reference<css::xml::dom::XElement> entry(
getKeyElement(url), UNO_QUERY);
194 entry->removeAttribute(
"revoked");
200 catch(
const css::uno::Exception &)
203 throw css::deployment::DeploymentException(
204 "Extension Manager: failed to revoke data entry in backend db: " +
214 Reference<css::xml::dom::XElement> entry(
getKeyElement(url), UNO_QUERY);
217 OUString sActive = entry->getAttribute(
"revoked");
218 if (!(sActive ==
"true"))
224 catch(
const css::uno::Exception &)
227 throw css::deployment::DeploymentException(
228 "Extension Manager: failed to determine an active entry in backend db: " +
234 std::u16string_view url)
240 OUString sExpression =
248 const Reference<css::xml::dom::XDocument> doc =
getDocument();
249 const Reference<css::xml::dom::XNode> root = doc->getFirstChild();
250 const Reference<css::xml::xpath::XXPathAPI> xpathApi =
getXPathAPI();
251 return xpathApi->selectSingleNode(root, sExpression);
253 catch(
const css::uno::Exception &)
256 throw css::deployment::DeploymentException(
257 "Extension Manager: failed to read key element in backend db: " +
264 std::vector< std::pair< OUString, OUString > >
const & vecPairs,
265 std::u16string_view sVectorTagName,
266 std::u16string_view sPairTagName,
267 std::u16string_view sFirstTagName,
268 std::u16string_view sSecondTagName,
269 css::uno::Reference<css::xml::dom::XNode>
const & xParent)
272 if (vecPairs.empty())
275 OSL_ASSERT(!sNameSpace.isEmpty());
277 const Reference<css::xml::dom::XDocument> doc =
getDocument();
279 const Reference<css::xml::dom::XElement> vectorNode(
280 doc->createElementNS(sNameSpace, sPrefix + sVectorTagName));
282 xParent->appendChild(
283 Reference<css::xml::dom::XNode>(
284 vectorNode, css::uno::UNO_QUERY_THROW));
285 for (
auto const& vecPair : vecPairs)
287 const Reference<css::xml::dom::XElement> pairNode(
288 doc->createElementNS(sNameSpace, sPrefix + sPairTagName));
290 vectorNode->appendChild(
291 Reference<css::xml::dom::XNode>(
292 pairNode, css::uno::UNO_QUERY_THROW));
294 const Reference<css::xml::dom::XElement> firstNode(
295 doc->createElementNS(sNameSpace, sPrefix + sFirstTagName));
297 pairNode->appendChild(
298 Reference<css::xml::dom::XNode>(
299 firstNode, css::uno::UNO_QUERY_THROW));
301 const Reference<css::xml::dom::XText> firstTextNode(
302 doc->createTextNode( vecPair.first));
304 firstNode->appendChild(
305 Reference<css::xml::dom::XNode>(
306 firstTextNode, css::uno::UNO_QUERY_THROW));
308 const Reference<css::xml::dom::XElement> secondNode(
309 doc->createElementNS(sNameSpace, sPrefix + sSecondTagName));
311 pairNode->appendChild(
312 Reference<css::xml::dom::XNode>(
313 secondNode, css::uno::UNO_QUERY_THROW));
315 const Reference<css::xml::dom::XText> secondTextNode(
316 doc->createTextNode( vecPair.second));
318 secondNode->appendChild(
319 Reference<css::xml::dom::XNode>(
320 secondTextNode, css::uno::UNO_QUERY_THROW));
323 catch(
const css::uno::Exception &)
326 throw css::deployment::DeploymentException(
327 "Extension Manager: failed to write data entry in backend db: " +
332 std::vector< std::pair< OUString, OUString > >
334 Reference<css::xml::dom::XNode>
const & parent,
335 std::u16string_view sListTagName,
336 std::u16string_view sPairTagName,
337 std::u16string_view sFirstTagName,
338 std::u16string_view sSecondTagName)
342 OSL_ASSERT(parent.is());
344 const Reference<css::xml::xpath::XXPathAPI> xpathApi =
getXPathAPI();
345 const OUString sExprPairs(
346 sPrefix + sListTagName +
"/" + sPrefix + sPairTagName);
347 const Reference<css::xml::dom::XNodeList> listPairs =
348 xpathApi->selectNodeList(parent, sExprPairs);
350 std::vector< std::pair< OUString, OUString > > retVector;
351 sal_Int32
length = listPairs->getLength();
352 for (sal_Int32
i = 0;
i < length;
i++)
354 const Reference<css::xml::dom::XNode> aPair = listPairs->item(
i);
355 const OUString sExprFirst(sPrefix + sFirstTagName +
"/text()");
356 const Reference<css::xml::dom::XNode>
first =
357 xpathApi->selectSingleNode(aPair, sExprFirst);
359 const OUString sExprSecond(sPrefix + sSecondTagName +
"/text()");
360 const Reference<css::xml::dom::XNode> second =
361 xpathApi->selectSingleNode(aPair, sExprSecond);
362 OSL_ASSERT(first.is() && second.is());
364 retVector.emplace_back(
365 first->getNodeValue(), second->getNodeValue());
369 catch(
const css::uno::Exception &)
372 throw css::deployment::DeploymentException(
373 "Extension Manager: failed to read data entry in backend db: " +
380 std::deque< OUString>
const &
list,
381 std::u16string_view sListTagName,
382 std::u16string_view sMemberTagName,
383 Reference<css::xml::dom::XNode>
const & xParent)
391 const Reference<css::xml::dom::XDocument> doc =
getDocument();
393 const Reference<css::xml::dom::XElement> listNode(
394 doc->createElementNS(sNameSpace, sPrefix + sListTagName));
396 xParent->appendChild(
397 Reference<css::xml::dom::XNode>(
398 listNode, css::uno::UNO_QUERY_THROW));
400 for (
auto const& elem : list)
402 const Reference<css::xml::dom::XNode> memberNode(
403 doc->createElementNS(sNameSpace, sPrefix + sMemberTagName), css::uno::UNO_QUERY_THROW);
405 listNode->appendChild(memberNode);
407 const Reference<css::xml::dom::XNode> textNode(
408 doc->createTextNode(elem), css::uno::UNO_QUERY_THROW);
410 memberNode->appendChild(textNode);
413 catch(
const css::uno::Exception &)
416 throw css::deployment::DeploymentException(
417 "Extension Manager: failed to write data entry in backend db: " +
425 std::u16string_view sElementName, OUString
const & value,
426 Reference<css::xml::dom::XNode>
const & xParent)
433 const Reference<css::xml::dom::XDocument> doc =
getDocument();
435 const Reference<css::xml::dom::XNode> dataNode(
436 doc->createElementNS(sNameSpace, sPrefix +
":" + sElementName),
438 xParent->appendChild(dataNode);
440 const Reference<css::xml::dom::XNode> dataValue(
441 doc->createTextNode(value), UNO_QUERY_THROW);
442 dataNode->appendChild(dataValue);
444 catch(
const css::uno::Exception &)
447 throw css::deployment::DeploymentException(
448 "Extension Manager: failed to write data entry(writeSimpleElement) in backend db: " +
456 OUString
const & url)
463 const Reference<css::xml::dom::XDocument> doc =
getDocument();
464 const Reference<css::xml::dom::XNode> root = doc->getFirstChild();
473 const OUString sExpression(
474 sPrefix +
":" + sElementName +
"[@url = \"" + url +
"\"]");
475 const Reference<css::xml::dom::XNode> existingNode =
476 getXPathAPI()->selectSingleNode(root, sExpression);
477 if (existingNode.is())
484 const Reference<css::xml::dom::XElement> keyElement(
485 doc->createElementNS(sNameSpace, sPrefix +
":" + sElementName));
487 keyElement->setAttribute(
"url", url);
489 const Reference<css::xml::dom::XNode> keyNode(
490 keyElement, UNO_QUERY_THROW);
491 root->appendChild(keyNode);
494 catch(
const css::uno::Exception &)
497 throw css::deployment::DeploymentException(
498 "Extension Manager: failed to write key element in backend db: " +
504 std::u16string_view sElementName, Reference<css::xml::dom::XNode>
const & xParent)
509 const OUString sExpr(sPrefix +
":" + sElementName +
"/text()");
510 const Reference<css::xml::xpath::XXPathAPI> xpathApi =
getXPathAPI();
511 const Reference<css::xml::dom::XNode> val =
512 xpathApi->selectSingleNode(xParent, sExpr);
514 return val->getNodeValue();
517 catch(
const css::uno::Exception &)
520 throw css::deployment::DeploymentException(
521 "Extension Manager: failed to read data (readSimpleElement) in backend db: " +
528 Reference<css::xml::dom::XNode>
const & parent,
529 std::u16string_view sListTagName,
530 std::u16string_view sMemberTagName)
534 OSL_ASSERT(parent.is());
536 const Reference<css::xml::xpath::XXPathAPI> xpathApi =
getXPathAPI();
537 const OUString sExprList(
538 sPrefix + sListTagName +
"/" + sPrefix + sMemberTagName +
"/text()");
539 const Reference<css::xml::dom::XNodeList>
list =
540 xpathApi->selectNodeList(parent, sExprList);
542 std::deque<OUString > retList;
543 sal_Int32
length = list->getLength();
544 for (sal_Int32
i = 0;
i < length;
i++)
546 const Reference<css::xml::dom::XNode> member = list->item(
i);
547 retList.push_back(member->getNodeValue());
551 catch(
const css::uno::Exception &)
554 throw css::deployment::DeploymentException(
555 "Extension Manager: failed to read data entry in backend db: " +
561 std::u16string_view name)
565 std::vector<OUString> listRet;
566 Reference<css::xml::dom::XDocument> doc =
getDocument();
567 Reference<css::xml::dom::XNode> root = doc->getFirstChild();
569 Reference<css::xml::xpath::XXPathAPI> xpathApi =
getXPathAPI();
572 OUString sNodeSelectExpr =
582 Reference<css::xml::dom::XNodeList> nodes =
583 xpathApi->selectNodeList(root, sNodeSelectExpr);
586 sal_Int32
length = nodes->getLength();
587 for (sal_Int32
i = 0;
i < length;
i++)
588 listRet.push_back(nodes->item(
i)->getNodeValue());
592 catch (
const css::deployment::DeploymentException& )
596 catch(
const css::uno::Exception &)
599 throw css::deployment::DeploymentException(
600 "Extension Manager: failed to read data entry in backend db: " +
608 OUString
const & url):
BackendDb(xContext, url)
621 Reference<css::xml::dom::XDocument> doc =
getDocument();
622 Reference<css::xml::dom::XNode> root = doc->getFirstChild();
624 #if OSL_DEBUG_LEVEL > 0
626 OUString sExpression(
627 sPrefix +
":" + sEntry +
"[@url = \"" + url +
"\"]");
628 Reference<css::xml::dom::XNode> _extensionNode =
629 getXPathAPI()->selectSingleNode(root, sExpression);
630 OSL_ASSERT(! _extensionNode.is());
632 Reference<css::xml::dom::XElement> helpElement(
633 doc->createElementNS(sNameSpace, sPrefix +
":" + sEntry));
635 helpElement->setAttribute(
"url", url);
637 Reference<css::xml::dom::XNode> helpNode(
638 helpElement, UNO_QUERY_THROW);
639 root->appendChild(helpNode);
644 catch(
const css::uno::Exception &)
647 throw css::deployment::DeploymentException(
648 "Extension Manager: failed to write data entry in backend db: " +
css::uno::Reference< css::xml::dom::XDocument > const & getDocument()
std::vector< sal_uInt8 > bytes
bool activateEntry(std::u16string_view url)
std::vector< std::pair< OUString, OUString > > readVectorOfPair(css::uno::Reference< css::xml::dom::XNode > const &parent, std::u16string_view sListTagName, std::u16string_view sPairTagName, std::u16string_view sFirstTagName, std::u16string_view sSecondTagName)
OUString readSimpleElement(std::u16string_view sElementName, css::uno::Reference< css::xml::dom::XNode > const &xParent)
css::uno::Reference< css::xml::dom::XDocument > m_doc
void revokeEntry(std::u16string_view url)
std::vector< OUString > getOneChildFromAllEntries(std::u16string_view sElementName)
css::uno::Reference< css::deployment::XPackageRegistry > create(css::uno::Reference< css::deployment::XPackageRegistry > const &xRootRegistry, OUString const &context, OUString const &cachePath, css::uno::Reference< css::uno::XComponentContext > const &xComponentContext)
css::uno::Reference< css::xml::dom::XNode > writeKeyElement(OUString const &url)
The key elements have a url attribute and are always children of the root element.
void removeEntry(std::u16string_view url)
bool hasActiveEntry(std::u16string_view url)
Any SAL_CALL getCaughtException()
css::uno::Reference< css::xml::xpath::XXPathAPI > m_xpathApi
virtual OUString getKeyElementName()=0
css::uno::Reference< css::xml::dom::XNode > getKeyElement(std::u16string_view url)
BackendDb(BackendDb const &)=delete
void writeSimpleElement(std::u16string_view sElementName, OUString const &value, css::uno::Reference< css::xml::dom::XNode > const &xParent)
void writeSimpleList(std::deque< OUString > const &list, std::u16string_view sListTagName, std::u16string_view sMemberTagName, css::uno::Reference< css::xml::dom::XNode > const &xParent)
void removeElement(OUString const &sXPathExpression)
virtual OUString getDbNSName()=0
Reference< io::XInputStream > createInputStream(std::vector< sal_Int8 > &&rInData)
void addEntry(OUString const &url)
OUString expandUnoRcUrl(OUString const &url)
std::deque< OUString > readList(css::uno::Reference< css::xml::dom::XNode > const &parent, std::u16string_view sListTagName, std::u16string_view sMemberTagName)
static uno::Reference< css::uno::XComponentContext > xContext
css::uno::Reference< css::io::XInputStream > openStream()
const css::uno::Reference< css::uno::XComponentContext > m_xContext
RegisteredDb(css::uno::Reference< css::uno::XComponentContext > const &xContext, OUString const &url)
virtual OUString getNSPrefix()=0
void writeVectorOfPair(std::vector< std::pair< OUString, OUString > > const &vecPairs, std::u16string_view sVectorTagName, std::u16string_view sPairTagName, std::u16string_view sFirstTagName, std::u16string_view sSecondTagName, css::uno::Reference< css::xml::dom::XNode > const &xParent)
css::uno::Reference< css::xml::xpath::XXPathAPI > const & getXPathAPI()
Reference< io::XOutputStream > createOutputStream(std::vector< sal_Int8 > *pOutData)
virtual OUString getRootElementName()=0
void writeStream(const css::uno::Reference< css::io::XInputStream > &rStream, bool bReplaceExisting)
constexpr OUStringLiteral first
uno::Reference< uno::XComponentContext > m_xContext