msi: Create the rest of objects with separate helpers.
This commit is contained in:
parent
2533c1287e
commit
5cbe5faf49
|
@ -44,7 +44,7 @@ WINE_DEFAULT_DEBUG_CHANNEL(msi);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* AutomationObject - "base" class for all automation objects. For each interface, we implement Invoke function
|
* AutomationObject - "base" class for all automation objects. For each interface, we implement Invoke function
|
||||||
* called from AutomationObject::Invoke, and pass this function to create_automation_object.
|
* called from AutomationObject::Invoke.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
typedef struct AutomationObject AutomationObject;
|
typedef struct AutomationObject AutomationObject;
|
||||||
|
@ -80,7 +80,10 @@ typedef struct {
|
||||||
VARIANT *data;
|
VARIANT *data;
|
||||||
} ListObject;
|
} ListObject;
|
||||||
|
|
||||||
|
static HRESULT create_database(MSIHANDLE, IDispatch**);
|
||||||
static HRESULT create_list_enumerator(ListObject*, void**);
|
static HRESULT create_list_enumerator(ListObject*, void**);
|
||||||
|
static HRESULT create_summaryinfo(MSIHANDLE, IDispatch**);
|
||||||
|
static HRESULT create_view(MSIHANDLE, IDispatch**);
|
||||||
|
|
||||||
/* ListEnumerator - IEnumVARIANT implementation for MSI automation lists */
|
/* ListEnumerator - IEnumVARIANT implementation for MSI automation lists */
|
||||||
typedef struct {
|
typedef struct {
|
||||||
|
@ -461,43 +464,6 @@ static const IProvideMultipleClassInfoVtbl ProvideMultipleClassInfoVtbl =
|
||||||
ProvideMultipleClassInfo_GetInfoOfIndex
|
ProvideMultipleClassInfo_GetInfoOfIndex
|
||||||
};
|
};
|
||||||
|
|
||||||
/* Create the automation object, placing the result in the pointer ppObj. The automation object is created
|
|
||||||
* with the appropriate clsid and invocation function. */
|
|
||||||
static HRESULT create_automation_object(MSIHANDLE msiHandle, IUnknown *pUnkOuter, void **ppObj, REFIID clsid,
|
|
||||||
autoInvokeFunc invokeFunc, autoFreeFunc freeFunc)
|
|
||||||
{
|
|
||||||
AutomationObject *object;
|
|
||||||
HRESULT hr;
|
|
||||||
|
|
||||||
TRACE("(%d,%p,%p,%s,%p,%p)\n", msiHandle, pUnkOuter, ppObj, debugstr_guid(clsid), invokeFunc, freeFunc);
|
|
||||||
|
|
||||||
if( pUnkOuter )
|
|
||||||
return CLASS_E_NOAGGREGATION;
|
|
||||||
|
|
||||||
object = msi_alloc_zero(sizeof(AutomationObject));
|
|
||||||
|
|
||||||
object->IDispatch_iface.lpVtbl = &AutomationObjectVtbl;
|
|
||||||
object->IProvideMultipleClassInfo_iface.lpVtbl = &ProvideMultipleClassInfoVtbl;
|
|
||||||
object->ref = 1;
|
|
||||||
|
|
||||||
object->msiHandle = msiHandle;
|
|
||||||
object->clsid = (LPCLSID)clsid;
|
|
||||||
object->funcInvoke = invokeFunc;
|
|
||||||
object->funcFree = freeFunc;
|
|
||||||
|
|
||||||
/* Load our TypeInfo so we don't have to process GetIDsOfNames */
|
|
||||||
object->iTypeInfo = NULL;
|
|
||||||
hr = load_type_info(&object->IDispatch_iface, &object->iTypeInfo, clsid, 0x0);
|
|
||||||
if (FAILED(hr)) {
|
|
||||||
msi_free( object );
|
|
||||||
return hr;
|
|
||||||
}
|
|
||||||
|
|
||||||
*ppObj = object;
|
|
||||||
|
|
||||||
return S_OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
static HRESULT init_automation_object(AutomationObject *This, MSIHANDLE msiHandle, REFIID clsid,
|
static HRESULT init_automation_object(AutomationObject *This, MSIHANDLE msiHandle, REFIID clsid,
|
||||||
autoInvokeFunc invokeFunc, autoFreeFunc freeFunc)
|
autoInvokeFunc invokeFunc, autoFreeFunc freeFunc)
|
||||||
{
|
{
|
||||||
|
@ -960,6 +926,26 @@ static HRESULT RecordImpl_Invoke(
|
||||||
return S_OK;
|
return S_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
HRESULT create_record(MSIHANDLE msiHandle, IDispatch **disp)
|
||||||
|
{
|
||||||
|
AutomationObject *record;
|
||||||
|
HRESULT hr;
|
||||||
|
|
||||||
|
record = msi_alloc(sizeof(*record));
|
||||||
|
if (!record) return E_OUTOFMEMORY;
|
||||||
|
|
||||||
|
hr = init_automation_object(record, msiHandle, &DIID_Record, RecordImpl_Invoke, NULL);
|
||||||
|
if (hr != S_OK)
|
||||||
|
{
|
||||||
|
msi_free(record);
|
||||||
|
return hr;
|
||||||
|
}
|
||||||
|
|
||||||
|
*disp = &record->IDispatch_iface;
|
||||||
|
|
||||||
|
return hr;
|
||||||
|
}
|
||||||
|
|
||||||
static HRESULT ListImpl_Invoke(
|
static HRESULT ListImpl_Invoke(
|
||||||
AutomationObject* This,
|
AutomationObject* This,
|
||||||
DISPID dispIdMember,
|
DISPID dispIdMember,
|
||||||
|
@ -1119,7 +1105,6 @@ static HRESULT ViewImpl_Invoke(
|
||||||
UINT* puArgErr)
|
UINT* puArgErr)
|
||||||
{
|
{
|
||||||
MSIHANDLE msiHandle;
|
MSIHANDLE msiHandle;
|
||||||
IDispatch *pDispatch = NULL;
|
|
||||||
UINT ret;
|
UINT ret;
|
||||||
VARIANTARG varg0, varg1;
|
VARIANTARG varg0, varg1;
|
||||||
HRESULT hr;
|
HRESULT hr;
|
||||||
|
@ -1147,8 +1132,10 @@ static HRESULT ViewImpl_Invoke(
|
||||||
V_VT(pVarResult) = VT_DISPATCH;
|
V_VT(pVarResult) = VT_DISPATCH;
|
||||||
if ((ret = MsiViewFetch(This->msiHandle, &msiHandle)) == ERROR_SUCCESS)
|
if ((ret = MsiViewFetch(This->msiHandle, &msiHandle)) == ERROR_SUCCESS)
|
||||||
{
|
{
|
||||||
if (SUCCEEDED(hr = create_automation_object(msiHandle, NULL, (LPVOID*)&pDispatch, &DIID_Record, RecordImpl_Invoke, NULL)))
|
IDispatch *dispatch = NULL;
|
||||||
V_DISPATCH(pVarResult) = pDispatch;
|
|
||||||
|
if (SUCCEEDED(hr = create_record(msiHandle, &dispatch)))
|
||||||
|
V_DISPATCH(pVarResult) = dispatch;
|
||||||
else
|
else
|
||||||
ERR("Failed to create Record object, hresult 0x%08x\n", hr);
|
ERR("Failed to create Record object, hresult 0x%08x\n", hr);
|
||||||
}
|
}
|
||||||
|
@ -1225,8 +1212,8 @@ static HRESULT DatabaseImpl_Invoke(
|
||||||
EXCEPINFO* pExcepInfo,
|
EXCEPINFO* pExcepInfo,
|
||||||
UINT* puArgErr)
|
UINT* puArgErr)
|
||||||
{
|
{
|
||||||
|
IDispatch *dispatch = NULL;
|
||||||
MSIHANDLE msiHandle;
|
MSIHANDLE msiHandle;
|
||||||
IDispatch *pDispatch = NULL;
|
|
||||||
UINT ret;
|
UINT ret;
|
||||||
VARIANTARG varg0, varg1;
|
VARIANTARG varg0, varg1;
|
||||||
HRESULT hr;
|
HRESULT hr;
|
||||||
|
@ -1246,9 +1233,9 @@ static HRESULT DatabaseImpl_Invoke(
|
||||||
V_VT(pVarResult) = VT_DISPATCH;
|
V_VT(pVarResult) = VT_DISPATCH;
|
||||||
if ((ret = MsiGetSummaryInformationW(This->msiHandle, NULL, V_I4(&varg0), &msiHandle)) == ERROR_SUCCESS)
|
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);
|
hr = create_summaryinfo(msiHandle, &dispatch);
|
||||||
if (SUCCEEDED(hr))
|
if (SUCCEEDED(hr))
|
||||||
V_DISPATCH(pVarResult) = pDispatch;
|
V_DISPATCH(pVarResult) = dispatch;
|
||||||
else
|
else
|
||||||
ERR("Failed to create SummaryInfo object: 0x%08x\n", hr);
|
ERR("Failed to create SummaryInfo object: 0x%08x\n", hr);
|
||||||
}
|
}
|
||||||
|
@ -1269,8 +1256,8 @@ static HRESULT DatabaseImpl_Invoke(
|
||||||
V_VT(pVarResult) = VT_DISPATCH;
|
V_VT(pVarResult) = VT_DISPATCH;
|
||||||
if ((ret = MsiDatabaseOpenViewW(This->msiHandle, V_BSTR(&varg0), &msiHandle)) == ERROR_SUCCESS)
|
if ((ret = MsiDatabaseOpenViewW(This->msiHandle, V_BSTR(&varg0), &msiHandle)) == ERROR_SUCCESS)
|
||||||
{
|
{
|
||||||
if (SUCCEEDED(hr = create_automation_object(msiHandle, NULL, (LPVOID*)&pDispatch, &DIID_View, ViewImpl_Invoke, NULL)))
|
if (SUCCEEDED(hr = create_view(msiHandle, &dispatch)))
|
||||||
V_DISPATCH(pVarResult) = pDispatch;
|
V_DISPATCH(pVarResult) = dispatch;
|
||||||
else
|
else
|
||||||
ERR("Failed to create View object, hresult 0x%08x\n", hr);
|
ERR("Failed to create View object, hresult 0x%08x\n", hr);
|
||||||
}
|
}
|
||||||
|
@ -1299,28 +1286,6 @@ static HRESULT DatabaseImpl_Invoke(
|
||||||
return S_OK;
|
return S_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
static HRESULT create_database(MSIHANDLE msiHandle, IDispatch **dispatch)
|
|
||||||
{
|
|
||||||
AutomationObject *database;
|
|
||||||
HRESULT hr;
|
|
||||||
|
|
||||||
TRACE("(%d %p)\n", msiHandle, dispatch);
|
|
||||||
|
|
||||||
database = msi_alloc(sizeof(AutomationObject));
|
|
||||||
if (!database) return E_OUTOFMEMORY;
|
|
||||||
|
|
||||||
hr = init_automation_object(database, msiHandle, &DIID_Database, DatabaseImpl_Invoke, NULL);
|
|
||||||
if (hr != S_OK)
|
|
||||||
{
|
|
||||||
msi_free(database);
|
|
||||||
return hr;
|
|
||||||
}
|
|
||||||
|
|
||||||
*dispatch = &database->IDispatch_iface;
|
|
||||||
|
|
||||||
return hr;
|
|
||||||
}
|
|
||||||
|
|
||||||
static HRESULT SessionImpl_Invoke(
|
static HRESULT SessionImpl_Invoke(
|
||||||
AutomationObject* This,
|
AutomationObject* This,
|
||||||
DISPID dispIdMember,
|
DISPID dispIdMember,
|
||||||
|
@ -1664,8 +1629,7 @@ static HRESULT InstallerImpl_CreateRecord(WORD wFlags,
|
||||||
if (!hrec)
|
if (!hrec)
|
||||||
return DISP_E_EXCEPTION;
|
return DISP_E_EXCEPTION;
|
||||||
|
|
||||||
hr = create_automation_object(hrec, NULL, (LPVOID*)&dispatch,
|
hr = create_record(hrec, &dispatch);
|
||||||
&DIID_Record, RecordImpl_Invoke, NULL);
|
|
||||||
if (SUCCEEDED(hr))
|
if (SUCCEEDED(hr))
|
||||||
V_DISPATCH(pVarResult) = dispatch;
|
V_DISPATCH(pVarResult) = dispatch;
|
||||||
|
|
||||||
|
@ -2432,3 +2396,67 @@ HRESULT create_session(MSIHANDLE msiHandle, IDispatch *installer, IDispatch **di
|
||||||
|
|
||||||
return hr;
|
return hr;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static HRESULT create_database(MSIHANDLE msiHandle, IDispatch **dispatch)
|
||||||
|
{
|
||||||
|
AutomationObject *database;
|
||||||
|
HRESULT hr;
|
||||||
|
|
||||||
|
TRACE("(%d %p)\n", msiHandle, dispatch);
|
||||||
|
|
||||||
|
database = msi_alloc(sizeof(AutomationObject));
|
||||||
|
if (!database) return E_OUTOFMEMORY;
|
||||||
|
|
||||||
|
hr = init_automation_object(database, msiHandle, &DIID_Database, DatabaseImpl_Invoke, NULL);
|
||||||
|
if (hr != S_OK)
|
||||||
|
{
|
||||||
|
msi_free(database);
|
||||||
|
return hr;
|
||||||
|
}
|
||||||
|
|
||||||
|
*dispatch = &database->IDispatch_iface;
|
||||||
|
|
||||||
|
return hr;
|
||||||
|
}
|
||||||
|
|
||||||
|
static HRESULT create_view(MSIHANDLE msiHandle, IDispatch **dispatch)
|
||||||
|
{
|
||||||
|
AutomationObject *view;
|
||||||
|
HRESULT hr;
|
||||||
|
|
||||||
|
TRACE("(%d %p)\n", msiHandle, dispatch);
|
||||||
|
|
||||||
|
view = msi_alloc(sizeof(AutomationObject));
|
||||||
|
if (!view) return E_OUTOFMEMORY;
|
||||||
|
|
||||||
|
hr = init_automation_object(view, msiHandle, &DIID_View, ViewImpl_Invoke, NULL);
|
||||||
|
if (hr != S_OK)
|
||||||
|
{
|
||||||
|
msi_free(view);
|
||||||
|
return hr;
|
||||||
|
}
|
||||||
|
|
||||||
|
*dispatch = &view->IDispatch_iface;
|
||||||
|
|
||||||
|
return hr;
|
||||||
|
}
|
||||||
|
|
||||||
|
static HRESULT create_summaryinfo(MSIHANDLE msiHandle, IDispatch **disp)
|
||||||
|
{
|
||||||
|
AutomationObject *info;
|
||||||
|
HRESULT hr;
|
||||||
|
|
||||||
|
info = msi_alloc(sizeof(*info));
|
||||||
|
if (!info) return E_OUTOFMEMORY;
|
||||||
|
|
||||||
|
hr = init_automation_object(info, msiHandle, &DIID_SummaryInfo, SummaryInfoImpl_Invoke, NULL);
|
||||||
|
if (hr != S_OK)
|
||||||
|
{
|
||||||
|
msi_free(info);
|
||||||
|
return hr;
|
||||||
|
}
|
||||||
|
|
||||||
|
*disp = &info->IDispatch_iface;
|
||||||
|
|
||||||
|
return hr;
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in New Issue