diff --git a/src/common/filename.cpp b/src/common/filename.cpp index 2a8092dfed..09b03c6251 100644 --- a/src/common/filename.cpp +++ b/src/common/filename.cpp @@ -144,6 +144,8 @@ extern const wxULongLong wxInvalidSize = (unsigned)-1; #endif // wxUSE_LONGLONG +namespace +{ // ---------------------------------------------------------------------------- // private classes @@ -295,17 +297,26 @@ static wxString wxGetVolumeString(const wxString& volume, wxPathFormat format) return path; } +// return true if the character is a DOS path separator i.e. either a slash or +// a backslash +inline bool IsDOSPathSep(wxUniChar ch) +{ + return ch == wxFILE_SEP_PATH_DOS || ch == wxFILE_SEP_PATH_UNIX; +} + // return true if the format used is the DOS/Windows one and the string looks // like a UNC path static bool IsUNCPath(const wxString& path, wxPathFormat format) { return format == wxPATH_DOS && path.length() >= 4 && // "\\a" can't be a UNC path - path[0u] == wxFILE_SEP_PATH_DOS && - path[1u] == wxFILE_SEP_PATH_DOS && - path[2u] != wxFILE_SEP_PATH_DOS; + IsDOSPathSep(path[0u]) && + IsDOSPathSep(path[1u]) && + !IsDOSPathSep(path[2u]); } +} // anonymous namespace + // ============================================================================ // implementation // ============================================================================ diff --git a/tests/filename/filenametest.cpp b/tests/filename/filenametest.cpp index eefd5ffd62..8039d2f80b 100644 --- a/tests/filename/filenametest.cpp +++ b/tests/filename/filenametest.cpp @@ -124,6 +124,7 @@ private: #ifdef __WINDOWS__ CPPUNIT_TEST( TestShortLongPath ); #endif // __WINDOWS__ + CPPUNIT_TEST( TestUNC ); CPPUNIT_TEST_SUITE_END(); void TestConstruction(); @@ -136,6 +137,7 @@ private: #ifdef __WINDOWS__ void TestShortLongPath(); #endif // __WINDOWS__ + void TestUNC(); DECLARE_NO_COPY_CLASS(FileNameTestCase) }; @@ -493,3 +495,15 @@ void FileNameTestCase::TestShortLongPath() } #endif // __WINDOWS__ + +void FileNameTestCase::TestUNC() +{ + wxFileName fn("//share/path/name.ext", wxPATH_DOS); + CPPUNIT_ASSERT_EQUAL( "share", fn.GetVolume() ); + CPPUNIT_ASSERT_EQUAL( "/path", fn.GetPath() ); + + fn.Assign("\\\\share2\\path2\\name.ext", wxPATH_DOS); + CPPUNIT_ASSERT_EQUAL( "share2", fn.GetVolume() ); + CPPUNIT_ASSERT_EQUAL( "/path2", fn.GetPath() ); +} +