msi: Create the rest of objects with separate helpers.

This commit is contained in:
Nikolay Sivov 2012-01-17 02:12:30 +03:00 committed by Alexandre Julliard
parent 2533c1287e
commit 5cbe5faf49
1 changed files with 98 additions and 70 deletions

View File

@ -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;
}