[OLEACC] Sync with Wine Staging 4.0. CORE-15682
[reactos.git] / dll / win32 / oleacc / main.c
index a373988..01ff575 100644 (file)
  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
  */
 
-#include "oleacc_private.h"
-
-#include <commctrl.h>
-#include <rpcproxy.h>
+#define COBJMACROS
 
-#include <wine/unicode.h>
+#include <stdarg.h>
+#include "windef.h"
+#include "winbase.h"
+#include "ole2.h"
+#include "commctrl.h"
+#include "rpcproxy.h"
 
+#include "initguid.h"
+#include "oleacc_private.h"
 #include "resource.h"
 
+#include "wine/unicode.h"
+#include "wine/debug.h"
+
+WINE_DEFAULT_DEBUG_CHANNEL(oleacc);
+
 static const WCHAR lresult_atom_prefix[] = {'w','i','n','e','_','o','l','e','a','c','c',':'};
 
 static const WCHAR menuW[] = {'#','3','2','7','6','8',0};
@@ -40,6 +49,11 @@ static const WCHAR richedit20wW[] = {'R','i','c','h','E','d','i','t','2','0','W'
 
 typedef HRESULT (WINAPI *accessible_create)(HWND, const IID*, void**);
 
+extern HRESULT WINAPI OLEACC_DllGetClassObject(REFCLSID, REFIID, void**) DECLSPEC_HIDDEN;
+extern BOOL WINAPI OLEACC_DllMain(HINSTANCE, DWORD, void*) DECLSPEC_HIDDEN;
+extern HRESULT WINAPI OLEACC_DllRegisterServer(void) DECLSPEC_HIDDEN;
+extern HRESULT WINAPI OLEACC_DllUnregisterServer(void) DECLSPEC_HIDDEN;
+
 static struct {
     const WCHAR *name;
     DWORD idx;
@@ -95,11 +109,11 @@ static accessible_create get_builtin_accessible_obj(HWND hwnd, LONG objid)
     WCHAR class_name[64];
     int i, idx;
 
-    if(!RealGetWindowClassW(hwnd, class_name, sizeof(class_name)/sizeof(WCHAR)))
+    if(!RealGetWindowClassW(hwnd, class_name, ARRAY_SIZE(class_name)))
         return NULL;
     TRACE("got window class: %s\n", debugstr_w(class_name));
 
-    for(i=0; i<sizeof(builtin_classes)/sizeof(builtin_classes[0]); i++) {
+    for(i=0; i<ARRAY_SIZE(builtin_classes); i++) {
         if(!strcmpiW(class_name, builtin_classes[i].name)) {
             accessible_create ret;
 
@@ -114,7 +128,7 @@ static accessible_create get_builtin_accessible_obj(HWND hwnd, LONG objid)
 
     idx = SendMessageW(hwnd, WM_GETOBJECT, 0, OBJID_QUERYCLASSNAMEIDX);
     if(idx) {
-        for(i=0; i<sizeof(builtin_classes)/sizeof(builtin_classes[0]); i++) {
+        for(i=0; i<ARRAY_SIZE(builtin_classes); i++) {
             if(idx == builtin_classes[i].idx) {
                 accessible_create ret;
 
@@ -158,7 +172,7 @@ HRESULT WINAPI CreateStdAccessibleObject( HWND hwnd, LONG idObject,
 
 HRESULT WINAPI ObjectFromLresult( LRESULT result, REFIID riid, WPARAM wParam, void **ppObject )
 {
-    WCHAR atom_str[sizeof(lresult_atom_prefix)/sizeof(WCHAR)+3*8+3];
+    WCHAR atom_str[ARRAY_SIZE(lresult_atom_prefix)+3*8+3];
     HANDLE server_proc, server_mapping, mapping;
     DWORD proc_id, size;
     IStream *stream;
@@ -179,11 +193,11 @@ HRESULT WINAPI ObjectFromLresult( LRESULT result, REFIID riid, WPARAM wParam, vo
     if(result != (ATOM)result)
         return E_FAIL;
 
-    if(!GlobalGetAtomNameW(result, atom_str, sizeof(atom_str)/sizeof(WCHAR)))
+    if(!GlobalGetAtomNameW(result, atom_str, ARRAY_SIZE(atom_str)))
         return E_FAIL;
     if(memcmp(atom_str, lresult_atom_prefix, sizeof(lresult_atom_prefix)))
         return E_FAIL;
-    p = atom_str + sizeof(lresult_atom_prefix)/sizeof(WCHAR);
+    p = atom_str + ARRAY_SIZE(lresult_atom_prefix);
     proc_id = strtoulW(p, &p, 16);
     if(*p != ':')
         return E_FAIL;
@@ -210,10 +224,12 @@ HRESULT WINAPI ObjectFromLresult( LRESULT result, REFIID riid, WPARAM wParam, vo
         return E_FAIL;
 
     data = GlobalAlloc(GMEM_FIXED, size);
+    if(!data) {
+        UnmapViewOfFile(view);
+        return E_OUTOFMEMORY;
+    }
     memcpy(data, view, size);
     UnmapViewOfFile(view);
-    if(!data)
-        return E_OUTOFMEMORY;
 
     hr = CreateStreamOnHGlobal(data, TRUE, &stream);
     if(FAILED(hr)) {
@@ -231,7 +247,7 @@ LRESULT WINAPI LresultFromObject( REFIID riid, WPARAM wParam, LPUNKNOWN pAcc )
     static const WCHAR atom_fmt[] = {'%','0','8','x',':','%','0','8','x',':','%','0','8','x',0};
     static const LARGE_INTEGER seek_zero = {{0}};
 
-    WCHAR atom_str[sizeof(lresult_atom_prefix)/sizeof(WCHAR)+3*8+3];
+    WCHAR atom_str[ARRAY_SIZE(lresult_atom_prefix)+3*8+3];
     IStream *stream;
     HANDLE mapping;
     STATSTG stat;
@@ -304,8 +320,8 @@ LRESULT WINAPI LresultFromObject( REFIID riid, WPARAM wParam, LPUNKNOWN pAcc )
     }
 
     memcpy(atom_str, lresult_atom_prefix, sizeof(lresult_atom_prefix));
-    sprintfW(atom_str+sizeof(lresult_atom_prefix)/sizeof(WCHAR),
-             atom_fmt, GetCurrentProcessId(), HandleToUlong(mapping), stat.cbSize.u.LowPart);
+    sprintfW(atom_str+ARRAY_SIZE(lresult_atom_prefix), atom_fmt, GetCurrentProcessId(),
+             HandleToUlong(mapping), stat.cbSize.u.LowPart);
     atom = GlobalAddAtomW(atom_str);
     if(!atom) {
         CloseHandle(mapping);
@@ -395,25 +411,45 @@ BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason,
             DisableThreadLibraryCalls(hinstDLL);
             break;
     }
-    return TRUE;
+
+    return OLEACC_DllMain(hinstDLL, fdwReason, lpvReserved);
 }
 
 HRESULT WINAPI DllRegisterServer(void)
 {
-    TRACE("()\n");
-    return __wine_register_resources(oleacc_handle);
+    return OLEACC_DllRegisterServer();
 }
 
 HRESULT WINAPI DllUnregisterServer(void)
 {
-    TRACE("()\n");
-    return __wine_unregister_resources(oleacc_handle);
+    return OLEACC_DllUnregisterServer();
+}
+
+HRESULT WINAPI DllGetClassObject(REFCLSID rclsid, REFIID iid, void **ppv)
+{
+    if(IsEqualGUID(&CLSID_CAccPropServices, rclsid)) {
+        TRACE("(CLSID_CAccPropServices %s %p)\n", debugstr_guid(iid), ppv);
+        return get_accpropservices_factory(iid, ppv);
+    }
+
+    if(IsEqualGUID(&CLSID_PSFactoryBuffer, rclsid)) {
+        TRACE("(CLSID_PSFactoryBuffer %s %p)\n", debugstr_guid(iid), ppv);
+        return OLEACC_DllGetClassObject(rclsid, iid, ppv);
+    }
+
+    FIXME("%s %s %p: stub\n", debugstr_guid(rclsid), debugstr_guid(iid), ppv);
+    return E_NOTIMPL;
 }
 
 void WINAPI GetOleaccVersionInfo(DWORD* pVersion, DWORD* pBuild)
 {
+#ifdef __REACTOS__
     *pVersion = MAKELONG(2,4); /* Windows XP version of oleacc: 4.2.5406.0 */
     *pBuild = MAKELONG(0,5406);
+#else
+    *pVersion = MAKELONG(0,7); /* Windows 7 version of oleacc: 7.0.0.0 */
+    *pBuild = MAKELONG(0,0);
+#endif
 }
 
 HANDLE WINAPI GetProcessHandleFromHwnd(HWND hwnd)
@@ -557,3 +593,50 @@ UINT WINAPI GetStateTextA(DWORD state_bit, CHAR *state_str, UINT state_str_len)
         return LoadStringA(oleacc_handle, state_id, tmp, sizeof(tmp));
     }
 }
+
+HRESULT WINAPI AccessibleChildren(IAccessible *container,
+        LONG start, LONG count, VARIANT *children, LONG *children_cnt)
+{
+    IEnumVARIANT *ev;
+    LONG i, child_no;
+    HRESULT hr;
+
+    TRACE("%p %d %d %p %p\n", container, start, count, children, children_cnt);
+
+    if(!container || !children || !children_cnt)
+        return E_INVALIDARG;
+
+    for(i=0; i<count; i++)
+        VariantInit(children+i);
+
+    hr = IAccessible_QueryInterface(container, &IID_IEnumVARIANT, (void**)&ev);
+    if(SUCCEEDED(hr)) {
+        hr = IEnumVARIANT_Reset(ev);
+        if(SUCCEEDED(hr))
+            hr = IEnumVARIANT_Skip(ev, start);
+        if(SUCCEEDED(hr))
+            hr = IEnumVARIANT_Next(ev, count, children, (ULONG*)children_cnt);
+        IEnumVARIANT_Release(ev);
+        return hr;
+    }
+
+    hr = IAccessible_get_accChildCount(container, &child_no);
+    if(FAILED(hr))
+        return hr;
+
+    for(i=0; i<count && start+i+1<=child_no; i++) {
+        IDispatch *disp;
+
+        V_VT(children+i) = VT_I4;
+        V_I4(children+i) = start+i+1;
+
+        hr = IAccessible_get_accChild(container, children[i], &disp);
+        if(SUCCEEDED(hr) && disp) {
+            V_VT(children+i) = VT_DISPATCH;
+            V_DISPATCH(children+i) = disp;
+        }
+    }
+
+    *children_cnt = i;
+    return i==count ? S_OK : S_FALSE;
+}