[OLEACC] Sync with Wine Staging 1.7.47. CORE-9924

svn path=/trunk/; revision=68483
This commit is contained in:
Amine Khaldi 2015-07-20 21:52:13 +00:00
parent 5672b06b75
commit b17a4d83bd
13 changed files with 368 additions and 25 deletions

View File

@ -1,5 +1,10 @@
add_definitions(-D__WINESRC__)
add_definitions(
-D__WINESRC__
-DENTRY_PREFIX=OLEACC_
-DPROXY_DELEGATION
-DWINE_REGISTER_DLL)
include_directories(${REACTOS_SOURCE_DIR}/include/reactos/wine)
spec2def(oleacc.dll oleacc.spec ADD_IMPORTLIB)
@ -8,25 +13,31 @@ list(APPEND SOURCE
main.c
propservice.c
window.c
oleacc_private.h)
oleacc_private.h
${CMAKE_CURRENT_BINARY_DIR}/proxy.dlldata.c)
add_idl_headers(oleacc_idlheader oleacc_classes.idl)
add_typelib(oleacc_classes.idl)
add_rpcproxy_files(oleacc_classes.idl)
list(APPEND oleacc_rc_deps
${CMAKE_CURRENT_SOURCE_DIR}/oleacc_classes.rgs
${CMAKE_CURRENT_SOURCE_DIR}/oleacc_classes_r.rgs
${CMAKE_CURRENT_SOURCE_DIR}/oleacc_classes_t.rgs
${CMAKE_CURRENT_BINARY_DIR}/oleacc_classes.tlb)
set_source_files_properties(oleacc.rc PROPERTIES OBJECT_DEPENDS "${oleacc_rc_deps}")
add_library(oleacc SHARED
${SOURCE}
guid.c
oleacc.rc
${CMAKE_CURRENT_BINARY_DIR}/oleacc_classes_p.c
${CMAKE_CURRENT_BINARY_DIR}/oleacc_stubs.c
${CMAKE_CURRENT_BINARY_DIR}/oleacc.def)
add_dependencies(oleacc stdole2)
add_dependencies(oleacc oleacc_idlheader stdole2)
set_module_type(oleacc win32dll)
target_link_libraries(oleacc uuid wine)
add_importlibs(oleacc oleaut32 ole32 user32 msvcrt kernel32 ntdll)
target_link_libraries(oleacc uuid wine ${PSEH_LIB})
add_importlibs(oleacc oleaut32 ole32 user32 rpcrt4 msvcrt kernel32 ntdll)
add_pch(oleacc oleacc_private.h SOURCE)
add_cd_file(TARGET oleacc DESTINATION reactos/system32 FOR all)

View File

@ -21,10 +21,12 @@
typedef struct {
IAccessible IAccessible_iface;
IOleWindow IOleWindow_iface;
IEnumVARIANT IEnumVARIANT_iface;
LONG ref;
HWND hwnd;
HWND enum_pos;
} Client;
static inline Client* impl_from_Client(IAccessible *iface)
@ -44,6 +46,8 @@ static HRESULT WINAPI Client_QueryInterface(IAccessible *iface, REFIID riid, voi
*ppv = iface;
}else if(IsEqualIID(riid, &IID_IOleWindow)) {
*ppv = &This->IOleWindow_iface;
}else if(IsEqualIID(riid, &IID_IEnumVARIANT)) {
*ppv = &This->IEnumVARIANT_iface;
}else {
WARN("no interface: %s\n", debugstr_guid(riid));
*ppv = NULL;
@ -137,8 +141,11 @@ static HRESULT WINAPI Client_get_accChild(IAccessible *iface,
VARIANT varChildID, IDispatch **ppdispChild)
{
Client *This = impl_from_Client(iface);
FIXME("(%p)->(%s %p)\n", This, debugstr_variant(&varChildID), ppdispChild);
return E_NOTIMPL;
TRACE("(%p)->(%s %p)\n", This, debugstr_variant(&varChildID), ppdispChild);
*ppdispChild = NULL;
return E_INVALIDARG;
}
static HRESULT WINAPI Client_get_accName(IAccessible *iface, VARIANT varID, BSTR *pszName)
@ -486,6 +493,128 @@ static const IOleWindowVtbl ClientOleWindowVtbl = {
Client_OleWindow_ContextSensitiveHelp
};
static inline Client* impl_from_Client_EnumVARIANT(IEnumVARIANT *iface)
{
return CONTAINING_RECORD(iface, Client, IEnumVARIANT_iface);
}
static HRESULT WINAPI Client_EnumVARIANT_QueryInterface(IEnumVARIANT *iface, REFIID riid, void **ppv)
{
Client *This = impl_from_Client_EnumVARIANT(iface);
return IAccessible_QueryInterface(&This->IAccessible_iface, riid, ppv);
}
static ULONG WINAPI Client_EnumVARIANT_AddRef(IEnumVARIANT *iface)
{
Client *This = impl_from_Client_EnumVARIANT(iface);
return IAccessible_AddRef(&This->IAccessible_iface);
}
static ULONG WINAPI Client_EnumVARIANT_Release(IEnumVARIANT *iface)
{
Client *This = impl_from_Client_EnumVARIANT(iface);
return IAccessible_Release(&This->IAccessible_iface);
}
static HRESULT WINAPI Client_EnumVARIANT_Next(IEnumVARIANT *iface,
ULONG celt, VARIANT *rgVar, ULONG *pCeltFetched)
{
Client *This = impl_from_Client_EnumVARIANT(iface);
HWND cur = This->enum_pos, next;
ULONG fetched = 0;
HRESULT hr;
TRACE("(%p)->(%u %p %p)\n", This, celt, rgVar, pCeltFetched);
if(!celt) {
if(pCeltFetched)
*pCeltFetched = 0;
return S_OK;
}
if(!This->enum_pos)
next = GetWindow(This->hwnd, GW_CHILD);
else
next = GetWindow(This->enum_pos, GW_HWNDNEXT);
while(next) {
cur = next;
V_VT(rgVar+fetched) = VT_DISPATCH;
hr = AccessibleObjectFromWindow(cur, OBJID_WINDOW,
&IID_IDispatch, (void**)&V_DISPATCH(rgVar+fetched));
if(FAILED(hr)) {
V_VT(rgVar+fetched) = VT_EMPTY;
while(fetched > 0) {
VariantClear(rgVar+fetched-1);
fetched--;
}
if(pCeltFetched)
*pCeltFetched = 0;
return hr;
}
fetched++;
if(fetched == celt)
break;
next = GetWindow(cur, GW_HWNDNEXT);
}
This->enum_pos = cur;
if(pCeltFetched)
*pCeltFetched = fetched;
return celt == fetched ? S_OK : S_FALSE;
}
static HRESULT WINAPI Client_EnumVARIANT_Skip(IEnumVARIANT *iface, ULONG celt)
{
Client *This = impl_from_Client_EnumVARIANT(iface);
HWND next;
TRACE("(%p)->(%u)\n", This, celt);
while(celt) {
if(!This->enum_pos)
next = GetWindow(This->hwnd, GW_CHILD);
else
next = GetWindow(This->enum_pos, GW_HWNDNEXT);
if(!next)
return S_FALSE;
This->enum_pos = next;
celt--;
}
return S_OK;
}
static HRESULT WINAPI Client_EnumVARIANT_Reset(IEnumVARIANT *iface)
{
Client *This = impl_from_Client_EnumVARIANT(iface);
TRACE("(%p)\n", This);
This->enum_pos = 0;
return S_OK;
}
static HRESULT WINAPI Client_EnumVARIANT_Clone(IEnumVARIANT *iface, IEnumVARIANT **ppEnum)
{
Client *This = impl_from_Client_EnumVARIANT(iface);
FIXME("(%p)->(%p)\n", This, ppEnum);
return E_NOTIMPL;
}
static const IEnumVARIANTVtbl ClientEnumVARIANTVtbl = {
Client_EnumVARIANT_QueryInterface,
Client_EnumVARIANT_AddRef,
Client_EnumVARIANT_Release,
Client_EnumVARIANT_Next,
Client_EnumVARIANT_Skip,
Client_EnumVARIANT_Reset,
Client_EnumVARIANT_Clone
};
HRESULT create_client_object(HWND hwnd, const IID *iid, void **obj)
{
Client *client;
@ -500,8 +629,10 @@ HRESULT create_client_object(HWND hwnd, const IID *iid, void **obj)
client->IAccessible_iface.lpVtbl = &ClientVtbl;
client->IOleWindow_iface.lpVtbl = &ClientOleWindowVtbl;
client->IEnumVARIANT_iface.lpVtbl = &ClientEnumVARIANTVtbl;
client->ref = 1;
client->hwnd = hwnd;
client->enum_pos = 0;
hres = IAccessible_QueryInterface(&client->IAccessible_iface, iid, obj);
IAccessible_Release(&client->IAccessible_iface);

View File

@ -0,0 +1,15 @@
/* DO NOT USE THE PRECOMPILED HEADER FOR THIS FILE! */
#include <stdarg.h>
#define WIN32_NO_STATUS
#define _INC_WINDOWS
#define COM_NO_WINDOWS_H
#include <windef.h>
#include <winbase.h>
#include <objbase.h>
#include <initguid.h>
#include <oleacc_classes.h>
/* NO CODE HERE, THIS IS JUST REQUIRED FOR THE GUID DEFINITIONS */

View File

@ -40,6 +40,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;
@ -397,25 +402,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)
@ -559,3 +584,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;
}

