Implementation of GetCompressedFileSize[AW]

Pavel Roskin proski at gnu.org
Wed Oct 1 22:22:42 CDT 2003


Hello!

FIXME about GetCompressedFileSizeA was too annoying when running Cygwin
programs, so I implemented it.  The code uses st_blocks when possible to
account for sparse files and falls back to st_size if st_blocks is missing
in struct stat.  The code uses shift operations so that both systems with
32-bit and 64-bit off_t will do their best to provide accurate results.

ChangeLog:
	* configure.ac:
	Check for st_blocks in struct stat.
	* win32/newfns.c:
	Implement GetCompressedFileSize[AW].

-- 
Regards,
Pavel Roskin
-------------- next part --------------
--- configure.ac
+++ configure.ac
@@ -1327,6 +1327,9 @@
 #include <getopt.h>
 #endif])
 
+dnl Check for stat.st_blocks
+AC_STRUCT_ST_BLOCKS
+
 dnl *** check for the need to define platform-specific symbols
 
 case $host_cpu in
--- dlls/comctl32/propsheet.c
+++ dlls/comctl32/propsheet.c
@@ -305,12 +305,17 @@ static BOOL PROPSHEET_CollectSheetInfoA(
 
   PROPSHEET_UnImplementedFlags(lppsh->dwFlags);
 
-  if (HIWORD(lppsh->pszCaption))
+  if (lppsh->dwFlags & INTRNL_ANY_WIZARD)
+     psInfo->ppshheader.pszCaption = NULL;
+  else
   {
-     int len = strlen(lppsh->pszCaption);
-     psInfo->ppshheader.pszCaption = HeapAlloc( GetProcessHeap(), 0, (len+1)*sizeof (WCHAR) );
-     MultiByteToWideChar(CP_ACP, 0, lppsh->pszCaption, -1, (LPWSTR) psInfo->ppshheader.pszCaption, len+1);
-     /* strcpy( (char *)psInfo->ppshheader.pszCaption, lppsh->pszCaption ); */
+     if (HIWORD(lppsh->pszCaption))
+     {
+        int len = strlen(lppsh->pszCaption);
+        psInfo->ppshheader.pszCaption = HeapAlloc( GetProcessHeap(), 0, (len+1)*sizeof (WCHAR) );
+        MultiByteToWideChar(CP_ACP, 0, lppsh->pszCaption, -1, (LPWSTR) psInfo->ppshheader.pszCaption, len+1);
+        /* strcpy( (char *)psInfo->ppshheader.pszCaption, lppsh->pszCaption ); */
+     }
   }
   psInfo->nPages = lppsh->nPages;
 
@@ -355,11 +360,16 @@ static BOOL PROPSHEET_CollectSheetInfoW(
 
   PROPSHEET_UnImplementedFlags(lppsh->dwFlags);
 
-  if (HIWORD(lppsh->pszCaption))
+  if (lppsh->dwFlags & INTRNL_ANY_WIZARD)
+     psInfo->ppshheader.pszCaption = NULL;
+  else
   {
-     int len = strlenW(lppsh->pszCaption);
-     psInfo->ppshheader.pszCaption = HeapAlloc( GetProcessHeap(), 0, (len+1)*sizeof(WCHAR) );
-     strcpyW( (WCHAR *)psInfo->ppshheader.pszCaption, lppsh->pszCaption );
+     if (!(lppsh->dwFlags & INTRNL_ANY_WIZARD) && HIWORD(lppsh->pszCaption))
+     {
+        int len = strlenW(lppsh->pszCaption);
+        psInfo->ppshheader.pszCaption = HeapAlloc( GetProcessHeap(), 0, (len+1)*sizeof(WCHAR) );
+        strcpyW( (WCHAR *)psInfo->ppshheader.pszCaption, lppsh->pszCaption );
+     }
   }
   psInfo->nPages = lppsh->nPages;
 
@@ -1554,6 +1564,9 @@ static BOOL PROPSHEET_ShowPage(HWND hwnd
      PROPSHEET_CreatePage(hwndDlg, index, psInfo, ppshpage);
   }
 
+  PROPSHEET_SetTitleW(hwndDlg, psInfo->ppshheader.dwFlags,
+                      psInfo->proppage[index].pszText);
+
   if (psInfo->active_page != -1)
      ShowWindow(psInfo->proppage[psInfo->active_page].hwndPage, SW_HIDE);
 
--- dlls/user/focus.c
+++ dlls/user/focus.c
@@ -258,6 +258,7 @@ HWND WINAPI SetFocus( HWND hwnd )
             HWND parent;
             LONG style = GetWindowLongW( hwndTop, GWL_STYLE );
             if (style & (WS_MINIMIZE | WS_DISABLED)) return 0;
+            if (!(style & WS_VISIBLE)) return 0;
             parent = GetAncestor( hwndTop, GA_PARENT );
             if (!parent || parent == GetDesktopWindow()) break;
             hwndTop = parent;
--- win32/newfns.c
+++ win32/newfns.c
@@ -33,6 +33,9 @@ at a later date. */
 #ifdef HAVE_UNISTD_H
 # include <unistd.h>
 #endif
+#ifdef HAVE_SYS_STAT_H
+# include <sys/stat.h>
+#endif
 
 #define NONAMELESSUNION
 #define NONAMELESSSTRUCT
@@ -41,22 +44,22 @@ at a later date. */
 #include "winnls.h"
 #include "winerror.h"
 #include "wine/debug.h"
+#include "file.h"
 
 WINE_DEFAULT_DEBUG_CHANNEL(win32);
 
 
 /******************************************************************************
  * GetCompressedFileSizeA [KERNEL32.@]
- *
- * NOTES
- *    This should call the W function below
  */
 DWORD WINAPI GetCompressedFileSizeA(
     LPCSTR lpFileName,
     LPDWORD lpFileSizeHigh)
 {
-    FIXME("(...): stub\n");
-    return 0xffffffff;
+    WCHAR fileW[MAX_PATHNAME_LEN];
+
+    MultiByteToWideChar(CP_ACP, 0, lpFileName, -1, fileW, MAX_PATHNAME_LEN);
+    return GetCompressedFileSizeW( fileW, lpFileSizeHigh );
 }
 
 
@@ -71,8 +74,27 @@ DWORD WINAPI GetCompressedFileSizeW(
     LPCWSTR lpFileName,     /* [in]  Pointer to name of file */
     LPDWORD lpFileSizeHigh) /* [out] Receives high-order doubleword of size */
 {
-    FIXME("(%s,%p): stub\n",debugstr_w(lpFileName),lpFileSizeHigh);
-    return 0xffffffff;
+    DOS_FULL_NAME full_name;
+    struct stat st;
+    DWORD low;
+
+    TRACE("(%s,%p)\n",debugstr_w(lpFileName),lpFileSizeHigh);
+    if ((lpFileName == NULL) ||
+        (!DOSFS_GetFullName( lpFileName, TRUE, &full_name )) ||
+        (stat(full_name.long_name, &st) != 0))
+    {
+        SetLastError( ERROR_INVALID_PARAMETER );
+        return 0xffffffff;
+    }
+#if HAVE_STRUCT_STAT_ST_BLOCKS
+    /* blocks are 512 bytes long */
+    *lpFileSizeHigh = (st.st_blocks >> 23);
+    low = ((st.st_blocks << 9) & 0xffffffff);
+#else
+    *lpFileSizeHigh = (st.st_size >> 32);
+    low = (st.st_size & 0xffffffff);
+#endif
+    return low;
 }
 
 


More information about the wine-patches mailing list