summaryrefslogtreecommitdiffstats
path: root/plug-ins/file-raw/file-raw-utils.c
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--plug-ins/file-raw/file-raw-utils.c153
1 files changed, 153 insertions, 0 deletions
diff --git a/plug-ins/file-raw/file-raw-utils.c b/plug-ins/file-raw/file-raw-utils.c
new file mode 100644
index 0000000..8847cd0
--- /dev/null
+++ b/plug-ins/file-raw/file-raw-utils.c
@@ -0,0 +1,153 @@
+/* GIMP - The GNU Image Manipulation Program
+ * Copyright (C) 1995 Spencer Kimball and Peter Mattis
+ *
+ * file-raw-utils.h -- raw file format plug-in
+ * Copyright (C) 2016 Tobias Ellinghaus <me@houz.org>
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+#include "config.h"
+
+#include <gdk/gdk.h>
+
+#ifdef GDK_WINDOWING_QUARTZ
+#include <CoreServices/CoreServices.h>
+#endif
+
+#ifdef GDK_WINDOWING_WIN32
+#include <windows.h>
+#endif
+
+#include <libgimp/gimp.h>
+
+#include "file-raw-utils.h"
+
+
+gchar *
+file_raw_get_executable_path (const gchar *main_executable,
+ const gchar *suffix,
+ const gchar *env_variable,
+ const gchar *mac_bundle_id,
+ const gchar *win32_registry_key_base,
+ gboolean *search_path)
+{
+ /*
+ * First check for the environment variable.
+ * Next do platform specific checks (bundle lookup on Mac, registry stuff
+ * on Windows).
+ * Last resort is hoping for the executable to be in PATH.
+ */
+
+ /*
+ * Look for env variable. That can be set directly or via an environ file.
+ * We assume that just appending the suffix to that value will work.
+ * That means that on Windows there should be no ".exe"!
+ */
+ const gchar *dt_env = env_variable ? g_getenv (env_variable) : NULL;
+
+ if (dt_env)
+ return g_strconcat (dt_env, suffix, NULL);
+
+#if defined (GDK_WINDOWING_QUARTZ)
+ if (mac_bundle_id)
+ {
+ CFStringRef bundle_id;
+
+ /* For macOS, attempt searching for an app bundle first. */
+ bundle_id = CFStringCreateWithCString (NULL, mac_bundle_id,
+ kCFStringEncodingUTF8);
+ if (bundle_id)
+ {
+ OSStatus status;
+ CFURLRef bundle_url = NULL;
+
+ status = LSFindApplicationForInfo (kLSUnknownCreator,
+ bundle_id, NULL, NULL,
+ &bundle_url);
+ if (status >= 0)
+ {
+ CFBundleRef bundle;
+ CFURLRef exec_url, absolute_url;
+ CFStringRef path;
+ gchar *ret;
+ CFIndex len;
+
+ bundle = CFBundleCreate (kCFAllocatorDefault, bundle_url);
+ CFRelease (bundle_url);
+
+ exec_url = CFBundleCopyExecutableURL (bundle);
+ absolute_url = CFURLCopyAbsoluteURL (exec_url);
+ path = CFURLCopyFileSystemPath (absolute_url, kCFURLPOSIXPathStyle);
+
+ /* This gets us the length in UTF16 characters, we multiply by 2
+ * to make sure we have a buffer big enough to fit the UTF8 string.
+ */
+ len = CFStringGetLength (path);
+ ret = g_malloc0 (len * 2 * sizeof (gchar));
+ if (! CFStringGetCString (path, ret, 2 * len * sizeof (gchar),
+ kCFStringEncodingUTF8))
+ ret = NULL;
+
+ CFRelease (path);
+ CFRelease (absolute_url);
+ CFRelease (exec_url);
+ CFRelease (bundle);
+
+ if (ret)
+ return ret;
+ }
+
+ CFRelease (bundle_id);
+ }
+ /* else, app bundle was not found, try path search as last resort. */
+ }
+
+#elif defined (GDK_WINDOWING_WIN32)
+ if (win32_registry_key_base)
+ {
+ /* Look for the application in the Windows registry. */
+ char *registry_key;
+ char path[MAX_PATH];
+ DWORD buffer_size = sizeof (path);
+ long status;
+
+ if (suffix)
+ registry_key = g_strconcat (win32_registry_key_base, suffix, ".exe", NULL);
+ else
+ registry_key = g_strconcat (win32_registry_key_base, ".exe", NULL);
+
+ /* Check HKCU first in case there is a user specific installation. */
+ status = RegGetValue (HKEY_CURRENT_USER, registry_key, "", RRF_RT_ANY,
+ NULL, (PVOID)&path, &buffer_size);
+
+ if (status != ERROR_SUCCESS)
+ status = RegGetValue (HKEY_LOCAL_MACHINE, registry_key, "", RRF_RT_ANY,
+ NULL, (PVOID)&path, &buffer_size);
+
+ g_free (registry_key);
+
+ if (status == ERROR_SUCCESS)
+ return g_strdup (path);
+ }
+#endif
+
+ /* Finally, the last resort. */
+ *search_path = TRUE;
+
+ if (suffix)
+ return g_strconcat (main_executable, suffix, NULL);
+
+ return g_strdup (main_executable);
+}