View File

@ -24,7 +24,8 @@
#include "resource.h"
1 TYPELIB "oleacc_classes.tlb"
1 WINE_REGISTRY "oleacc_classes.rgs"
1 WINE_REGISTRY "oleacc_classes_r.rgs"
2 WINE_REGISTRY "oleacc_classes_t.rgs"
LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL

View File

@ -1,4 +1,4 @@
@ stub AccessibleChildren
@ stdcall AccessibleChildren(ptr long long ptr ptr)
@ stub AccessibleObjectFromEvent
@ stdcall AccessibleObjectFromPoint(int64 ptr ptr)
@ stdcall AccessibleObjectFromWindow(ptr long ptr ptr)

View File

@ -17,5 +17,13 @@
*/
#pragma makedep regtypelib
#pragma makedep proxy
#pragma makedep register
#include "oleacc.idl"
[
threading(both),
uuid(03022430-abc4-11d0-bde2-00aa001a1953) /* IAccessibleHandler */
]
coclass PSFactoryBuffer { interface IFactoryBuffer; }

View File

@ -0,0 +1,38 @@
HKCR
{
NoRemove Interface
{
'{618736E0-3C3D-11CF-810C-00AA00389B71}' = s 'IAccessible'
{
NumMethods = s 28
ProxyStubClsid32 = s '{03022430-ABC4-11D0-BDE2-00AA001A1953}'
}
'{03022430-ABC4-11D0-BDE2-00AA001A1953}' = s 'IAccessibleHandler'
{
NumMethods = s 4
ProxyStubClsid32 = s '{03022430-ABC4-11D0-BDE2-00AA001A1953}'
}
'{7852B78D-1CFD-41C1-A615-9C0C85960B5F}' = s 'IAccIdentity'
{
NumMethods = s 4
ProxyStubClsid32 = s '{03022430-ABC4-11D0-BDE2-00AA001A1953}'
}
'{76C0DBBB-15E0-4E7B-B61B-20EEEA2001E0}' = s 'IAccPropServer'
{
NumMethods = s 4
ProxyStubClsid32 = s '{03022430-ABC4-11D0-BDE2-00AA001A1953}'
}
'{6E26E776-04F0-495D-80E4-3330352E3169}' = s 'IAccPropServices'
{
NumMethods = s 18
ProxyStubClsid32 = s '{03022430-ABC4-11D0-BDE2-00AA001A1953}'
}
}
NoRemove CLSID
{
'{03022430-ABC4-11D0-BDE2-00AA001A1953}' = s 'PSFactoryBuffer'
{
InprocServer32 = s '%MODULE%' { val ThreadingModel = s 'Both' }
}
}
}

View File

@ -16,5 +16,11 @@ HKCR
}
NoRemove CLSID
{
'{B5F8350B-0548-48B1-A6EE-88BD00B4A5E7}' = s 'CAccPropServices'
{
InprocServer32 = s '%MODULE%' { val ThreadingModel = s 'Apartment' }
TypeLib = s '{1EA4DBF0-3C3B-11CF-810C-00AA00389B71}'
Version = s '1.1'
}
}
}

View File

@ -28,13 +28,14 @@
#include <windef.h>
#include <winbase.h>
#include <ole2.h>
#include <oleacc.h>
#include <oleacc_classes.h>
#include <wine/debug.h>
WINE_DEFAULT_DEBUG_CHANNEL(oleacc);
HRESULT create_client_object(HWND, const IID*, void**) DECLSPEC_HIDDEN;
HRESULT create_window_object(HWND, const IID*, void**) DECLSPEC_HIDDEN;
HRESULT get_accpropservices_factory(REFIID, void**) DECLSPEC_HIDDEN;
int convert_child_id(VARIANT *v) DECLSPEC_HIDDEN;

View File

