Nikolay Sivov : ole2disp: Implement SafeArrayAllocData().
Alexandre Julliard
julliard at wine.codeweavers.com
Tue Jan 12 12:15:22 CST 2016
Module: wine
Branch: master
Commit: beceaa82ca28b99ef49a3b34f691ff234f001344
URL: http://source.winehq.org/git/wine.git/?a=commit;h=beceaa82ca28b99ef49a3b34f691ff234f001344
Author: Nikolay Sivov <nsivov at codeweavers.com>
Date: Tue Jan 12 11:49:30 2016 +0300
ole2disp: Implement SafeArrayAllocData().
Signed-off-by: Nikolay Sivov <nsivov at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>
---
dlls/ole2disp.dll16/ole2disp.c | 34 +++++++++++++++++++++++++++++++++
dlls/ole2disp.dll16/ole2disp.dll16.spec | 2 +-
2 files changed, 35 insertions(+), 1 deletion(-)
diff --git a/dlls/ole2disp.dll16/ole2disp.c b/dlls/ole2disp.dll16/ole2disp.c
index 539b515..5831d86 100644
--- a/dlls/ole2disp.dll16/ole2disp.c
+++ b/dlls/ole2disp.dll16/ole2disp.c
@@ -72,6 +72,23 @@ static void safearray_free(SEGPTR ptr)
WOWGlobalUnlockFree16(ptr);
}
+static ULONG safearray_getcellcount(const SAFEARRAY16 *sa)
+{
+ const SAFEARRAYBOUND16 *sab = sa->rgsabound;
+ USHORT count = sa->cDims;
+ ULONG cells = 1;
+
+ while (count--)
+ {
+ if (!sab->cElements)
+ return 0;
+ cells *= sab->cElements;
+ sab++;
+ }
+
+ return cells;
+}
+
/******************************************************************************
* SafeArrayAllocDescriptor [OLE2DISP.38]
*/
@@ -96,6 +113,23 @@ HRESULT WINAPI SafeArrayAllocDescriptor16(UINT16 dims, SEGPTR *ret)
}
/******************************************************************************
+ * SafeArrayAllocData [OLE2DISP.39]
+ */
+HRESULT WINAPI SafeArrayAllocData16(SAFEARRAY16 *sa)
+{
+ ULONG size;
+
+ TRACE("%p\n", sa);
+
+ if (!sa)
+ return E_INVALIDARG16;
+
+ size = safearray_getcellcount(sa);
+ sa->pvData = safearray_alloc(size * sa->cbElements);
+ return sa->pvData ? S_OK : E_OUTOFMEMORY16;
+}
+
+/******************************************************************************
* SafeArrayDestroyDescriptor [OLE2DISP.40]
*/
HRESULT WINAPI SafeArrayDestroyDescriptor16(SEGPTR s)
diff --git a/dlls/ole2disp.dll16/ole2disp.dll16.spec b/dlls/ole2disp.dll16/ole2disp.dll16.spec
index 997de31..919583d 100644
--- a/dlls/ole2disp.dll16/ole2disp.dll16.spec
+++ b/dlls/ole2disp.dll16/ole2disp.dll16.spec
@@ -36,7 +36,7 @@
36 stub REVOKEACTIVEOBJECT
37 stub GETACTIVEOBJECT
38 pascal SafeArrayAllocDescriptor(word ptr) SafeArrayAllocDescriptor16
-39 stub SAFEARRAYALLOCDATA
+39 pascal SafeArrayAllocData(ptr) SafeArrayAllocData16
40 pascal SafeArrayDestroyDescriptor(segptr) SafeArrayDestroyDescriptor16
41 stub SAFEARRAYDESTROYDATA
42 stub SAFEARRAYREDIM
More information about the wine-cvs
mailing list