* 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};
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;
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;
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;
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;
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;
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)) {
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;
}
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);
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)
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;
+}