experimental session-save speedup
[ardour.git] / libs / pbd / openuri.cc
index 13d534e7606f9eb0102be399efdeb3d79a5ecd0c..0d744ae50d56bac379296865988eb01ac670cd5a 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
 #include "pbd/epa.h"
 #include "pbd/openuri.h"
 
+#ifdef __APPLE__
+#include <curl/curl.h>
+       extern bool cocoa_open_url (const char*);
+#endif
+
+#ifdef PLATFORM_WINDOWS
+       #include <windows.h>
+       #include <shellapi.h>
+#endif
+
 bool
 PBD::open_uri (const char* uri)
 {
-#ifdef __APPLE__
-       extern bool cocoa_open_url (const char*);
+#ifdef PLATFORM_WINDOWS
+       ShellExecute(NULL, "open", uri, NULL, NULL, SW_SHOWNORMAL);
+       return true;
+#elif __APPLE__
        return cocoa_open_url (uri);
 #else
        EnvironmentalProtectionAgency* global_epa = EnvironmentalProtectionAgency::get_global_epa ();
@@ -46,8 +58,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());
 
@@ -56,7 +74,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
+}