Module: wine Branch: master Commit: 9d234fcb9f6afcf3ef7ab9df668d55f945a58a0a URL: http://source.winehq.org/git/wine.git/?a=commit;h=9d234fcb9f6afcf3ef7ab9df66...
Author: Misha Koshelev mk144210@bcm.edu Date: Fri May 11 14:08:43 2007 -0500
msi: automation: Implement View::Modify.
---
dlls/msi/automation.c | 18 ++++++++++++++++++ dlls/msi/msiserver.idl | 20 ++++++++++++++++++++ dlls/msi/msiserver_dispids.h | 1 + dlls/msi/tests/automation.c | 29 ++++++++++++----------------- 4 files changed, 51 insertions(+), 17 deletions(-)
diff --git a/dlls/msi/automation.c b/dlls/msi/automation.c index e314be0..b9dcb5a 100644 --- a/dlls/msi/automation.c +++ b/dlls/msi/automation.c @@ -735,6 +735,24 @@ static HRESULT WINAPI ViewImpl_Invoke( else return DISP_E_MEMBERNOTFOUND; break;
+ case DISPID_VIEW_MODIFY: + if (wFlags & DISPATCH_METHOD) + { + hr = DispGetParam(pDispParams, 0, VT_I4, &varg0, puArgErr); + if (FAILED(hr)) return hr; + hr = DispGetParam(pDispParams, 1, VT_DISPATCH, &varg1, puArgErr); + if (FAILED(hr)) return hr; + if (!V_DISPATCH(&varg1)) return DISP_E_EXCEPTION; + if ((ret = MsiViewModify(This->msiHandle, V_I4(&varg0), ((AutomationObject *)V_DISPATCH(&varg1))->msiHandle)) != ERROR_SUCCESS) + { + VariantClear(&varg1); + ERR("MsiViewModify returned %d\n", ret); + return DISP_E_EXCEPTION; + } + } + else return DISP_E_MEMBERNOTFOUND; + break; + case DISPID_VIEW_CLOSE: if (wFlags & DISPATCH_METHOD) { diff --git a/dlls/msi/msiserver.idl b/dlls/msi/msiserver.idl index f47b691..560b572 100644 --- a/dlls/msi/msiserver.idl +++ b/dlls/msi/msiserver.idl @@ -124,6 +124,22 @@ library WindowsInstaller methods: }
+ typedef enum { + msiViewModifySeek = -1, + msiViewModifyRefresh = 0, + msiViewModifyInsert = 1, + msiViewModifyUpdate = 2, + msiViewModifyAssign = 3, + msiViewModifyReplace = 4, + msiViewModifyMerge = 5, + msiViewModifyDelete = 6, + msiViewModifyInsertTemporary = 7, + msiViewModifyValidate = 8, + msiViewModifyValidateNew = 9, + msiViewModifyValidateField = 10, + msiViewModifyValidateDelete = 11, + } _MsiViewModify; /* Added underscore to avoid conflict with function name */ + [ uuid(000C109C-0000-0000-C000-000000000046) ] dispinterface View { @@ -133,6 +149,10 @@ library WindowsInstaller void Execute([in, optional, defaultvalue(0)] Record *Params); [id(DISPID_VIEW_FETCH)] Record* Fetch(); + [id(DISPID_VIEW_MODIFY)] + void Modify( + [in] _MsiViewModify Mode, + Record *Record); [id(DISPID_VIEW_CLOSE)] void Close(); } diff --git a/dlls/msi/msiserver_dispids.h b/dlls/msi/msiserver_dispids.h index 88d6d53..ebcab7d 100644 --- a/dlls/msi/msiserver_dispids.h +++ b/dlls/msi/msiserver_dispids.h @@ -30,6 +30,7 @@
#define DISPID_VIEW_EXECUTE 1 #define DISPID_VIEW_FETCH 2 +#define DISPID_VIEW_MODIFY 3 #define DISPID_VIEW_CLOSE 4
#define DISPID_DATABASE_OPENVIEW 3 diff --git a/dlls/msi/tests/automation.c b/dlls/msi/tests/automation.c index b3c661e..4aaa671 100644 --- a/dlls/msi/tests/automation.c +++ b/dlls/msi/tests/automation.c @@ -1071,27 +1071,22 @@ static void test_Database(IDispatch *pDatabase) ok_exception(hr, szStringDataField);
/* View::Modify with incorrect parameters */ - todo_wine - { - hr = View_Modify(pView, -5, NULL); - ok(hr == DISP_E_EXCEPTION, "View_Modify failed, hresult 0x%08x\n", hr); - ok_exception(hr, szModifyModeRecord); + hr = View_Modify(pView, -5, NULL); + ok(hr == DISP_E_EXCEPTION, "View_Modify failed, hresult 0x%08x\n", hr); + ok_exception(hr, szModifyModeRecord);
- hr = View_Modify(pView, -5, pRecord); - ok(hr == DISP_E_EXCEPTION, "View_Modify failed, hresult 0x%08x\n", hr); - ok_exception(hr, szModifyModeRecord); + hr = View_Modify(pView, -5, pRecord); + ok(hr == DISP_E_EXCEPTION, "View_Modify failed, hresult 0x%08x\n", hr); + ok_exception(hr, szModifyModeRecord);
- hr = View_Modify(pView, MSIMODIFY_REFRESH, NULL); - ok(hr == DISP_E_EXCEPTION, "View_Modify failed, hresult 0x%08x\n", hr); - ok_exception(hr, szModifyModeRecord); - } + hr = View_Modify(pView, MSIMODIFY_REFRESH, NULL); + ok(hr == DISP_E_EXCEPTION, "View_Modify failed, hresult 0x%08x\n", hr); + ok_exception(hr, szModifyModeRecord);
/* View::Modify with MSIMODIFY_REFRESH should undo our changes */ - todo_wine - { - hr = View_Modify(pView, MSIMODIFY_REFRESH, pRecord); - ok(SUCCEEDED(hr), "View_Modify failed, hresult 0x%08x\n", hr); - } + hr = View_Modify(pView, MSIMODIFY_REFRESH, pRecord); + /* Wine's MsiViewModify currently does not support MSIMODIFY_REFRESH */ + todo_wine ok(SUCCEEDED(hr), "View_Modify failed, hresult 0x%08x\n", hr);
/* Record::StringDataGet, confirm that the record is back to its unmodified value */ memset(szString, 0, sizeof(szString));