Prepare plugin-meta-data config-dir and files
[ardour.git] / libs / pbd / openuri.cc
index e2575185dfb013bc4028b8cc5062c06edf0bf08a..3ae57d09fb7b11f3e4f0b8e849997216451c6326 100644 (file)
@@ -1,5 +1,5 @@
 /*
-    Copyright (C) 2012 Paul Davis 
+    Copyright (C) 2012 Paul Davis
 
     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
@@ -29,6 +29,7 @@
 #include "pbd/openuri.h"
 
 #ifdef __APPLE__
+#include <curl/curl.h>
        extern bool cocoa_open_url (const char*);
 #endif
 
@@ -41,7 +42,9 @@ bool
 PBD::open_uri (const char* uri)
 {
 #ifdef PLATFORM_WINDOWS
-       ShellExecute(NULL, "open", uri, NULL, NULL, SW_SHOWNORMAL);
+       gunichar2* wuri = g_utf8_to_utf16 (uri, -1, NULL, NULL, NULL);
+       ShellExecuteW(NULL, L"open", (LPCWSTR)wuri, NULL, NULL, SW_SHOWNORMAL);
+       g_free (wuri);
        return true;
 #elif __APPLE__
        return cocoa_open_url (uri);
@@ -57,8 +60,14 @@ PBD::open_uri (const char* uri)
                global_epa->restore ();
        }
 
+       std::string s(uri);
+       while (s.find("\\") != std::string::npos)
+               s.replace(s.find("\\"), 1, "\\\\");
+       while (s.find("\"") != std::string::npos)
+               s.replace(s.find("\\"), 1, "\\\"");
+
        std::string command = "xdg-open ";
-       command += uri;
+       command += '"' + s + '"';
        command += " &";
        (void) system (command.c_str());
 
@@ -67,7 +76,25 @@ PBD::open_uri (const char* uri)
 }
 
 bool
-PBD::open_uri (const std::string& uri) 
+PBD::open_uri (const std::string& uri)
 {
        return open_uri (uri.c_str());
 }
+
+bool
+PBD::open_folder (const std::string& d)
+{
+#ifdef __APPLE__
+       CURL *curl = curl_easy_init ();
+       bool rv = false;
+       if (curl) {
+               char * e = curl_easy_escape (curl, d.c_str(), d.size());
+               std::string url = "file:///" + std::string(e);
+               rv = PBD::open_uri (url);
+               curl_free (e);
+       }
+       return rv;
+#else
+       return PBD::open_uri (d);
+#endif
+}