[Resend] SHLWAPI fixes.

Flameeyes dgp85 at users.sourceforge.net
Thu Dec 18 14:44:18 CST 2003


The attached patches fixes some functions of shlwapi I needed to run an
application I wrote with BCB that was using MS XML Parser.
I'm using it and works well AFAIK.
-- 
Flameeyes <dgp85 at users.sf.net>
http://flameeyes.web.ctonet.it/
-------------- next part --------------
? dlls/kernel/comm.spec.c
? dlls/kernel/system.spec.c
? dlls/ntdll/ntdll.dll.glue.c
? dlls/ntdll/relay16.s
? dlls/user/display.spec.c
? dlls/user/keyboard.spec.c
? dlls/user/mouse.spec.c
? miscemu/Makefile
? miscemu/wine
? programs/osversioncheck/Makefile
? programs/osversioncheck/osversioncheck.exe.dbg.c
? programs/osversioncheck/osversioncheck.exe.spec.c
? programs/regapi/Makefile
? programs/regapi/regapi.exe.dbg.c
? programs/regapi/regapi.exe.spec.c
? programs/regtest/Makefile
? programs/regtest/regtest.exe.dbg.c
? programs/regtest/regtest.exe.spec.c
? tools/winewrap
Index: dlls/shlwapi/path.c
===================================================================
RCS file: /home/wine/wine/dlls/shlwapi/path.c,v
retrieving revision 1.38
diff -u -3 -r1.38 path.c
--- dlls/shlwapi/path.c	22 Sep 2003 19:46:32 -0000	1.38
+++ dlls/shlwapi/path.c	18 Dec 2003 18:52:54 -0000
@@ -3058,8 +3058,77 @@
  */
 BOOL WINAPI PathSearchAndQualifyA(LPCSTR lpszPath, LPSTR lpszBuf, UINT cchBuf)
 {
-  FIXME("(%s,%p,0x%08x)-stub\n", debugstr_a(lpszPath), lpszBuf, cchBuf);
-  return FALSE;
+  TRACE("(%s %p %d)\n", debugstr_a(lpszPath), lpszBuf, cchBuf);
+
+  if (!lpszPath || !*lpszPath)
+    return FALSE;
+
+  LPSTR temp_in = malloc(sizeof(*lpszPath) * cchBuf);
+  StrCpyA(temp_in, lpszPath);
+  lpszPath = temp_in;
+  LPSTR temp_out = lpszBuf;
+  LPSTR temp_out2 = temp_out;
+  BOOL ret = TRUE;
+  
+  if (*temp_in == '\\' && temp_in[1] == '\\')
+  {
+    /* Network share: skip share server and mount point */
+    temp_in += 2;
+    if ((temp_in = StrChrA(temp_in, '\\')) &&
+        (temp_in = StrChrA(temp_in + 1, '\\')))
+      temp_in++;
+  }
+
+  /* Check x:\ */
+  if (temp_in[0] && temp_in[1] == ':' && temp_in[2] == '\\')
+    temp_in += 3;
+
+  if ( temp_in != lpszPath )
+  {
+    StrCpyNA(temp_out, lpszPath, (temp_in - lpszPath) +1);
+    temp_out += (temp_in - lpszPath);
+    temp_out2 = temp_out;
+    *temp_out = '\0';
+    lpszPath = temp_in;
+  } else {
+    FIXME("must prepend current path");
+  }
+
+  while(*temp_in)
+  {
+    if ( *temp_in == '.' )
+    {
+      if ( ! temp_in[1] )
+      { ret = TRUE; break; }
+
+      if ( temp_in[1] == '\\' ) { temp_in += 2; continue; }
+        
+      if ( temp_in[1] == '.' && temp_in[2] == '\\' )
+      {
+        if ( temp_out == temp_out2 ) { temp_in += 3; continue; }
+
+        temp_out = StrRChrA(temp_out, temp_out2, '\\');
+        *temp_out = '\0'; continue;
+      }
+    } //if ( *temp_in == '.' )
+
+    if ( StrChrA(temp_in, '\\') )
+    {
+      size_t len = (StrChrA(temp_in, '\\') - temp_in )+1;
+      StrCpyNA(temp_out, temp_in, len+1);
+      temp_out += len;
+      temp_in += len;
+      *temp_out = '\0'; continue;
+    } else {
+      StrCpyA(temp_out, temp_in);
+      break;
+    }
+  } // while
+
+  TRACE("(%s)\n", debugstr_a(lpszBuf));
+
+  free(temp_in);
+  return ret;
 }
 
 /*************************************************************************
@@ -3069,8 +3138,77 @@
  */
 BOOL WINAPI PathSearchAndQualifyW(LPCWSTR lpszPath, LPWSTR lpszBuf, UINT cchBuf)
 {
-  FIXME("(%s,%p,0x%08x)-stub\n", debugstr_w(lpszPath), lpszBuf, cchBuf);
-  return FALSE;
+  TRACE("(%s %p %d)\n", debugstr_w(lpszPath), lpszBuf, cchBuf);
+
+  if (!lpszPath || !*lpszPath)
+    return FALSE;
+
+  LPWSTR temp_in = malloc(sizeof(*lpszPath) * cchBuf);
+  StrCpyW(temp_in, lpszPath);
+  lpszPath = temp_in;
+  LPWSTR temp_out = lpszBuf;
+  LPWSTR temp_out2 = temp_out;
+  BOOL ret = TRUE;
+  
+  if (*temp_in == '\\' && temp_in[1] == '\\')
+  {
+    /* Network share: skip share server and mount point */
+    temp_in += 2;
+    if ((temp_in = StrChrW(temp_in, '\\')) &&
+        (temp_in = StrChrW(temp_in + 1, '\\')))
+      temp_in++;
+  }
+
+  /* Check x:\ */
+  if (temp_in[0] && temp_in[1] == ':' && temp_in[2] == '\\')
+    temp_in += 3;
+
+  if ( temp_in != lpszPath )
+  {
+    StrCpyNW(temp_out, lpszPath, (temp_in - lpszPath) +1);
+    temp_out += (temp_in - lpszPath);
+    temp_out2 = temp_out;
+    *temp_out = '\0';
+    lpszPath = temp_in;
+  } else {
+    FIXME("must prepend current path");
+  }
+
+  while(*temp_in)
+  {
+    if ( *temp_in == '.' )
+    {
+      if ( ! temp_in[1] )
+      { ret = TRUE; break; }
+
+      if ( temp_in[1] == '\\' ) { temp_in += 2; continue; }
+        
+      if ( temp_in[1] == '.' && temp_in[2] == '\\' )
+      {
+        if ( temp_out == temp_out2 ) { temp_in += 3; continue; }
+
+        temp_out = StrRChrW(temp_out, temp_out2, '\\');
+        *temp_out = '\0'; continue;
+      }
+    } //if ( *temp_in == '.' )
+
+    if ( StrChrW(temp_in, '\\') )
+    {
+      size_t len = (StrChrW(temp_in, '\\') - temp_in )+1;
+      StrCpyNW(temp_out, temp_in, len+1);
+      temp_out += len;
+      temp_in += len;
+      *temp_out = '\0'; continue;
+    } else {
+      StrCpyW(temp_out, temp_in);
+      break;
+    }
+  } // while
+
+  TRACE("(%s)\n", debugstr_w(lpszBuf));
+
+  free(temp_in);
+  return ret;
 }
 
 /*************************************************************************
@@ -3187,7 +3325,7 @@
 HRESULT WINAPI PathCreateFromUrlW(LPCWSTR lpszUrl, LPWSTR lpszPath,
                                   LPDWORD pcchPath, DWORD dwFlags)
 {
-  static const WCHAR stemp[] = { 'f','i','l','e',':','/','/',0 };
+  static const WCHAR stemp[] = { 'f','i','l','e',':','/','/', '/', 0 };
   LPWSTR pwszPathPart;
   HRESULT hr;
 
@@ -3196,6 +3334,11 @@
   if (!lpszUrl || !lpszPath || !pcchPath || !*pcchPath)
     return E_INVALIDARG;
 
+  /* Path of the form file:///... */
+  if (!strncmpW(lpszUrl, stemp, 8))
+  {
+    lpszUrl += 8;
+  }
   /* Path of the form file://... */
   if (!strncmpW(lpszUrl, stemp, 7))
   {
Index: dlls/shlwapi/url.c
===================================================================
RCS file: /home/wine/wine/dlls/shlwapi/url.c,v
retrieving revision 1.26
diff -u -3 -r1.26 url.c
--- dlls/shlwapi/url.c	1 Oct 2003 03:10:42 -0000	1.26
+++ dlls/shlwapi/url.c	18 Dec 2003 18:53:00 -0000
@@ -464,7 +464,19 @@
     nByteLen = (lstrlenW(pszUrl) + 1) * sizeof(WCHAR); /* length in bytes */
     lpszUrlCpy = HeapAlloc(GetProcessHeap(), 0, nByteLen);
 
-    if (dwFlags & URL_DONT_SIMPLIFY)
+    if (dwFlags & URL_FILE_USE_PATHURL && ( *pszUrl && pszUrl[1] == ':' && pszUrl[2] == '\\' ) )
+    {
+      pszCanonicalized[0] = 'f';
+      pszCanonicalized[1] = 'i';
+      pszCanonicalized[2] = 'l';
+      pszCanonicalized[3] = 'e';
+      pszCanonicalized[4] = ':';
+      pszCanonicalized[5] = '/';
+      pszCanonicalized[6] = '/';
+      StrCpyW(pszCanonicalized+7, pszUrl);
+      TRACE("result %s\n", debugstr_w(pszCanonicalized));
+      return S_OK;
+    } else if (dwFlags & URL_DONT_SIMPLIFY)
         memcpy(lpszUrlCpy, pszUrl, nByteLen);
     else {
 
@@ -1693,8 +1705,12 @@
     case URLIS_URL:
     case URLIS_NOHISTORY:
     case URLIS_FILEURL:
+        return !StrCmpNA("file://", pszUrl, 7);
     case URLIS_APPLIABLE:
-    case URLIS_DIRECTORY:
+    case URLIS_DIRECTORY: {
+        LPCWSTR last = StrChrW(pszUrl, '\0') -1;
+        return ( *last == '/' || *last == '\\' );
+    }
     case URLIS_HASQUERY:
     default:
 	FIXME("(%s %d): stub\n", debugstr_a(pszUrl), Urlis);
@@ -1712,6 +1728,7 @@
     UNKNOWN_SHLWAPI_2 base;
     DWORD res1;
 
+    TRACE("(%s %d)\n", debugstr_w(pszUrl), Urlis);
     switch (Urlis) {
 
     case URLIS_OPAQUE:
@@ -1726,8 +1743,13 @@
     case URLIS_URL:
     case URLIS_NOHISTORY:
     case URLIS_FILEURL:
+        return pszUrl[0] == 'f' && pszUrl[1] == 'i' && pszUrl[2] == 'l'
+            && pszUrl[3] == 'e' && pszUrl[4] == ':' && pszUrl[5] == '/' && pszUrl[6] == '/';
     case URLIS_APPLIABLE:
-    case URLIS_DIRECTORY:
+    case URLIS_DIRECTORY: {
+        LPCWSTR last = StrChrW(pszUrl, '\0') -1;
+        return ( *last == '/' || *last == '\\' );
+    }
     case URLIS_HASQUERY:
     default:
 	FIXME("(%s %d): stub\n", debugstr_w(pszUrl), Urlis);
@@ -2175,26 +2197,29 @@
 		return E_INVALIDARG;
 	}
 
-	for (pszConstPointer = pszPath; *pszConstPointer; pszConstPointer++)
-	{
-		if (isalpha(*pszConstPointer) || isdigit(*pszConstPointer) ||
-			*pszConstPointer == '.' || *pszConstPointer == '-')
-			nCharBeforeColon++;
-		else break;
-	}
-	if (*pszConstPointer == ':') /* then already in URL format, so copy */
+	if ( ! (pszPath[0] && pszPath[1] == ':' && pszPath[2] == '\\') )
 	{
-		dwChRequired = lstrlenA(pszPath);
-		if (dwChRequired > *pcchUrl)
+		for (pszConstPointer = pszPath; *pszConstPointer; pszConstPointer++)
 		{
-			*pcchUrl = dwChRequired;
-			return E_POINTER;
+			if (isalpha(*pszConstPointer) || isdigit(*pszConstPointer) ||
+				*pszConstPointer == '.' || *pszConstPointer == '-')
+				nCharBeforeColon++;
+			else break;
 		}
-		else
+		if (*pszConstPointer == ':') /* then already in URL format, so copy */
 		{
-			*pcchUrl = dwChRequired;
-			StrCpyA(pszUrl, pszPath);
-			return S_FALSE;
+			dwChRequired = lstrlenA(pszPath);
+			if (dwChRequired > *pcchUrl)
+			{
+				*pcchUrl = dwChRequired;
+				return E_POINTER;
+			}
+			else
+			{
+				*pcchUrl = dwChRequired;
+				StrCpyA(pszUrl, pszPath);
+				return S_FALSE;
+			}
 		}
 	}
 	/* then must need converting to file: format */
@@ -2248,6 +2273,8 @@
 		pszPointer++;
 	}
 	StrCpyA(pszPointer, pszNewUrl);
+	LPWSTR slash;
+	while((slash = StrChrW(pszUrl, '\\'))) *slash = '/';
 	TRACE("<- %s\n", debugstr_a(pszUrl));
 	return S_OK;
 }
