summaryrefslogtreecommitdiff
path: root/shell/source/sessioninstall/SyncDbusSessionHelper.cxx
diff options
context:
space:
mode:
Diffstat (limited to 'shell/source/sessioninstall/SyncDbusSessionHelper.cxx')
-rw-r--r--shell/source/sessioninstall/SyncDbusSessionHelper.cxx113
1 files changed, 113 insertions, 0 deletions
diff --git a/shell/source/sessioninstall/SyncDbusSessionHelper.cxx b/shell/source/sessioninstall/SyncDbusSessionHelper.cxx
new file mode 100644
index 000000000000..1653cb3f8603
--- /dev/null
+++ b/shell/source/sessioninstall/SyncDbusSessionHelper.cxx
@@ -0,0 +1,113 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This file is part of the LibreOffice project.
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#include <SyncDbusSessionHelper.hxx>
+
+#include <comphelper/stlunosequence.hxx>
+#include <gio/gio.h>
+#include <vector>
+#include <boost/shared_ptr.hpp>
+
+using namespace ::com::sun::star::lang;
+using namespace ::com::sun::star::uno;
+using namespace ::comphelper;
+using namespace ::std;;
+using namespace ::rtl;;
+
+namespace
+{
+ struct GVariantDeleter { void operator()(GVariant* pV) { g_variant_unref(pV); } };
+ struct GVariantBuilderDeleter { void operator()(GVariantBuilder* pVB) { g_variant_builder_unref(pVB); } };
+ template <typename T> struct GObjectDeleter { void operator()(T* pO) { g_object_unref(pO); } };
+ class GErrorWrapper
+ {
+ GError* m_pError;
+ public:
+ GErrorWrapper(GError* pError) : m_pError(pError) {};
+ ~GErrorWrapper()
+ {
+ if(!m_pError)
+ return;
+ OUString sMsg = OUString::createFromAscii(m_pError->message);
+ g_error_free(m_pError);
+ throw RuntimeException(sMsg, NULL);
+ }
+ GError** getRef() { return &m_pError; }
+ };
+ static inline GDBusProxy* lcl_GetPackageKitProxy(const OUString sInterface)
+ {
+ const OString sFullInterface = rtl::OUStringToOString("org.freedesktop.PackageKit." + sInterface, RTL_TEXTENCODING_ASCII_US);
+ GErrorWrapper error(NULL);
+ GDBusProxy* proxy = NULL;
+ proxy = g_dbus_proxy_new_for_bus_sync (G_BUS_TYPE_SESSION,
+ G_DBUS_PROXY_FLAGS_NONE, NULL,
+ "org.freedesktop.PackageKit",
+ "/org/freedesktop/PackageKit",
+ reinterpret_cast<const gchar*>(sFullInterface.getStr()),
+ NULL,
+ error.getRef());
+ if(!proxy)
+ throw RuntimeException(OUString("couldnt get a proxy!"),NULL);
+ return proxy;
+ };
+}
+
+namespace shell { namespace sessioninstall
+{
+ SyncDbusSessionHelper::SyncDbusSessionHelper(Reference<XComponentContext> const&)
+ {
+ g_type_init ();
+ }
+ void SAL_CALL SyncDbusSessionHelper::InstallPackageNames( const ::sal_uInt32 nXid, const Sequence< OUString >& vPackages, const OUString& sInteraction ) throw (RuntimeException)
+ {
+ vector< OString > vPackagesOString;
+ vPackagesOString.reserve(vPackages.getLength());
+ boost::shared_ptr<GVariantBuilder> pBuilder(g_variant_builder_new(G_VARIANT_TYPE ("as")), GVariantBuilderDeleter());
+ for( const OUString* pPackage = stl_begin(vPackages); pPackage != stl_end(vPackages); ++pPackage)
+ {
+ vPackagesOString.push_back(rtl::OUStringToOString(*pPackage, RTL_TEXTENCODING_ASCII_US));
+ g_variant_builder_add(pBuilder.get(), "s", vPackagesOString.back().getStr());
+ }
+
+ const OString sInteractionAscii = OUStringToOString(sInteraction, RTL_TEXTENCODING_ASCII_US);
+ boost::shared_ptr<GDBusProxy> proxy(lcl_GetPackageKitProxy("Modify"), GObjectDeleter<GDBusProxy>());
+ GErrorWrapper error(NULL);
+ g_dbus_proxy_call_sync (proxy.get(),
+ "InstallPackageNames",
+ g_variant_new ("(uass)",
+ sal::static_int_cast<guint32>(nXid),
+ pBuilder.get(),
+ sInteractionAscii.getStr()),
+ G_DBUS_CALL_FLAGS_NONE,
+ -1, /* timeout */
+ NULL, /* cancellable */
+ error.getRef());
+ }
+
+ void SAL_CALL SyncDbusSessionHelper::IsInstalled( const OUString& sPackagename, const OUString& sInteraction, ::sal_Bool& o_isInstalled ) throw (RuntimeException)
+ {
+ const OString sPackagenameAscii = OUStringToOString(sPackagename, RTL_TEXTENCODING_ASCII_US);
+ const OString sInteractionAscii = OUStringToOString(sInteraction, RTL_TEXTENCODING_ASCII_US);
+ boost::shared_ptr<GDBusProxy> proxy(lcl_GetPackageKitProxy("Query"), GObjectDeleter<GDBusProxy>());
+ GErrorWrapper error(NULL);
+ boost::shared_ptr<GVariant> result(g_dbus_proxy_call_sync (proxy.get(),
+ "IsInstalled",
+ g_variant_new ("(ss)",
+ sPackagenameAscii.getStr(),
+ sInteractionAscii.getStr()),
+ G_DBUS_CALL_FLAGS_NONE,
+ -1, /* timeout */
+ NULL, /* cancellable */
+ error.getRef()),GVariantDeleter());
+ if(result.get())
+ o_isInstalled = g_variant_get_boolean(g_variant_get_child_value(result.get(),0)) ? sal_True : sal_False;
+ }
+}}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */