Commit 5c60510b authored by Vincent Béron's avatar Vincent Béron Committed by Alexandre Julliard

Implement the repair mechanism in msiexec, and stub it out in

msi.dll.
parent d6315926
......@@ -561,6 +561,18 @@ UINT WINAPI MsiInstallProductW(LPCWSTR szPackagePath, LPCWSTR szCommandLine)
return rc;
}
UINT WINAPI MsiReinstallProductA(LPCSTR szProduct, DWORD dwReinstallMode)
{
FIXME("%s 0x%08lx\n", debugstr_a(szProduct), dwReinstallMode);
return ERROR_CALL_NOT_IMPLEMENTED;
}
UINT WINAPI MsiReinstallProductW(LPCWSTR szProduct, DWORD dwReinstallMode)
{
FIXME("%s 0x%08lx\n", debugstr_w(szProduct), dwReinstallMode);
return ERROR_CALL_NOT_IMPLEMENTED;
}
UINT WINAPI MsiConfigureProductA(LPCSTR szProduct, int iInstallLevel, INSTALLSTATE eInstallState)
{
LPWSTR szwProduct = NULL;
......
......@@ -127,8 +127,8 @@
127 stub MsiReinstallFeatureFromDescriptorA
128 stub MsiReinstallFeatureFromDescriptorW
129 stub MsiReinstallFeatureW
130 stub MsiReinstallProductA
131 stub MsiReinstallProductW
130 stdcall MsiReinstallProductA(str long)
131 stdcall MsiReinstallProductW(wstr long)
132 stub MsiSequenceA
133 stub MsiSequenceW
134 stub MsiSetComponentStateA
......
......@@ -77,6 +77,21 @@ typedef enum tagINSTALLMESSAGE
INSTALLMESSAGE_SHOWDIALOG = 0x0e000000
} INSTALLMESSAGE;
typedef enum tagREINSTALLMODE
{
REINSTALLMODE_REPAIR = 0x00000001,
REINSTALLMODE_FILEMISSING = 0x00000002,
REINSTALLMODE_FILEOLDERVERSION = 0x00000004,
REINSTALLMODE_FILEEQUALVERSION = 0x00000008,
REINSTALLMODE_FILEEXACT = 0x00000010,
REINSTALLMODE_FILEVERIFY = 0x00000020,
REINSTALLMODE_FILEREPLACE = 0x00000040,
REINSTALLMODE_MACHINEDATA = 0x00000080,
REINSTALLMODE_USERDATA = 0x00000100,
REINSTALLMODE_SHORTCUT = 0x00000200,
REINSTALLMODE_PACKAGE = 0x00000400
} REINSTALLMODE;
typedef enum tagINSTALLLOGMODE
{
INSTALLLOGMODE_FATALEXIT = (1 << (INSTALLMESSAGE_FATALEXIT >> 24)),
......@@ -113,6 +128,10 @@ UINT WINAPI MsiInstallProductA(LPCSTR, LPCSTR);
UINT WINAPI MsiInstallProductW(LPCWSTR, LPCWSTR);
#define MsiInstallProduct WINELIB_NAME_AW(MsiInstallProduct)
UINT WINAPI MsiReinstallProductA(LPCSTR, DWORD);
UINT WINAPI MsiReinstallProductW(LPCWSTR, DWORD);
#define MsiReinstallProduct WINELIB_NAME_AW(MsiReinstallProduct)
UINT WINAPI MsiEnumProductsA(DWORD index, LPSTR lpguid);
UINT WINAPI MsiEnumProductsW(DWORD index, LPWSTR lpguid);
#define MsiEnumProducts WINELIB_NAME_AW(MsiEnumProducts)
......
......@@ -123,6 +123,7 @@ int main(int argc, char *argv[])
{
int i;
BOOL FunctionInstall = FALSE;
BOOL FunctionRepair = FALSE;
BOOL FunctionDllRegisterServer = FALSE;
BOOL FunctionDllUnregisterServer = FALSE;
......@@ -132,6 +133,8 @@ int main(int argc, char *argv[])
LPSTR Properties = HeapAlloc(GetProcessHeap(), 0, 1);
LPSTR TempStr = NULL;
DWORD RepairMode = 0;
LPSTR DllName = NULL;
Properties[0] = 0;
......@@ -172,11 +175,68 @@ int main(int argc, char *argv[])
}
else if(!strncasecmp(argv[i], "/f", 2))
{
int j;
int len = strlen(argv[i]);
FunctionRepair = TRUE;
for(j = 2; j < len; j++)
{
switch(argv[i][j])
{
case 'P':
case 'p':
RepairMode |= REINSTALLMODE_FILEMISSING;
break;
case 'O':
case 'o':
RepairMode |= REINSTALLMODE_FILEOLDERVERSION;
break;
case 'E':
case 'e':
RepairMode |= REINSTALLMODE_FILEEQUALVERSION;
break;
case 'D':
case 'd':
RepairMode |= REINSTALLMODE_FILEEXACT;
break;
case 'C':
case 'c':
RepairMode |= REINSTALLMODE_FILEVERIFY;
break;
case 'A':
case 'a':
RepairMode |= REINSTALLMODE_FILEREPLACE;
break;
case 'U':
case 'u':
RepairMode |= REINSTALLMODE_USERDATA;
break;
case 'M':
case 'm':
RepairMode |= REINSTALLMODE_MACHINEDATA;
break;
case 'S':
case 's':
RepairMode |= REINSTALLMODE_SHORTCUT;
break;
case 'V':
case 'v':
RepairMode |= REINSTALLMODE_PACKAGE;
break;
default:
fprintf(stderr, "Unknown option \"%c\" in Repair mode\n", argv[i][j]);
break;
}
}
i++;
if(i >= argc)
ShowUsage(1);
WINE_FIXME("Repair not implemented yet\n");
ExitProcess(1);
GotProductCode = GetProductCode(argv[i], ProductCode);
if(!GotProductCode)
{
HeapFree(GetProcessHeap(), 0, ProductCode);
ProductCode = NULL;
PackageName = argv[i];
}
}
else if(!strcasecmp(argv[i], "/x"))
{
......@@ -311,6 +371,22 @@ int main(int argc, char *argv[])
}
}
}
else if(FunctionRepair)
{
if(GotProductCode)
{
WINE_FIXME("Product code treatment not implemented yet\n");
ExitProcess(1);
}
else
{
if(MsiReinstallProductA(PackageName, RepairMode) != ERROR_SUCCESS)
{
fprintf(stderr, "Repair of %s (0x%08lx) failed.\n", PackageName, RepairMode);
ExitProcess(1);
}
}
}
else if(FunctionDllRegisterServer)
{
DllRegisterServer(DllName);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment