msi: Improve stub for MsiGetFeatureCost{A, W} and hook the stub into the VolumeCostList dialog control.
This commit is contained in:
parent
3a9ea794e1
commit
b960b967c9
|
@ -2614,15 +2614,44 @@ static void msi_dialog_vcl_add_columns( msi_dialog *dialog, msi_control *control
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static LONGLONG msi_vcl_get_cost( msi_dialog *dialog )
|
||||||
|
{
|
||||||
|
MSIFEATURE *feature;
|
||||||
|
INT each_cost;
|
||||||
|
LONGLONG total_cost = 0;
|
||||||
|
|
||||||
|
LIST_FOR_EACH_ENTRY( feature, &dialog->package->features, MSIFEATURE, entry )
|
||||||
|
{
|
||||||
|
if (ERROR_SUCCESS == (MSI_GetFeatureCost(dialog->package, feature,
|
||||||
|
MSICOSTTREE_SELFONLY, INSTALLSTATE_LOCAL, &each_cost)))
|
||||||
|
{
|
||||||
|
/* each_cost is in 512-byte units */
|
||||||
|
total_cost += each_cost * 512;
|
||||||
|
}
|
||||||
|
if (ERROR_SUCCESS == (MSI_GetFeatureCost(dialog->package, feature,
|
||||||
|
MSICOSTTREE_SELFONLY, INSTALLSTATE_ABSENT, &each_cost)))
|
||||||
|
{
|
||||||
|
/* each_cost is in 512-byte units */
|
||||||
|
total_cost -= each_cost * 512;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return total_cost;
|
||||||
|
}
|
||||||
|
|
||||||
static void msi_dialog_vcl_add_drives( msi_dialog *dialog, msi_control *control )
|
static void msi_dialog_vcl_add_drives( msi_dialog *dialog, msi_control *control )
|
||||||
{
|
{
|
||||||
ULARGE_INTEGER total, free;
|
ULARGE_INTEGER total, free;
|
||||||
|
LONGLONG difference, cost;
|
||||||
WCHAR size_text[MAX_PATH];
|
WCHAR size_text[MAX_PATH];
|
||||||
|
WCHAR cost_text[MAX_PATH];
|
||||||
LPWSTR drives, ptr;
|
LPWSTR drives, ptr;
|
||||||
LVITEMW lvitem;
|
LVITEMW lvitem;
|
||||||
DWORD size;
|
DWORD size;
|
||||||
int i = 0;
|
int i = 0;
|
||||||
|
|
||||||
|
cost = msi_vcl_get_cost(dialog);
|
||||||
|
StrFormatByteSizeW(cost, cost_text, MAX_PATH);
|
||||||
|
|
||||||
size = GetLogicalDriveStringsW( 0, NULL );
|
size = GetLogicalDriveStringsW( 0, NULL );
|
||||||
if ( !size ) return;
|
if ( !size ) return;
|
||||||
|
|
||||||
|
@ -2642,6 +2671,7 @@ static void msi_dialog_vcl_add_drives( msi_dialog *dialog, msi_control *control
|
||||||
SendMessageW( control->hwnd, LVM_INSERTITEMW, 0, (LPARAM)&lvitem );
|
SendMessageW( control->hwnd, LVM_INSERTITEMW, 0, (LPARAM)&lvitem );
|
||||||
|
|
||||||
GetDiskFreeSpaceExW(ptr, &free, &total, NULL);
|
GetDiskFreeSpaceExW(ptr, &free, &total, NULL);
|
||||||
|
difference = free.QuadPart - cost;
|
||||||
|
|
||||||
StrFormatByteSizeW(total.QuadPart, size_text, MAX_PATH);
|
StrFormatByteSizeW(total.QuadPart, size_text, MAX_PATH);
|
||||||
lvitem.iSubItem = 1;
|
lvitem.iSubItem = 1;
|
||||||
|
@ -2655,6 +2685,17 @@ static void msi_dialog_vcl_add_drives( msi_dialog *dialog, msi_control *control
|
||||||
lvitem.cchTextMax = lstrlenW(size_text) + 1;
|
lvitem.cchTextMax = lstrlenW(size_text) + 1;
|
||||||
SendMessageW( control->hwnd, LVM_SETITEMW, 0, (LPARAM)&lvitem );
|
SendMessageW( control->hwnd, LVM_SETITEMW, 0, (LPARAM)&lvitem );
|
||||||
|
|
||||||
|
lvitem.iSubItem = 3;
|
||||||
|
lvitem.pszText = cost_text;
|
||||||
|
lvitem.cchTextMax = lstrlenW(cost_text) + 1;
|
||||||
|
SendMessageW( control->hwnd, LVM_SETITEMW, 0, (LPARAM)&lvitem );
|
||||||
|
|
||||||
|
StrFormatByteSizeW(difference, size_text, MAX_PATH);
|
||||||
|
lvitem.iSubItem = 4;
|
||||||
|
lvitem.pszText = size_text;
|
||||||
|
lvitem.cchTextMax = lstrlenW(size_text) + 1;
|
||||||
|
SendMessageW( control->hwnd, LVM_SETITEMW, 0, (LPARAM)&lvitem );
|
||||||
|
|
||||||
ptr += lstrlenW(ptr) + 1;
|
ptr += lstrlenW(ptr) + 1;
|
||||||
i++;
|
i++;
|
||||||
}
|
}
|
||||||
|
|
|
@ -934,8 +934,24 @@ UINT WINAPI MsiGetFeatureStateW(MSIHANDLE hInstall, LPCWSTR szFeature,
|
||||||
UINT WINAPI MsiGetFeatureCostA(MSIHANDLE hInstall, LPCSTR szFeature,
|
UINT WINAPI MsiGetFeatureCostA(MSIHANDLE hInstall, LPCSTR szFeature,
|
||||||
MSICOSTTREE iCostTree, INSTALLSTATE iState, LPINT piCost)
|
MSICOSTTREE iCostTree, INSTALLSTATE iState, LPINT piCost)
|
||||||
{
|
{
|
||||||
FIXME("(%d %s %i %i %p): stub\n", hInstall, debugstr_a(szFeature),
|
LPWSTR szwFeature = NULL;
|
||||||
iCostTree, iState, piCost);
|
UINT rc;
|
||||||
|
|
||||||
|
szwFeature = strdupAtoW(szFeature);
|
||||||
|
|
||||||
|
rc = MsiGetFeatureCostW(hInstall, szwFeature, iCostTree, iState, piCost);
|
||||||
|
|
||||||
|
msi_free(szwFeature);
|
||||||
|
|
||||||
|
return rc;
|
||||||
|
}
|
||||||
|
|
||||||
|
UINT MSI_GetFeatureCost(MSIPACKAGE *package, MSIFEATURE *feature,
|
||||||
|
MSICOSTTREE iCostTree, INSTALLSTATE iState,
|
||||||
|
LPINT piCost)
|
||||||
|
{
|
||||||
|
FIXME("(%s %i %i %p): not implemented yet\n",
|
||||||
|
debugstr_w(feature->Feature), iCostTree, iState, piCost);
|
||||||
if (piCost) *piCost = 0;
|
if (piCost) *piCost = 0;
|
||||||
return ERROR_SUCCESS;
|
return ERROR_SUCCESS;
|
||||||
}
|
}
|
||||||
|
@ -946,10 +962,57 @@ UINT WINAPI MsiGetFeatureCostA(MSIHANDLE hInstall, LPCSTR szFeature,
|
||||||
UINT WINAPI MsiGetFeatureCostW(MSIHANDLE hInstall, LPCWSTR szFeature,
|
UINT WINAPI MsiGetFeatureCostW(MSIHANDLE hInstall, LPCWSTR szFeature,
|
||||||
MSICOSTTREE iCostTree, INSTALLSTATE iState, LPINT piCost)
|
MSICOSTTREE iCostTree, INSTALLSTATE iState, LPINT piCost)
|
||||||
{
|
{
|
||||||
FIXME("(%d %s %i %i %p): stub\n", hInstall, debugstr_w(szFeature),
|
MSIPACKAGE *package;
|
||||||
|
MSIFEATURE *feature;
|
||||||
|
UINT ret;
|
||||||
|
|
||||||
|
TRACE("(%d %s %i %i %p)\n", hInstall, debugstr_w(szFeature),
|
||||||
iCostTree, iState, piCost);
|
iCostTree, iState, piCost);
|
||||||
if (piCost) *piCost = 0;
|
|
||||||
return ERROR_SUCCESS;
|
package = msihandle2msiinfo(hInstall, MSIHANDLETYPE_PACKAGE);
|
||||||
|
if (!package)
|
||||||
|
{
|
||||||
|
HRESULT hr;
|
||||||
|
BSTR feature;
|
||||||
|
IWineMsiRemotePackage *remote_package;
|
||||||
|
|
||||||
|
remote_package = (IWineMsiRemotePackage *)msi_get_remote(hInstall);
|
||||||
|
if (!remote_package)
|
||||||
|
return ERROR_INVALID_HANDLE;
|
||||||
|
|
||||||
|
feature = SysAllocString(szFeature);
|
||||||
|
if (!feature)
|
||||||
|
{
|
||||||
|
IWineMsiRemotePackage_Release(remote_package);
|
||||||
|
return ERROR_OUTOFMEMORY;
|
||||||
|
}
|
||||||
|
|
||||||
|
hr = IWineMsiRemotePackage_GetFeatureCost(remote_package, feature,
|
||||||
|
iCostTree, iState, piCost);
|
||||||
|
|
||||||
|
SysFreeString(feature);
|
||||||
|
IWineMsiRemotePackage_Release(remote_package);
|
||||||
|
|
||||||
|
if (FAILED(hr))
|
||||||
|
{
|
||||||
|
if (HRESULT_FACILITY(hr) == FACILITY_WIN32)
|
||||||
|
return HRESULT_CODE(hr);
|
||||||
|
|
||||||
|
return ERROR_FUNCTION_FAILED;
|
||||||
|
}
|
||||||
|
|
||||||
|
return ERROR_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
feature = get_loaded_feature(package, szFeature);
|
||||||
|
|
||||||
|
if (feature)
|
||||||
|
ret = MSI_GetFeatureCost(package, feature, iCostTree, iState, piCost);
|
||||||
|
else
|
||||||
|
ret = ERROR_UNKNOWN_FEATURE;
|
||||||
|
|
||||||
|
msiobj_release( &package->hdr );
|
||||||
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
/***********************************************************************
|
/***********************************************************************
|
||||||
|
|
|
@ -759,6 +759,7 @@ extern LPCWSTR msi_download_file( LPCWSTR szUrl, LPWSTR filename );
|
||||||
extern UINT msi_package_add_info(MSIPACKAGE *, DWORD, DWORD, LPCWSTR, LPWSTR);
|
extern UINT msi_package_add_info(MSIPACKAGE *, DWORD, DWORD, LPCWSTR, LPWSTR);
|
||||||
extern UINT msi_package_add_media_disk(MSIPACKAGE *, DWORD, DWORD, DWORD, LPWSTR, LPWSTR);
|
extern UINT msi_package_add_media_disk(MSIPACKAGE *, DWORD, DWORD, DWORD, LPWSTR, LPWSTR);
|
||||||
extern UINT msi_clone_properties(MSIPACKAGE *);
|
extern UINT msi_clone_properties(MSIPACKAGE *);
|
||||||
|
extern UINT MSI_GetFeatureCost(MSIPACKAGE *, MSIFEATURE *, MSICOSTTREE, INSTALLSTATE, LPINT);
|
||||||
|
|
||||||
/* for deformating */
|
/* for deformating */
|
||||||
extern UINT MSI_FormatRecordW( MSIPACKAGE *, MSIRECORD *, LPWSTR, LPDWORD );
|
extern UINT MSI_FormatRecordW( MSIPACKAGE *, MSIRECORD *, LPWSTR, LPDWORD );
|
||||||
|
|
|
@ -71,6 +71,7 @@ interface IWineMsiRemotePackage : IUnknown
|
||||||
HRESULT SetInstallLevel( [in] int level );
|
HRESULT SetInstallLevel( [in] int level );
|
||||||
HRESULT FormatRecord( [in] MSIHANDLE record, [out] BSTR *value );
|
HRESULT FormatRecord( [in] MSIHANDLE record, [out] BSTR *value );
|
||||||
HRESULT EvaluateCondition( [in] BSTR condition );
|
HRESULT EvaluateCondition( [in] BSTR condition );
|
||||||
|
HRESULT GetFeatureCost( [in] BSTR feature, [in] INT cost_tree, [in] INSTALLSTATE state, [out] INT *cost);
|
||||||
}
|
}
|
||||||
|
|
||||||
[
|
[
|
||||||
|
|
|
@ -1898,6 +1898,14 @@ static HRESULT WINAPI mrp_EvaluateCondition( IWineMsiRemotePackage *iface, BSTR
|
||||||
return HRESULT_FROM_WIN32(r);
|
return HRESULT_FROM_WIN32(r);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static HRESULT WINAPI mrp_GetFeatureCost( IWineMsiRemotePackage *iface, BSTR feature,
|
||||||
|
INT cost_tree, INSTALLSTATE state, INT *cost )
|
||||||
|
{
|
||||||
|
msi_remote_package_impl* This = mrp_from_IWineMsiRemotePackage( iface );
|
||||||
|
UINT r = MsiGetFeatureCostW(This->package, feature, cost_tree, state, cost);
|
||||||
|
return HRESULT_FROM_WIN32(r);
|
||||||
|
}
|
||||||
|
|
||||||
static const IWineMsiRemotePackageVtbl msi_remote_package_vtbl =
|
static const IWineMsiRemotePackageVtbl msi_remote_package_vtbl =
|
||||||
{
|
{
|
||||||
mrp_QueryInterface,
|
mrp_QueryInterface,
|
||||||
|
@ -1922,6 +1930,7 @@ static const IWineMsiRemotePackageVtbl msi_remote_package_vtbl =
|
||||||
mrp_SetInstallLevel,
|
mrp_SetInstallLevel,
|
||||||
mrp_FormatRecord,
|
mrp_FormatRecord,
|
||||||
mrp_EvaluateCondition,
|
mrp_EvaluateCondition,
|
||||||
|
mrp_GetFeatureCost,
|
||||||
};
|
};
|
||||||
|
|
||||||
HRESULT create_msi_remote_package( IUnknown *pOuter, LPVOID *ppObj )
|
HRESULT create_msi_remote_package( IUnknown *pOuter, LPVOID *ppObj )
|
||||||
|
|
Loading…
Reference in New Issue