resolve gtk + VST threading issues
[ardour.git] / libs / pbd / pathexpand.cc
index ae3bed4599df4ca04d06d3a2a030348b3a82ca4e..3398bd11521594bd70e4db5d64c39bbd7d73e534 100644 (file)
@@ -23,7 +23,7 @@
 #include <cerrno>
 #include <cstdlib>
 
-#include <boost/regex.h>
+#include <regex.h>
 
 #include <glibmm/miscutils.h>
 
 using std::string;
 using std::vector;
 
+#ifdef COMPILER_MINGW
+
+#include <stdlib.h>
+#include <glibmm.h>
+
+/****************************************************************
+ * Emulate POSIX realpath() using Win32 _fullpath() since realpath()
+ * is not available.
+ *
+ * Returns:
+ *    On Success: A pointer to the resolved (absolute) path
+ *    On Failure: 0 (NULL)
+ */
+
+static char* 
+realpath (const char *original_path, char resolved_path[_MAX_PATH+1])
+{
+       char *rpath = 0;
+       bool bIsSymLink = false; // We'll probably need to test the incoming path
+                                // to find out if it points to a Windows shortcut
+                                // (or a hard link) and set this appropriately.
+
+       if (bIsSymLink) {
+               // At the moment I'm not sure if Windows '_fullpath()' is directly
+               // equivalent to POSIX 'realpath()' - in as much as the latter will
+               // resolve the supplied path if it happens to point to a symbolic
+               // link ('_fullpath()' probably DOESN'T do this but I'm not really
+               // sure if Ardour needs such functionality anyway). Therefore we'll
+               // possibly need to add that functionality here at a later date.
+       } else {
+               char temp[(_MAX_PATH+1)*6]; // Allow for maximum length of a path in wchar characters
+               
+               // POSIX 'realpath()' requires that the buffer size is at
+               // least PATH_MAX+1, so assume that the user knew this !!
+
+               rpath = _fullpath (temp, Glib::locale_from_utf8 (original_path).c_str(), _MAX_PATH);
+
+               if (0 != rpath) {
+                       snprintf (resolved_path, _MAX_PATH+1, "%s", Glib::locale_to_utf8 (temp).c_str());
+               }
+                       
+       }
+       
+       return (rpath);
+}
+
+#endif  // COMPILER_MINGW
+
 string
 PBD::canonical_path (const std::string& path)
 {
-#ifdef COMPILER_MINGW
-       return path;
-#endif
        char buf[PATH_MAX+1];
 
-       if (!realpath (path.c_str(), buf) && (errno != ENOENT)) {
+       if (!realpath (path.c_str(), buf)) {
                return path;
        }