@ -236,13 +236,7 @@ static const IClassFactoryVtbl CAccPropServicesFactoryVtbl = {
static IClassFactory CAccPropServicesFactory = { &CAccPropServicesFactoryVtbl };
HRESULT WINAPI DllGetClassObject(REFCLSID rclsid, REFIID iid, void **ppv)
HRESULT get_accpropservices_factory(REFIID riid, void **ppv)
{
if(IsEqualGUID(&CLSID_CAccPropServices, rclsid)) {
TRACE("(CLSID_CAccPropServices %s %p)\n", debugstr_guid(iid), ppv);
return IClassFactory_QueryInterface(&CAccPropServicesFactory, iid, ppv);
}
FIXME("%s %s %p: stub\n", debugstr_guid(rclsid), debugstr_guid(iid), ppv);
return E_NOTIMPL;
return IClassFactory_QueryInterface(&CAccPropServicesFactory, riid, ppv);
}

View File

@ -21,6 +21,7 @@
typedef struct {
IAccessible IAccessible_iface;
IOleWindow IOleWindow_iface;
IEnumVARIANT IEnumVARIANT_iface;
LONG ref;
} Window;
@ -42,6 +43,8 @@ static HRESULT WINAPI Window_QueryInterface(IAccessible *iface, REFIID riid, voi
*ppv = iface;
}else if(IsEqualIID(riid, &IID_IOleWindow)) {
*ppv = &This->IOleWindow_iface;
}else if(IsEqualIID(riid, &IID_IEnumVARIANT)) {
*ppv = &This->IEnumVARIANT_iface;
}else {
WARN("no interface: %s\n", debugstr_guid(riid));
*ppv = NULL;
@ -339,6 +342,68 @@ static const IOleWindowVtbl WindowOleWindowVtbl = {
Window_OleWindow_ContextSensitiveHelp
};
static inline Window* impl_from_Window_EnumVARIANT(IEnumVARIANT *iface)
{
return CONTAINING_RECORD(iface, Window, IEnumVARIANT_iface);
}
static HRESULT WINAPI Window_EnumVARIANT_QueryInterface(IEnumVARIANT *iface, REFIID riid, void **ppv)
{
Window *This = impl_from_Window_EnumVARIANT(iface);
return IAccessible_QueryInterface(&This->IAccessible_iface, riid, ppv);
}
static ULONG WINAPI Window_EnumVARIANT_AddRef(IEnumVARIANT *iface)
{
Window *This = impl_from_Window_EnumVARIANT(iface);
return IAccessible_AddRef(&This->IAccessible_iface);
}
static ULONG WINAPI Window_EnumVARIANT_Release(IEnumVARIANT *iface)
{
Window *This = impl_from_Window_EnumVARIANT(iface);
return IAccessible_Release(&This->IAccessible_iface);
}
static HRESULT WINAPI Window_EnumVARIANT_Next(IEnumVARIANT *iface,
ULONG celt, VARIANT *rgVar, ULONG *pCeltFetched)
{
Window *This = impl_from_Window_EnumVARIANT(iface);
FIXME("(%p)->(%u %p %p)\n", This, celt, rgVar, pCeltFetched);
return E_NOTIMPL;
}
static HRESULT WINAPI Window_EnumVARIANT_Skip(IEnumVARIANT *iface, ULONG celt)
{
Window *This = impl_from_Window_EnumVARIANT(iface);
FIXME("(%p)->(%u)\n", This, celt);
return E_NOTIMPL;
}
static HRESULT WINAPI Window_EnumVARIANT_Reset(IEnumVARIANT *iface)
{
Window *This = impl_from_Window_EnumVARIANT(iface);
FIXME("(%p)\n", This);
return E_NOTIMPL;
}
static HRESULT WINAPI Window_EnumVARIANT_Clone(IEnumVARIANT *iface, IEnumVARIANT **ppEnum)
{
Window *This = impl_from_Window_EnumVARIANT(iface);
FIXME("(%p)->(%p)\n", This, ppEnum);
return E_NOTIMPL;
}
static const IEnumVARIANTVtbl WindowEnumVARIANTVtbl = {
Window_EnumVARIANT_QueryInterface,
Window_EnumVARIANT_AddRef,
Window_EnumVARIANT_Release,
Window_EnumVARIANT_Next,
Window_EnumVARIANT_Skip,
Window_EnumVARIANT_Reset,
Window_EnumVARIANT_Clone
};
HRESULT create_window_object(HWND hwnd, const IID *iid, void **obj)
{
Window *window;
@ -353,6 +418,7 @@ HRESULT create_window_object(HWND hwnd, const IID *iid, void **obj)
window->IAccessible_iface.lpVtbl = &WindowVtbl;
window->IOleWindow_iface.lpVtbl = &WindowOleWindowVtbl;
window->IEnumVARIANT_iface.lpVtbl = &WindowEnumVARIANTVtbl;
window->ref = 1;
hres = IAccessible_QueryInterface(&window->IAccessible_iface, iid, obj);

View File

@ -146,7 +146,7 @@ reactos/dll/win32/objsel # Synced to WineStaging-1.7.37
reactos/dll/win32/odbc32 # Synced to WineStaging-1.7.37. Depends on port of Linux ODBC.
reactos/dll/win32/odbccp32 # Synced to WineStaging-1.7.47
reactos/dll/win32/ole32 # Synced to WineStaging-1.7.47
reactos/dll/win32/oleacc # Synced to WineStaging-1.7.37
reactos/dll/win32/oleacc # Synced to WineStaging-1.7.47
reactos/dll/win32/oleaut32 # Synced to WineStaging-1.7.37
reactos/dll/win32/olecli32 # Synced to WineStaging-1.7.37
reactos/dll/win32/oledlg # Synced to WineStaging-1.7.37