vcl/unx/generic/fontmanager/fontconfig.cxx  |   74 +++++++++++++++++-----------
 vcl/unx/generic/fontmanager/fontmanager.cxx |    3 -
 2 files changed, 47 insertions(+), 30 deletions(-)

New commits:
commit 2a593ff092c628eff906c4df9b4da993a3973ec3
Author: Samuel Mehrbrodt <samuel.mehrbr...@cib.de>
Date:   Wed Jul 12 16:28:54 2017 +0200

    Migrate missing font installation to new GDBus API
    
    Change-Id: I31809e9993cd6cefd6625107c2fe2c4540cca498
    Reviewed-on: https://gerrit.libreoffice.org/39870
    Reviewed-by: Caolán McNamara <caol...@redhat.com>
    Tested-by: Caolán McNamara <caol...@redhat.com>

diff --git a/vcl/unx/generic/fontmanager/fontconfig.cxx 
b/vcl/unx/generic/fontmanager/fontconfig.cxx
index 6e7b69da18d6..59bc5f365611 100644
--- a/vcl/unx/generic/fontmanager/fontconfig.cxx
+++ b/vcl/unx/generic/fontmanager/fontconfig.cxx
@@ -31,6 +31,7 @@
 #include <rtl/strbuf.hxx>
 #include <unicode/uchar.h>
 #include <unicode/uscript.h>
+#include <config_gio.h>
 
 using namespace psp;
 
@@ -38,8 +39,8 @@ using namespace psp;
 #include <ft2build.h>
 #include <fontconfig/fcfreetype.h>
 
-#if ENABLE_DBUS
-#include <dbus/dbus-glib.h>
+#if ENABLE_GIO
+#include <gio/gio.h>
 #endif
 
 #include <cstdio>
@@ -860,9 +861,11 @@ namespace
         return OStringToOUString(aBuf.makeStringAndClear(), 
RTL_TEXTENCODING_UTF8);
     }
 
-#if ENABLE_DBUS
+#if ENABLE_GIO
     guint get_xid_for_dbus()
     {
+        // FIXME: Application::GetActiveTopWindow only returns something 
sensible if LO currently has the focus
+        // (which is not the case when you are trying to debug this...). It 
should instead return the last active window.
         const vcl::Window *pTopWindow = Application::IsHeadlessModeEnabled() ? 
nullptr : Application::GetActiveTopWindow();
         const SystemEnvData* pEnvData = pTopWindow ? 
pTopWindow->GetSystemData() : nullptr;
         return pEnvData ? pEnvData->aWindow : 0;
@@ -870,17 +873,21 @@ namespace
 #endif
 }
 
-#if ENABLE_DBUS
+#if ENABLE_GIO
 IMPL_LINK_NOARG(PrintFontManager, autoInstallFontLangSupport, Timer *, void)
 {
     guint xid = get_xid_for_dbus();
 
     if (!xid)
+    {
+        SAL_WARN("vcl", "Could not retrieve X Window ID for DBUS");
         return;
+    }
+
 
     GError *error = nullptr;
     /* get the DBUS session connection */
-    DBusGConnection *session_connection = dbus_g_bus_get(DBUS_BUS_SESSION, 
&error);
+    GDBusConnection *session_connection = g_bus_get_sync(G_BUS_TYPE_SESSION, 
nullptr, &error);
     if (error != nullptr)
     {
         g_debug ("DBUS cannot connect : %s", error->message);
@@ -889,40 +896,49 @@ IMPL_LINK_NOARG(PrintFontManager, 
autoInstallFontLangSupport, Timer *, void)
     }
 
     /* get the proxy with gnome-session-manager */
-    DBusGProxy *proxy = dbus_g_proxy_new_for_name(session_connection,
-                                       "org.freedesktop.PackageKit",
-                                       "/org/freedesktop/PackageKit",
-                                       "org.freedesktop.PackageKit.Modify");
-    if (proxy == nullptr)
+    GDBusProxy *proxy = g_dbus_proxy_new_sync(session_connection,
+                                              G_DBUS_PROXY_FLAGS_NONE,
+                                              nullptr, // GDBusInterfaceInfo
+                                              "org.freedesktop.PackageKit",
+                                              "/org/freedesktop/PackageKit",
+                                              
"org.freedesktop.PackageKit.Modify",
+                                              nullptr, // GCancellable
+                                              &error);
+    if (proxy == nullptr && error != nullptr)
     {
-        g_debug("Could not get DBUS proxy: org.freedesktop.PackageKit");
+        g_debug("Could not get DBUS proxy: org.freedesktop.PackageKit: %s", 
error->message);
+        g_error_free(error);
         return;
     }
 
-    gchar **fonts = static_cast<gchar**>(g_malloc((m_aCurrentRequests.size() + 
1) * sizeof(gchar*)));
-    gchar **font = fonts;
+    GVariantBuilder *builder = g_variant_builder_new (G_VARIANT_TYPE("as")); 
// 'as'=array of strings
     for (std::vector<OString>::const_iterator aI = m_aCurrentRequests.begin(); 
aI != m_aCurrentRequests.end(); ++aI)
-        *font++ = const_cast<gchar*>(aI->getStr());
-    *font = nullptr;
-    gboolean res = dbus_g_proxy_call(proxy, "InstallFontconfigResources", 
&error,
-                 G_TYPE_UINT, xid, /* xid */
-                 G_TYPE_STRV, fonts, /* data */
-                 G_TYPE_STRING, "hide-finished", /* interaction */
-                 G_TYPE_INVALID,
-                 G_TYPE_INVALID);
-    /* check the return value */
-    if (!res)
-       g_debug("InstallFontconfigResources method failed");
-
-    /* check the error value */
-    if (error != nullptr)
+        g_variant_builder_add (builder, "s", aI->getStr());
+
+    GVariant *res = g_dbus_proxy_call_sync(proxy,
+                                     "InstallFontconfigResources",
+                                     // Create a new variant with the 
following types:
+                                     //   'u'=guint32 (xid); 'as'=array of 
strings (builder); 's'=string ("hide-finished")
+                                     // See also 
https://people.gnome.org/~ryanl/glib-docs/gvariant-format-strings.html
+                                     g_variant_new("(uass)", xid, builder, 
"hide-finished"),
+                                     G_DBUS_CALL_FLAGS_NONE,
+                                     -1, // Timeout
+                                     nullptr, // GCancellable
+                                     &error);
+
+    if (res == nullptr && error != nullptr)
     {
         g_debug("InstallFontconfigResources problem : %s", error->message);
         g_error_free(error);
     }
+    else
+    {
+        g_variant_unref(res);
+    }
 
-    g_free(fonts);
+    g_variant_builder_unref(builder);
     g_object_unref(G_OBJECT (proxy));
+
     m_aCurrentRequests.clear();
 }
 #endif
@@ -1081,7 +1097,7 @@ void PrintFontManager::Substitute( FontSelectPattern 
&rPattern, OUString& rMissi
                     }
                 }
                 OUString sStillMissing(pRemainingCodes.get(), nRemainingLen);
-#if ENABLE_DBUS
+#if ENABLE_GIO
                 if (get_xid_for_dbus())
                 {
                     if (sStillMissing == rMissingCodes) //replaced nothing
diff --git a/vcl/unx/generic/fontmanager/fontmanager.cxx 
b/vcl/unx/generic/fontmanager/fontmanager.cxx
index 98babfee2491..6726deeefb90 100644
--- a/vcl/unx/generic/fontmanager/fontmanager.cxx
+++ b/vcl/unx/generic/fontmanager/fontmanager.cxx
@@ -23,6 +23,7 @@
 #include <dirent.h>
 #include <stdlib.h>
 #include <osl/thread.h>
+#include <config_gio.h>
 
 #include "unx/fontmanager.hxx"
 #include "fontsubset.hxx"
@@ -133,7 +134,7 @@ PrintFontManager::PrintFontManager()
     : m_nNextFontID( 1 )
     , m_nNextDirAtom( 1 )
 {
-#if ENABLE_DBUS
+#if ENABLE_GIO
     m_aFontInstallerTimer.SetInvokeHandler(LINK(this, PrintFontManager, 
autoInstallFontLangSupport));
     m_aFontInstallerTimer.SetTimeout(5000);
 #endif
_______________________________________________
Libreoffice-commits mailing list
libreoffice-comm...@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits

Reply via email to