Misha Koshelev : msi: automation: Generalize list implementation.
Alexandre Julliard
julliard at wine.codeweavers.com
Fri May 18 13:56:12 CDT 2007
Module: wine
Branch: master
Commit: 4ccdbc5845379337607962d359eda7c62882a575
URL: http://source.winehq.org/git/wine.git/?a=commit;h=4ccdbc5845379337607962d359eda7c62882a575
Author: Misha Koshelev <mk144210 at bcm.edu>
Date: Fri May 18 11:23:01 2007 -0500
msi: automation: Generalize list implementation.
Same structures and functions can be used for both StringList and RecordList.
---
dlls/msi/automation.c | 69 ++++++++++++++++++++++--------------------
dlls/msi/msiserver.idl | 4 +-
dlls/msi/msiserver_dispids.h | 4 +-
3 files changed, 40 insertions(+), 37 deletions(-)
diff --git a/dlls/msi/automation.c b/dlls/msi/automation.c
index f7183de..98ec166 100644
--- a/dlls/msi/automation.c
+++ b/dlls/msi/automation.c
@@ -84,9 +84,9 @@ interface AutomationObject {
*/
typedef struct {
- int iCount;
- LPWSTR *pszStrings;
-} StringListData;
+ ULONG ulCount;
+ VARIANT *pVars;
+} ListData;
typedef struct {
/* The parent Installer object */
@@ -635,7 +635,7 @@ static HRESULT WINAPI RecordImpl_Invoke(
return S_OK;
}
-static HRESULT WINAPI StringListImpl_Invoke(
+static HRESULT WINAPI ListImpl_Invoke(
AutomationObject* This,
DISPID dispIdMember,
REFIID riid,
@@ -646,7 +646,7 @@ static HRESULT WINAPI StringListImpl_Invoke(
EXCEPINFO* pExcepInfo,
UINT* puArgErr)
{
- StringListData *data = (StringListData *)private_data(This);
+ ListData *data = (ListData *)private_data(This);
HRESULT hr;
VARIANTARG varg0;
@@ -654,22 +654,21 @@ static HRESULT WINAPI StringListImpl_Invoke(
switch (dispIdMember)
{
- case DISPID_STRINGLIST_ITEM:
+ case DISPID_LIST_ITEM:
if (wFlags & DISPATCH_PROPERTYGET) {
hr = DispGetParam(pDispParams, 0, VT_I4, &varg0, puArgErr);
if (FAILED(hr)) return hr;
- if (V_I4(&varg0) < 0 || V_I4(&varg0) >= data->iCount)
+ if (V_I4(&varg0) < 0 || V_I4(&varg0) >= data->ulCount)
return DISP_E_BADINDEX;
- V_VT(pVarResult) = VT_BSTR;
- V_BSTR(pVarResult) = SysAllocString(data->pszStrings[V_I4(&varg0)]);
+ VariantCopy(pVarResult, &data->pVars[V_I4(&varg0)]);
}
else return DISP_E_MEMBERNOTFOUND;
break;
- case DISPID_STRINGLIST_COUNT:
+ case DISPID_LIST_COUNT:
if (wFlags & DISPATCH_PROPERTYGET) {
V_VT(pVarResult) = VT_I4;
- V_I4(pVarResult) = data->iCount;
+ V_I4(pVarResult) = data->ulCount;
}
else return DISP_E_MEMBERNOTFOUND;
break;
@@ -683,14 +682,14 @@ static HRESULT WINAPI StringListImpl_Invoke(
return S_OK;
}
-static void WINAPI StringListImpl_Free(AutomationObject *This)
+static void WINAPI ListImpl_Free(AutomationObject *This)
{
- StringListData *data = private_data(This);
- int idx;
+ ListData *data = private_data(This);
+ ULONG idx;
- for (idx=0; idx<data->iCount; idx++)
- SysFreeString(data->pszStrings[idx]);
- HeapFree(GetProcessHeap(), 0, data->pszStrings);
+ for (idx=0; idx<data->ulCount; idx++)
+ VariantClear(&data->pVars[idx]);
+ HeapFree(GetProcessHeap(), 0, data->pVars);
}
static HRESULT WINAPI ViewImpl_Invoke(
@@ -1388,8 +1387,8 @@ static HRESULT WINAPI InstallerImpl_Invoke(
case DISPID_INSTALLER_PRODUCTS:
if (wFlags & DISPATCH_PROPERTYGET)
{
- StringListData *sldata = NULL;
- int idx = 0;
+ ListData *ldata = NULL;
+ ULONG idx = 0;
WCHAR szProductBuf[GUID_SIZE];
/* Find number of products */
@@ -1401,22 +1400,24 @@ static HRESULT WINAPI InstallerImpl_Invoke(
}
V_VT(pVarResult) = VT_DISPATCH;
- if (SUCCEEDED(hr = create_automation_object(0, NULL, (LPVOID*)&pDispatch, &DIID_StringList, StringListImpl_Invoke, StringListImpl_Free, sizeof(StringListData))))
+ if (SUCCEEDED(hr = create_automation_object(0, NULL, (LPVOID*)&pDispatch, &DIID_StringList, ListImpl_Invoke, ListImpl_Free, sizeof(ListData))))
{
IDispatch_AddRef(pDispatch);
V_DISPATCH(pVarResult) = pDispatch;
/* Save product strings */
- sldata = (StringListData *)private_data((AutomationObject *)pDispatch);
- if (!(sldata->pszStrings = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(LPWSTR)*sldata->iCount)))
+ ldata = (ListData *)private_data((AutomationObject *)pDispatch);
+ if (!(ldata->pVars = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(VARIANT)*idx)))
ERR("Out of memory\n");
else
{
- sldata->iCount = idx;
- for (idx = 0; idx < sldata->iCount; idx++)
+ ldata->ulCount = idx;
+ for (idx = 0; idx < ldata->ulCount; idx++)
{
ret = MsiEnumProductsW(idx, szProductBuf);
- sldata->pszStrings[idx] = SysAllocString(szProductBuf);
+ VariantInit(&ldata->pVars[idx]);
+ V_VT(&ldata->pVars[idx]) = VT_BSTR;
+ V_BSTR(&ldata->pVars[idx]) = SysAllocString(szProductBuf);
}
}
}
@@ -1429,8 +1430,8 @@ static HRESULT WINAPI InstallerImpl_Invoke(
case DISPID_INSTALLER_RELATEDPRODUCTS:
if (wFlags & DISPATCH_PROPERTYGET)
{
- StringListData *sldata = NULL;
- int idx = 0;
+ ListData *ldata = NULL;
+ ULONG idx = 0;
WCHAR szProductBuf[GUID_SIZE];
hr = DispGetParam(pDispParams, 0, VT_BSTR, &varg0, puArgErr);
@@ -1446,22 +1447,24 @@ static HRESULT WINAPI InstallerImpl_Invoke(
}
V_VT(pVarResult) = VT_DISPATCH;
- if (SUCCEEDED(hr = create_automation_object(0, NULL, (LPVOID*)&pDispatch, &DIID_StringList, StringListImpl_Invoke, StringListImpl_Free, sizeof(StringListData))))
+ if (SUCCEEDED(hr = create_automation_object(0, NULL, (LPVOID*)&pDispatch, &DIID_StringList, ListImpl_Invoke, ListImpl_Free, sizeof(ListData))))
{
IDispatch_AddRef(pDispatch);
V_DISPATCH(pVarResult) = pDispatch;
/* Save product strings */
- sldata = (StringListData *)private_data((AutomationObject *)pDispatch);
- if (!(sldata->pszStrings = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(LPWSTR)*sldata->iCount)))
+ ldata = (ListData *)private_data((AutomationObject *)pDispatch);
+ if (!(ldata->pVars = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(VARIANT)*idx)))
ERR("Out of memory\n");
else
{
- sldata->iCount = idx;
- for (idx = 0; idx < sldata->iCount; idx++)
+ ldata->ulCount = idx;
+ for (idx = 0; idx < ldata->ulCount; idx++)
{
ret = MsiEnumRelatedProductsW(V_BSTR(&varg0), 0, idx, szProductBuf);
- sldata->pszStrings[idx] = SysAllocString(szProductBuf);
+ VariantInit(&ldata->pVars[idx]);
+ V_VT(&ldata->pVars[idx]) = VT_BSTR;
+ V_BSTR(&ldata->pVars[idx]) = SysAllocString(szProductBuf);
}
}
}
diff --git a/dlls/msi/msiserver.idl b/dlls/msi/msiserver.idl
index 33b6bf8..485334c 100644
--- a/dlls/msi/msiserver.idl
+++ b/dlls/msi/msiserver.idl
@@ -114,9 +114,9 @@ library WindowsInstaller
{
properties:
methods:
- [id(DISPID_STRINGLIST_ITEM), propget]
+ [id(DISPID_LIST_ITEM), propget]
BSTR Item(long Index);
- [id(DISPID_STRINGLIST_COUNT), propget]
+ [id(DISPID_LIST_COUNT), propget]
long Count();
}
diff --git a/dlls/msi/msiserver_dispids.h b/dlls/msi/msiserver_dispids.h
index 065b874..5ef21c8 100644
--- a/dlls/msi/msiserver_dispids.h
+++ b/dlls/msi/msiserver_dispids.h
@@ -29,8 +29,8 @@
#define DISPID_RECORD_STRINGDATA 1
#define DISPID_RECORD_INTEGERDATA 2
-#define DISPID_STRINGLIST_ITEM 0
-#define DISPID_STRINGLIST_COUNT 1
+#define DISPID_LIST_ITEM 0
+#define DISPID_LIST_COUNT 1
#define DISPID_VIEW_EXECUTE 1
#define DISPID_VIEW_FETCH 2
More information about the wine-cvs
mailing list