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