Hi, I submitted the following patch to wine-patches but was thinking about it some more. The problem is that you have the following UI levels and flags: INSTALLUILEVEL_NOCHANGE = 0, INSTALLUILEVEL_DEFAULT = 1, INSTALLUILEVEL_NONE = 2, INSTALLUILEVEL_BASIC = 3, INSTALLUILEVEL_REDUCED = 4, INSTALLUILEVEL_FULL = 5, INSTALLUILEVEL_HIDECANCEL = 0x20, INSTALLUILEVEL_PROGRESSONLY = 0x40, INSTALLUILEVEL_ENDDIALOG = 0x80, INSTALLUILEVEL_SOURCERESONLY = 0x100 and the code to check for the level was:
if ( msi_get_property_int(package, szUILevel, 0) >= INSTALLUILEVEL_REDUCED)
but the problem is that if any of the flags are set, then immediately this would assume full UI install even though this is not the case for some installers (see bug #6992). I proposed this change:
if ( (msi_get_property_int(package, szUILevel, 0) & INSTALLUILEVEL_FULL)
=
INSTALLUILEVEL_REDUCED )
It will work because INSTALLUILEVEL_FULL is 4+1 and so doing an AND operation with INSTALLUI_LEVEL FULL will be 4+1 and with INSTALLUILEVEL_REDUCED will be 4, both of which are greater than or equal to four. However, if for some reason these UI levels were to change in the future, or if someone decided to further modify this code and say, try to check for INSTALLUILEVEL_BASIC (3) they would actually be getting a 1 instead by doing INSTALLUILEVEL_BASIC & INSTALLUILEVEL_FULL. So is this too hacky? Is there a simple, better way to do this?
Thanks Misha
"Misha Koshelev" mk144210@bcm.tmc.edu wrote:
Hi, I submitted the following patch to wine-patches but was thinking about it some more. The problem is that you have the following UI levels and flags: INSTALLUILEVEL_NOCHANGE = 0, INSTALLUILEVEL_DEFAULT = 1, INSTALLUILEVEL_NONE = 2, INSTALLUILEVEL_BASIC = 3, INSTALLUILEVEL_REDUCED = 4, INSTALLUILEVEL_FULL = 5, INSTALLUILEVEL_HIDECANCEL = 0x20, INSTALLUILEVEL_PROGRESSONLY = 0x40, INSTALLUILEVEL_ENDDIALOG = 0x80, INSTALLUILEVEL_SOURCERESONLY = 0x100 and the code to check for the level was:
if ( msi_get_property_int(package, szUILevel, 0) >= INSTALLUILEVEL_REDUCED)
but the problem is that if any of the flags are set, then immediately this would assume full UI install even though this is not the case for some installers (see bug #6992). I proposed this change:
if ( (msi_get_property_int(package, szUILevel, 0) & INSTALLUILEVEL_FULL)
=
INSTALLUILEVEL_REDUCED )
It will work because INSTALLUILEVEL_FULL is 4+1 and so doing an AND operation with INSTALLUI_LEVEL FULL will be 4+1 and with INSTALLUILEVEL_REDUCED will be 4, both of which are greater than or equal to four. However, if for some reason these UI levels were to change in the future, or if someone decided to further modify this code and say, try to check for INSTALLUILEVEL_BASIC (3) they would actually be getting a 1 instead by doing INSTALLUILEVEL_BASIC & INSTALLUILEVEL_FULL. So is this too hacky? Is there a simple, better way to do this?
Looks like that the flags are placed in the bits higher than 4, so I'd vote for something like the following:
if ( (msi_get_property_int(package, szUILevel, 0) & 0x0f)>= INSTALLUILEVEL_REDUCED ) ...
That seems like a good way to do it. I sent an updated patch to wine-patches.
Misha
On Tue, 2007-02-06 at 12:15 +0800, Dmitry Timoshkov wrote:
"Misha Koshelev" mk144210@bcm.tmc.edu wrote:
Hi, I submitted the following patch to wine-patches but was thinking about it some more. The problem is that you have the following UI levels and flags: INSTALLUILEVEL_NOCHANGE = 0, INSTALLUILEVEL_DEFAULT = 1, INSTALLUILEVEL_NONE = 2, INSTALLUILEVEL_BASIC = 3, INSTALLUILEVEL_REDUCED = 4, INSTALLUILEVEL_FULL = 5, INSTALLUILEVEL_HIDECANCEL = 0x20, INSTALLUILEVEL_PROGRESSONLY = 0x40, INSTALLUILEVEL_ENDDIALOG = 0x80, INSTALLUILEVEL_SOURCERESONLY = 0x100 and the code to check for the level was:
if ( msi_get_property_int(package, szUILevel, 0) >= INSTALLUILEVEL_REDUCED)
but the problem is that if any of the flags are set, then immediately this would assume full UI install even though this is not the case for some installers (see bug #6992). I proposed this change:
if ( (msi_get_property_int(package, szUILevel, 0) & INSTALLUILEVEL_FULL)
=
INSTALLUILEVEL_REDUCED )
It will work because INSTALLUILEVEL_FULL is 4+1 and so doing an AND operation with INSTALLUI_LEVEL FULL will be 4+1 and with INSTALLUILEVEL_REDUCED will be 4, both of which are greater than or equal to four. However, if for some reason these UI levels were to change in the future, or if someone decided to further modify this code and say, try to check for INSTALLUILEVEL_BASIC (3) they would actually be getting a 1 instead by doing INSTALLUILEVEL_BASIC & INSTALLUILEVEL_FULL. So is this too hacky? Is there a simple, better way to do this?
Looks like that the flags are placed in the bits higher than 4, so I'd vote for something like the following:
if ( (msi_get_property_int(package, szUILevel, 0) & 0x0f)>= INSTALLUILEVEL_REDUCED ) ...