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