@@ -2276,23 +2303,26 @@
 	if (!pszUrl || !pcchUrl || !pszUrl)
 		return E_INVALIDARG;
 
-	for (pszConstPointer = pszPath; *pszConstPointer; pszConstPointer++)
-	{
-		if (isalphaW(*pszConstPointer) || isdigitW(*pszConstPointer) ||
-			*pszConstPointer == '.' || *pszConstPointer == '-')
-			nCharBeforeColon++;
-		else break;
-	}
-	if (*pszConstPointer == ':') /* then already in URL format, so copy */
+	if ( ! (pszPath[0] && pszPath[1] == ':' && pszPath[2] == '\\') )
 	{
-		dwChRequired = lstrlenW(pszPath);
-		*pcchUrl = dwChRequired;
-		if (dwChRequired > *pcchUrl)
-			return E_POINTER;
-		else
+		for (pszConstPointer = pszPath; *pszConstPointer; pszConstPointer++)
+		{
+			if (isalphaW(*pszConstPointer) || isdigitW(*pszConstPointer) ||
+				*pszConstPointer == '.' || *pszConstPointer == '-')
+				nCharBeforeColon++;
+			else break;
+		}
+		if (*pszConstPointer == ':') /* then already in URL format, so copy */
 		{
-			StrCpyW(pszUrl, pszPath);
-			return S_FALSE;
+			dwChRequired = lstrlenW(pszPath);
+			*pcchUrl = dwChRequired;
+			if (dwChRequired > *pcchUrl)
+				return E_POINTER;
+			else
+			{
+				StrCpyW(pszUrl, pszPath);
+				return S_FALSE;
+			}
 		}
 	}
 	/* then must need converting to file: format */
@@ -2346,6 +2376,9 @@
 	}
 	StrCpyW(pszPointer, pszPath);
 	StrCpyW(pszUrl, pszNewUrl);
+
+	LPWSTR slash;
+	while((slash = StrChrW(pszUrl, '\\'))) *slash = '/';
 	return S_OK;
 }
 


More information about the wine-patches mailing list