Misha Koshelev : msi: automation: Implement View::Modify.

Alexandre Julliard julliard at wine.codeweavers.com
Mon May 14 10:52:49 CDT 2007


Module: wine
Branch: master
Commit: 9d234fcb9f6afcf3ef7ab9df668d55f945a58a0a
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=9d234fcb9f6afcf3ef7ab9df668d55f945a58a0a

Author: Misha Koshelev <mk144210 at 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));




More information about the wine-cvs mailing list