Procházet zdrojové kódy

add to_os_short_name(), to_os_long_name()

David Rose před 19 roky
rodič
revize
abdf0bdd29
2 změnil soubory, kde provedl 82 přidání a 13 odebrání
  1. 80 13
      dtool/src/dtoolutil/filename.cxx
  2. 2 0
      dtool/src/dtoolutil/filename.h

+ 80 - 13
dtool/src/dtoolutil/filename.cxx

@@ -913,19 +913,16 @@ to_os_specific() const {
   standard.standardize();
   standard.standardize();
 
 
 #ifdef IS_OSX 
 #ifdef IS_OSX 
-	if(get_type() == T_dso)
-	{
-          std::string workname = standard.get_fullpath();
-	  size_t dot = workname.rfind('.');
-	  if (dot != string::npos) 
-	  {
-		  if (workname.substr(dot) == ".so") 
-		  {
-  			string dyLibBase = workname.substr(0, dot)+".dylib";
-			return dyLibBase ; 
-		  }
-  	    }
-	}
+  if (get_type() == T_dso) {
+    std::string workname = standard.get_fullpath();
+    size_t dot = workname.rfind('.');
+    if (dot != string::npos) {
+      if (workname.substr(dot) == ".so") {
+        string dyLibBase = workname.substr(0, dot)+".dylib";
+        return dyLibBase; 
+      }
+    }
+  }
 #endif
 #endif
 
 
 #ifdef WIN32
 #ifdef WIN32
@@ -968,6 +965,76 @@ to_os_generic() const {
 #endif // WIN32
 #endif // WIN32
 }
 }
 
 
+////////////////////////////////////////////////////////////////////
+//     Function: Filename::to_os_short_name
+//       Access: Published
+//  Description: This works like to_os_generic(), but it returns the
+//               "short name" version of the filename, if it exists,
+//               or the original filename otherwise.
+//
+//               On Windows platforms, this returns the 8.3 filename
+//               version of the given filename, if the file exists,
+//               and the same thing as to_os_specific() otherwise.  On
+//               non-Windows platforms, this always returns the same
+//               thing as to_os_specific().
+////////////////////////////////////////////////////////////////////
+string Filename::
+to_os_short_name() const {
+  assert(!get_pattern());
+
+#ifdef WIN32
+  string os_specific = to_os_specific();
+  
+  char short_name[MAX_PATH + 1];
+  DWORD l = GetShortPathName(os_specific.c_str(), short_name, MAX_PATH + 1);
+  if (l == 0) {
+    // Couldn't query the path name for some reason.  Probably the
+    // file didn't exist.
+    return os_specific;
+  }
+  // According to the Windows docs, l will return a value greater than
+  // the specified length if the short_name length wasn't enough--but also
+  // according to the Windows docs, MAX_PATH will always be enough.
+  assert(l < MAX_PATH + 1);
+
+  return string(short_name);
+
+#else // WIN32
+  return to_os_specific();
+#endif // WIN32
+}
+
+////////////////////////////////////////////////////////////////////
+//     Function: Filename::to_os_long_name
+//       Access: Published
+//  Description: This is the opposite of to_os_short_name(): it
+//               returns the "long name" of the filename, if the
+//               filename exists.  On non-Windows platforms, this
+//               returns the same thing as to_os_specific().
+////////////////////////////////////////////////////////////////////
+string Filename::
+to_os_long_name() const {
+  assert(!get_pattern());
+
+#ifdef WIN32
+  string os_specific = to_os_specific();
+  
+  char long_name[MAX_PATH + 1];
+  DWORD l = GetLongPathName(os_specific.c_str(), long_name, MAX_PATH + 1);
+  if (l == 0) {
+    // Couldn't query the path name for some reason.  Probably the
+    // file didn't exist.
+    return os_specific;
+  }
+  assert(l < MAX_PATH + 1);
+
+  return string(long_name);
+
+#else // WIN32
+  return to_os_specific();
+#endif // WIN32
+}
+
 ////////////////////////////////////////////////////////////////////
 ////////////////////////////////////////////////////////////////////
 //     Function: Filename::exists
 //     Function: Filename::exists
 //       Access: Published
 //       Access: Published

+ 2 - 0
dtool/src/dtoolutil/filename.h

@@ -152,6 +152,8 @@ PUBLISHED:
 
 
   string to_os_specific() const;
   string to_os_specific() const;
   string to_os_generic() const;
   string to_os_generic() const;
+  string to_os_short_name() const;
+  string to_os_long_name() const;
 
 
   bool exists() const;
   bool exists() const;
   bool is_regular_file() const;
   bool is_regular_file() const;