25 #include <rtl/bootstrap.hxx>
26 #include <com/sun/star/deployment/DeploymentException.hpp>
27 #include <com/sun/star/deployment/XExtensionManager.hpp>
28 #include <com/sun/star/deployment/thePackageManagerFactory.hpp>
29 #include <com/sun/star/deployment/XPackageManager.hpp>
30 #include <com/sun/star/deployment/XPackage.hpp>
31 #include <com/sun/star/deployment/InstallException.hpp>
32 #include <com/sun/star/deployment/VersionException.hpp>
33 #include <com/sun/star/lang/IllegalArgumentException.hpp>
34 #include <com/sun/star/lang/XServiceInfo.hpp>
35 #include <com/sun/star/beans/Optional.hpp>
36 #include <com/sun/star/task/XInteractionApprove.hpp>
37 #include <com/sun/star/beans/Ambiguous.hpp>
38 #include <com/sun/star/ucb/CommandAbortedException.hpp>
39 #include <com/sun/star/ucb/CommandFailedException.hpp>
40 #include <com/sun/star/uno/XComponentContext.hpp>
41 #include <com/sun/star/io/XInputStream.hpp>
42 #include <com/sun/star/util/XModifyBroadcaster.hpp>
45 #include <osl/diagnose.h>
58 #include <string_view>
67 using ::com::sun::star::uno::Reference;
71 struct CompIdentifiers
73 bool operator() (std::vector<Reference<css::deployment::XPackage> >
const & a,
74 std::vector<Reference<css::deployment::XPackage> >
const & b)
76 return getName(a).compareTo(getName(b)) < 0;
79 static OUString getName(std::vector<Reference<css::deployment::XPackage> >
const & a);
82 OUString CompIdentifiers::getName(std::vector<Reference<css::deployment::XPackage> >
const & a)
84 OSL_ASSERT(
a.size() == 3);
86 Reference<css::deployment::XPackage> extension;
87 for (
auto const& elem : a)
95 OSL_ASSERT(extension.is());
96 return extension->getDisplayName();
103 ::rtl::Bootstrap::expandMacros(url);
107 Reference<css::io::XInputStream> xData(
109 reinterpret_cast<sal_Int8 const *>(stamp.getStr()),
110 stamp.getLength() ) );
111 ucbStamp.writeStream( xData,
true );
116 throw css::deployment::DeploymentException(
"Failed to update" + url,
nullptr, exc);
120 class ExtensionRemoveGuard
122 css::uno::Reference<css::deployment::XPackage>
m_extension;
123 css::uno::Reference<css::deployment::XPackageManager> m_xPackageManager;
126 ExtensionRemoveGuard(){};
127 ExtensionRemoveGuard(
128 css::uno::Reference<css::deployment::XPackage>
const & extension,
129 css::uno::Reference<css::deployment::XPackageManager>
const & xPackageManager):
130 m_extension(extension), m_xPackageManager(xPackageManager) {}
131 ~ExtensionRemoveGuard();
133 void set(css::uno::Reference<css::deployment::XPackage>
const & extension,
134 css::uno::Reference<css::deployment::XPackageManager>
const & xPackageManager) {
135 m_extension = extension;
136 m_xPackageManager = xPackageManager;
140 ExtensionRemoveGuard::~ExtensionRemoveGuard()
143 OSL_ASSERT(!(
m_extension.is() && !m_xPackageManager.is()));
145 m_xPackageManager->removePackage(
147 css::uno::Reference<css::task::XAbortChannel>(),
148 css::uno::Reference<css::ucb::XCommandEnvironment>());
178 return "com.sun.star.comp.deployment.ExtensionManager";
189 return {
"com.sun.star.comp.deployment.ExtensionManager" };
215 return new dp_misc::AbortChannel;
218 css::uno::Reference<css::deployment::XPackageManager>
221 Reference<css::deployment::XPackageManager> xPackageManager;
222 if (repository ==
u"user")
224 else if (repository ==
u"shared")
226 else if (repository ==
u"bundled")
228 else if (repository ==
u"tmp")
230 else if (repository ==
u"bak")
233 throw lang::IllegalArgumentException(
234 "No valid repository name provided.",
235 static_cast<cppu::OWeakObject*>(
this), 0);
236 return xPackageManager;
248 uno::Sequence<Reference<css::deployment::XPackage> >
const & seqExt,
249 std::u16string_view repository)
256 if (repositoryName == repository)
261 for (
const Reference<css::deployment::XPackage>& xExtension : seqExt)
264 id2extensions::iterator ivec = mapExt.find(
id);
265 if (ivec == mapExt.end())
267 std::vector<Reference<css::deployment::XPackage> > vec(3);
268 vec[index] = xExtension;
273 ivec->second[index] = xExtension;
290 std::vector<Reference<css::deployment::XPackage> >
292 OUString
const & identifier, OUString
const & fileName)
295 std::vector<Reference<css::deployment::XPackage> > extensionList;
296 Reference<css::deployment::XPackageManager> lRepos[] = {
300 Reference<css::deployment::XPackage> xPackage;
303 xPackage = lRepos[
i]->getDeployedPackage(
304 identifier, fileName, Reference<ucb::XCommandEnvironment>());
306 catch(
const lang::IllegalArgumentException &)
310 extensionList.push_back(xPackage);
312 OSL_ASSERT(extensionList.size() == 3);
313 return extensionList;
316 uno::Sequence<Reference<css::deployment::XPackage> >
318 OUString
const & identifier,
319 OUString
const & fileName,
320 Reference< ucb::XCommandEnvironment>
const & )
324 std::vector<Reference<css::deployment::XPackage> > listExtensions =
326 bool bHasExtension =
false;
329 for (
auto const& extension : listExtensions)
330 bHasExtension |= extension.is();
332 throw lang::IllegalArgumentException(
333 "Could not find extension: " + identifier +
", " + fileName,
334 static_cast<cppu::OWeakObject*>(
this), -1);
338 catch (
const css::deployment::DeploymentException & )
342 catch (
const ucb::CommandFailedException & )
346 catch (css::uno::RuntimeException &)
352 uno::Any exc = ::cppu::getCaughtException();
353 throw css::deployment::DeploymentException(
354 "Extension Manager: exception during getExtensionsWithSameIdentifier",
355 static_cast<OWeakObject*>(
this), exc);
360 OUString
const & identifier, OUString
const & fileName)
362 std::vector<Reference<css::deployment::XPackage> > listExtensions;
366 }
catch (
const lang::IllegalArgumentException & ) {
368 OSL_ASSERT(listExtensions.size() == 3);
374 uno::Sequence<Reference<css::deployment::XPackage> >
const & seqExtSameId)
376 OSL_ASSERT(seqExtSameId.getLength() == 3);
377 Reference<css::deployment::XPackage>
const & userExtension = seqExtSameId[0];
378 if (userExtension.is())
380 beans::Optional<beans::Ambiguous<sal_Bool> > reg =
381 userExtension->isRegistered(Reference<task::XAbortChannel>(),
382 Reference<ucb::XCommandEnvironment>());
387 ! reg.Value.IsAmbiguous && ! reg.Value.Value)
409 OUString
const & identifier, OUString
const & fileName,
412 Reference<task::XAbortChannel>
const & xAbortChannel,
413 Reference<ucb::XCommandEnvironment>
const & xCmdEnv )
415 std::vector<Reference<css::deployment::XPackage> > listExtensions;
418 }
catch (
const lang::IllegalArgumentException &) {
420 OSL_ASSERT(listExtensions.size() == 3);
424 bUserDisabled, bStartup, xAbortChannel, xCmdEnv);
430 uno::Sequence<Reference<css::deployment::XPackage> >
const & seqExt,
433 Reference<task::XAbortChannel>
const & xAbortChannel,
434 Reference<ucb::XCommandEnvironment>
const & xCmdEnv )
436 bool bActive =
false;
437 sal_Int32 len = seqExt.getLength();
438 for (sal_Int32 i = 0;
i < len;
i++)
440 Reference<css::deployment::XPackage>
const & aExt = seqExt[
i];
444 beans::Optional<beans::Ambiguous<sal_Bool> > optReg =
445 aExt->isRegistered(xAbortChannel, xCmdEnv);
447 if (!optReg.IsPresent)
451 if (i == 0 && bUserDisabled)
453 aExt->revokePackage(bStartup, xAbortChannel, xCmdEnv);
462 aExt->revokePackage(bStartup, xAbortChannel, xCmdEnv);
472 aExt->registerPackage(bStartup, xAbortChannel, xCmdEnv);
479 OUString
const & identifier, OUString
const & fileName,
480 Reference<css::deployment::XPackageManager>
const & xPackageManager,
481 Reference<ucb::XCommandEnvironment>
const & xCmdEnv )
483 Reference<css::deployment::XPackage> xBackup;
484 Reference<ucb::XCommandEnvironment> tmpCmdEnv(
486 Reference<css::deployment::XPackage> xOldExtension = xPackageManager->getDeployedPackage(
487 identifier, fileName, tmpCmdEnv);
489 if (xOldExtension.is())
492 xOldExtension->getURL(), uno::Sequence<beans::NamedValue>(),
493 OUString(), Reference<task::XAbortChannel>(), tmpCmdEnv);
495 OSL_ENSURE(xBackup.is(),
"Failed to backup extension");
508 uno::Sequence< Reference<css::deployment::XPackageTypeInfo> >
519 Reference<css::deployment::XPackageManager>
const & xPackageMgr,
520 uno::Sequence<beans::NamedValue>
const &
properties,
521 css::uno::Reference<css::deployment::XPackage>
const & xTmpExtension,
522 Reference<task::XAbortChannel>
const & xAbortChannel,
523 Reference<ucb::XCommandEnvironment>
const & xCmdEnv,
524 Reference<css::deployment::XPackage> & out_existingExtension )
528 Reference<css::deployment::XPackage> xOldExtension;
530 const OUString sFileName = xTmpExtension->getName();
531 const OUString
sDisplayName = xTmpExtension->getDisplayName();
532 const OUString sVersion = xTmpExtension->getVersion();
536 xOldExtension = xPackageMgr->getDeployedPackage(
537 sIdentifier, sFileName, xCmdEnv);
538 out_existingExtension = xOldExtension;
540 catch (
const lang::IllegalArgumentException &)
543 bool bCanInstall =
false;
557 if (xOldExtension.is())
561 checkUpdate(sVersion, sDisplayName,xOldExtension, xCmdEnv);
570 Reference<ucb::XCommandEnvironment> _xCmdEnv(xCmdEnv);
574 const ::std::optional<dp_misc::SimpleLicenseAttributes> licenseAttributes =
577 if (licenseAttributes && licenseAttributes->suppressIfRequired
581 bCanInstall = xTmpExtension->checkPrerequisites(
586 catch (
const css::deployment::DeploymentException& ) {
588 }
catch (
const ucb::CommandFailedException & ) {
590 }
catch (
const ucb::CommandAbortedException & ) {
592 }
catch (
const lang::IllegalArgumentException &) {
594 }
catch (
const uno::RuntimeException &) {
596 }
catch (
const uno::Exception &) {
597 uno::Any excOccurred = ::cppu::getCaughtException();
598 css::deployment::DeploymentException exc(
599 "Extension Manager: exception in doChecksForAddExtension",
600 static_cast<OWeakObject*>(
this), excOccurred);
603 throw uno::RuntimeException(
604 "Extension Manager: unexpected exception in doChecksForAddExtension",
605 static_cast<OWeakObject*>(
this));
611 OUString
const & url, uno::Sequence<beans::NamedValue>
const &
properties,
612 OUString
const & repository,
613 Reference<task::XAbortChannel>
const & xAbortChannel,
614 Reference<ucb::XCommandEnvironment>
const & xCmdEnv )
616 Reference<css::deployment::XPackage> xNewExtension;
618 Reference<css::deployment::XPackageManager> xPackageManager;
619 if (repository ==
"user")
621 else if (repository ==
"shared")
624 throw lang::IllegalArgumentException(
625 "No valid repository name provided.",
626 static_cast<cppu::OWeakObject*>(
this), 0);
631 Reference<css::deployment::XPackageManager> xTmpRepository(
getTmpRepository());
636 Reference<css::deployment::XPackage> xTmpExtension(
637 xTmpRepository->addPackage(
638 url, uno::Sequence<beans::NamedValue>(), OUString(), xAbortChannel,
640 if (!xTmpExtension.is()) {
641 throw css::deployment::DeploymentException(
642 (
"Extension Manager: Failed to create temporary XPackage for url: "
644 static_cast<OWeakObject*>(
this),
uno::Any());
649 ExtensionRemoveGuard tmpExtensionRemoveGuard(xTmpExtension,
getTmpRepository());
650 ExtensionRemoveGuard bakExtensionRemoveGuard;
652 const OUString sFileName = xTmpExtension->getName();
653 Reference<css::deployment::XPackage> xOldExtension;
654 Reference<css::deployment::XPackage> xExtensionBackup;
666 bool bUserDisabled =
false;
680 if (xOldExtension.is())
684 xOldExtension->revokePackage(
685 false, xAbortChannel, Reference<ucb::XCommandEnvironment>());
688 xOldExtension, Reference<task::XAbortChannel>(),
689 Reference<ucb::XCommandEnvironment>());
692 catch (
const lang::DisposedException &)
703 sal_Int32 failedPrereq = xTmpExtension->checkPrerequisites(
704 xAbortChannel, pSilentCommandEnv,
true);
705 if (failedPrereq == 0)
707 xNewExtension = xPackageManager->addPackage(
708 url, properties, OUString(), xAbortChannel,
709 Reference<ucb::XCommandEnvironment>());
714 bool bUserDisabled2 = bUserDisabled;
715 if (repository ==
"user")
716 bUserDisabled2 =
false;
720 OUString sNewExtensionFileName = xNewExtension->getName();
723 sNewExtensionIdentifier, sNewExtensionFileName,
724 bUserDisabled2,
false, xAbortChannel,
725 Reference<ucb::XCommandEnvironment>());
736 }
catch (
const css::deployment::DeploymentException& ) {
738 }
catch (
const ucb::CommandFailedException & ) {
740 }
catch (
const ucb::CommandAbortedException & ) {
742 }
catch (
const lang::IllegalArgumentException &) {
744 }
catch (
const uno::RuntimeException &) {
746 }
catch (
const uno::Exception &) {
747 uno::Any excOccurred = ::cppu::getCaughtException();
748 css::deployment::DeploymentException exc(
749 "Extension Manager: Exception on fireModified() "
750 "in the scope of 'if (failedPrereq == 0)'",
751 static_cast<OWeakObject*>(
this), excOccurred);
754 throw uno::RuntimeException(
755 "Extension Manager: RuntimeException on fireModified() "
756 "in the scope of 'if (failedPrereq == 0)'",
757 static_cast<OWeakObject*>(
this));
762 if (pSilentCommandEnv->m_Exception.hasValue())
764 else if ( pSilentCommandEnv->m_UnknownException.hasValue())
767 throw css::deployment::DeploymentException (
768 "Extension Manager: exception during addExtension, ckeckPrerequisites failed",
769 static_cast<OWeakObject*>(
this),
uno::Any());
772 catch (
const css::deployment::DeploymentException& ) {
773 excOccurred2 = ::cppu::getCaughtException();
774 }
catch (
const ucb::CommandFailedException & ) {
775 excOccurred2 = ::cppu::getCaughtException();
776 }
catch (
const ucb::CommandAbortedException & ) {
777 excOccurred2 = ::cppu::getCaughtException();
778 }
catch (
const lang::IllegalArgumentException &) {
779 excOccurred2 = ::cppu::getCaughtException();
780 }
catch (
const uno::RuntimeException &) {
781 excOccurred2 = ::cppu::getCaughtException();
783 excOccurred2 = ::cppu::getCaughtException();
784 css::deployment::DeploymentException exc(
785 "Extension Manager: exception during addExtension, url: "
786 + url, static_cast<OWeakObject*>(
this), excOccurred2);
787 excOccurred2 <<= exc;
800 if (xExtensionBackup.is())
802 xPackageManager->importExtension(
803 xExtensionBackup, Reference<task::XAbortChannel>(),
804 Reference<ucb::XCommandEnvironment>());
807 sIdentifier, sFileName, bUserDisabled,
false,
808 Reference<task::XAbortChannel>(), Reference<ucb::XCommandEnvironment>());
813 ::cppu::throwException(excOccurred2);
817 return xNewExtension;
821 OUString
const & identifier, OUString
const & fileName,
822 OUString
const & repository,
823 Reference<task::XAbortChannel>
const & xAbortChannel,
824 Reference<ucb::XCommandEnvironment>
const & xCmdEnv )
827 Reference<css::deployment::XPackage> xExtensionBackup;
828 Reference<css::deployment::XPackageManager> xPackageManager;
829 bool bUserDisabled =
false;
834 if (repository ==
"user")
836 else if (repository ==
"shared")
839 throw lang::IllegalArgumentException(
840 "No valid repository name provided.",
841 static_cast<cppu::OWeakObject*>(
this), 0);
846 identifier, fileName, xPackageManager, xCmdEnv);
849 Reference<css::deployment::XPackage> xOldExtension =
850 xPackageManager->getDeployedPackage(
851 identifier, fileName, xCmdEnv);
852 xOldExtension->revokePackage(
false, xAbortChannel, xCmdEnv);
854 xPackageManager->removePackage(
855 identifier, fileName, xAbortChannel, xCmdEnv);
857 xAbortChannel, xCmdEnv);
860 catch (
const css::deployment::DeploymentException& ) {
861 excOccurred1 = ::cppu::getCaughtException();
862 }
catch (
const ucb::CommandFailedException & ) {
863 excOccurred1 = ::cppu::getCaughtException();
864 }
catch (
const ucb::CommandAbortedException & ) {
865 excOccurred1 = ::cppu::getCaughtException();
866 }
catch (
const lang::IllegalArgumentException &) {
867 excOccurred1 = ::cppu::getCaughtException();
868 }
catch (
const uno::RuntimeException &) {
869 excOccurred1 = ::cppu::getCaughtException();
871 excOccurred1 = ::cppu::getCaughtException();
872 css::deployment::DeploymentException exc(
873 "Extension Manager: exception during removeExtension",
874 static_cast<OWeakObject*>(
this), excOccurred1);
875 excOccurred1 <<= exc;
884 Reference<ucb::XCommandEnvironment> tmpCmdEnv(
886 if (xExtensionBackup.is())
888 xPackageManager->importExtension(
889 xExtensionBackup, Reference<task::XAbortChannel>(),
892 identifier, fileName, bUserDisabled,
false,
893 Reference<task::XAbortChannel>(),
898 xExtensionBackup->getName(), xAbortChannel, xCmdEnv);
905 ::cppu::throwException(excOccurred1);
908 if (xExtensionBackup.is())
911 xExtensionBackup->getName(), xAbortChannel, xCmdEnv);
916 Reference<css::deployment::XPackage>
const & extension,
917 Reference<task::XAbortChannel>
const & xAbortChannel,
918 Reference<ucb::XCommandEnvironment>
const & xCmdEnv)
921 bool bUserDisabled =
false;
927 OUString repository = extension->getRepositoryName();
928 if (repository !=
"user")
929 throw lang::IllegalArgumentException(
930 "No valid repository name provided.",
931 static_cast<cppu::OWeakObject*>(
this), 0);
934 extension->getName());
937 extension->getName(),
false,
false,
938 xAbortChannel, xCmdEnv);
940 catch (
const css::deployment::DeploymentException& ) {
941 excOccurred = ::cppu::getCaughtException();
942 }
catch (
const ucb::CommandFailedException & ) {
943 excOccurred = ::cppu::getCaughtException();
944 }
catch (
const ucb::CommandAbortedException & ) {
945 excOccurred = ::cppu::getCaughtException();
946 }
catch (
const lang::IllegalArgumentException &) {
947 excOccurred = ::cppu::getCaughtException();
948 }
catch (
const uno::RuntimeException &) {
949 excOccurred = ::cppu::getCaughtException();
951 excOccurred = ::cppu::getCaughtException();
952 css::deployment::DeploymentException exc(
953 "Extension Manager: exception during enableExtension",
954 static_cast<OWeakObject*>(
this), excOccurred);
964 extension->getName(), bUserDisabled,
false,
965 xAbortChannel, xCmdEnv);
970 ::cppu::throwException(excOccurred);
974 Reference<css::deployment::XPackage>
const & extension,
975 Reference<task::XAbortChannel>
const & xAbortChannel,
976 Reference<ucb::XCommandEnvironment>
const & xCmdEnv)
984 Reference<css::deployment::XPackageManager> mgr =
986 ret = mgr->checkPrerequisites(extension, xAbortChannel, xCmdEnv);
990 extension->revokePackage(
false, xAbortChannel, xCmdEnv);
995 xAbortChannel, xCmdEnv);
998 catch (
const css::deployment::DeploymentException& ) {
1000 }
catch (
const ucb::CommandFailedException & ) {
1002 }
catch (
const ucb::CommandAbortedException & ) {
1004 }
catch (
const lang::IllegalArgumentException &) {
1006 }
catch (
const uno::RuntimeException &) {
1009 uno::Any excOccurred = ::cppu::getCaughtException();
1010 css::deployment::DeploymentException exc(
1011 "Extension Manager: exception during disableExtension",
1012 static_cast<OWeakObject*>(
this), excOccurred);
1018 Reference<css::deployment::XPackage>
const & extension,
1019 Reference<task::XAbortChannel>
const & xAbortChannel,
1020 Reference<ucb::XCommandEnvironment>
const & xCmdEnv )
1024 bool bUserDisabled =
false;
1027 if (!extension.is())
1029 const OUString repository( extension->getRepositoryName());
1030 if (repository !=
"user")
1031 throw lang::IllegalArgumentException(
1032 "No valid repository name provided.",
1033 static_cast<cppu::OWeakObject*>(
this), 0);
1039 xAbortChannel, xCmdEnv);
1041 catch (
const css::deployment::DeploymentException& ) {
1042 excOccurred = ::cppu::getCaughtException();
1043 }
catch (
const ucb::CommandFailedException & ) {
1044 excOccurred = ::cppu::getCaughtException();
1045 }
catch (
const ucb::CommandAbortedException & ) {
1046 excOccurred = ::cppu::getCaughtException();
1047 }
catch (
const lang::IllegalArgumentException &) {
1048 excOccurred = ::cppu::getCaughtException();
1049 }
catch (
const uno::RuntimeException &) {
1050 excOccurred = ::cppu::getCaughtException();
1052 excOccurred = ::cppu::getCaughtException();
1053 css::deployment::DeploymentException exc(
1054 "Extension Manager: exception during disableExtension",
1055 static_cast<OWeakObject*>(
this), excOccurred);
1056 excOccurred <<= exc;
1065 extension->getName(), bUserDisabled,
false,
1066 xAbortChannel, xCmdEnv);
1071 ::cppu::throwException(excOccurred);
1074 uno::Sequence< Reference<css::deployment::XPackage> >
1076 OUString
const & repository,
1077 Reference<task::XAbortChannel>
const &xAbort,
1078 Reference<ucb::XCommandEnvironment>
const & xCmdEnv )
1084 Reference<css::deployment::XPackage>
1086 OUString
const & repository,
1087 OUString
const & identifier,
1088 OUString
const & filename,
1089 Reference<ucb::XCommandEnvironment>
const & xCmdEnv )
1092 identifier, filename, xCmdEnv);
1095 uno::Sequence< uno::Sequence<Reference<css::deployment::XPackage> > >
1097 Reference<task::XAbortChannel>
const & xAbort,
1098 Reference<ucb::XCommandEnvironment>
const & xCmdEnv )
1104 uno::Sequence<Reference<css::deployment::XPackage> > userExt =
1107 uno::Sequence<Reference<css::deployment::XPackage> > sharedExt =
1110 uno::Sequence<Reference<css::deployment::XPackage> > bundledExt =
1119 std::vector< std::vector<Reference<css::deployment::XPackage> > >
1121 for (
auto const& elem : mapExt)
1122 vecExtensions.push_back(elem.second);
1125 std::sort(vecExtensions.begin(), vecExtensions.end(), CompIdentifiers());
1128 uno::Sequence< uno::Sequence<Reference<css::deployment::XPackage> > > seqSeq(vecExtensions.size());
1129 auto seqSeqRange = asNonConstRange(seqSeq);
1130 for (
auto const& elem : vecExtensions)
1136 }
catch (
const css::deployment::DeploymentException& ) {
1138 }
catch (
const ucb::CommandFailedException & ) {
1140 }
catch (
const ucb::CommandAbortedException & ) {
1142 }
catch (
const lang::IllegalArgumentException &) {
1144 }
catch (
const uno::RuntimeException &) {
1147 uno::Any exc = ::cppu::getCaughtException();
1148 throw css::deployment::DeploymentException(
1149 "Extension Manager: exception during enableExtension",
1150 static_cast<OWeakObject*>(
this), exc);
1157 sal_Bool force, OUString
const & repository,
1158 Reference<task::XAbortChannel>
const & xAbortChannel,
1159 Reference<ucb::XCommandEnvironment>
const & xCmdEnv )
1163 Reference<css::deployment::XPackageManager>
1166 std::set< OUString > disabledExts;
1168 const uno::Sequence< Reference<css::deployment::XPackage> >
extensions(
1169 xPackageManager->getDeployedPackages(xAbortChannel, xCmdEnv));
1174 beans::Optional< beans::Ambiguous< sal_Bool > > registered(
1175 package->isRegistered(xAbortChannel, xCmdEnv));
1176 if (registered.IsPresent &&
1177 !(registered.Value.IsAmbiguous ||
1178 registered.Value.Value))
1181 OSL_ASSERT(!
id.isEmpty());
1182 disabledExts.insert(
id);
1185 catch (
const lang::DisposedException &)
1192 xPackageManager->reinstallDeployedPackages(
1193 force, xAbortChannel, xCmdEnv);
1197 const uno::Sequence< Reference<css::deployment::XPackage> >
extensions(
1198 xPackageManager->getDeployedPackages(xAbortChannel, xCmdEnv));
1205 const OUString fileName =
package->getName();
1206 OSL_ASSERT(!
id.isEmpty());
1208 id, fileName, disabledExts.find(
id) != disabledExts.end(),
1209 true, xAbortChannel, xCmdEnv );
1211 catch (
const lang::DisposedException &)
1215 }
catch (
const css::deployment::DeploymentException& ) {
1217 }
catch (
const ucb::CommandFailedException & ) {
1219 }
catch (
const ucb::CommandAbortedException & ) {
1221 }
catch (
const lang::IllegalArgumentException &) {
1223 }
catch (
const uno::RuntimeException &) {
1226 uno::Any exc = ::cppu::getCaughtException();
1227 throw css::deployment::DeploymentException(
1228 "Extension Manager: exception during enableExtension",
1229 static_cast<OWeakObject*>(
this), exc);
1234 Reference<task::XAbortChannel>
const & xAbortChannel,
1235 Reference<ucb::XCommandEnvironment>
const & xCmdEnv )
1241 sSynchronizingShared = sSynchronizingShared.replaceAll(
"%NAME",
"shared");
1244 progressShared.
update(
"\n\n");
1247 sSynchronizingBundled = sSynchronizingBundled.replaceAll(
"%NAME",
"bundled");
1250 progressBundled.
update(
"\n\n");
1263 const uno::Sequence<uno::Sequence<Reference<css::deployment::XPackage> > >
1265 for (uno::Sequence<Reference<css::deployment::XPackage> >
const & seqExt : seqSeqExt)
1268 xAbortChannel, xCmdEnv);
1275 OSL_FAIL(
"Extensions Manager: synchronize");
1277 OUString lastSyncBundled(
"$BUNDLED_EXTENSIONS_USER/lastsynchronized");
1278 writeLastModified(lastSyncBundled, xCmdEnv,
m_xContext);
1279 OUString lastSyncShared(
"$SHARED_EXTENSIONS_USER/lastsynchronized");
1280 writeLastModified(lastSyncShared, xCmdEnv,
m_xContext);
1282 }
catch (
const css::deployment::DeploymentException& ) {
1284 }
catch (
const ucb::CommandFailedException & ) {
1286 }
catch (
const ucb::CommandAbortedException & ) {
1288 }
catch (
const lang::IllegalArgumentException &) {
1290 }
catch (
const uno::RuntimeException &) {
1293 uno::Any exc = ::cppu::getCaughtException();
1294 throw css::deployment::DeploymentException(
1295 "Extension Manager: exception in synchronize",
1296 static_cast<OWeakObject*>(
this), exc);
1308 OUString
const & displayName,
1309 Reference<ucb::XCommandEnvironment>
const & cmdEnv)
1312 css::deployment::InstallException(
1313 "Extension " + displayName +
1314 " is about to be installed.",
1315 static_cast<OWeakObject *>(
this), displayName));
1316 bool approve =
false, abort =
false;
1319 cmdEnv, &approve, &abort ))
1321 OSL_ASSERT( !approve && !abort );
1322 throw css::deployment::DeploymentException(
1323 DpResId(RID_STR_ERROR_WHILE_ADDING) + displayName,
1324 static_cast<OWeakObject *>(
this), request );
1326 if (abort || !approve)
1327 throw ucb::CommandFailedException(
1328 DpResId(RID_STR_ERROR_WHILE_ADDING) + displayName,
1329 static_cast<OWeakObject *>(
this), request );
1337 OUString
const & newVersion,
1338 OUString
const & newDisplayName,
1339 Reference<css::deployment::XPackage>
const & oldExtension,
1340 Reference<ucb::XCommandEnvironment>
const & xCmdEnv )
1344 (css::deployment::VersionException(
1346 RID_STR_PACKAGE_ALREADY_ADDED ) + newDisplayName,
1347 static_cast<OWeakObject *>(
this), newVersion, newDisplayName,
1349 bool replace =
false, abort =
false;
1352 xCmdEnv, &replace, &abort )) {
1353 OSL_ASSERT( !replace && !abort );
1354 throw css::deployment::DeploymentException(
1356 RID_STR_ERROR_WHILE_ADDING) + newDisplayName,
1357 static_cast<OWeakObject *>(
this), request );
1359 if (abort || !replace)
1360 throw ucb::CommandFailedException(
1362 RID_STR_PACKAGE_ALREADY_ADDED) + newDisplayName,
1363 static_cast<OWeakObject *>(
this), request );
1366 uno::Sequence<Reference<css::deployment::XPackage> > SAL_CALL
1368 OUString
const & repository,
1369 Reference<ucb::XCommandEnvironment>
const & xCmdEnv)
1371 Reference<css::deployment::XPackageManager>
1374 return xPackageManager->getExtensionsWithUnacceptedLicenses(xCmdEnv);
1386 Reference<util::XModifyListener>
const & xListener )
1389 rBHelper.addListener(
cppu::UnoType<decltype(xListener)>::
get(), xListener );
1394 Reference<util::XModifyListener>
const & xListener )
1397 rBHelper.removeListener(
cppu::UnoType<decltype(xListener)>::
get(), xListener );
1402 ::osl::MutexGuard guard(
m_aMutex );
1403 if (rBHelper.bInDispose || rBHelper.bDisposed) {
1404 throw lang::DisposedException(
1405 "ExtensionManager instance has already been disposed!",
1406 static_cast<OWeakObject *>(
this) );
1414 if (pContainer !=
nullptr) {
1415 pContainer->
forEach<util::XModifyListener>(
1416 [
this] (uno::Reference<util::XModifyListener>
const& xListener)
1417 {
return xListener->modified(lang::EventObject(static_cast<OWeakObject *>(
this))); });
1424 extern "C" SAL_DLLPUBLIC_EXPORT css::uno::XInterface*
1426 css::uno::XComponentContext* context, css::uno::Sequence<css::uno::Any>
const& )
std::unordered_map< OUString, std::vector< css::uno::Reference< css::deployment::XPackage > > > id2extensions
virtual css::uno::Sequence< css::uno::Reference< css::deployment::XPackage > > SAL_CALL getExtensionsWithUnacceptedLicenses(OUString const &repository, css::uno::Reference< css::ucb::XCommandEnvironment > const &xCmdEnv) override
virtual void SAL_CALL reinstallDeployedExtensions(sal_Bool force, OUString const &repository, css::uno::Reference< css::task::XAbortChannel > const &xAbortChannel, css::uno::Reference< css::ucb::XCommandEnvironment > const &xCmdEnv) override
virtual sal_Int32 SAL_CALL checkPrerequisitesAndEnable(css::uno::Reference< css::deployment::XPackage > const &extension, css::uno::Reference< css::task::XAbortChannel > const &xAbortChannel, css::uno::Reference< css::ucb::XCommandEnvironment > const &xCmdEnv) override
virtual void SAL_CALL removeModifyListener(css::uno::Reference< css::util::XModifyListener > const &xListener) override
css::uno::Reference< css::deployment::XPackageManager > getBakRepository()
bool isSuppressedLicense() const
virtual css::uno::Sequence< css::uno::Sequence< css::uno::Reference< css::deployment::XPackage > > > SAL_CALL getAllExtensions(css::uno::Reference< css::task::XAbortChannel > const &, css::uno::Reference< css::ucb::XCommandEnvironment > const &xCmdEnv) override
virtual css::uno::Reference< css::deployment::XPackage > SAL_CALL addExtension(OUString const &url, css::uno::Sequence< css::beans::NamedValue > const &properties, OUString const &repository, css::uno::Reference< css::task::XAbortChannel > const &xAbortChannel, css::uno::Reference< css::ucb::XCommandEnvironment > const &xCmdEnv) override
virtual css::uno::Sequence< OUString > SAL_CALL getSupportedServiceNames() override
void SAL_CALL throwException(Any const &exc)
bool isExtensionUpdate() const
virtual void SAL_CALL removeExtension(OUString const &identifier, OUString const &filename, OUString const &repository, css::uno::Reference< css::task::XAbortChannel > const &xAbortChannel, css::uno::Reference< css::ucb::XCommandEnvironment > const &xCmdEnv) override
css::uno::Reference< css::deployment::XPackageManager > getTmpRepository()
mutable::osl::Mutex m_aMutex
ExtensionManager(css::uno::Reference< css::uno::XComponentContext >const &xContext)
void syncRepositories(bool force, Reference< ucb::XCommandEnvironment > const &xCmdEnv)
static OUString StrSyncRepository()
void update(OUString const &status) const
void activateExtension(OUString const &identifier, OUString const &fileName, bool bUserDisabled, bool bStartup, css::uno::Reference< css::task::XAbortChannel > const &xAbortChannel, css::uno::Reference< css::ucb::XCommandEnvironment > const &xCmdEnv)
std::vector< OUString > m_repositoryNames
Any SAL_CALL getCaughtException()
virtual css::uno::Sequence< css::uno::Reference< css::deployment::XPackage > > SAL_CALL getDeployedExtensions(OUString const &repository, css::uno::Reference< css::task::XAbortChannel > const &, css::uno::Reference< css::ucb::XCommandEnvironment > const &xCmdEnv) override
bool CPPUHELPER_DLLPUBLIC supportsService(css::lang::XServiceInfo *implementation, rtl::OUString const &name)
virtual css::uno::Sequence< css::uno::Reference< css::deployment::XPackage > > SAL_CALL getExtensionsWithSameIdentifier(OUString const &identifier, OUString const &filename, css::uno::Reference< css::ucb::XCommandEnvironment > const &xCmdEnv) override
bool doChecksForAddExtension(css::uno::Reference< css::deployment::XPackageManager > const &xPackageMgr, css::uno::Sequence< css::beans::NamedValue > const &properties, css::uno::Reference< css::deployment::XPackage > const &xTmpExtension, css::uno::Reference< css::task::XAbortChannel > const &xAbortChannel, css::uno::Reference< css::ucb::XCommandEnvironment > const &xCmdEnv, css::uno::Reference< css::deployment::XPackage > &out_existingExtension)
virtual sal_Bool SAL_CALL isReadOnlyRepository(OUString const &repository) override
DESKTOP_DEPLOYMENTMISC_DLLPUBLIC DescriptionInfoset getDescriptionInfoset(std::u16string_view sExtensionFolderURL)
creates a DescriptionInfoset object.
virtual ~ExtensionManager() override
#define SAL_N_ELEMENTS(arr)
css::uno::Reference< css::deployment::XPackageManager > getUserRepository()
virtual css::uno::Reference< css::deployment::XPackage > SAL_CALL getDeployedExtension(OUString const &repository, OUString const &identifier, OUString const &filename, css::uno::Reference< css::ucb::XCommandEnvironment > const &xCmdEnv) override
css::uno::Reference< css::deployment::XPackageManagerFactory > m_xPackageManagerFactory
css::uno::Reference< css::uno::XComponentContext > m_xContext
css::uno::Reference< css::deployment::XPackage > backupExtension(OUString const &identifier, OUString const &fileName, css::uno::Reference< css::deployment::XPackageManager > const &xPackageManager, css::uno::Reference< css::ucb::XCommandEnvironment > const &xCmdEnv)
const uno::Reference< deployment::XPackage > m_extension
virtual sal_Bool SAL_CALL synchronize(css::uno::Reference< css::task::XAbortChannel > const &xAbortChannel, css::uno::Reference< css::ucb::XCommandEnvironment > const &xCmdEnv) override
virtual void SAL_CALL disableExtension(css::uno::Reference< css::deployment::XPackage > const &extension, css::uno::Reference< css::task::XAbortChannel > const &xAbortChannel, css::uno::Reference< css::ucb::XCommandEnvironment > const &xCmdEnv) override
css::uno::Reference< css::deployment::XPackageManager > getSharedRepository()
Reference< io::XInputStream > createInputStream(std::vector< sal_Int8 > &&rInData)
this class is for use in XPackageManager::checkPrerequisites
css::uno::Reference< css::deployment::XPackageManager > getPackageManager(std::u16string_view repository)
static uno::Reference< css::uno::XComponentContext > xContext
std::vector< css::uno::Reference< css::deployment::XPackage > > getExtensionsWithSameId(OUString const &identifier, OUString const &fileName)
css::uno::Reference< css::deployment::XPackageManager > getBundledRepository()
void addExtensionsToMap(id2extensions &mapExt, css::uno::Sequence< css::uno::Reference< css::deployment::XPackage > > const &seqExt, std::u16string_view repository)
bool isUserDisabled(OUString const &identifier, OUString const &filename)
css::uno::Sequence< DstElementType > containerToSequence(const SrcType &i_Container)
virtual css::uno::Reference< css::task::XAbortChannel > SAL_CALL createAbortChannel() override
void checkUpdate(OUString const &newVersion, OUString const &newDisplayName, css::uno::Reference< css::deployment::XPackage > const &oldExtension, css::uno::Reference< css::ucb::XCommandEnvironment > const &xCmdEnv)
virtual css::uno::Sequence< css::uno::Reference< css::deployment::XPackageTypeInfo > > SAL_CALL getSupportedPackageTypes() override
DESKTOP_DEPLOYMENTMISC_DLLPUBLIC bool erase_path(OUString const &url, css::uno::Reference< css::ucb::XCommandEnvironment > const &xCmdEnv, bool throw_exc=true)
virtual void SAL_CALL enableExtension(css::uno::Reference< css::deployment::XPackage > const &extension, css::uno::Reference< css::task::XAbortChannel > const &xAbortChannel, css::uno::Reference< css::ucb::XCommandEnvironment > const &xCmdEnv) override
void checkInstall(OUString const &displayName, css::uno::Reference< css::ucb::XCommandEnvironment > const &cmdEnv)
SAL_DLLPUBLIC_EXPORT css::uno::XInterface * com_sun_star_comp_deployment_ExtensionManager_get_implementation(css::uno::XComponentContext *context, css::uno::Sequence< css::uno::Any > const &)
::std::optional< SimpleLicenseAttributes > getSimpleLicenseAttributes() const
returns the attributes of the simple-license element
virtual OUString SAL_CALL getImplementationName() override
void forEach(FuncT const &func)
virtual void SAL_CALL addModifyListener(css::uno::Reference< css::util::XModifyListener > const &xListener) override
DESKTOP_DEPLOYMENTMISC_DLLPUBLIC bool interactContinuation(css::uno::Any const &request, css::uno::Type const &continuation, css::uno::Reference< css::ucb::XCommandEnvironment > const &xCmdEnv, bool *pcont, bool *pabort)
OUString DpResId(TranslateId aId)
DESKTOP_DEPLOYMENTMISC_DLLPUBLIC OUString getIdentifier(css::uno::Reference< css::deployment::XPackage > const &package)
Gets the identifier of a package.
virtual sal_Bool SAL_CALL supportsService(const OUString &ServiceName) override
void set(css::uno::UnoInterfaceReference const &value)
uno::Reference< uno::XComponentContext > m_xContext
Access to the content of an XML description element.