[prev in list] [next in list] [prev in thread] [next in thread] 

List:       kde-windows
Subject:    branches/kdepim/enterprise4/kdelibs-4.0.83/kdecore/io
From:       Jaroslaw Staniek <js () iidea ! pl>
Date:       2008-07-01 20:03:04
Message-ID: 1214942584.033937.14094.nullmailer () svn ! kde ! org
[Download RAW message or body]

SVN commit 826921 by staniek:

Windows: KUrl ctors taking path (const char*, QByteArray or QString) 
now treat // prefix in the same way as drive letter + ':'.

This fixes e.g. file dialog selection from Windows network locations 
like //host//path/to/file. 
In such cases the protocol is still "file", so proper KIO slave is used.

CCMAIL:kde-windows@kde.org
CCMAIL:danny@commit-digest.org



 M  +43 -16    kurl.cpp  


--- branches/kdepim/enterprise4/kdelibs-4.0.83/kdecore/io/kurl.cpp #826920:826921
@@ -119,24 +119,37 @@
 }
 
 #ifdef Q_WS_WIN
-// Removes file:/// or file:// or file:/ or / prefix assuming that str is (nonempty) \
Windows absolute path with a drive letter. +
+// returns true if provided arguments desinate letter+colon or double slash
+#define IS_DRIVE_OR_DOUBLESLASH(isletter, char1, char2, colon, slash) \
+  ((isletter && char2 == colon) || (char1 == slash && char2 == slash))
+
+// Removes file:/// or file:// or file:/ or / prefix assuming that str 
+// is (nonempty) Windows absolute path with a drive letter or double slash.
 // If there was file protocol, the path is decoded from percent encoding
 static QString removeSlashOrFilePrefix(const QString& str)
 {
   // FIXME this should maybe be replaced with some (faster?)/nicer logic
   const int len = str.length();
   if (str[0]=='f') {
-    if ( len > 10 && str.startsWith( QLatin1String( "file:///" ) ) && \
str[8].isLetter() && str[9] == QLatin1Char(':') ) +    if ( len > 10 && \
str.startsWith( QLatin1String( "file:///" ) )  +         && \
IS_DRIVE_OR_DOUBLESLASH(str[8].isLetter(), str[8], str[9], QLatin1Char(':'), \
QLatin1Char('/')) )  return QUrl::fromPercentEncoding( str.toLatin1() ).mid(8);
-    else if ( len > 9 && str.startsWith( QLatin1String( "file://" ) ) && \
str[7].isLetter() && str[8] == QLatin1Char(':') ) +    else if ( len > 9 && \
str.startsWith( QLatin1String( "file://" ) ) +              && \
IS_DRIVE_OR_DOUBLESLASH(str[7].isLetter(), str[7], str[8], QLatin1Char(':'), \
QLatin1Char('/')) )  return QUrl::fromPercentEncoding( str.toLatin1() ).mid(7);
-    else if ( len > 8 && str.startsWith( QLatin1String( "file:/" ) ) && \
str[6].isLetter() && str[7] == QLatin1Char(':') ) +    else if ( len > 8 && \
str.startsWith( QLatin1String( "file:/" ) ) +              && \
IS_DRIVE_OR_DOUBLESLASH(str[6].isLetter(), str[6], str[7], QLatin1Char(':'), \
QLatin1Char('/')) )  return QUrl::fromPercentEncoding( str.toLatin1() ).mid(6);
   }
-  /* no 'else' since there can be "f:/" path */
-  if ( len > 2 && str[0] == QLatin1Char('/') && str[1].isLetter() && str[2] == \
QLatin1Char(':') ) +  /* No 'else' here since there can be "f:/" path. */
+
+  /* '/' + drive letter or // */
+  if ( len > 2 && str[0] == QLatin1Char('/')
+       && IS_DRIVE_OR_DOUBLESLASH(str[1].isLetter(), str[1], str[2], \
QLatin1Char(':'), QLatin1Char('/')) )  return str.mid(1);
-  else if ( len >= 2 && str[0].isLetter() && str[1] == QLatin1Char(':') )
+  /* drive letter or // */
+  else if ( len >= 2 && IS_DRIVE_OR_DOUBLESLASH(str[0].isLetter(), str[0], str[1], \
QLatin1Char(':'), QLatin1Char('/')) )  return str;
   return QString();
 }
@@ -363,11 +376,25 @@
   : QUrl(), d(0)
 {
 #ifdef Q_WS_WIN
-    kDebug(126) << "KUrl::KUrl " << " " << str;
+  // true if @a c is letter
+  #define IS_LETTER(c) \
+    ((c >= 'A' && c <= 'Z') || (c >= 'a' && c <= 'z'))
+
+  // like IS_DRIVE_OR_DOUBLESLASH, but slash is prepended
+  #define IS_SLASH_AND_DRIVE_OR_DOUBLESLASH_0 \
+    ( str[0] == '/' && IS_DRIVE_OR_DOUBLESLASH(IS_LETTER(str[1]), str[1], str[2], \
':', '/') ) +
+  // like IS_DRIVE_OR_DOUBLESLASH, with characters == str[0] and str[1]
+  #define IS_DRIVE_OR_DOUBLESLASH_0 \
+    ( IS_DRIVE_OR_DOUBLESLASH(IS_LETTER(str[0]), str[0], str[1], ':', '/') )
+
+#if defined(DEBUG_KURL)
+  kDebug(126) << "KUrl::KUrl " << " " << str;
+#endif
   if ( str && str[0] && str[1] && str[2] ) {
-    if ( str[0] == '/' && (str[1] >= 'A' && str[1] <= 'Z' || str[1] >= 'a' && str[1] \
                <= 'z') && str[2] == ':' )
-    	setPath( QString::fromUtf8( str+1 ) );
-    else if ( (str[0] >= 'A' && str[0] <= 'Z' || str[0] >= 'a' && str[0] <= 'z')  && \
str[1] == ':' ) +    if ( IS_SLASH_AND_DRIVE_OR_DOUBLESLASH_0 )
+      setPath( QString::fromUtf8( str+1 ) );
+    else if ( IS_DRIVE_OR_DOUBLESLASH_0 )
       setPath( QString::fromUtf8( str ) );
 #else
   if ( str && str[0] ) {
@@ -384,13 +411,13 @@
 {
   if ( !str.isEmpty() ) {
 #ifdef Q_WS_WIN
-#if defined(DEBUG_KURL)
+#ifdef DEBUG_KURL
     kDebug(126) << "KUrl::KUrl " << " " << str.data();
 #endif
-    if ( str[0] == '/' && (str[1] >= 'A' && str[1] <= 'Z' || str[1] >= 'a' && str[1] \
                <= 'z') && str[2] == ':' )
-    	  setPath( QString::fromUtf8( str.mid( 1 ) ) );
-    else if ( (str[0] >= 'A' && str[0] <= 'Z' || str[0] >= 'a' && str[0] <= 'z')  && \
                str[1] == ':' )
-        setPath( QString::fromUtf8( str ) );
+    if ( IS_SLASH_AND_DRIVE_OR_DOUBLESLASH_0 )
+      setPath( QString::fromUtf8( str.mid( 1 ) ) );
+    else if ( IS_DRIVE_OR_DOUBLESLASH_0 )
+      setPath( QString::fromUtf8( str ) );
 #else
     if ( str[0] == '/' || str[0] == '~' )
       setPath( QString::fromUtf8( str ) );
_______________________________________________
Kde-windows mailing list
Kde-windows@kde.org
https://mail.kde.org/mailman/listinfo/kde-windows


[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic