Sync msiexec with winehq cvs

svn path=/trunk/; revision=11878
This commit is contained in:
James Tabor 2004-11-30 19:16:37 +00:00
parent 34151c8b26
commit a9a6f59924

View file

@ -110,6 +110,20 @@ static VOID StringCompareRemoveLast(LPSTR String, CHAR character)
if(len && String[len-1] == character) String[len-1] = 0; if(len && String[len-1] == character) String[len-1] = 0;
} }
static INT MSIEXEC_lstrncmpiA(LPCSTR str1, LPCSTR str2, INT size)
{
INT ret;
if ((str1 == NULL) && (str2 == NULL)) return 0;
if (str1 == NULL) return -1;
if (str2 == NULL) return 1;
ret = CompareStringA(GetThreadLocale(), NORM_IGNORECASE, str1, size, str2, -1);
if (ret) ret -= 2;
return ret;
}
static VOID *LoadProc(LPCSTR DllName, LPCSTR ProcName, HMODULE* DllHandle) static VOID *LoadProc(LPCSTR DllName, LPCSTR ProcName, HMODULE* DllHandle)
{ {
VOID* (*proc)(void); VOID* (*proc)(void);
@ -179,6 +193,9 @@ int main(int argc, char *argv[])
BOOL FunctionPatch = FALSE; BOOL FunctionPatch = FALSE;
BOOL FunctionDllRegisterServer = FALSE; BOOL FunctionDllRegisterServer = FALSE;
BOOL FunctionDllUnregisterServer = FALSE; BOOL FunctionDllUnregisterServer = FALSE;
BOOL FunctionRegServer = FALSE;
BOOL FunctionUnregServer = FALSE;
BOOL FunctionUnknown = FALSE;
BOOL GotProductCode = FALSE; BOOL GotProductCode = FALSE;
LPCSTR PackageName = NULL; LPCSTR PackageName = NULL;
@ -209,16 +226,30 @@ int main(int argc, char *argv[])
{ {
WINE_TRACE("argv[%d] = %s\n", i, argv[i]); WINE_TRACE("argv[%d] = %s\n", i, argv[i]);
if(!strcasecmp(argv[i], "/i")) if (!lstrcmpiA(argv[i], "/regserver"))
{
FunctionRegServer = TRUE;
}
else if (!lstrcmpiA(argv[i], "/unregserver") || !lstrcmpiA(argv[i], "/unregister"))
{
FunctionUnregServer = TRUE;
}
else if(!MSIEXEC_lstrncmpiA(argv[i], "/i", 2))
{ {
char *argvi = argv[i];
FunctionInstall = TRUE; FunctionInstall = TRUE;
i++; if(strlen(argvi) > 2)
if(i >= argc) argvi += 2;
ShowUsage(1); else {
WINE_TRACE("argv[%d] = %s\n", i, argv[i]); i++;
GotProductCode = GetProductCode(argv[i], &PackageName, &ProductCode); if(i >= argc)
ShowUsage(1);
WINE_TRACE("argv[%d] = %s\n", i, argv[i]);
argvi = argv[i];
}
GotProductCode = GetProductCode(argvi, &PackageName, &ProductCode);
} }
else if(!strcasecmp(argv[i], "/a")) else if(!lstrcmpiA(argv[i], "/a"))
{ {
FunctionInstall = TRUE; FunctionInstall = TRUE;
FunctionInstallAdmin = TRUE; FunctionInstallAdmin = TRUE;
@ -230,7 +261,7 @@ int main(int argc, char *argv[])
PackageName = argv[i]; PackageName = argv[i];
StringListAppend(&Properties, ActionAdmin); StringListAppend(&Properties, ActionAdmin);
} }
else if(!strncasecmp(argv[i], "/f", 2)) else if(!MSIEXEC_lstrncmpiA(argv[i], "/f", 2))
{ {
int j; int j;
int len = strlen(argv[i]); int len = strlen(argv[i]);
@ -298,7 +329,7 @@ int main(int argc, char *argv[])
WINE_TRACE("argv[%d] = %s\n", i, argv[i]); WINE_TRACE("argv[%d] = %s\n", i, argv[i]);
GotProductCode = GetProductCode(argv[i], &PackageName, &ProductCode); GotProductCode = GetProductCode(argv[i], &PackageName, &ProductCode);
} }
else if(!strcasecmp(argv[i], "/x")) else if(!lstrcmpiA(argv[i], "/x"))
{ {
FunctionInstall = TRUE; FunctionInstall = TRUE;
i++; i++;
@ -308,7 +339,7 @@ int main(int argc, char *argv[])
GotProductCode = GetProductCode(argv[i], &PackageName, &ProductCode); GotProductCode = GetProductCode(argv[i], &PackageName, &ProductCode);
StringListAppend(&Properties, RemoveAll); StringListAppend(&Properties, RemoveAll);
} }
else if(!strncasecmp(argv[i], "/j", 2)) else if(!MSIEXEC_lstrncmpiA(argv[i], "/j", 2))
{ {
int j; int j;
int len = strlen(argv[i]); int len = strlen(argv[i]);
@ -336,7 +367,7 @@ int main(int argc, char *argv[])
WINE_TRACE("argv[%d] = %s\n", i, argv[i]); WINE_TRACE("argv[%d] = %s\n", i, argv[i]);
PackageName = argv[i]; PackageName = argv[i];
} }
else if(!strcasecmp(argv[i], "u")) else if(!lstrcmpiA(argv[i], "u"))
{ {
FunctionAdvertise = TRUE; FunctionAdvertise = TRUE;
AdvertiseMode = ADVERTISEFLAGS_USERASSIGN; AdvertiseMode = ADVERTISEFLAGS_USERASSIGN;
@ -346,7 +377,7 @@ int main(int argc, char *argv[])
WINE_TRACE("argv[%d] = %s\n", i, argv[i]); WINE_TRACE("argv[%d] = %s\n", i, argv[i]);
PackageName = argv[i]; PackageName = argv[i];
} }
else if(!strcasecmp(argv[i], "m")) else if(!lstrcmpiA(argv[i], "m"))
{ {
FunctionAdvertise = TRUE; FunctionAdvertise = TRUE;
AdvertiseMode = ADVERTISEFLAGS_MACHINEASSIGN; AdvertiseMode = ADVERTISEFLAGS_MACHINEASSIGN;
@ -356,7 +387,7 @@ int main(int argc, char *argv[])
WINE_TRACE("argv[%d] = %s\n", i, argv[i]); WINE_TRACE("argv[%d] = %s\n", i, argv[i]);
PackageName = argv[i]; PackageName = argv[i];
} }
else if(!strcasecmp(argv[i], "/t")) else if(!lstrcmpiA(argv[i], "/t"))
{ {
i++; i++;
if(i >= argc) if(i >= argc)
@ -365,12 +396,12 @@ int main(int argc, char *argv[])
StringListAppend(&Transforms, argv[i]); StringListAppend(&Transforms, argv[i]);
StringListAppend(&Transforms, ";"); StringListAppend(&Transforms, ";");
} }
else if(!strncasecmp(argv[i], "TRANSFORMS=", 11)) else if(!MSIEXEC_lstrncmpiA(argv[i], "TRANSFORMS=", 11))
{ {
StringListAppend(&Transforms, argv[i]+11); StringListAppend(&Transforms, argv[i]+11);
StringListAppend(&Transforms, ";"); StringListAppend(&Transforms, ";");
} }
else if(!strcasecmp(argv[i], "/g")) else if(!lstrcmpiA(argv[i], "/g"))
{ {
i++; i++;
if(i >= argc) if(i >= argc)
@ -378,7 +409,7 @@ int main(int argc, char *argv[])
WINE_TRACE("argv[%d] = %s\n", i, argv[i]); WINE_TRACE("argv[%d] = %s\n", i, argv[i]);
Language = strtol(argv[i], NULL, 0); Language = strtol(argv[i], NULL, 0);
} }
else if(!strncasecmp(argv[i], "/l", 2)) else if(!MSIEXEC_lstrncmpiA(argv[i], "/l", 2))
{ {
int j; int j;
int len = strlen(argv[i]); int len = strlen(argv[i]);
@ -468,7 +499,7 @@ int main(int argc, char *argv[])
ExitProcess(1); ExitProcess(1);
} }
} }
else if(!strcasecmp(argv[i], "/p")) else if(!lstrcmpiA(argv[i], "/p"))
{ {
FunctionPatch = TRUE; FunctionPatch = TRUE;
i++; i++;
@ -477,36 +508,41 @@ int main(int argc, char *argv[])
WINE_TRACE("argv[%d] = %s\n", i, argv[i]); WINE_TRACE("argv[%d] = %s\n", i, argv[i]);
PatchFileName = argv[i]; PatchFileName = argv[i];
} }
else if(!strncasecmp(argv[i], "/q", 2)) else if(!MSIEXEC_lstrncmpiA(argv[i], "/q", 2))
{ {
if(strlen(argv[i]) == 2 || !strcasecmp(argv[i]+2, "n")) if(strlen(argv[i]) == 2 || !lstrcmpiA(argv[i]+2, "n"))
{ {
InstallUILevel = INSTALLUILEVEL_NONE; InstallUILevel = INSTALLUILEVEL_NONE;
} }
else if(!strcasecmp(argv[i]+2, "b")) else if(!lstrcmpiA(argv[i]+2, "b"))
{ {
InstallUILevel = INSTALLUILEVEL_BASIC; InstallUILevel = INSTALLUILEVEL_BASIC;
} }
else if(!strcasecmp(argv[i]+2, "r")) else if(!lstrcmpiA(argv[i]+2, "r"))
{ {
InstallUILevel = INSTALLUILEVEL_REDUCED; InstallUILevel = INSTALLUILEVEL_REDUCED;
} }
else if(!strcasecmp(argv[i]+2, "f")) else if(!lstrcmpiA(argv[i]+2, "f"))
{ {
InstallUILevel = INSTALLUILEVEL_FULL|INSTALLUILEVEL_ENDDIALOG; InstallUILevel = INSTALLUILEVEL_FULL|INSTALLUILEVEL_ENDDIALOG;
} }
else if(!strcasecmp(argv[i]+2, "n+")) else if(!lstrcmpiA(argv[i]+2, "n+"))
{ {
InstallUILevel = INSTALLUILEVEL_NONE|INSTALLUILEVEL_ENDDIALOG; InstallUILevel = INSTALLUILEVEL_NONE|INSTALLUILEVEL_ENDDIALOG;
} }
else if(!strcasecmp(argv[i]+2, "b+")) else if(!lstrcmpiA(argv[i]+2, "b+"))
{ {
InstallUILevel = INSTALLUILEVEL_BASIC|INSTALLUILEVEL_ENDDIALOG; InstallUILevel = INSTALLUILEVEL_BASIC|INSTALLUILEVEL_ENDDIALOG;
} }
else if(!strcasecmp(argv[i]+2, "b-")) else if(!lstrcmpiA(argv[i]+2, "b-"))
{ {
InstallUILevel = INSTALLUILEVEL_BASIC|INSTALLUILEVEL_PROGRESSONLY; InstallUILevel = INSTALLUILEVEL_BASIC|INSTALLUILEVEL_PROGRESSONLY;
} }
else if(!lstrcmpiA(argv[i]+2, "b+!"))
{
InstallUILevel = INSTALLUILEVEL_BASIC|INSTALLUILEVEL_ENDDIALOG;
WINE_FIXME("Unknown modifier: !\n");
}
else else
{ {
fprintf(stderr, "Unknown option \"%s\" for UI level\n", argv[i]+2); fprintf(stderr, "Unknown option \"%s\" for UI level\n", argv[i]+2);
@ -518,7 +554,7 @@ int main(int argc, char *argv[])
ExitProcess(1); ExitProcess(1);
} }
} }
else if(!strcasecmp(argv[i], "/y")) else if(!lstrcmpiA(argv[i], "/y"))
{ {
FunctionDllRegisterServer = TRUE; FunctionDllRegisterServer = TRUE;
i++; i++;
@ -527,7 +563,7 @@ int main(int argc, char *argv[])
WINE_TRACE("argv[%d] = %s\n", i, argv[i]); WINE_TRACE("argv[%d] = %s\n", i, argv[i]);
DllName = argv[i]; DllName = argv[i];
} }
else if(!strcasecmp(argv[i], "/z")) else if(!lstrcmpiA(argv[i], "/z"))
{ {
FunctionDllUnregisterServer = TRUE; FunctionDllUnregisterServer = TRUE;
i++; i++;
@ -536,10 +572,20 @@ int main(int argc, char *argv[])
WINE_TRACE("argv[%d] = %s\n", i, argv[i]); WINE_TRACE("argv[%d] = %s\n", i, argv[i]);
DllName = argv[i]; DllName = argv[i];
} }
else if(!strcasecmp(argv[i], "/h") || !strcasecmp(argv[i], "/?")) else if(!lstrcmpiA(argv[i], "/h") || !lstrcmpiA(argv[i], "/?"))
{ {
ShowUsage(0); ShowUsage(0);
} }
else if(!lstrcmpiA(argv[i], "/m"))
{
FunctionUnknown = TRUE;
WINE_FIXME("Unknown parameter /m\n");
}
else if(!lstrcmpiA(argv[i], "/D"))
{
FunctionUnknown = TRUE;
WINE_FIXME("Unknown parameter /D\n");
}
else if(strchr(argv[i], '=')) else if(strchr(argv[i], '='))
{ {
StringListAppend(&Properties, argv[i]); StringListAppend(&Properties, argv[i]);
@ -614,6 +660,18 @@ int main(int argc, char *argv[])
{ {
DllUnregisterServer(DllName); DllUnregisterServer(DllName);
} }
else if (FunctionRegServer)
{
WINE_FIXME( "/regserver not implemented yet, ignoring\n" );
}
else if (FunctionUnregServer)
{
WINE_FIXME( "/unregserver not implemented yet, ignoring\n" );
}
else if (FunctionUnknown)
{
WINE_FIXME( "Unknown function, ignoring\n" );
}
else else
ShowUsage(1); ShowUsage(1);