msi [2/2]: Implement SummaryInfo::Property get

James Hawkins truiken at gmail.com
Thu May 31 21:52:05 CDT 2007


Hi,

Changelog:
* Implement SummaryInfo::Property get.

 dlls/msi/automation.c        |  136 ++++++++++++++++++++++++++++++++++++++++++
 dlls/msi/msiserver.idl       |    4 +
 dlls/msi/msiserver_dispids.h |    3 +
 include/msidefs.h            |    2 -
 4 files changed, 144 insertions(+), 1 deletions(-)

-- 
James Hawkins
-------------- next part --------------
diff --git a/dlls/msi/automation.c b/dlls/msi/automation.c
index be47cb6..6b1f6c2 100644
--- a/dlls/msi/automation.c
+++ b/dlls/msi/automation.c
@@ -730,6 +730,114 @@ HRESULT WINAPI DispGetParam_CopyOnly(
                         &pdispparams->rgvarg[pos]);
 }
 
+static HRESULT WINAPI SummaryInfoImpl_Invoke(
+        AutomationObject* This,
+        DISPID dispIdMember,
+        REFIID riid,
+        LCID lcid,
+        WORD wFlags,
+        DISPPARAMS* pDispParams,
+        VARIANT* pVarResult,
+        EXCEPINFO* pExcepInfo,
+        UINT* puArgErr)
+{
+    UINT ret;
+    VARIANTARG varg0;
+    HRESULT hr;
+
+    VariantInit(&varg0);
+
+    switch (dispIdMember)
+    {
+        case DISPID_SUMMARYINFO_PROPERTY:
+            if (wFlags & DISPATCH_PROPERTYGET)
+            {
+                UINT type;
+                INT value;
+                INT pid;
+
+                static WCHAR szEmpty[] = {0};
+
+                VariantClear(pVarResult);
+
+                hr = DispGetParam(pDispParams, 0, VT_I4, &varg0, puArgErr);
+                if (FAILED(hr)) return hr;
+                pid = V_I4(&varg0);
+
+                if (pid == PID_CODEPAGE || (pid >= PID_PAGECOUNT && pid <= PID_CHARCOUNT) || PID_SECURITY)
+                {
+                    ret = MsiSummaryInfoGetPropertyW(This->msiHandle, pid, &type, &value,
+                                                     NULL, NULL, NULL);
+                    if (ret != ERROR_SUCCESS)
+                        return DISP_E_EXCEPTION;
+
+                    if (pid == PID_CODEPAGE)
+                    {
+                        V_VT(pVarResult) = VT_I2;
+                        V_I2(pVarResult) = value;
+                    }
+                    else
+                    {
+                        V_VT(pVarResult) = VT_I4;
+                        V_I4(pVarResult) = value;
+                    }
+                }
+                else if ((pid >= PID_TITLE && pid <= PID_REVNUMBER) || pid == PID_APPNAME)
+                {
+                    LPWSTR str;
+                    DWORD size = 0;
+
+                    ret = MsiSummaryInfoGetPropertyW(This->msiHandle, pid, &type, NULL,
+                                                     NULL, szEmpty, &size);
+                    if (ret != ERROR_MORE_DATA)
+                        return DISP_E_EXCEPTION;
+
+                    str = msi_alloc(++size * sizeof(WCHAR));
+                    if (!str)
+                        return DISP_E_EXCEPTION;
+
+                    ret = MsiSummaryInfoGetPropertyW(This->msiHandle, pid, &type, NULL,
+                                                     NULL, str, &size);
+                    if (ret != ERROR_SUCCESS)
+                    {
+                        msi_free(str);
+                        return DISP_E_EXCEPTION;
+                    }
+
+                    V_VT(pVarResult) = VT_BSTR;
+                    V_BSTR(pVarResult) = SysAllocString(str);
+                    msi_free(str);
+                }
+                else if (pid >= PID_EDITTIME && pid <= PID_LASTSAVE_DTM)
+                {
+                    FILETIME ft;
+                    SYSTEMTIME st;
+                    DATE date;
+
+                    ret = MsiSummaryInfoGetPropertyW(This->msiHandle, pid, &type, &value,
+                                                     &ft, NULL, NULL);
+                    if (ret != ERROR_SUCCESS)
+                        return DISP_E_EXCEPTION;
+
+                    FileTimeToSystemTime(&ft, &st);
+                    SystemTimeToVariantTime(&st, &date);
+
+                    V_VT(pVarResult) = VT_DATE;
+                    V_DATE(pVarResult) = date;
+                }
+            }
+            else return DISP_E_MEMBERNOTFOUND;
+            break;
+
+        default:
+            ERR("Member not found: %d\n", dispIdMember);
+            return DISP_E_MEMBERNOTFOUND;
+    }
+
+    VariantClear(&varg0);
+    return S_OK;
+}
+
 static HRESULT WINAPI RecordImpl_Invoke(
         AutomationObject* This,
         DISPID dispIdMember,
@@ -1010,6 +1118,34 @@ static HRESULT WINAPI DatabaseImpl_Invok
 
     switch (dispIdMember)
     {
+        case DISPID_DATABASE_SUMMARYINFORMATION:
+            if (wFlags & DISPATCH_METHOD)
+            {
+                hr = DispGetParam(pDispParams, 0, VT_I4, &varg0, puArgErr);
+                if (FAILED(hr))
+                    V_I4(&varg0) = 0;
+
+                V_VT(pVarResult) = VT_DISPATCH;
+                if ((ret = MsiGetSummaryInformationW(This->msiHandle, NULL, V_I4(&varg0), &msiHandle)) == ERROR_SUCCESS)
+                {
+                    hr = create_automation_object(msiHandle, NULL, (LPVOID *)&pDispatch, &DIID_SummaryInfo, SummaryInfoImpl_Invoke, NULL, 0);
+                    if (SUCCEEDED(hr))
+                    {
+                        IDispatch_AddRef(pDispatch);
+                        V_DISPATCH(pVarResult) = pDispatch;
+                    }
+                    else
+                        ERR("Failed to create SummaryInfo object: 0x%08x\n", hr);
+                }
+                else
+                {
+                    ERR("MsiGetSummaryInformation returned %d\n", ret);
+                    return DISP_E_EXCEPTION;
+                }
+            }
+            else return DISP_E_MEMBERNOTFOUND;
+            break;
+
         case DISPID_DATABASE_OPENVIEW:
             if (wFlags & DISPATCH_METHOD)
             {
diff --git a/dlls/msi/msiserver.idl b/dlls/msi/msiserver.idl
index d9869f0..f2b5695 100644
--- a/dlls/msi/msiserver.idl
+++ b/dlls/msi/msiserver.idl
@@ -146,6 +146,8 @@ library WindowsInstaller
     {
         properties:
         methods:
+        [id(DISPID_SUMMARYINFO_PROPERTY), propget]
+            VARIANT Property([in] long Pid);
     }
 
     typedef enum {
@@ -188,6 +190,8 @@ library WindowsInstaller
         methods:
         [id(DISPID_DATABASE_OPENVIEW)]
             View* OpenView([in] BSTR Sql);
+        [id(DISPID_DATABASE_SUMMARYINFORMATION)]
+            SummaryInfo *SummaryInformation([in, optional, defaultvalue(0)] long UpdateCount);
     }
 
     typedef enum {
diff --git a/dlls/msi/msiserver_dispids.h b/dlls/msi/msiserver_dispids.h
index c3dd07a..c01adbe 100644
--- a/dlls/msi/msiserver_dispids.h
+++ b/dlls/msi/msiserver_dispids.h
@@ -39,6 +39,7 @@ #define DISPID_VIEW_FETCH 2
 #define DISPID_VIEW_MODIFY 3
 #define DISPID_VIEW_CLOSE 4
 
+#define DISPID_DATABASE_SUMMARYINFORMATION 2
 #define DISPID_DATABASE_OPENVIEW 3
 
 #define DISPID_SESSION_INSTALLER 1
@@ -51,3 +52,5 @@ #define DISPID_SESSION_EVALUATECONDITION
 #define DISPID_SESSION_FEATURECURRENTSTATE 13
 #define DISPID_SESSION_FEATUREREQUESTSTATE 14
 #define DISPID_SESSION_SETINSTALLLEVEL 19
+
+#define DISPID_SUMMARYINFO_PROPERTY 1
diff --git a/include/msidefs.h b/include/msidefs.h
index cf022d6..9e1e75d 100644
--- a/include/msidefs.h
+++ b/include/msidefs.h
@@ -229,7 +229,7 @@ #define PID_COMMENTS 6
 #define PID_TEMPLATE 7
 #define PID_LASTAUTHOR 8
 #define PID_REVNUMBER 9
-#define PID_EDITTINE 10
+#define PID_EDITTIME 10
 #define PID_LASTPRINTED 11
 #define PID_CREATE_DTM 12
 #define PID_LASTSAVE_DTM 13
-- 
1.4.1


More information about the wine-patches mailing list