msi: fix file version comparsons when installing
Aric Stewart
aric at codeweavers.com
Fri Oct 8 08:55:16 CDT 2004
Properly compare file versions when upgrading files so that new versions
get properly installed.
-aric
-------------- next part --------------
Index: dlls/msi/action.c
===================================================================
RCS file: /home/wine/wine/dlls/msi/action.c,v
retrieving revision 1.35
diff -u -r1.35 action.c
--- dlls/msi/action.c 10 Sep 2004 22:29:49 -0000 1.35
+++ dlls/msi/action.c 8 Oct 2004 13:44:47 -0000
@@ -2093,21 +2093,29 @@
DWORD versize;
UINT sz;
LPVOID version;
+ static const WCHAR name[] =
+ {'\\',0};
+ static const WCHAR name_fmt[] =
+ {'%','u','.','%','u','.','%','u','.','%','u',0};
WCHAR filever[0x100];
- static const WCHAR name[] =
- {'\\','V','a','r','F','i','l','e','I','n','f','o',
- '\\','F','i','l','e','V','e','r','s','i','o','n',0};
+ VS_FIXEDFILEINFO *lpVer;
- FIXME("Version comparison.. Untried Untested and most "
- "likely very very wrong\n");
+ FIXME("Version comparison.. \n");
versize = GetFileVersionInfoSizeW(file->TargetPath,&handle);
version = HeapAlloc(GetProcessHeap(),0,versize);
GetFileVersionInfoW(file->TargetPath, 0, versize, version);
- sz = 0x100;
- VerQueryValueW(version,name,(LPVOID)filever,&sz);
- HeapFree(GetProcessHeap(),0,version);
-
- if (strcmpW(version,file->Version)<0)
+
+ VerQueryValueW(version, name, (LPVOID*)&lpVer, &sz);
+
+ sprintfW(filever,name_fmt,
+ HIWORD(lpVer->dwFileVersionMS),
+ LOWORD(lpVer->dwFileVersionMS),
+ HIWORD(lpVer->dwFileVersionLS),
+ LOWORD(lpVer->dwFileVersionLS));
+
+ TRACE("new %s old %s\n", debugstr_w(file->Version),
+ debugstr_w(filever));
+ if (strcmpiW(filever,file->Version)<0)
{
file->State = 2;
FIXME("cost should be diff in size\n");
@@ -2115,6 +2123,7 @@
}
else
file->State = 3;
+ HeapFree(GetProcessHeap(),0,version);
}
else
file->State = 3;
@@ -2574,8 +2583,17 @@
if (!MoveFileW(file->SourcePath,file->TargetPath))
{
rc = GetLastError();
- ERR("Unable to move file (error %d)\n", rc);
- break;
+ ERR("Unable to move file (%s -> %s) (error %d)\n",
+ debugstr_w(file->SourcePath), debugstr_w(file->TargetPath),
+ rc);
+ if (rc == ERROR_ALREADY_EXISTS && file->State == 2)
+ {
+ CopyFileW(file->SourcePath,file->TargetPath,FALSE);
+ DeleteFileW(file->SourcePath);
+ rc = 0;
+ }
+ else
+ break;
}
else
file->State = 4;
More information about the wine-patches
mailing list