From df4522e909316bdef9dd666dd30b8cd767d2d2e8 Mon Sep 17 00:00:00 2001 From: Jan Zerebecki Date: Thu, 5 Feb 2009 23:29:34 +0100 Subject: [PATCH] push d1f5df181c120dbe494f7c89b454752c2e0dcc04 --- .gitignore | 1 + configure | 234 ++++++--- configure.ac | 40 +- dlls/advapi32/security.c | 183 ++++--- dlls/advapi32/service.c | 10 +- dlls/advapi32/tests/security.c | 22 + dlls/atl/registrar.c | 4 +- dlls/cabinet/cabinet.h | 1 - dlls/cabinet/fdi.c | 2 +- dlls/comctl32/propsheet.c | 15 +- dlls/comctl32/status.c | 8 +- dlls/comctl32/syslink.c | 16 +- dlls/comctl32/tests/status.c | 25 +- dlls/comctl32/tests/toolbar.c | 103 ++++ dlls/comctl32/toolbar.c | 177 +++---- dlls/crypt32/crypt32_Ko.rc | 1 + dlls/crypt32/tests/encode.c | 2 - dlls/cryptui/cryptui_Ko.rc | 84 +++ dlls/cryptui/main.c | 31 +- dlls/d3dx8/d3dx8.spec | 2 + dlls/d3dx8/math.c | 156 +++--- dlls/d3dx8/mesh.c | 42 ++ dlls/d3dx8/tests/math.c | 10 + dlls/d3dx8/tests/mesh.c | 61 +++ dlls/d3dx9_36/Makefile.in | 1 + dlls/d3dx9_36/d3dx9_36.spec | 2 +- dlls/d3dx9_36/math.c | 28 +- dlls/d3dx9_36/mesh.c | 72 +++ dlls/d3dx9_36/tests/math.c | 39 +- dlls/d3dxof/d3dxof.c | 52 +- dlls/d3dxof/d3dxof_private.h | 2 + dlls/dbghelp/dbghelp_private.h | 11 +- dlls/dbghelp/module.c | 2 +- dlls/dbghelp/source.c | 113 ----- dlls/dbghelp/storage.c | 83 +-- dlls/dbghelp/symbol.c | 194 ++++++- dlls/dinput/dinput_main.c | 4 +- dlls/dinput/effect_linuxinput.c | 26 +- dlls/dinput/joystick_linuxinput.c | 37 +- dlls/dinput/tests/joystick.c | 60 +++ dlls/dmime/segtriggertrack.c | 10 +- dlls/dmloader/container.c | 28 +- dlls/dmstyle/style.c | 8 +- dlls/dplayx/dplayx_global.c | 27 - dlls/dplayx/name_server.c | 7 - dlls/dplayx/name_server.h | 1 - dlls/dsound/capture.c | 8 - dlls/fusion/tests/fusion.c | 9 +- dlls/gdi32/font.c | 7 +- dlls/gdi32/freetype.c | 25 +- dlls/gdi32/gdi16.c | 15 +- dlls/gdi32/path.c | 5 +- dlls/gdi32/tests/font.c | 56 ++ dlls/gdiplus/font.c | 23 + dlls/gdiplus/gdiplus.spec | 14 +- dlls/gdiplus/graphics.c | 112 +++- dlls/gdiplus/image.c | 46 ++ dlls/gdiplus/region.c | 133 ++++- dlls/gdiplus/stringformat.c | 7 +- dlls/gdiplus/tests/Makefile.in | 2 +- dlls/gdiplus/tests/graphics.c | 14 +- dlls/gdiplus/tests/image.c | 111 +++- dlls/gdiplus/tests/region.c | 233 +++++++++ dlls/gdiplus/tests/stringformat.c | 62 +++ dlls/inetcomm/inetcomm_private.h | 2 - dlls/inetcomm/internettransport.c | 23 - dlls/iphlpapi/ipstats.c | 8 +- dlls/itss/chm_lib.c | 117 +---- dlls/itss/chm_lib.h | 5 - dlls/jscript/engine.c | 2 +- dlls/jscript/jscript.c | 34 +- dlls/jscript/lex.c | 4 +- dlls/jscript/regexp.c | 16 +- dlls/jscript/tests/jscript.c | 12 +- dlls/jscript/tests/run.c | 14 +- dlls/kernel32/process.c | 7 +- dlls/kernel32/tests/directory.c | 25 +- dlls/kernel32/tests/drive.c | 15 +- dlls/kernel32/tests/file.c | 18 +- dlls/kernel32/tests/path.c | 12 +- dlls/kernel32/tests/profile.c | 75 ++- dlls/localspl/localspl_main.c | 7 +- dlls/mapi32/tests/prop.c | 49 +- dlls/mapi32/tests/util.c | 9 +- dlls/mlang/mlang.c | 235 ++++++--- dlls/mlang/mlang.spec | 29 +- dlls/mlang/tests/mlang.c | 48 +- dlls/msacm32/driver.c | 5 +- dlls/msacm32/filter.c | 24 +- dlls/msacm32/format.c | 27 +- dlls/msacm32/internal.c | 11 + dlls/msacm32/stream.c | 9 +- dlls/msacm32/tests/msacm.c | 6 +- dlls/msadp32.acm/msadp32.c | 37 +- dlls/msctf/Makefile.in | 4 + dlls/msctf/categorymgr.c | 289 +++++++++++ dlls/msctf/context.c | 418 +++++++++++++++ dlls/msctf/documentmgr.c | 280 ++++++++++ dlls/msctf/inputprocessor.c | 360 +++++++++++++ dlls/msctf/msctf.c | 34 +- dlls/msctf/msctf.spec | 27 + dlls/msctf/msctf_internal.h | 6 + dlls/msctf/regsvr.c | 14 + dlls/msctf/threadmgr.c | 109 +++- dlls/mshtml/Makefile.in | 1 + dlls/mshtml/editor.c | 2 +- dlls/mshtml/htmlstyle.c | 7 + dlls/mshtml/htmlstyle.h | 5 + dlls/mshtml/htmlstyle3.c | 441 ++++++++++++++++ dlls/mshtml/htmlstylesheet.c | 8 +- dlls/mshtml/install.c | 29 +- dlls/mshtml/mshtml_private.h | 4 +- dlls/mshtml/mutation.c | 2 +- dlls/mshtml/navigate.c | 2 +- dlls/mshtml/script.c | 6 +- dlls/mshtml/tests/dom.c | 2 + dlls/mshtml/tests/script.c | 16 +- dlls/msi/msiserver.idl | 1 - dlls/msi/script.c | 4 +- dlls/ntdll/exception.c | 3 + dlls/ntoskrnl.exe/ntoskrnl.c | 5 +- dlls/ole32/comcat.c | 6 - dlls/ole32/moniker.c | 2 +- dlls/ole32/tests/usrmarshal.c | 192 ++++--- dlls/oleaut32/tests/usrmarshal.c | 122 +++-- dlls/oleaut32/tests/varformat.c | 5 + dlls/oleaut32/typelib.c | 30 +- dlls/propsys/propsys.spec | 2 +- dlls/propsys/propsys_main.c | 7 + dlls/riched20/context.c | 6 +- dlls/riched20/editor.c | 34 +- dlls/riched20/editstr.h | 6 +- dlls/riched20/tests/editor.c | 4 +- dlls/riched20/wrap.c | 2 +- dlls/riched32/tests/editor.c | 19 +- dlls/rpcrt4/ndr_ole.c | 2 +- dlls/rpcrt4/rpc_epmap.c | 2 +- dlls/rpcrt4/tests/cstub.c | 2 +- dlls/rpcrt4/tests/ndr_marshall.c | 2 +- dlls/rpcrt4/tests/server.c | 2 +- dlls/rsaenh/handle.c | 84 +-- dlls/rsaenh/handle.h | 2 - dlls/rsaenh/tests/rsaenh.c | 8 +- dlls/sane.ds/ds_ctrl.c | 19 +- dlls/secur32/tests/secur32.c | 12 +- dlls/setupapi/tests/parser.c | 15 +- dlls/shdocvw/oleobject.c | 5 + dlls/shdocvw/tests/webbrowser.c | 33 ++ dlls/shell32/shlexec.c | 2 + dlls/shell32/tests/shellpath.c | 220 ++++---- dlls/shell32/tests/shlfolder.c | 4 +- dlls/twain_32/tests/dsm.c | 214 ++++++++ dlls/urlmon/umon.c | 2 +- dlls/user32/tests/class.c | 14 +- dlls/user32/tests/dde.c | 2 +- dlls/user32/tests/listbox.c | 8 +- dlls/user32/tests/menu.c | 16 +- dlls/user32/tests/msg.c | 56 +- dlls/user32/tests/text.c | 17 + dlls/user32/tests/win.c | 30 +- dlls/user32/text.c | 4 +- dlls/uuid/uuid.c | 2 + dlls/wined3d/arb_program_shader.c | 20 +- dlls/wined3d/ati_fragment_shader.c | 6 +- dlls/wined3d/baseshader.c | 2 - dlls/wined3d/device.c | 4 +- dlls/wined3d/drawprim.c | 2 +- dlls/wined3d/glsl_shader.c | 22 +- dlls/wined3d/pixelshader.c | 2 - dlls/wined3d/query.c | 18 +- dlls/wined3d/resource.c | 1 - dlls/wined3d/surface.c | 2 +- dlls/wined3d/surface_base.c | 2 +- dlls/wined3d/utils.c | 6 +- dlls/wined3d/vertexshader.c | 2 - dlls/winedos/int10.c | 118 +---- dlls/winedos/ioports.c | 193 +++++-- dlls/winedos/vga.c | 268 +++++++++- dlls/winedos/vga.h | 29 +- dlls/wineoss.drv/audio.c | 2 +- dlls/wineps.drv/type1.c | 6 +- dlls/winex11.drv/opengl.c | 6 +- dlls/winex11.drv/xrandr.c | 8 - dlls/winex11.drv/xrandr.h | 1 - dlls/winex11.drv/xrender.c | 9 +- dlls/winex11.drv/xvidmode.c | 9 - dlls/winhttp/net.c | 2 +- dlls/winhttp/request.c | 4 +- dlls/wininet/http.c | 5 +- dlls/wininet/internet.h | 3 - dlls/wininet/tests/internet.c | 36 +- dlls/winmm/mci.c | 86 ++-- dlls/winmm/winemm.h | 7 +- dlls/winmm/winmm.c | 2 +- dlls/winspool.drv/info.c | 6 +- dlls/winspool.drv/tests/info.c | 3 + dlls/wintrust/asn.c | 2 +- dlls/wintrust/tests/crypt.c | 12 +- dlls/wnaspi32/aspi.c | 2 +- dlls/wnaspi32/winaspi16.c | 6 +- dlls/wnaspi32/winescsi.h | 3 - include/Makefile.in | 2 + include/activscp.idl | 46 +- include/config.h.in | 6 +- include/d3dx8math.h | 2 + include/d3dx8mesh.h | 1 + include/{d3dx8mesh.h => d3dx9mesh.h} | 14 +- include/dimm.idl | 2 - include/gdiplusflat.h | 7 + include/mlang.idl | 5 - include/mmddk.h | 26 +- include/msacm.h | 72 +-- include/msacmdrv.h | 48 +- include/msctf.idl | 342 ++++++++++++- include/mshtmdid.h | 14 + include/mshtml.idl | 214 ++++++++ include/rpcndr.h | 14 +- dlls/winex11.drv/xrandr.h => include/textstor.idl | 28 +- include/winnt.h | 25 +- include/wtypes.idl | 1 + programs/progman/dialog.c | 590 +++++++++++----------- programs/rpcss/irotp.c | 2 +- programs/services/rpc.c | 2 +- programs/services/services.c | 6 +- programs/taskmgr/applpage.c | 260 +++++----- programs/taskmgr/graphctl.c | 238 ++++----- programs/taskmgr/graphctl.h | 4 - programs/taskmgr/taskmgr.h | 2 - programs/taskmgr/trayicon.c | 2 +- programs/winedbg/symbol.c | 2 +- programs/winefile/winefile.c | 17 +- programs/winetest/main.c | 22 +- programs/winhlp32/winhelp.c | 2 +- tools/widl/header.c | 2 +- tools/winebuild/build.h | 4 + tools/winebuild/import.c | 14 +- tools/winebuild/main.c | 22 +- tools/winebuild/utils.c | 132 ++++- tools/winegcc/utils.c | 7 + tools/winegcc/utils.h | 1 + tools/winegcc/winegcc.c | 311 ++++++++---- tools/wrc/readres.c | 3 + 242 files changed, 7817 insertions(+), 2713 deletions(-) create mode 100644 dlls/d3dx9_36/mesh.c rewrite dlls/mlang/mlang.spec (67%) create mode 100644 dlls/msctf/categorymgr.c create mode 100644 dlls/msctf/context.c create mode 100644 dlls/msctf/documentmgr.c create mode 100644 dlls/msctf/inputprocessor.c create mode 100644 dlls/mshtml/htmlstyle3.c copy include/{d3dx8mesh.h => d3dx9mesh.h} (75%) copy dlls/winex11.drv/xrandr.h => include/textstor.idl (60%) diff --git a/.gitignore b/.gitignore index 4a5a3b02a54..9ec7ed518e2 100644 --- a/.gitignore +++ b/.gitignore @@ -194,6 +194,7 @@ include/shtypes.h include/stamp-h include/stdole2.tlb include/strmif.h +include/textstor.h include/tom.h include/unknwn.h include/urlhist.h diff --git a/configure b/configure index 8e267542496..e468cfbf16a 100755 --- a/configure +++ b/configure @@ -16575,70 +16575,7 @@ echo "${ECHO_T}$ac_cv_c_gcc_strength_bug" >&6; } EXTRACFLAGS="$EXTRACFLAGS -fno-strength-reduce" fi - - { echo "$as_me:$LINENO: checking whether the compiler supports -fshort-wchar" >&5 -echo $ECHO_N "checking whether the compiler supports -fshort-wchar... $ECHO_C" >&6; } -if test "${ac_cv_cflags__fshort_wchar+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - ac_wine_try_cflags_saved=$CFLAGS -CFLAGS="$CFLAGS -fshort-wchar" -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ - -int -main () -{ - - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (ac_try="$ac_link" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 - (eval "$ac_link") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest$ac_exeext && - $as_test_x conftest$ac_exeext; then - ac_cv_cflags__fshort_wchar=yes -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_cv_cflags__fshort_wchar=no -fi - -rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ - conftest$ac_exeext conftest.$ac_ext -CFLAGS=$ac_wine_try_cflags_saved -fi -{ echo "$as_me:$LINENO: result: $ac_cv_cflags__fshort_wchar" >&5 -echo "${ECHO_T}$ac_cv_cflags__fshort_wchar" >&6; } -if test $ac_cv_cflags__fshort_wchar = yes; then - -cat >>confdefs.h <<\_ACEOF -#define CC_FLAG_SHORT_WCHAR "-fshort-wchar" -_ACEOF - -fi - - { echo "$as_me:$LINENO: checking whether the compiler supports -fno-builtin" >&5 + { echo "$as_me:$LINENO: checking whether the compiler supports -fno-builtin" >&5 echo $ECHO_N "checking whether the compiler supports -fno-builtin... $ECHO_C" >&6; } if test "${ac_cv_cflags__fno_builtin+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 @@ -22310,6 +22247,175 @@ _ACEOF fi +{ echo "$as_me:$LINENO: checking for struct icmpstat.icps_outhist" >&5 +echo $ECHO_N "checking for struct icmpstat.icps_outhist... $ECHO_C" >&6; } +if test "${ac_cv_member_struct_icmpstat_icps_outhist+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#ifdef HAVE_SYS_TYPES_H +#include +#endif +#ifdef HAVE_ALIAS_H +#include +#endif +#ifdef HAVE_SYS_SOCKET_H +#include +#endif +#ifdef HAVE_SYS_SOCKETVAR_H +#include +#endif +#ifdef HAVE_SYS_TIMEOUT_H +#include +#endif +#ifdef HAVE_NETINET_IN_H +#include +#endif +#ifdef HAVE_NETINET_IN_SYSTM_H +#include +#endif +#ifdef HAVE_NETINET_IP_H +#include +#endif +#ifdef HAVE_NETINET_IP_VAR_H +#include +#endif +#ifdef HAVE_NETINET_IP_ICMP_H +#include +#endif +#ifdef HAVE_NETINET_ICMP_VAR +#include +#endif + +int +main () +{ +static struct icmpstat ac_aggr; +if (ac_aggr.icps_outhist) +return 0; + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_cv_member_struct_icmpstat_icps_outhist=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#ifdef HAVE_SYS_TYPES_H +#include +#endif +#ifdef HAVE_ALIAS_H +#include +#endif +#ifdef HAVE_SYS_SOCKET_H +#include +#endif +#ifdef HAVE_SYS_SOCKETVAR_H +#include +#endif +#ifdef HAVE_SYS_TIMEOUT_H +#include +#endif +#ifdef HAVE_NETINET_IN_H +#include +#endif +#ifdef HAVE_NETINET_IN_SYSTM_H +#include +#endif +#ifdef HAVE_NETINET_IP_H +#include +#endif +#ifdef HAVE_NETINET_IP_VAR_H +#include +#endif +#ifdef HAVE_NETINET_IP_ICMP_H +#include +#endif +#ifdef HAVE_NETINET_ICMP_VAR +#include +#endif + +int +main () +{ +static struct icmpstat ac_aggr; +if (sizeof ac_aggr.icps_outhist) +return 0; + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_cv_member_struct_icmpstat_icps_outhist=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_cv_member_struct_icmpstat_icps_outhist=no +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +{ echo "$as_me:$LINENO: result: $ac_cv_member_struct_icmpstat_icps_outhist" >&5 +echo "${ECHO_T}$ac_cv_member_struct_icmpstat_icps_outhist" >&6; } +if test $ac_cv_member_struct_icmpstat_icps_outhist = yes; then + +cat >>confdefs.h <<_ACEOF +#define HAVE_STRUCT_ICMPSTAT_ICPS_OUTHIST 1 +_ACEOF + + +fi + + { echo "$as_me:$LINENO: checking for timezone variable" >&5 echo $ECHO_N "checking for timezone variable... $ECHO_C" >&6; } if test "${ac_cv_have_timezone+set}" = set; then diff --git a/configure.ac b/configure.ac index 6390e40db46..f16a55bb88b 100644 --- a/configure.ac +++ b/configure.ac @@ -1336,10 +1336,6 @@ then fi dnl Check for some compiler flags - - WINE_TRY_CFLAGS([-fshort-wchar], - [AC_DEFINE(CC_FLAG_SHORT_WCHAR, "-fshort-wchar", - [Specifies the compiler flag that forces a short wchar_t])]) WINE_TRY_CFLAGS([-fno-builtin],[AC_SUBST(BUILTINFLAG,"-fno-builtin")]) WINE_TRY_CFLAGS([-fno-strict-aliasing]) WINE_TRY_CFLAGS([-Wdeclaration-after-statement]) @@ -1758,6 +1754,42 @@ AC_CHECK_MEMBERS([ns_msg._msg_ptr],,, # include #endif]) +dnl Check for struct icmpstat.icps_outhist +AC_CHECK_MEMBERS([struct icmpstat.icps_outhist],,, +[#ifdef HAVE_SYS_TYPES_H +#include +#endif +#ifdef HAVE_ALIAS_H +#include +#endif +#ifdef HAVE_SYS_SOCKET_H +#include +#endif +#ifdef HAVE_SYS_SOCKETVAR_H +#include +#endif +#ifdef HAVE_SYS_TIMEOUT_H +#include +#endif +#ifdef HAVE_NETINET_IN_H +#include +#endif +#ifdef HAVE_NETINET_IN_SYSTM_H +#include +#endif +#ifdef HAVE_NETINET_IP_H +#include +#endif +#ifdef HAVE_NETINET_IP_VAR_H +#include +#endif +#ifdef HAVE_NETINET_IP_ICMP_H +#include +#endif +#ifdef HAVE_NETINET_ICMP_VAR +#include +#endif]) + dnl Check for the external timezone variables timezone and daylight AC_CACHE_CHECK([for timezone variable], ac_cv_have_timezone, AC_LINK_IFELSE([AC_LANG_PROGRAM([[#include ]], [[timezone = 1]])],[ac_cv_have_timezone="yes"],[ac_cv_have_timezone="no"])) diff --git a/dlls/advapi32/security.c b/dlls/advapi32/security.c index 43d6d07d328..d62bb23e4c2 100644 --- a/dlls/advapi32/security.c +++ b/dlls/advapi32/security.c @@ -130,6 +130,10 @@ static const WELLKNOWNSID WellKnownSids[] = { {0,0}, WinBuiltinAuthorizationAccessSid, { SID_REVISION, 2, { SECURITY_NT_AUTHORITY }, { SECURITY_BUILTIN_DOMAIN_RID, DOMAIN_ALIAS_RID_AUTHORIZATIONACCESS } } }, { {0,0}, WinBuiltinTerminalServerLicenseServersSid, { SID_REVISION, 2, { SECURITY_NT_AUTHORITY }, { SECURITY_BUILTIN_DOMAIN_RID, DOMAIN_ALIAS_RID_TS_LICENSE_SERVERS } } }, { {0,0}, WinBuiltinDCOMUsersSid, { SID_REVISION, 2, { SECURITY_NT_AUTHORITY }, { SECURITY_BUILTIN_DOMAIN_RID, DOMAIN_ALIAS_RID_DCOM_USERS } } }, + { {'L','W'}, WinLowLabelSid, { SID_REVISION, 1, { SECURITY_MANDATORY_LABEL_AUTHORITY}, { SECURITY_MANDATORY_LOW_RID} } }, + { {'M','E'}, WinMediumLabelSid, { SID_REVISION, 1, { SECURITY_MANDATORY_LABEL_AUTHORITY}, { SECURITY_MANDATORY_MEDIUM_RID } } }, + { {'H','I'}, WinHighLabelSid, { SID_REVISION, 1, { SECURITY_MANDATORY_LABEL_AUTHORITY}, { SECURITY_MANDATORY_HIGH_RID } } }, + { {'S','I'}, WinSystemLabelSid, { SID_REVISION, 1, { SECURITY_MANDATORY_LABEL_AUTHORITY}, { SECURITY_MANDATORY_SYSTEM_RID } } }, }; /* these SIDs must be constructed as relative to some domain - only the RID is well-known */ @@ -2527,17 +2531,119 @@ LookupAccountNameA( } /****************************************************************************** + * lookup_user_account_name + */ +static BOOL lookup_user_account_name(PSID Sid, PDWORD cbSid, LPWSTR ReferencedDomainName, + LPDWORD cchReferencedDomainName, PSID_NAME_USE peUse ) +{ + /* Default implementation: Always return a default SID */ + SID_IDENTIFIER_AUTHORITY identifierAuthority = {SECURITY_NT_AUTHORITY}; + BOOL ret; + PSID pSid; + static const WCHAR dm[] = {'D','O','M','A','I','N',0}; + DWORD nameLen; + LPCWSTR domainName; + + ret = AllocateAndInitializeSid(&identifierAuthority, + 2, + SECURITY_BUILTIN_DOMAIN_RID, + DOMAIN_ALIAS_RID_ADMINS, + 0, 0, 0, 0, 0, 0, + &pSid); + + if (!ret) + return FALSE; + + if (!RtlValidSid(pSid)) + { + FreeSid(pSid); + return FALSE; + } + + if (Sid != NULL && (*cbSid >= GetLengthSid(pSid))) + CopySid(*cbSid, Sid, pSid); + if (*cbSid < GetLengthSid(pSid)) + { + SetLastError(ERROR_INSUFFICIENT_BUFFER); + ret = FALSE; + } + *cbSid = GetLengthSid(pSid); + + domainName = dm; + nameLen = strlenW(domainName); + + if (*cchReferencedDomainName <= nameLen || !ret) + { + SetLastError(ERROR_INSUFFICIENT_BUFFER); + nameLen += 1; + ret = FALSE; + } + else if (ReferencedDomainName) + strcpyW(ReferencedDomainName, domainName); + + *cchReferencedDomainName = nameLen; + + if (ret) + *peUse = SidTypeUser; + + FreeSid(pSid); + + return ret; +} + +/****************************************************************************** + * lookup_computer_account_name + */ +static BOOL lookup_computer_account_name(PSID Sid, PDWORD cbSid, LPWSTR ReferencedDomainName, + LPDWORD cchReferencedDomainName, PSID_NAME_USE peUse ) +{ + MAX_SID local; + BOOL ret; + static const WCHAR dm[] = {'D','O','M','A','I','N',0}; + DWORD nameLen; + LPCWSTR domainName; + + if ((ret = ADVAPI_GetComputerSid(&local))) + { + if (Sid != NULL && (*cbSid >= GetLengthSid(&local))) + CopySid(*cbSid, Sid, &local); + if (*cbSid < GetLengthSid(&local)) + { + SetLastError(ERROR_INSUFFICIENT_BUFFER); + ret = FALSE; + } + *cbSid = GetLengthSid(&local); + } + + domainName = dm; + nameLen = strlenW(domainName); + + if (*cchReferencedDomainName <= nameLen || !ret) + { + SetLastError(ERROR_INSUFFICIENT_BUFFER); + nameLen += 1; + ret = FALSE; + } + else if (ReferencedDomainName) + strcpyW(ReferencedDomainName, domainName); + + *cchReferencedDomainName = nameLen; + + if (ret) + *peUse = SidTypeDomain; + + return ret; +} + +/****************************************************************************** * LookupAccountNameW [ADVAPI32.@] */ BOOL WINAPI LookupAccountNameW( LPCWSTR lpSystemName, LPCWSTR lpAccountName, PSID Sid, LPDWORD cbSid, LPWSTR ReferencedDomainName, LPDWORD cchReferencedDomainName, PSID_NAME_USE peUse ) { - /* Default implementation: Always return a default SID */ - SID_IDENTIFIER_AUTHORITY identifierAuthority = {SECURITY_NT_AUTHORITY}; BOOL ret; PSID pSid; - static const WCHAR dm[] = {'D','O','M','A','I','N',0}; unsigned int i; DWORD nameLen; LPWSTR userName = NULL; @@ -2617,69 +2723,24 @@ BOOL WINAPI LookupAccountNameW( LPCWSTR lpSystemName, LPCWSTR lpAccountName, PSI userName = HeapAlloc(GetProcessHeap(), 0, nameLen); - ret = GetUserNameW(userName, &nameLen); - - if (ret && strcmpW(lpAccountName, userName) != 0) + if (GetUserNameW(userName, &nameLen) && !strcmpW(lpAccountName, userName)) + ret = lookup_user_account_name(Sid, cbSid, ReferencedDomainName, + cchReferencedDomainName, peUse); + else { - SetLastError(ERROR_NONE_MAPPED); - ret = FALSE; + nameLen = UNLEN + 1; + if (GetComputerNameW(userName, &nameLen) && !strcmpW(lpAccountName, userName)) + ret = lookup_computer_account_name(Sid, cbSid, ReferencedDomainName, + cchReferencedDomainName, peUse); + else + { + SetLastError(ERROR_NONE_MAPPED); + ret = FALSE; + } } HeapFree(GetProcessHeap(), 0, userName); - if (!ret) - { - return ret; - } - - ret = AllocateAndInitializeSid(&identifierAuthority, - 2, - SECURITY_BUILTIN_DOMAIN_RID, - DOMAIN_ALIAS_RID_ADMINS, - 0, 0, 0, 0, 0, 0, - &pSid); - - if (!ret) - return FALSE; - - if (!RtlValidSid(pSid)) - { - FreeSid(pSid); - return FALSE; - } - - if (Sid != NULL && (*cbSid >= GetLengthSid(pSid))) - CopySid(*cbSid, Sid, pSid); - if (*cbSid < GetLengthSid(pSid)) - { - SetLastError(ERROR_INSUFFICIENT_BUFFER); - ret = FALSE; - } - *cbSid = GetLengthSid(pSid); - - domainName = dm; - nameLen = strlenW(domainName); - - if (*cchReferencedDomainName <= nameLen || !ret) - { - SetLastError(ERROR_INSUFFICIENT_BUFFER); - nameLen += 1; - ret = FALSE; - } - else if (ReferencedDomainName) - { - strcpyW(ReferencedDomainName, domainName); - } - - *cchReferencedDomainName = nameLen; - - if (ret) - { - *peUse = SidTypeUser; - } - - FreeSid(pSid); - return ret; } diff --git a/dlls/advapi32/service.c b/dlls/advapi32/service.c index a107397e658..e0efa2b3aab 100644 --- a/dlls/advapi32/service.c +++ b/dlls/advapi32/service.c @@ -49,7 +49,7 @@ static const WCHAR szServiceManagerKey[] = { 'S','y','s','t','e','m','\\', 'C','u','r','r','e','n','t','C','o','n','t','r','o','l','S','e','t','\\', 'S','e','r','v','i','c','e','s',0 }; -void __RPC_FAR * __RPC_USER MIDL_user_allocate(size_t len) +void __RPC_FAR * __RPC_USER MIDL_user_allocate(SIZE_T len) { return HeapAlloc(GetProcessHeap(), 0, len); } @@ -1365,9 +1365,10 @@ BOOL WINAPI QueryServiceConfig2A(SC_HANDLE hService, DWORD dwLevel, LPBYTE buffe switch(dwLevel) { case SERVICE_CONFIG_DESCRIPTION: - { LPSERVICE_DESCRIPTIONA configA = (LPSERVICE_DESCRIPTIONA) buffer; + if (buffer && bufferW) { + LPSERVICE_DESCRIPTIONA configA = (LPSERVICE_DESCRIPTIONA) buffer; LPSERVICE_DESCRIPTIONW configW = (LPSERVICE_DESCRIPTIONW) bufferW; - if (configW->lpDescription) { + if (configW->lpDescription && (size > sizeof(SERVICE_DESCRIPTIONA))) { DWORD sz; configA->lpDescription = (LPSTR)(configA + 1); sz = WideCharToMultiByte( CP_ACP, 0, configW->lpDescription, -1, @@ -1380,10 +1381,11 @@ BOOL WINAPI QueryServiceConfig2A(SC_HANDLE hService, DWORD dwLevel, LPBYTE buffe } else configA->lpDescription = NULL; } - break; + break; default: FIXME("conversation W->A not implemented for level %d\n", dwLevel); ret = FALSE; + break; } cleanup: diff --git a/dlls/advapi32/tests/security.c b/dlls/advapi32/tests/security.c index 260ebf58a67..a681cb1e26e 100644 --- a/dlls/advapi32/tests/security.c +++ b/dlls/advapi32/tests/security.c @@ -1705,6 +1705,7 @@ static void test_LookupAccountName(void) DWORD sid_size, domain_size, user_size; DWORD sid_save, domain_save; CHAR user_name[UNLEN + 1]; + CHAR computer_name[UNLEN + 1]; SID_NAME_USE sid_use; LPSTR domain, account, sid_dom; PSID psid; @@ -1875,6 +1876,27 @@ static void test_LookupAccountName(void) "Expected RPC_S_SERVER_UNAVAILABLE or RPC_S_INVALID_NET_ADDR, got %d\n", GetLastError()); ok(sid_size == 0, "Expected 0, got %d\n", sid_size); ok(domain_size == 0, "Expected 0, got %d\n", domain_size); + + /* try with the computer name as the account name */ + domain_size = sizeof(computer_name); + GetComputerNameA(computer_name, &domain_size); + sid_size = 0; + domain_size = 0; + ret = LookupAccountNameA(NULL, computer_name, NULL, &sid_size, NULL, &domain_size, &sid_use); + ok(!ret && (GetLastError() == ERROR_INSUFFICIENT_BUFFER || + broken(GetLastError() == ERROR_TRUSTED_DOMAIN_FAILURE) || + broken(GetLastError() == ERROR_TRUSTED_RELATIONSHIP_FAILURE)), + "LookupAccountNameA failed: %d\n", GetLastError()); + if (GetLastError() == ERROR_INSUFFICIENT_BUFFER) + { + psid = HeapAlloc(GetProcessHeap(), 0, sid_size); + domain = HeapAlloc(GetProcessHeap(), 0, domain_size); + ret = LookupAccountNameA(NULL, computer_name, psid, &sid_size, domain, &domain_size, &sid_use); + ok(ret, "LookupAccountNameA failed: %d\n", GetLastError()); + ok(sid_use == SidTypeDomain, "expected SidTypeDomain, got %d\n", sid_use); + HeapFree(GetProcessHeap(), 0, domain); + HeapFree(GetProcessHeap(), 0, psid); + } } static void test_security_descriptor(void) diff --git a/dlls/atl/registrar.c b/dlls/atl/registrar.c index d3ca9b0709f..b2efda989ad 100644 --- a/dlls/atl/registrar.c +++ b/dlls/atl/registrar.c @@ -444,7 +444,7 @@ static HRESULT resource_register(Registrar *This, LPCOLESTR resFileName, if(regstra) { len = MultiByteToWideChar(CP_ACP, 0, regstra, reslen, NULL, 0)+1; regstrw = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, len*sizeof(WCHAR)); - MultiByteToWideChar(CP_ACP, 0, regstra, reslen, regstrw, -1); + MultiByteToWideChar(CP_ACP, 0, regstra, reslen, regstrw, len); regstrw[len-1] = '\0'; hres = string_register(This, regstrw, do_register); @@ -484,7 +484,7 @@ static HRESULT file_register(Registrar *This, LPCOLESTR fileName, BOOL do_regist if(lres == ERROR_SUCCESS) { len = MultiByteToWideChar(CP_ACP, 0, regstra, filelen, NULL, 0)+1; regstrw = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, len*sizeof(WCHAR)); - MultiByteToWideChar(CP_ACP, 0, regstra, filelen, regstrw, -1); + MultiByteToWideChar(CP_ACP, 0, regstra, filelen, regstrw, len); regstrw[len-1] = '\0'; hres = string_register(This, regstrw, do_register); diff --git a/dlls/cabinet/cabinet.h b/dlls/cabinet/cabinet.h index 8b38f9b587c..3423a73de7f 100644 --- a/dlls/cabinet/cabinet.h +++ b/dlls/cabinet/cabinet.h @@ -654,7 +654,6 @@ typedef struct { } SESSION; /* from fdi.c */ -void QTMupdatemodel(struct QTMmodel *model, int sym); int make_decode_table(cab_ULONG nsyms, cab_ULONG nbits, const cab_UBYTE *length, cab_UWORD *table); #endif /* __WINE_CABINET_H */ diff --git a/dlls/cabinet/fdi.c b/dlls/cabinet/fdi.c index e36066df5bc..bdf64b6df5b 100644 --- a/dlls/cabinet/fdi.c +++ b/dlls/cabinet/fdi.c @@ -151,7 +151,7 @@ typedef struct fdi_cds_fwd { /**************************************************************** * QTMupdatemodel (internal) */ -void QTMupdatemodel(struct QTMmodel *model, int sym) { +static void QTMupdatemodel(struct QTMmodel *model, int sym) { struct QTMmodelsym temp; int i, j; diff --git a/dlls/comctl32/propsheet.c b/dlls/comctl32/propsheet.c index 7c2f26a8ec5..785643db49a 100644 --- a/dlls/comctl32/propsheet.c +++ b/dlls/comctl32/propsheet.c @@ -740,7 +740,7 @@ static BOOL PROPSHEET_AdjustSize(HWND hwndDlg, PropSheetInfo* psInfo) HWND hwndTabCtrl = GetDlgItem(hwndDlg, IDC_TABCONTROL); HWND hwndButton = GetDlgItem(hwndDlg, IDOK); RECT rc,tabRect; - int tabOffsetX, tabOffsetY, buttonHeight; + int buttonHeight; PADDING_INFO padding = PROPSHEET_GetPaddingInfo(hwndDlg); RECT units; @@ -784,9 +784,6 @@ static BOOL PROPSHEET_AdjustSize(HWND hwndDlg, PropSheetInfo* psInfo) SendMessageW(hwndTabCtrl, TCM_ADJUSTRECT, TRUE, (LPARAM)&rc); - tabOffsetX = -(rc.left); - tabOffsetY = -(rc.top); - rc.right -= rc.left; rc.bottom -= rc.top; TRACE("setting tab %p, rc (0,0)-(%d,%d)\n", @@ -798,8 +795,14 @@ static BOOL PROPSHEET_AdjustSize(HWND hwndDlg, PropSheetInfo* psInfo) TRACE("tab client rc %s\n", wine_dbgstr_rect(&rc)); - rc.right += ((padding.x * 2) + tabOffsetX); - rc.bottom += (buttonHeight + (3 * padding.y) + tabOffsetY); + rc.right += (padding.x * 2); + rc.bottom += buttonHeight + (3 * padding.y); + + if (!psInfo->isModeless) + AdjustWindowRect(&rc, GetWindowLongW(hwndDlg, GWL_STYLE), FALSE); + + rc.right -= rc.left; + rc.bottom -= rc.top; /* * Resize the property sheet. diff --git a/dlls/comctl32/status.c b/dlls/comctl32/status.c index d107329922f..35d3bd4ce93 100644 --- a/dlls/comctl32/status.c +++ b/dlls/comctl32/status.c @@ -95,7 +95,6 @@ typedef struct #define HORZ_BORDER 0 #define VERT_BORDER 2 #define HORZ_GAP 2 -#define MIN_PANE_HEIGHT 18 static const WCHAR themeClass[] = { 'S','t','a','t','u','s',0 }; @@ -649,7 +648,9 @@ STATUSBAR_SetIcon (STATUS_INFO *infoPtr, INT nPart, HICON hIcon) static BOOL STATUSBAR_SetMinHeight (STATUS_INFO *infoPtr, INT height) { - infoPtr->minHeight = max(height, MIN_PANE_HEIGHT); + DWORD ysize = GetSystemMetrics(SM_CYSIZE); + if (ysize & 1) ysize--; + infoPtr->minHeight = max(height, ysize); infoPtr->height = STATUSBAR_ComputeHeight(infoPtr); /* like native, don't resize the control */ return TRUE; @@ -921,7 +922,8 @@ STATUSBAR_WMCreate (HWND hwnd, const CREATESTRUCTA *lpCreate) infoPtr->horizontalBorder = HORZ_BORDER; infoPtr->verticalBorder = VERT_BORDER; infoPtr->horizontalGap = HORZ_GAP; - infoPtr->minHeight = MIN_PANE_HEIGHT; + infoPtr->minHeight = GetSystemMetrics(SM_CYSIZE); + if (infoPtr->minHeight & 1) infoPtr->minHeight--; STATUSBAR_NotifyFormat(infoPtr, infoPtr->Notify, NF_REQUERY); diff --git a/dlls/comctl32/syslink.c b/dlls/comctl32/syslink.c index 5c25a52f471..8f48b4c53fd 100644 --- a/dlls/comctl32/syslink.c +++ b/dlls/comctl32/syslink.c @@ -1317,7 +1317,7 @@ static LRESULT SYSLINK_SendParentNotify (const SYSLINK_INFO *infoPtr, UINT code, * SYSLINK_SetFocus * Handles receiving the input focus. */ -static LRESULT SYSLINK_SetFocus (SYSLINK_INFO *infoPtr, HWND PrevFocusWindow) +static LRESULT SYSLINK_SetFocus (SYSLINK_INFO *infoPtr) { PDOC_ITEM Focus; @@ -1340,7 +1340,7 @@ static LRESULT SYSLINK_SetFocus (SYSLINK_INFO *infoPtr, HWND PrevFocusWindow) * SYSLINK_KillFocus * Handles losing the input focus. */ -static LRESULT SYSLINK_KillFocus (SYSLINK_INFO *infoPtr, HWND NewFocusWindow) +static LRESULT SYSLINK_KillFocus (SYSLINK_INFO *infoPtr) { PDOC_ITEM Focus; @@ -1385,7 +1385,7 @@ static PDOC_ITEM SYSLINK_LinkAtPt (const SYSLINK_INFO *infoPtr, const POINT *pt, * SYSLINK_LButtonDown * Handles mouse clicks */ -static LRESULT SYSLINK_LButtonDown (SYSLINK_INFO *infoPtr, DWORD Buttons, const POINT *pt) +static LRESULT SYSLINK_LButtonDown (SYSLINK_INFO *infoPtr, const POINT *pt) { PDOC_ITEM Current, Old; int id; @@ -1411,7 +1411,7 @@ static LRESULT SYSLINK_LButtonDown (SYSLINK_INFO *infoPtr, DWORD Buttons, const * SYSLINK_LButtonUp * Handles mouse clicks */ -static LRESULT SYSLINK_LButtonUp (SYSLINK_INFO *infoPtr, DWORD Buttons, const POINT *pt) +static LRESULT SYSLINK_LButtonUp (SYSLINK_INFO *infoPtr, const POINT *pt) { if(infoPtr->MouseDownID > -1) { @@ -1601,14 +1601,14 @@ static LRESULT WINAPI SysLinkWindowProc(HWND hwnd, UINT message, POINT pt; pt.x = (short)LOWORD(lParam); pt.y = (short)HIWORD(lParam); - return SYSLINK_LButtonDown(infoPtr, wParam, &pt); + return SYSLINK_LButtonDown(infoPtr, &pt); } case WM_LBUTTONUP: { POINT pt; pt.x = (short)LOWORD(lParam); pt.y = (short)HIWORD(lParam); - return SYSLINK_LButtonUp(infoPtr, wParam, &pt); + return SYSLINK_LButtonUp(infoPtr, &pt); } case WM_KEYDOWN: @@ -1694,10 +1694,10 @@ static LRESULT WINAPI SysLinkWindowProc(HWND hwnd, UINT message, return SYSLINK_GetIdealHeight(infoPtr); case WM_SETFOCUS: - return SYSLINK_SetFocus(infoPtr, (HWND)wParam); + return SYSLINK_SetFocus(infoPtr); case WM_KILLFOCUS: - return SYSLINK_KillFocus(infoPtr, (HWND)wParam); + return SYSLINK_KillFocus(infoPtr); case WM_ENABLE: infoPtr->Style &= ~WS_DISABLED; diff --git a/dlls/comctl32/tests/status.c b/dlls/comctl32/tests/status.c index 8b8facf1df1..f47d3ea06f2 100644 --- a/dlls/comctl32/tests/status.c +++ b/dlls/comctl32/tests/status.c @@ -40,6 +40,7 @@ static WNDPROC g_status_wndproc; static RECT g_rcCreated; static HWND g_hMainWnd; static int g_wmsize_count = 0; +static DWORD g_height; static HWND create_status_control(DWORD style, DWORD exstyle) { @@ -113,10 +114,16 @@ static int CALLBACK check_height_font_enumproc(ENUMLOGFONTEX *enumlf, NEWTEXTMET { HWND hwndStatus = (HWND)lParam; HDC hdc = GetDC(NULL); - static const int sizes[] = {8, 9, 10, 12, 16, 22, 28, 36, 48, 72}; - int i; + static const int sizes[] = { 6, 7, 8, 9, 10, 11, 12, 13, 15, 16, + 20, 22, 28, 36, 48, 72}; + DWORD i; + DWORD y; + LPSTR facename = (CHAR *)enumlf->elfFullName; + + /* on win9x, enumlf->elfFullName is only valid for truetype fonts */ + if (type != TRUETYPE_FONTTYPE) + facename = enumlf->elfLogFont.lfFaceName; - trace("Font %s\n", enumlf->elfFullName); for (i = 0; i < sizeof(sizes)/sizeof(sizes[0]); i++) { HFONT hFont; @@ -132,7 +139,11 @@ static int CALLBACK check_height_font_enumproc(ENUMLOGFONTEX *enumlf, NEWTEXTMET GetClientRect(hwndStatus, &rcCtrl); GetTextMetrics(hdc, &tm); - expect(max(tm.tmHeight + (tm.tmInternalLeading ? tm.tmInternalLeading : 2) + 4, 20), rcCtrl.bottom); + y = tm.tmHeight + (tm.tmInternalLeading ? tm.tmInternalLeading : 2) + 4; + + ok( rcCtrl.bottom == max(y, g_height), + "got %d (expected %d) for %s #%d\n", + rcCtrl.bottom, max(y, g_height), facename, sizes[i]); SelectObject(hdc, hOldFont); SendMessage(hwndStatus, WM_SETFONT, (WPARAM)hCtrlFont, TRUE); @@ -213,7 +224,11 @@ static void test_height(void) ZeroMemory(&lf, sizeof(lf)); SendMessage(hwndStatus, SB_SETMINHEIGHT, 0, 0); hdc = GetDC(NULL); - trace("dpi=%d\n", GetDeviceCaps(hdc, LOGPIXELSY)); + + g_height = GetSystemMetrics(SM_CYSIZE) + 2; + if (g_height & 1) g_height--; /* The height is always even */ + + trace("dpi=%d (min height: %d)\n", GetDeviceCaps(hdc, LOGPIXELSY), g_height); EnumFontFamiliesEx(hdc, &lf, (FONTENUMPROC)check_height_family_enumproc, (LPARAM)hwndStatus, 0); ReleaseDC(NULL, hdc); diff --git a/dlls/comctl32/tests/toolbar.c b/dlls/comctl32/tests/toolbar.c index ee86c1c58a8..1c155f590e5 100644 --- a/dlls/comctl32/tests/toolbar.c +++ b/dlls/comctl32/tests/toolbar.c @@ -999,6 +999,108 @@ static void test_sizes(void) DestroyWindow(hToolbar); } +/* Toolbar control has two ways of reacting to a change. We call them a + * relayout and recalc. A recalc forces a recompute of values like button size + * and top margin (the latter in comctl32 idCommand,tbb->iBitmap, tbb->fsState, tbb->fsStyle, tbb->dwData, tbb->iString, + (fUnicode ? wine_dbgstr_w((LPWSTR)tbb->iString) : wine_dbgstr_a((LPSTR)tbb->iString))); +} + +static void +TOOLBAR_DumpButton(const TOOLBAR_INFO *infoPtr, const TBUTTON_INFO *bP, INT btn_num) { if (TRACE_ON(toolbar)){ TRACE("button %d id %d, bitmap=%d, state=%02x, style=%02x, data=%08lx, stringid=0x%08lx\n", btn_num, bP->idCommand, GETIBITMAP(infoPtr, bP->iBitmap), bP->fsState, bP->fsStyle, bP->dwData, bP->iString); TRACE("string %s\n", debugstr_w(TOOLBAR_GetText(infoPtr,bP))); - if (internal) - TRACE("button %d id %d, hot=%s, row=%d, rect=(%s)\n", - btn_num, bP->idCommand, - (bP->bHot) ? "TRUE":"FALSE", bP->nRow, - wine_dbgstr_rect(&bP->rect)); + TRACE("button %d id %d, hot=%s, row=%d, rect=(%s)\n", + btn_num, bP->idCommand, (bP->bHot) ? "TRUE":"FALSE", bP->nRow, + wine_dbgstr_rect(&bP->rect)); } } @@ -307,7 +314,7 @@ TOOLBAR_DumpToolbar(const TOOLBAR_INFO *iP, INT line) iP->himlInt, iP->himlDef, iP->himlHot, iP->himlDis, (iP->bDoRedraw) ? "TRUE" : "FALSE"); for(i=0; inNumButtons; i++) { - TOOLBAR_DumpButton(iP, &iP->buttons[i], i, TRUE); + TOOLBAR_DumpButton(iP, &iP->buttons[i], i); } } } @@ -1814,6 +1821,62 @@ TOOLBAR_InternalHitTest (HWND hwnd, const POINT *lpPt) } +/* worker for TB_ADDBUTTONS and TB_INSERTBUTTON */ +static BOOL +TOOLBAR_InternalInsertButtonsT(TOOLBAR_INFO *infoPtr, INT iIndex, UINT nAddButtons, TBBUTTON *lpTbb, BOOL fUnicode) +{ + INT nOldButtons, nNewButtons, iButton; + BOOL fHasString = FALSE; + + if (iIndex < 0) /* iIndex can be negative, what means adding at the end */ + iIndex = infoPtr->nNumButtons; + + nOldButtons = infoPtr->nNumButtons; + nNewButtons = nOldButtons + nAddButtons; + + infoPtr->buttons = ReAlloc(infoPtr->buttons, sizeof(TBUTTON_INFO)*nNewButtons); + memmove(&infoPtr->buttons[iIndex + nAddButtons], &infoPtr->buttons[iIndex], + (nOldButtons - iIndex) * sizeof(TBUTTON_INFO)); + infoPtr->nNumButtons += nAddButtons; + + /* insert new buttons data */ + for (iButton = 0; iButton < nAddButtons; iButton++) { + TBUTTON_INFO *btnPtr = &infoPtr->buttons[iIndex + iButton]; + + TOOLBAR_DumpTBButton(lpTbb, fUnicode); + + ZeroMemory(btnPtr, sizeof(*btnPtr)); + btnPtr->iBitmap = lpTbb[iButton].iBitmap; + btnPtr->idCommand = lpTbb[iButton].idCommand; + btnPtr->fsState = lpTbb[iButton].fsState; + btnPtr->fsStyle = lpTbb[iButton].fsStyle; + btnPtr->dwData = lpTbb[iButton].dwData; + if(HIWORD(lpTbb[iButton].iString) && lpTbb[iButton].iString != -1) + { + if (fUnicode) + Str_SetPtrW((LPWSTR*)&btnPtr->iString, (LPWSTR)lpTbb[iButton].iString ); + else + Str_SetPtrAtoW((LPWSTR*)&btnPtr->iString, (LPSTR)lpTbb[iButton].iString); + fHasString = TRUE; + } + else + btnPtr->iString = lpTbb[iButton].iString; + + TOOLBAR_TooltipAddTool(infoPtr, btnPtr); + } + + if (infoPtr->nNumStrings > 0 || fHasString) + TOOLBAR_CalcToolbar(infoPtr->hwndSelf); + else + TOOLBAR_LayoutToolbar(infoPtr->hwndSelf); + TOOLBAR_AutoSize(infoPtr->hwndSelf); + + TOOLBAR_DumpToolbar(infoPtr, __LINE__); + InvalidateRect(infoPtr->hwndSelf, NULL, TRUE); + return TRUE; +} + + static INT TOOLBAR_GetButtonIndex (const TOOLBAR_INFO *infoPtr, INT idCommand, BOOL CommandIsIndex) { @@ -2839,52 +2902,11 @@ TOOLBAR_AddButtonsT(HWND hwnd, WPARAM wParam, LPARAM lParam, BOOL fUnicode) { TOOLBAR_INFO *infoPtr = TOOLBAR_GetInfoPtr (hwnd); LPTBBUTTON lpTbb = (LPTBBUTTON)lParam; - INT nOldButtons, nNewButtons, nAddButtons, nCount; - BOOL fHasString = FALSE; + INT nAddButtons = (UINT)wParam; TRACE("adding %ld buttons (unicode=%d)!\n", wParam, fUnicode); - nAddButtons = (UINT)wParam; - nOldButtons = infoPtr->nNumButtons; - nNewButtons = nOldButtons + nAddButtons; - - infoPtr->buttons = ReAlloc(infoPtr->buttons, sizeof(TBUTTON_INFO)*nNewButtons); - infoPtr->nNumButtons = nNewButtons; - - /* insert new button data */ - for (nCount = 0; nCount < nAddButtons; nCount++) { - TBUTTON_INFO *btnPtr = &infoPtr->buttons[nOldButtons+nCount]; - btnPtr->iBitmap = lpTbb[nCount].iBitmap; - btnPtr->idCommand = lpTbb[nCount].idCommand; - btnPtr->fsState = lpTbb[nCount].fsState; - btnPtr->fsStyle = lpTbb[nCount].fsStyle; - btnPtr->dwData = lpTbb[nCount].dwData; - btnPtr->bHot = FALSE; - if(HIWORD(lpTbb[nCount].iString) && lpTbb[nCount].iString != -1) - { - if (fUnicode) - Str_SetPtrW ((LPWSTR*)&btnPtr->iString, (LPWSTR)lpTbb[nCount].iString ); - else - Str_SetPtrAtoW((LPWSTR*)&btnPtr->iString, (LPSTR)lpTbb[nCount].iString); - fHasString = TRUE; - } - else - btnPtr->iString = lpTbb[nCount].iString; - - TOOLBAR_TooltipAddTool(infoPtr, btnPtr); - } - - if (infoPtr->nNumStrings > 0 || fHasString) - TOOLBAR_CalcToolbar(hwnd); - else - TOOLBAR_LayoutToolbar(hwnd); - TOOLBAR_AutoSize (hwnd); - - TOOLBAR_DumpToolbar (infoPtr, __LINE__); - - InvalidateRect(hwnd, NULL, TRUE); - - return TRUE; + return TOOLBAR_InternalInsertButtonsT(infoPtr, -1, nAddButtons, lpTbb, fUnicode); } @@ -3763,8 +3785,6 @@ TOOLBAR_InsertButtonT(HWND hwnd, WPARAM wParam, LPARAM lParam, BOOL fUnicode) if (lpTbb == NULL) return FALSE; - TOOLBAR_DumpButton(infoPtr, (TBUTTON_INFO *)lpTbb, nIndex, FALSE); - if (nIndex == -1) { /* EPP: this seems to be an undocumented call (from my IE4) * I assume in that case that: @@ -3783,39 +3803,7 @@ TOOLBAR_InsertButtonT(HWND hwnd, WPARAM wParam, LPARAM lParam, BOOL fUnicode) TRACE("adjust index=%d\n", nIndex); } - infoPtr->nNumButtons++; - infoPtr->buttons = ReAlloc(infoPtr->buttons, sizeof(TBUTTON_INFO) * infoPtr->nNumButtons); - memmove(&infoPtr->buttons[nIndex+1], &infoPtr->buttons[nIndex], - (infoPtr->nNumButtons - nIndex - 1) * sizeof(TBUTTON_INFO)); - - /* insert new button */ - ZeroMemory(&infoPtr->buttons[nIndex], sizeof(infoPtr->buttons[nIndex])); - infoPtr->buttons[nIndex].iBitmap = lpTbb->iBitmap; - infoPtr->buttons[nIndex].idCommand = lpTbb->idCommand; - infoPtr->buttons[nIndex].fsState = lpTbb->fsState; - infoPtr->buttons[nIndex].fsStyle = lpTbb->fsStyle; - infoPtr->buttons[nIndex].dwData = lpTbb->dwData; - /* if passed string and not index, then add string */ - if(HIWORD(lpTbb->iString) && lpTbb->iString!=-1) { - if (fUnicode) - Str_SetPtrW((LPWSTR *)&infoPtr->buttons[nIndex].iString, (LPWSTR)lpTbb->iString); - else - Str_SetPtrAtoW((LPWSTR *)&infoPtr->buttons[nIndex].iString, (LPCSTR )lpTbb->iString); - } - else - infoPtr->buttons[nIndex].iString = lpTbb->iString; - - TOOLBAR_TooltipAddTool(infoPtr, &infoPtr->buttons[nIndex]); - - if (infoPtr->nNumStrings > 0) - TOOLBAR_CalcToolbar(hwnd); - else - TOOLBAR_LayoutToolbar(hwnd); - TOOLBAR_AutoSize (hwnd); - - InvalidateRect (hwnd, NULL, TRUE); - - return TRUE; + return TOOLBAR_InternalInsertButtonsT(infoPtr, nIndex, 1, lpTbb, fUnicode); } /* << TOOLBAR_InsertMarkHitTest >> */ @@ -4459,7 +4447,7 @@ TOOLBAR_SetButtonInfoA (HWND hwnd, WPARAM wParam, LPARAM lParam) /* save the button rect to see if we need to redraw the whole toolbar */ oldBtnRect = btnPtr->rect; - TOOLBAR_CalcToolbar(hwnd); + TOOLBAR_LayoutToolbar(hwnd); if (!EqualRect(&oldBtnRect, &btnPtr->rect)) InvalidateRect(hwnd, NULL, TRUE); @@ -4512,7 +4500,7 @@ TOOLBAR_SetButtonInfoW (HWND hwnd, WPARAM wParam, LPARAM lParam) /* save the button rect to see if we need to redraw the whole toolbar */ oldBtnRect = btnPtr->rect; - TOOLBAR_CalcToolbar(hwnd); + TOOLBAR_LayoutToolbar(hwnd); if (!EqualRect(&oldBtnRect, &btnPtr->rect)) InvalidateRect(hwnd, NULL, TRUE); @@ -4660,11 +4648,10 @@ static LRESULT TOOLBAR_SetExtendedStyle (HWND hwnd, WPARAM wParam, LPARAM lParam) { TOOLBAR_INFO *infoPtr = TOOLBAR_GetInfoPtr (hwnd); - DWORD dwTemp; + DWORD dwOldStyle; - dwTemp = infoPtr->dwExStyle; - infoPtr->dwExStyle &= ~wParam; - infoPtr->dwExStyle |= (DWORD)lParam; + dwOldStyle = infoPtr->dwExStyle; + infoPtr->dwExStyle = (DWORD)lParam; TRACE("new style 0x%08x\n", infoPtr->dwExStyle); @@ -4672,13 +4659,15 @@ TOOLBAR_SetExtendedStyle (HWND hwnd, WPARAM wParam, LPARAM lParam) FIXME("Unknown Toolbar Extended Style 0x%08x. Please report.\n", (infoPtr->dwExStyle & ~TBSTYLE_EX_ALL)); - TOOLBAR_CalcToolbar (hwnd); + if ((dwOldStyle ^ infoPtr->dwExStyle) & TBSTYLE_EX_MIXEDBUTTONS) + TOOLBAR_CalcToolbar(hwnd); + else + TOOLBAR_LayoutToolbar(hwnd); TOOLBAR_AutoSize(hwnd); - InvalidateRect(hwnd, NULL, TRUE); - return (LRESULT)dwTemp; + return (LRESULT)dwOldStyle; } diff --git a/dlls/crypt32/crypt32_Ko.rc b/dlls/crypt32/crypt32_Ko.rc index 2968e52856d..51e3fc32f67 100644 --- a/dlls/crypt32/crypt32_Ko.rc +++ b/dlls/crypt32/crypt32_Ko.rc @@ -172,6 +172,7 @@ STRINGTABLE DISCARDABLE IDS_LOCALIZEDNAME_MY "°³ÀÎ" IDS_LOCALIZEDNAME_CA "Áß°³ °ËÁõ ±â°ü" IDS_LOCALIZEDNAME_ADDRESSBOOK "´Ù¸¥ »ç¶÷" + IDS_LOCALIZEDNAME_TRUSTEDPUBLISHER "½Å·ÚÇÒ ¼ö ÀÖ´Â ¹ßÇàÀÚ" } STRINGTABLE DISCARDABLE diff --git a/dlls/crypt32/tests/encode.c b/dlls/crypt32/tests/encode.c index 5c681b638cc..439a25fabcf 100644 --- a/dlls/crypt32/tests/encode.c +++ b/dlls/crypt32/tests/encode.c @@ -1960,8 +1960,6 @@ static const struct encodedBits bits[] = { { 1, bin54, 2, bin55 }, /* strange test case, showing cUnusedBits >= 8 is allowed */ { 9, bin56, 1, bin57 }, - /* even stranger test case, showing cUnusedBits > cbData * 8 is allowed */ - { 17, bin58, 0, NULL }, }; static void test_encodeBits(DWORD dwEncoding) diff --git a/dlls/cryptui/cryptui_Ko.rc b/dlls/cryptui/cryptui_Ko.rc index b08671b639e..195a3f128fd 100644 --- a/dlls/cryptui/cryptui_Ko.rc +++ b/dlls/cryptui/cryptui_Ko.rc @@ -143,6 +143,26 @@ STRINGTABLE DISCARDABLE IDS_PURPOSE_CA_EXCHANGE "»çÀû Å° º¸°ü¼Ò" IDS_PURPOSE_KEY_RECOVERY_AGENT "Å° º¹±¸ ¿¡ÀÌÀüÆ®" IDS_PURPOSE_DS_EMAIL_REPLICATION "µð·ºÅ丮 ¼­ºñ½º ÀüÀÚ¿ìÆí º¹Á¦" + IDS_EXPORT_WIZARD "ÀÎÁõ¼­ ³»º¸³»±â ¸¶¹ý»ç" + IDS_EXPORT_FORMAT_TITLE "³»º¸³¾ Çü½Ä" + IDS_EXPORT_FORMAT_SUBTITLE "³»¿ëÀ» ÀúÀåÇÒ Çü½Ä ¼±ÅÃ." + IDS_EXPORT_FILE_TITLE "³»º¸³¾ ÆÄÀÏÀ̸§" + IDS_EXPORT_FILE_SUBTITLE "³»¿ëÀ» ÀúÀåÇÒ ÆÄÀÏ À̸§ ÁöÁ¤." + IDS_EXPORT_FILE_EXISTS "ÁöÁ¤µÈ ÆÄÀÏÀº ÀÌ¹Ì Á¸ÀçÇÕ´Ï´Ù.µ¤¾î ¾²½Ã°Ú½À´Ï±î?" + IDS_EXPORT_FILTER_CERT "DER-¾ÏȣȭµÈ ¹ÙÀ̳ʸ® X.509 (*.cer)" + IDS_EXPORT_FILTER_BASE64_CERT "Base64-¾ÏȣȭµÈ X.509 (*.cer)" + IDS_EXPORT_FILTER_CRL "ÀÎÁõ¼­ Æó±â ¸ñ·Ï (*.crl)" + IDS_EXPORT_FILTER_CTL "ÀÎÁõ¼­ ½Å·Ú ¸ñ·Ï (*.stl)" + IDS_EXPORT_FILTER_CMS "CMS/PKCS #7 ¸Þ¼¼Áö (*.p7b)" + IDS_EXPORT_FILTER_PFX "°³ÀÎ Á¤º¸ ±³È¯ (*.pfx)" + IDS_EXPORT_FILTER_SERIALIZED_CERT_STORE "³ª¿­µÈ ÀÎÁõ¼­ ÀúÀå¼Ò (*.sst)" + IDS_EXPORT_FORMAT "ÆÄÀÏ Çü½Ä" + IDS_EXPORT_INCLUDE_CHAIN "ÀÎÁõ °æ·Î¿¡ ÀÖ´Â ¸ðµç ÀÎÁõ¼­ Æ÷ÇÔ" + IDS_EXPORT_KEYS "³»º¸³¾ Å°" + IDS_YES "¿¹" + IDS_NO "¾Æ´Ï¿À" + IDS_EXPORT_SUCCEEDED "³»º¸³»±â ¼º°ø." + IDS_EXPORT_FAILED "³»º¸³»±â ½ÇÆÐ." } IDD_GENERAL DIALOG DISCARDABLE 0, 0, 255, 236 @@ -330,3 +350,67 @@ BEGIN PUSHBUTTON "È®ÀÎ", IDOK, 132,155,51,14, BS_DEFPUSHBUTTON PUSHBUTTON "Ãë¼Ò", IDCANCEL, 190,155,51,14 END + + +IDD_EXPORT_WELCOME DIALOG DISCARDABLE 0,0,317,143 +CAPTION "ÀÎÁõ¼­ ³»º¸³»±â ¸¶¹ý»ç" +FONT 8, "MS Shell Dlg" +BEGIN + LTEXT "ÀÎÁõ¼­ ³»º¸³»±â ¸¶¹ý»ç¿¡ ¿À½Å °ÍÀ» ȯ¿µÇÕ´Ï´Ù", IDC_EXPORT_TITLE, + 115,1,195,40 + LTEXT "ÀÌ ¸¶¹ý»ç´Â ÀÎÁõ¼­,ÀÎÁõ¼­ Æó±â ¸ñ·Ï,ÀÎÁõ¼­ ½Å·Ú ¸ñ·ÏÀ» ÀÎÁõ¼­ ÀúÀå¼Ò·ÎºÎÅÍ ÆÄÀÏ·Î ³»º¸³»´Â °ÍÀ» µµ¿ÍÁÙ°Ì´Ï´Ù.", + -1, 115,33,195,16 + LTEXT " ÀÎÁõ¼­´Â ´ç½ÅÀ̳ª ´ç½ÅÀÌ Åë½Å¿¡ »ç¿ëÇÏ´Â ÄÄÇ»Å͸¦ ½Å¿øº¸ÁõÇÏ´Â µ¥ »ç¿ëµË´Ï´Ù. ¶ÇÇÑ ¸Þ¼¼Áö¿¡ »çÀÎÇÏ°í ÀÎÁõÇÏ´Â µ¥µµ »ç¿ëµË´Ï´Ù. ÀÎÁõ¼­ º¸°ü¼Ò´Â ÀÎÁõ¼­, ÀÎÁõ¼­ Æı⠸ñ·Ï, ÀÎÁõ¼­ ½Å·Ú ¸ñ·ÏÀÇ ÀúÀå¼ÒÀÔ´Ï´Ù..", + -1, 115,56,195,40 + LTEXT "°è¼Ó ÇϽǷÁ¸é, <´ÙÀ½>À» Ŭ¸¯ÇϽʽÿÀ.", + -1, 115,103,195,8 +END + +IDD_EXPORT_FORMAT DIALOG DISCARDABLE 0,0,317,143 +CAPTION "ÀÎÁõ¼­ ³»º¸³»±â ¸¶¹ý»ç" +FONT 8, "MS Shell Dlg" +BEGIN + LTEXT "»ç¿ëÇÒ ÆÄÀÏ Çü½Ä ¼±ÅÃ:", -1, 21,1,195,10 + AUTORADIOBUTTON "&DER-¾ÏȣȭµÈ X.509 (.cer)", + IDC_EXPORT_FORMAT_DER, 31,18,200,12, BS_AUTORADIOBUTTON|WS_TABSTOP + AUTORADIOBUTTON "Ba&se64-¾ÏȣȭµÈ X.509 (.cer):", + IDC_EXPORT_FORMAT_BASE64, 31,30,200,12, BS_AUTORADIOBUTTON + AUTORADIOBUTTON "¾ÏÈ£ ¸Þ½ÃÁö ¹®¹ý Ç¥ÁØ/PKCS #7 ¸Þ½ÃÁö(&C) (.p7b)", + IDC_EXPORT_FORMAT_CMS, 31,42,200,12, BS_AUTORADIOBUTTON + CHECKBOX "°¡´ÉÇÑ ÀÎÁõ¼­ °æ·Î¿¡ ÀÖ´Â ¸ðµç ÀÎÁõ¼­ Æ÷ÇÔ(&I)", + IDC_EXPORT_CMS_INCLUDE_CHAIN, 44,57,200,8, BS_AUTOCHECKBOX|WS_TABSTOP|WS_DISABLED + AUTORADIOBUTTON "°³ÀÎ Á¤º¸ ±³È¯(&P)/PKCS #12 (.pfx)", + IDC_EXPORT_FORMAT_PFX, 31,72,200,12, BS_AUTORADIOBUTTON|WS_DISABLED + CHECKBOX "°¡´ÉÇÑ ÀÎÁõ¼­ °æ·Î¿¡ ÀÖ´Â ¸ðµç ÀÎÁõ¼­ Æ÷ÇÔ(&U)", + IDC_EXPORT_PFX_INCLUDE_CHAIN, 44,87,200,8, BS_AUTOCHECKBOX|WS_TABSTOP|WS_DISABLED + CHECKBOX "°­ÇÑ ¾Ïȣȭ °¡´É(&E)", + IDC_EXPORT_PFX_STRONG_ENCRYPTION, 44,102,200,8, + BS_AUTOCHECKBOX|WS_TABSTOP|WS_DISABLED + CHECKBOX "³»º¸³»±â°¡ ¼º°øÇÏ¸é °³ÀÎ Å° Áö¿ì±â(&K)", + IDC_EXPORT_PFX_DELETE_PRIVATE_KEY, 44,117,200,8, + BS_AUTOCHECKBOX|WS_TABSTOP|WS_DISABLED +END + +IDD_EXPORT_FILE DIALOG DISCARDABLE 0,0,317,143 +CAPTION "ÀÎÁõ¼­ ³»º¸³»±â ¸¶¹ý»ç" +FONT 8, "MS Shell Dlg" +BEGIN + LTEXT "ÆÄÀÏ À̸§(&F):", -1, 21,1,195,10 + EDITTEXT IDC_EXPORT_FILENAME, 21,11,208,14, ES_AUTOHSCROLL|WS_TABSTOP + PUSHBUTTON "ã±â(&R)...", IDC_EXPORT_BROWSE_FILE, 236,11,60,14 +END + +IDD_EXPORT_FINISH DIALOG DISCARDABLE 0,0,317,143 +CAPTION "ÀÎÁõ¼­ ³»º¸³»±â ¸¶¹ý»ç" +FONT 8, "MS Shell Dlg" +BEGIN + LTEXT "ÀÎÁõ¼­ ³»º¸³»±â ¸¶¹ý¼­ ¿Ï·áÇÏ´Â Áß", IDC_EXPORT_TITLE, + 115,1,195,40 + LTEXT "´ç½ÅÀº ÀÎÁõ¼­ ³»º¸³»±â ¸¶¹ý¸¦ ¿Ï·áÇÏ´Â µ¥ ¼º°øÇÏ¿´½À´Ï´Ù.", + -1, 115,33,195,24 + LTEXT "´ç½ÅÀº ´ÙÀ½ ¼³Á¤À» ÁöÁ¤Çß½À´Ï´Ù:", + -1, 115,57,195,12 + CONTROL "", IDC_EXPORT_SETTINGS, "SysListView32", + LVS_REPORT|LVS_NOCOLUMNHEADER|LVS_SINGLESEL|WS_CHILD|WS_VISIBLE|WS_TABSTOP|WS_BORDER, + 115,67,174,100 +END diff --git a/dlls/cryptui/main.c b/dlls/cryptui/main.c index 498c158f9bf..8590d0cdc9b 100644 --- a/dlls/cryptui/main.c +++ b/dlls/cryptui/main.c @@ -1076,25 +1076,24 @@ static LRESULT CALLBACK cert_mgr_dlg_proc(HWND hwnd, UINT msg, WPARAM wp, HWND tab = GetDlgItem(hwnd, IDC_MGR_STORES); data = HeapAlloc(GetProcessHeap(), 0, sizeof(struct CertMgrData)); - if (data) + if (!data) + return 0; + data->imageList = ImageList_Create(16, 16, ILC_COLOR4 | ILC_MASK, 2, 0); + if (data->imageList) { - data->imageList = ImageList_Create(16, 16, ILC_COLOR4 | ILC_MASK, - 2, 0); - if (data->imageList) - { - HBITMAP bmp; - COLORREF backColor = RGB(255, 0, 255); + HBITMAP bmp; + COLORREF backColor = RGB(255, 0, 255); - bmp = LoadBitmapW(hInstance, MAKEINTRESOURCEW(IDB_SMALL_ICONS)); - ImageList_AddMasked(data->imageList, bmp, backColor); - DeleteObject(bmp); - ImageList_SetBkColor(data->imageList, CLR_NONE); - SendMessageW(GetDlgItem(hwnd, IDC_MGR_CERTS), LVM_SETIMAGELIST, - LVSIL_SMALL, (LPARAM)data->imageList); - } - SetWindowLongPtrW(hwnd, DWLP_USER, (LPARAM)data); - data->title = pCryptUICertMgr->pwszTitle; + bmp = LoadBitmapW(hInstance, MAKEINTRESOURCEW(IDB_SMALL_ICONS)); + ImageList_AddMasked(data->imageList, bmp, backColor); + DeleteObject(bmp); + ImageList_SetBkColor(data->imageList, CLR_NONE); + SendMessageW(GetDlgItem(hwnd, IDC_MGR_CERTS), LVM_SETIMAGELIST, + LVSIL_SMALL, (LPARAM)data->imageList); } + SetWindowLongPtrW(hwnd, DWLP_USER, (LPARAM)data); + data->title = pCryptUICertMgr->pwszTitle; + initialize_purpose_selection(hwnd); add_cert_columns(hwnd); if (pCryptUICertMgr->pwszTitle) diff --git a/dlls/d3dx8/d3dx8.spec b/dlls/d3dx8/d3dx8.spec index 3587c6b4e07..3ee6f1b091f 100644 --- a/dlls/d3dx8/d3dx8.spec +++ b/dlls/d3dx8/d3dx8.spec @@ -68,6 +68,7 @@ @ stdcall D3DXPlaneTransform(ptr ptr ptr) @ stdcall D3DXColorAdjustSaturation(ptr ptr long) @ stdcall D3DXColorAdjustContrast(ptr ptr long) +@ stdcall D3DXFresnelTerm(long long) @ stdcall D3DXCreateMatrixStack(long ptr) @ stdcall D3DXCreateFont(ptr ptr ptr) @ stub D3DXCreateFontIndirect @@ -108,6 +109,7 @@ @ stub D3DXFVFFromDeclarator @ stub D3DXWeldVertices @ stub D3DXIntersect +@ cdecl D3DXIntersectTri(ptr ptr ptr ptr ptr ptr ptr ptr) @ stdcall D3DXSphereBoundProbe(ptr long ptr ptr) @ stdcall D3DXBoxBoundProbe(ptr ptr ptr ptr) @ stub D3DXCreatePolygon diff --git a/dlls/d3dx8/math.c b/dlls/d3dx8/math.c index bcab3b4676e..b355c9cc309 100644 --- a/dlls/d3dx8/math.c +++ b/dlls/d3dx8/math.c @@ -58,6 +58,20 @@ D3DXCOLOR* WINAPI D3DXColorAdjustSaturation(D3DXCOLOR *pout, CONST D3DXCOLOR *pc return pout; } +/*_________________Misc__________________________*/ + +FLOAT WINAPI D3DXFresnelTerm(FLOAT costheta, FLOAT refractionindex) +{ + FLOAT a, d, g, result; + + g = sqrt(refractionindex * refractionindex + costheta * costheta - 1.0f); + a = g + costheta; + d = g - costheta; + result = ( costheta * a - 1.0f ) * ( costheta * a - 1.0f ) / ( ( costheta * d + 1.0f ) * ( costheta * d + 1.0f ) ) + 1.0f; + result = result * 0.5f * d * d / ( a * a ); + return result; +} + /*_________________D3DXMatrix____________________*/ D3DXMATRIX* WINAPI D3DXMatrixAffineTransformation(D3DXMATRIX *pout, FLOAT scaling, CONST D3DXVECTOR3 *rotationcenter, CONST D3DXQUATERNION *rotation, CONST D3DXVECTOR3 *translation) @@ -114,6 +128,7 @@ FLOAT WINAPI D3DXMatrixfDeterminant(CONST D3DXMATRIX *pm) D3DXMATRIX* WINAPI D3DXMatrixInverse(D3DXMATRIX *pout, FLOAT *pdeterminant, CONST D3DXMATRIX *pm) { int a, i, j; + D3DXMATRIX out; D3DXVECTOR4 v, vec[3]; FLOAT det; @@ -135,11 +150,12 @@ D3DXMATRIX* WINAPI D3DXMatrixInverse(D3DXMATRIX *pout, FLOAT *pdeterminant, CONS } } D3DXVec4Cross(&v, &vec[0], &vec[1], &vec[2]); - pout->u.m[0][i] = pow(-1.0f, i) * v.x / det; - pout->u.m[1][i] = pow(-1.0f, i) * v.y / det; - pout->u.m[2][i] = pow(-1.0f, i) * v.z / det; - pout->u.m[3][i] = pow(-1.0f, i) * v.w / det; + out.u.m[0][i] = pow(-1.0f, i) * v.x / det; + out.u.m[1][i] = pow(-1.0f, i) * v.y / det; + out.u.m[2][i] = pow(-1.0f, i) * v.z / det; + out.u.m[3][i] = pow(-1.0f, i) * v.w / det; } + *pout = out; return pout; } @@ -938,23 +954,25 @@ D3DXVECTOR3* WINAPI D3DXPlaneIntersectLine(D3DXVECTOR3 *pout, CONST D3DXPLANE *p D3DXPLANE* WINAPI D3DXPlaneNormalize(D3DXPLANE *pout, CONST D3DXPLANE *pp) { + D3DXPLANE out; FLOAT norm; norm = sqrt(pp->a * pp->a + pp->b * pp->b + pp->c * pp->c); if ( norm ) { - pout->a = pp->a / norm; - pout->b = pp->b / norm; - pout->c = pp->c / norm; - pout->d = pp->d / norm; + out.a = pp->a / norm; + out.b = pp->b / norm; + out.c = pp->c / norm; + out.d = pp->d / norm; } else { - pout->a = 0.0f; - pout->b = 0.0f; - pout->c = 0.0f; - pout->d = 0.0f; + out.a = 0.0f; + out.b = 0.0f; + out.c = 0.0f; + out.d = 0.0f; } + *pout = out; return pout; } @@ -1062,23 +1080,25 @@ D3DXQUATERNION* WINAPI D3DXQuaternionMultiply(D3DXQUATERNION *pout, CONST D3DXQU D3DXQUATERNION* WINAPI D3DXQuaternionNormalize(D3DXQUATERNION *pout, CONST D3DXQUATERNION *pq) { + D3DXQUATERNION out; FLOAT norm; norm = D3DXQuaternionLength(pq); if ( !norm ) { - pout->x = 0.0f; - pout->y = 0.0f; - pout->z = 0.0f; - pout->w = 0.0f; + out.x = 0.0f; + out.y = 0.0f; + out.z = 0.0f; + out.w = 0.0f; } else { - pout->x = pq->x / norm; - pout->y = pq->y / norm; - pout->z = pq->z / norm; - pout->w = pq->w / norm; + out.x = pq->x / norm; + out.y = pq->y / norm; + out.z = pq->z / norm; + out.w = pq->w / norm; } + *pout=out; return pout; } @@ -1229,19 +1249,21 @@ D3DXVECTOR2* WINAPI D3DXVec2Hermite(D3DXVECTOR2 *pout, CONST D3DXVECTOR2 *pv1, C D3DXVECTOR2* WINAPI D3DXVec2Normalize(D3DXVECTOR2 *pout, CONST D3DXVECTOR2 *pv) { + D3DXVECTOR2 out; FLOAT norm; norm = D3DXVec2Length(pv); if ( !norm ) { - pout->x = 0.0f; - pout->y = 0.0f; + out.x = 0.0f; + out.y = 0.0f; } else { - pout->x = pv->x / norm; - pout->y = pv->y / norm; + out.x = pv->x / norm; + out.y = pv->y / norm; } + *pout=out; return pout; } @@ -1316,35 +1338,38 @@ D3DXVECTOR3* WINAPI D3DXVec3Hermite(D3DXVECTOR3 *pout, CONST D3DXVECTOR3 *pv1, C D3DXVECTOR3* WINAPI D3DXVec3Normalize(D3DXVECTOR3 *pout, CONST D3DXVECTOR3 *pv) { + D3DXVECTOR3 out; FLOAT norm; norm = D3DXVec3Length(pv); if ( !norm ) { - pout->x = 0.0f; - pout->y = 0.0f; - pout->z = 0.0f; + out.x = 0.0f; + out.y = 0.0f; + out.z = 0.0f; } else { - pout->x = pv->x / norm; - pout->y = pv->y / norm; - pout->z = pv->z / norm; + out.x = pv->x / norm; + out.y = pv->y / norm; + out.z = pv->z / norm; } + *pout = out; return pout; } D3DXVECTOR3* WINAPI D3DXVec3Project(D3DXVECTOR3 *pout, CONST D3DXVECTOR3 *pv, CONST D3DVIEWPORT8 *pviewport, CONST D3DXMATRIX *pprojection, CONST D3DXMATRIX *pview, CONST D3DXMATRIX *pworld) { - D3DXMATRIX m1, m2; - D3DXVECTOR3 vec; - - D3DXMatrixMultiply(&m1, pworld, pview); - D3DXMatrixMultiply(&m2, &m1, pprojection); - D3DXVec3TransformCoord(&vec, pv, &m2); - pout->x = pviewport->X + ( 1.0f + vec.x ) * pviewport->Width / 2.0f; - pout->y = pviewport->Y + ( 1.0f - vec.y ) * pviewport->Height / 2.0f; - pout->z = pviewport->MinZ + vec.z * ( pviewport->MaxZ - pviewport->MinZ ); + D3DXMATRIX m; + D3DXVECTOR3 out; + + D3DXMatrixMultiply(&m, pworld, pview); + D3DXMatrixMultiply(&m, &m, pprojection); + D3DXVec3TransformCoord(&out, pv, &m); + out.x = pviewport->X + ( 1.0f + out.x ) * pviewport->Width / 2.0f; + out.y = pviewport->Y + ( 1.0f - out.y ) * pviewport->Height / 2.0f; + out.z = pviewport->MinZ + out.z * ( pviewport->MaxZ - pviewport->MinZ ); + *pout = out; return pout; } @@ -1359,6 +1384,7 @@ D3DXVECTOR4* WINAPI D3DXVec3Transform(D3DXVECTOR4 *pout, CONST D3DXVECTOR3 *pv, D3DXVECTOR3* WINAPI D3DXVec3TransformCoord(D3DXVECTOR3 *pout, CONST D3DXVECTOR3 *pv, CONST D3DXMATRIX *pm) { + D3DXVECTOR3 out; FLOAT norm; norm = pm->u.m[0][3] * pv->x + pm->u.m[1][3] * pv->y + pm->u.m[2][3] *pv->z + pm->u.m[3][3]; @@ -1366,16 +1392,17 @@ D3DXVECTOR3* WINAPI D3DXVec3TransformCoord(D3DXVECTOR3 *pout, CONST D3DXVECTOR3 if ( norm ) { CONST D3DXVECTOR3 v = *pv; - pout->x = (pm->u.m[0][0] * v.x + pm->u.m[1][0] * v.y + pm->u.m[2][0] * v.z + pm->u.m[3][0]) / norm; - pout->y = (pm->u.m[0][1] * v.x + pm->u.m[1][1] * v.y + pm->u.m[2][1] * v.z + pm->u.m[3][1]) / norm; - pout->z = (pm->u.m[0][2] * v.x + pm->u.m[1][2] * v.y + pm->u.m[2][2] * v.z + pm->u.m[3][2]) / norm; + out.x = (pm->u.m[0][0] * v.x + pm->u.m[1][0] * v.y + pm->u.m[2][0] * v.z + pm->u.m[3][0]) / norm; + out.y = (pm->u.m[0][1] * v.x + pm->u.m[1][1] * v.y + pm->u.m[2][1] * v.z + pm->u.m[3][1]) / norm; + out.z = (pm->u.m[0][2] * v.x + pm->u.m[1][2] * v.y + pm->u.m[2][2] * v.z + pm->u.m[3][2]) / norm; } else { - pout->x = 0.0f; - pout->y = 0.0f; - pout->z = 0.0f; + out.x = 0.0f; + out.y = 0.0f; + out.z = 0.0f; } + *pout = out; return pout; } @@ -1391,16 +1418,17 @@ D3DXVECTOR3* WINAPI D3DXVec3TransformNormal(D3DXVECTOR3 *pout, CONST D3DXVECTOR3 D3DXVECTOR3* WINAPI D3DXVec3Unproject(D3DXVECTOR3 *pout, CONST D3DXVECTOR3 *pv, CONST D3DVIEWPORT8 *pviewport, CONST D3DXMATRIX *pprojection, CONST D3DXMATRIX *pview, CONST D3DXMATRIX *pworld) { - D3DXMATRIX m1, m2, m3; - D3DXVECTOR3 vec; - - D3DXMatrixMultiply(&m1, pworld, pview); - D3DXMatrixMultiply(&m2, &m1, pprojection); - D3DXMatrixInverse(&m3, NULL, &m2); - vec.x = 2.0f * ( pv->x - pviewport->X ) / pviewport->Width - 1.0f; - vec.y = 1.0f - 2.0f * ( pv->y - pviewport->Y ) / pviewport->Height; - vec.z = ( pv->z - pviewport->MinZ) / ( pviewport->MaxZ - pviewport->MinZ ); - D3DXVec3TransformCoord(pout, &vec, &m3); + D3DXMATRIX m; + D3DXVECTOR3 out; + + D3DXMatrixMultiply(&m, pworld, pview); + D3DXMatrixMultiply(&m, &m, pprojection); + D3DXMatrixInverse(&m, NULL, &m); + out.x = 2.0f * ( pv->x - pviewport->X ) / pviewport->Width - 1.0f; + out.y = 1.0f - 2.0f * ( pv->y - pviewport->Y ) / pviewport->Height; + out.z = ( pv->z - pviewport->MinZ) / ( pviewport->MaxZ - pviewport->MinZ ); + D3DXVec3TransformCoord(&out, &out, &m); + *pout = out; return pout; } @@ -1453,23 +1481,25 @@ D3DXVECTOR4* WINAPI D3DXVec4Hermite(D3DXVECTOR4 *pout, CONST D3DXVECTOR4 *pv1, C D3DXVECTOR4* WINAPI D3DXVec4Normalize(D3DXVECTOR4 *pout, CONST D3DXVECTOR4 *pv) { + D3DXVECTOR4 out; FLOAT norm; norm = D3DXVec4Length(pv); if ( !norm ) { - pout->x = 0.0f; - pout->y = 0.0f; - pout->z = 0.0f; - pout->w = 0.0f; + out.x = 0.0f; + out.y = 0.0f; + out.z = 0.0f; + out.w = 0.0f; } else { - pout->x = pv->x / norm; - pout->y = pv->y / norm; - pout->z = pv->z / norm; - pout->w = pv->w / norm; + out.x = pv->x / norm; + out.y = pv->y / norm; + out.z = pv->z / norm; + out.w = pv->w / norm; } + *pout = out; return pout; } diff --git a/dlls/d3dx8/mesh.c b/dlls/d3dx8/mesh.c index c1d242bf07c..88e9b87867f 100644 --- a/dlls/d3dx8/mesh.c +++ b/dlls/d3dx8/mesh.c @@ -90,6 +90,48 @@ done we've got an intersection of the ray with the box. return TRUE; } +BOOL CDECL D3DXIntersectTri(CONST D3DXVECTOR3 *p0, CONST D3DXVECTOR3 *p1, CONST D3DXVECTOR3 *p2, CONST D3DXVECTOR3 *praypos, CONST D3DXVECTOR3 *praydir, FLOAT *pu, FLOAT *pv, FLOAT *pdist) +{ + D3DXMATRIX m; + D3DXVECTOR4 vec; + + m.m[0][0] = p1->x - p0->x; + m.m[1][0] = p2->x - p0->x; + m.m[2][0] = -praydir->x; + m.m[3][0] = 0.0f; + m.m[0][1] = p1->y - p0->z; + m.m[1][1] = p2->y - p0->z; + m.m[2][1] = -praydir->y; + m.m[3][1] = 0.0f; + m.m[0][2] = p1->z - p0->z; + m.m[1][2] = p2->z - p0->z; + m.m[2][2] = -praydir->z; + m.m[3][2] = 0.0f; + m.m[0][3] = 0.0f; + m.m[1][3] = 0.0f; + m.m[2][3] = 0.0f; + m.m[3][3] = 1.0f; + + vec.x = praypos->x - p0->x; + vec.y = praypos->y - p0->y; + vec.z = praypos->z - p0->z; + vec.w = 0.0f; + + if ( D3DXMatrixInverse(&m, NULL, &m) ) + { + D3DXVec4Transform(&vec, &vec, &m); + if ( (vec.x >= 0.0f) && (vec.y >= 0.0f) && (vec.x + vec.y <= 1.0f) && (vec.z >= 0.0f) ) + { + *pu = vec.x; + *pv = vec.y; + *pdist = fabs( vec.z ); + return TRUE; + } + } + +return FALSE; +} + BOOL WINAPI D3DXSphereBoundProbe(CONST D3DXVECTOR3 *pcenter, FLOAT radius, CONST D3DXVECTOR3 *prayposition, CONST D3DXVECTOR3 *praydirection) { D3DXVECTOR3 difference; diff --git a/dlls/d3dx8/tests/math.c b/dlls/d3dx8/tests/math.c index b1bfd74cfe8..6a7f99da03b 100644 --- a/dlls/d3dx8/tests/math.c +++ b/dlls/d3dx8/tests/math.c @@ -166,6 +166,15 @@ static void D3DXColorTest(void) ok(funcpointer == NULL, "Expected: %p, Got: %p\n", NULL, funcpointer); } +static void D3DXFresnelTest(void) +{ + FLOAT expected, got; + + expected = 0.089187; + got = D3DXFresnelTerm(0.5f,1.5); + ok( fabs(got - expected) < admitted_error, "Expected: %f, Got: %f\n", expected, got); +} + static void D3DXMatrixTest(void) { D3DXMATRIX expectedmat, gotmat, mat, mat2, mat3; @@ -1498,6 +1507,7 @@ static void test_matrix_stack(void) START_TEST(math) { D3DXColorTest(); + D3DXFresnelTest(); D3DXMatrixTest(); D3DXPlaneTest(); D3X8QuaternionTest(); diff --git a/dlls/d3dx8/tests/mesh.c b/dlls/d3dx8/tests/mesh.c index e3370de036e..4dfa11fb8e8 100644 --- a/dlls/d3dx8/tests/mesh.c +++ b/dlls/d3dx8/tests/mesh.c @@ -20,6 +20,13 @@ #include "wine/test.h" +#define admitted_error 0.0001f + +static BOOL compare(FLOAT u, FLOAT v) +{ + return (fabs(u-v) < admitted_error); +} + static void D3DXBoundProbeTest(void) { BOOL result; @@ -94,7 +101,61 @@ static void D3DXBoundProbeTest(void) ok(result == FALSE, "expected FALSE, received TRUE\n"); } +static void D3DXIntersectTriTest(void) +{ + BOOL exp_res, got_res; + D3DXVECTOR3 position, ray, vertex[3]; + FLOAT exp_dist, got_dist, exp_u, got_u, exp_v, got_v; + + vertex[0].x = 1.0f; vertex[0].y = 0.0f; vertex[0].z = 0.0f; + vertex[1].x = 2.0f; vertex[1].y = 0.0f; vertex[1].z = 0.0f; + vertex[2].x = 1.0f; vertex[2].y = 1.0f; vertex[2].z = 0.0f; + + position.x = -14.5f; position.y = -23.75f; position.z = -32.0f; + + ray.x = 2.0f; ray.y = 3.0f; ray.z = 4.0f; + + exp_res = TRUE; exp_u = 0.5f; exp_v = 0.25f; exp_dist = 8.0f; + + got_res = D3DXIntersectTri(&vertex[0],&vertex[1],&vertex[2],&position,&ray,&got_u,&got_v,&got_dist); + ok( got_res == exp_res, "Expected result = %d, got %d\n",exp_res,got_res); + ok( compare(exp_u,got_u), "Expected u = %f, got %f\n",exp_u,got_u); + ok( compare(exp_v,got_v), "Expected v = %f, got %f\n",exp_v,got_v); + ok( compare(exp_dist,got_dist), "Expected distance = %f, got %f\n",exp_dist,got_dist); + +/*Only positive ray is taken in account*/ + + vertex[0].x = 1.0f; vertex[0].y = 0.0f; vertex[0].z = 0.0f; + vertex[1].x = 2.0f; vertex[1].y = 0.0f; vertex[1].z = 0.0f; + vertex[2].x = 1.0f; vertex[2].y = 1.0f; vertex[2].z = 0.0f; + + position.x = 17.5f; position.y = 24.25f; position.z = 32.0f; + + ray.x = 2.0f; ray.y = 3.0f; ray.z = 4.0f; + + exp_res = FALSE; + + got_res = D3DXIntersectTri(&vertex[0],&vertex[1],&vertex[2],&position,&ray,&got_u,&got_v,&got_dist); + ok( got_res == exp_res, "Expected result = %d, got %d\n",exp_res,got_res); + +/*Intersection between ray and triangle in a same plane is considered as empty*/ + + vertex[0].x = 4.0f; vertex[0].y = 0.0f; vertex[0].z = 0.0f; + vertex[1].x = 6.0f; vertex[1].y = 0.0f; vertex[1].z = 0.0f; + vertex[2].x = 4.0f; vertex[2].y = 2.0f; vertex[2].z = 0.0f; + + position.x = 1.0f; position.y = 1.0f; position.z = 0.0f; + + ray.x = 1.0f; ray.y = 0.0f; ray.z = 0.0f; + + exp_res = FALSE; + + got_res = D3DXIntersectTri(&vertex[0],&vertex[1],&vertex[2],&position,&ray,&got_u,&got_v,&got_dist); + ok( got_res == exp_res, "Expected result = %d, got %d\n",exp_res,got_res); +} + START_TEST(mesh) { D3DXBoundProbeTest(); + D3DXIntersectTriTest(); } diff --git a/dlls/d3dx9_36/Makefile.in b/dlls/d3dx9_36/Makefile.in index 0b5a3d3ac0d..7cd5c3c6108 100644 --- a/dlls/d3dx9_36/Makefile.in +++ b/dlls/d3dx9_36/Makefile.in @@ -10,6 +10,7 @@ C_SRCS = \ d3dx9_36_main.c \ font.c \ math.c \ + mesh.c \ shader.c \ sprite.c diff --git a/dlls/d3dx9_36/d3dx9_36.spec b/dlls/d3dx9_36/d3dx9_36.spec index d7fba368b55..813a5ad46a4 100644 --- a/dlls/d3dx9_36/d3dx9_36.spec +++ b/dlls/d3dx9_36/d3dx9_36.spec @@ -167,7 +167,7 @@ @ stdcall D3DXGetVertexShaderProfile(ptr) @ stdcall D3DXIntersect(ptr ptr ptr ptr ptr ptr ptr ptr ptr ptr) d3dx8.D3DXIntersect @ stdcall D3DXIntersectSubset(ptr long ptr ptr ptr ptr ptr ptr ptr ptr ptr) d3dx8.D3DXIntersectSubset -@ stdcall D3DXIntersectTri(ptr ptr ptr ptr ptr ptr ptr ptr) d3dx8.D3DXIntersectTri +@ stdcall D3DXIntersectTri(ptr ptr ptr ptr ptr ptr ptr ptr) @ stub D3DXLoadMeshFromXA @ stub D3DXLoadMeshFromXInMemory @ stub D3DXLoadMeshFromXResource diff --git a/dlls/d3dx9_36/math.c b/dlls/d3dx9_36/math.c index 13b8bd34c75..2bf301b2602 100644 --- a/dlls/d3dx9_36/math.c +++ b/dlls/d3dx9_36/math.c @@ -164,13 +164,13 @@ D3DXMATRIX* WINAPI D3DXMatrixTransformation2D( { sca.x=pscaling->x; sca.y=pscaling->y; - sca.z=0.0f; + sca.z=1.0f; } else { - sca.x=0.0f; - sca.y=0.0f; - sca.z=0.0f; + sca.x=1.0f; + sca.y=1.0f; + sca.z=1.0f; } if ( protationcenter ) @@ -222,7 +222,7 @@ D3DXPLANE* WINAPI D3DXPlaneTransformArray( CONST D3DXMATRIX* matrix, UINT elements) { UINT i; - TRACE("\n"); + for (i = 0; i < elements; ++i) { D3DXPlaneTransform( (D3DXPLANE*)((char*)out + outstride * i), @@ -242,7 +242,7 @@ D3DXVECTOR4* WINAPI D3DXVec2TransformArray( CONST D3DXMATRIX* matrix, UINT elements) { UINT i; - TRACE("\n"); + for (i = 0; i < elements; ++i) { D3DXVec2Transform( (D3DXVECTOR4*)((char*)out + outstride * i), @@ -260,7 +260,7 @@ D3DXVECTOR2* WINAPI D3DXVec2TransformCoordArray( CONST D3DXMATRIX* matrix, UINT elements) { UINT i; - TRACE("\n"); + for (i = 0; i < elements; ++i) { D3DXVec2TransformCoord( (D3DXVECTOR2*)((char*)out + outstride * i), @@ -278,7 +278,7 @@ D3DXVECTOR2* WINAPI D3DXVec2TransformNormalArray( CONST D3DXMATRIX *matrix, UINT elements) { UINT i; - TRACE("\n"); + for (i = 0; i < elements; ++i) { D3DXVec2TransformNormal( (D3DXVECTOR2*)((char*)out + outstride * i), @@ -299,7 +299,7 @@ D3DXVECTOR3* WINAPI D3DXVec3ProjectArray( CONST D3DXMATRIX* view, CONST D3DXMATRIX* world, UINT elements) { UINT i; - TRACE("\n"); + for (i = 0; i < elements; ++i) { D3DXVec3Project( (D3DXVECTOR3*)((char*)out + outstride * i), @@ -317,7 +317,7 @@ D3DXVECTOR4* WINAPI D3DXVec3TransformArray( CONST D3DXMATRIX* matrix, UINT elements) { UINT i; - TRACE("\n"); + for (i = 0; i < elements; ++i) { D3DXVec3Transform( (D3DXVECTOR4*)((char*)out + outstride * i), @@ -335,7 +335,7 @@ D3DXVECTOR3* WINAPI D3DXVec3TransformCoordArray( CONST D3DXMATRIX* matrix, UINT elements) { UINT i; - TRACE("\n"); + for (i = 0; i < elements; ++i) { D3DXVec3TransformCoord( (D3DXVECTOR3*)((char*)out + outstride * i), @@ -353,7 +353,7 @@ D3DXVECTOR3* WINAPI D3DXVec3TransformNormalArray( CONST D3DXMATRIX* matrix, UINT elements) { UINT i; - TRACE("\n"); + for (i = 0; i < elements; ++i) { D3DXVec3TransformNormal( (D3DXVECTOR3*)((char*)out + outstride * i), @@ -372,7 +372,7 @@ D3DXVECTOR3* WINAPI D3DXVec3UnprojectArray( CONST D3DXMATRIX* view, CONST D3DXMATRIX* world, UINT elements) { UINT i; - TRACE("\n"); + for (i = 0; i < elements; ++i) { D3DXVec3Unproject( (D3DXVECTOR3*)((char*)out + outstride * i), @@ -390,7 +390,7 @@ D3DXVECTOR4* WINAPI D3DXVec4TransformArray( CONST D3DXMATRIX* matrix, UINT elements) { UINT i; - TRACE("\n"); + for (i = 0; i < elements; ++i) { D3DXVec4Transform( (D3DXVECTOR4*)((char*)out + outstride * i), diff --git a/dlls/d3dx9_36/mesh.c b/dlls/d3dx9_36/mesh.c new file mode 100644 index 00000000000..0ecace6ccf4 --- /dev/null +++ b/dlls/d3dx9_36/mesh.c @@ -0,0 +1,72 @@ + /* + * Mesh operations specific to D3DX9. + * + * Copyright (C) 2009 David Adam + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA + */ + +#include "config.h" +#include "windef.h" +#include "wingdi.h" +#include "wine/debug.h" +#include "d3dx9.h" + +WINE_DEFAULT_DEBUG_CHANNEL(d3dx); + +/************************************************************************* + * D3DXIntersectTri + */ +BOOL WINAPI D3DXIntersectTri(CONST D3DXVECTOR3 *p0, CONST D3DXVECTOR3 *p1, CONST D3DXVECTOR3 *p2, CONST D3DXVECTOR3 *praypos, CONST D3DXVECTOR3 *praydir, FLOAT *pu, FLOAT *pv, FLOAT *pdist) +{ + D3DXMATRIX m; + D3DXVECTOR4 vec; + + m.m[0][0] = p1->x - p0->x; + m.m[1][0] = p2->x - p0->x; + m.m[2][0] = -praydir->x; + m.m[3][0] = 0.0f; + m.m[0][1] = p1->y - p0->z; + m.m[1][1] = p2->y - p0->z; + m.m[2][1] = -praydir->y; + m.m[3][1] = 0.0f; + m.m[0][2] = p1->z - p0->z; + m.m[1][2] = p2->z - p0->z; + m.m[2][2] = -praydir->z; + m.m[3][2] = 0.0f; + m.m[0][3] = 0.0f; + m.m[1][3] = 0.0f; + m.m[2][3] = 0.0f; + m.m[3][3] = 1.0f; + + vec.x = praypos->x - p0->x; + vec.y = praypos->y - p0->y; + vec.z = praypos->z - p0->z; + vec.w = 0.0f; + + if ( D3DXMatrixInverse(&m, NULL, &m) ) + { + D3DXVec4Transform(&vec, &vec, &m); + if ( (vec.x >= 0.0f) && (vec.y >= 0.0f) && (vec.x + vec.y <= 1.0f) && (vec.z >= 0.0f) ) + { + *pu = vec.x; + *pv = vec.y; + *pdist = fabs( vec.z ); + return TRUE; + } + } + + return FALSE; +} diff --git a/dlls/d3dx9_36/tests/math.c b/dlls/d3dx9_36/tests/math.c index 50db67b0c47..8a9c3e2b8ac 100644 --- a/dlls/d3dx9_36/tests/math.c +++ b/dlls/d3dx9_36/tests/math.c @@ -612,7 +612,7 @@ static void test_Matrix_Transformation2D(void) U(exp_mat).m[3][1] = -13.401899f; U(exp_mat).m[0][2] = 0.0f; U(exp_mat).m[1][2] = 0.0f; - U(exp_mat).m[2][2] = 0.0f; + U(exp_mat).m[2][2] = 1.0f; U(exp_mat).m[3][2] = 0.0f; U(exp_mat).m[0][3] = 0.0f; U(exp_mat).m[1][3] = 0.0f; @@ -635,17 +635,17 @@ static void test_Matrix_Transformation2D(void) sca_rot = 5.0f*D3DX_PI/4.0f; - U(exp_mat).m[0][0] = 0.0f; - U(exp_mat).m[1][0] = 0.0f; + U(exp_mat).m[0][0] = 0.50f; + U(exp_mat).m[1][0] = -0.866025f; U(exp_mat).m[2][0] = 0.0f; - U(exp_mat).m[3][0] = 2.830127f; - U(exp_mat).m[0][1] = 0.0f; - U(exp_mat).m[1][1] = 0.0f; + U(exp_mat).m[3][0] = -6.0f; + U(exp_mat).m[0][1] = 0.866025f; + U(exp_mat).m[1][1] = 0.50f; U(exp_mat).m[2][1] = 0.0f; - U(exp_mat).m[3][1] = 12.294229f; + U(exp_mat).m[3][1] = 7.0f; U(exp_mat).m[0][2] = 0.0f; U(exp_mat).m[1][2] = 0.0f; - U(exp_mat).m[2][2] = 0.0f; + U(exp_mat).m[2][2] = 1.0f; U(exp_mat).m[3][2] = 0.0f; U(exp_mat).m[0][3] = 0.0f; U(exp_mat).m[1][3] = 0.0f; @@ -655,6 +655,29 @@ static void test_Matrix_Transformation2D(void) D3DXMatrixTransformation2D(&got_mat, &sca_center, sca_rot, NULL, NULL, rot, &trans); expect_mat(&exp_mat, &got_mat); + +/*_________*/ + + U(exp_mat).m[0][0] = 0.50f; + U(exp_mat).m[1][0] = -0.866025f; + U(exp_mat).m[2][0] = 0.0f; + U(exp_mat).m[3][0] = 0.0f; + U(exp_mat).m[0][1] = 0.866025f; + U(exp_mat).m[1][1] = 0.50f; + U(exp_mat).m[2][1] = 0.0f; + U(exp_mat).m[3][1] = 0.0f; + U(exp_mat).m[0][2] = 0.0f; + U(exp_mat).m[1][2] = 0.0f; + U(exp_mat).m[2][2] = 1.0f; + U(exp_mat).m[3][2] = 0.0f; + U(exp_mat).m[0][3] = 0.0f; + U(exp_mat).m[1][3] = 0.0f; + U(exp_mat).m[2][3] = 0.0f; + U(exp_mat).m[3][3] = 1.0f; + + D3DXMatrixTransformation2D(&got_mat, NULL, sca_rot, NULL, NULL, rot, NULL); + + expect_mat(&exp_mat, &got_mat); } static void test_D3DXVec_Array(void) diff --git a/dlls/d3dxof/d3dxof.c b/dlls/d3dxof/d3dxof.c index 6aa0032d73e..fb52a199c75 100644 --- a/dlls/d3dxof/d3dxof.c +++ b/dlls/d3dxof/d3dxof.c @@ -46,8 +46,6 @@ WINE_DEFAULT_DEBUG_CHANNEL(d3dxof); #define XOFFILE_FORMAT_FLOAT_BITS_32 MAKEFOUR('0','0','3','2') #define XOFFILE_FORMAT_FLOAT_BITS_64 MAKEFOUR('0','0','6','4') -#define MAX_INPUT_SIZE 2000000 - static const struct IDirectXFileVtbl IDirectXFile_Vtbl; static const struct IDirectXFileBinaryVtbl IDirectXFileBinary_Vtbl; static const struct IDirectXFileDataVtbl IDirectXFileData_Vtbl; @@ -130,8 +128,11 @@ static HRESULT WINAPI IDirectXFileImpl_CreateEnumObject(IDirectXFile* iface, LPV IDirectXFileEnumObjectImpl* object; HRESULT hr; DWORD header[4]; - DWORD size; HANDLE hFile = INVALID_HANDLE_VALUE; + HANDLE file_mapping = 0; + LPBYTE buffer = NULL; + DWORD file_size = 0; + LPDXFILELOADMEMORY lpdxflm = NULL; TRACE("(%p/%p)->(%p,%x,%p)\n", This, iface, pvSource, dwLoadOptions, ppEnumObj); @@ -150,17 +151,27 @@ static HRESULT WINAPI IDirectXFileImpl_CreateEnumObject(IDirectXFile* iface, LPV return DXFILEERR_FILENOTFOUND; } - if (!ReadFile(hFile, header, 16, &size, NULL)) + file_size = GetFileSize(hFile, NULL); + if (file_size < 16) { - hr = DXFILEERR_BADVALUE; + hr = DXFILEERR_BADFILETYPE; + goto error; + } + + file_mapping = CreateFileMappingA(hFile, NULL, PAGE_READONLY, 0, 0, NULL); + if (!file_mapping) + { + hr = DXFILEERR_BADFILETYPE; goto error; } - if (size < 16) + buffer = MapViewOfFile(file_mapping, FILE_MAP_READ, 0, 0, 0); + if (!buffer) { hr = DXFILEERR_BADFILETYPE; goto error; } + memcpy(header, buffer, 16); } else if (dwLoadOptions == DXFILELOAD_FROMMEMORY) { @@ -224,6 +235,8 @@ static HRESULT WINAPI IDirectXFileImpl_CreateEnumObject(IDirectXFile* iface, LPV object->source = dwLoadOptions; object->hFile = hFile; + object->file_mapping = file_mapping; + object->buffer = buffer; object->pDirectXFile = This; object->buf.pdxf = This; object->buf.txt = (header[2] == XOFFILE_FORMAT_TEXT); @@ -232,22 +245,8 @@ static HRESULT WINAPI IDirectXFileImpl_CreateEnumObject(IDirectXFile* iface, LPV if (dwLoadOptions == DXFILELOAD_FROMFILE) { - object->buf.buffer = HeapAlloc(GetProcessHeap(), 0, MAX_INPUT_SIZE+1); - if (!object->buf.buffer) - { - ERR("Out of memory\n"); - hr = DXFILEERR_BADALLOC; - goto error; - } - - ReadFile(hFile, object->buf.buffer, MAX_INPUT_SIZE+1, &object->buf.rem_bytes, NULL); - if (object->buf.rem_bytes > MAX_INPUT_SIZE) - { - FIXME("File size > %d not supported yet\n", MAX_INPUT_SIZE); - HeapFree(GetProcessHeap(), 0, object->buf.buffer); - hr = DXFILEERR_PARSEERROR; - goto error; - } + object->buf.buffer = buffer + 16; + object->buf.rem_bytes = file_size - 16; } else { @@ -255,7 +254,7 @@ static HRESULT WINAPI IDirectXFileImpl_CreateEnumObject(IDirectXFile* iface, LPV object->buf.rem_bytes = lpdxflm->dSize; } - TRACE("Read %d bytes\n", object->buf.rem_bytes); + TRACE("Object size is %d bytes\n", object->buf.rem_bytes + 16); *ppEnumObj = (LPDIRECTXFILEENUMOBJECT)object; @@ -286,6 +285,10 @@ static HRESULT WINAPI IDirectXFileImpl_CreateEnumObject(IDirectXFile* iface, LPV return DXFILE_OK; error: + if (buffer) + UnmapViewOfFile(buffer); + if (file_mapping) + CloseHandle(file_mapping); if (hFile != INVALID_HANDLE_VALUE) CloseHandle(hFile); *ppEnumObj = NULL; @@ -972,7 +975,8 @@ static ULONG WINAPI IDirectXFileEnumObjectImpl_Release(IDirectXFileEnumObject* i } if (This->source == DXFILELOAD_FROMFILE) { - HeapFree(GetProcessHeap(), 0, This->buf.buffer); + UnmapViewOfFile(This->buffer); + CloseHandle(This->file_mapping); CloseHandle(This->hFile); } HeapFree(GetProcessHeap(), 0, This); diff --git a/dlls/d3dxof/d3dxof_private.h b/dlls/d3dxof/d3dxof_private.h index 585f9d5ab03..978b3122da7 100644 --- a/dlls/d3dxof/d3dxof_private.h +++ b/dlls/d3dxof/d3dxof_private.h @@ -149,6 +149,8 @@ typedef struct { LONG ref; DXFILELOADOPTIONS source; HANDLE hFile; + HANDLE file_mapping; + LPBYTE buffer; parse_buffer buf; IDirectXFileImpl* pDirectXFile; ULONG nb_xobjects; diff --git a/dlls/dbghelp/dbghelp_private.h b/dlls/dbghelp/dbghelp_private.h index 880aed9a86b..0345a3fd872 100644 --- a/dlls/dbghelp/dbghelp_private.h +++ b/dlls/dbghelp/dbghelp_private.h @@ -29,6 +29,7 @@ #include "objbase.h" #include "oaidl.h" #include "winnls.h" +#include "wine/list.h" #include "wine/unicode.h" #include "cvconst.h" @@ -37,13 +38,14 @@ struct pool /* poor's man */ { - struct pool_arena* first; - unsigned arena_size; + struct list arena_list; + struct list arena_full; + size_t arena_size; }; -void pool_init(struct pool* a, unsigned arena_size); +void pool_init(struct pool* a, size_t arena_size); void pool_destroy(struct pool* a); -void* pool_alloc(struct pool* a, unsigned len); +void* pool_alloc(struct pool* a, size_t len); char* pool_strdup(struct pool* a, const char* str); struct vector @@ -90,7 +92,6 @@ void hash_table_init(struct pool* pool, struct hash_table* ht, unsigned num_buckets); void hash_table_destroy(struct hash_table* ht); void hash_table_add(struct hash_table* ht, struct hash_table_elt* elt); -void* hash_table_find(const struct hash_table* ht, const char* name); struct hash_table_iter { diff --git a/dlls/dbghelp/module.c b/dlls/dbghelp/module.c index 49b774262ce..fcdea2e114e 100644 --- a/dlls/dbghelp/module.c +++ b/dlls/dbghelp/module.c @@ -543,7 +543,7 @@ DWORD64 WINAPI SymLoadModuleExW(HANDLE hProcess, HANDLE hFile, PCWSTR wImageNam if (!(module = pe_load_native_module(pcs, wImageName, hFile, BaseOfDll, SizeOfDll))) { /* and finally and ELF module */ - if (module_get_type_by_name(wImageName) == DMT_ELF) + if (wImageName && (module_get_type_by_name(wImageName) == DMT_ELF)) module = elf_load_module(pcs, wImageName, BaseOfDll); } } diff --git a/dlls/dbghelp/source.c b/dlls/dbghelp/source.c index 8eef33727cd..dd8fc6e876a 100644 --- a/dlls/dbghelp/source.c +++ b/dlls/dbghelp/source.c @@ -26,9 +26,6 @@ #include "dbghelp_private.h" #include "wine/debug.h" -#ifdef HAVE_REGEX_H -# include -#endif WINE_DEFAULT_DEBUG_CHANNEL(dbghelp); @@ -154,116 +151,6 @@ BOOL WINAPI SymEnumSourceFiles(HANDLE hProcess, ULONG64 ModBase, PCSTR Mask, return TRUE; } -static inline void re_append(char** mask, unsigned* len, char ch) -{ - *mask = HeapReAlloc(GetProcessHeap(), 0, *mask, ++(*len)); - (*mask)[*len - 2] = ch; -} - -static BOOL compile_regex(regex_t* re, const char* srcfile) -{ - char* mask; - unsigned len = 1; - - mask = HeapAlloc(GetProcessHeap(), 0, 1); - re_append(&mask, &len, '^'); - if (!srcfile || !*srcfile) re_append(&mask, &len, '*'); - else while (*srcfile) - { - switch (*srcfile) - { - case '\\': - case '/': - re_append(&mask, &len, '['); - re_append(&mask, &len, '\\'); - re_append(&mask, &len, '\\'); - re_append(&mask, &len, '/'); - re_append(&mask, &len, ']'); - break; - case '.': - re_append(&mask, &len, '\\'); - re_append(&mask, &len, '.'); - break; - default: - re_append(&mask, &len, *srcfile); - break; - } - srcfile++; - } - re_append(&mask, &len, '$'); - mask[len - 1] = '\0'; - len = regcomp(re, mask, REG_NOSUB); - HeapFree(GetProcessHeap(), 0, mask); - if (len) - { - FIXME("Couldn't compile %s\n", mask); - SetLastError(ERROR_INVALID_PARAMETER); - return FALSE; - } - return TRUE; -} - -/****************************************************************** - * SymEnumLines (DBGHELP.@) - * - */ -BOOL WINAPI SymEnumLines(HANDLE hProcess, ULONG64 base, PCSTR compiland, - PCSTR srcfile, PSYM_ENUMLINES_CALLBACK cb, PVOID user) -{ - struct module_pair pair; - struct hash_table_iter hti; - struct symt_ht* sym; - regex_t re; - struct line_info* dli; - void* ptr; - SRCCODEINFO sci; - const char* file; - - if (!cb) return FALSE; - if (!(dbghelp_options & SYMOPT_LOAD_LINES)) return TRUE; - - pair.pcs = process_find_by_handle(hProcess); - if (!pair.pcs) return FALSE; - if (compiland) FIXME("Unsupported yet (filtering on compiland %s)\n", compiland); - pair.requested = module_find_by_addr(pair.pcs, base, DMT_UNKNOWN); - if (!module_get_debug(&pair)) return FALSE; - if (!compile_regex(&re, srcfile)) return FALSE; - - sci.SizeOfStruct = sizeof(sci); - sci.ModBase = base; - - hash_table_iter_init(&pair.effective->ht_symbols, &hti, NULL); - while ((ptr = hash_table_iter_up(&hti))) - { - unsigned int i; - - sym = GET_ENTRY(ptr, struct symt_ht, hash_elt); - if (sym->symt.tag != SymTagFunction) continue; - - sci.FileName[0] = '\0'; - for (i=0; ivlines); i++) - { - dli = vector_at(&((struct symt_function*)sym)->vlines, i); - if (dli->is_source_file) - { - file = source_get(pair.effective, dli->u.source_file); - if (regexec(&re, file, 0, NULL, 0) != 0) file = ""; - strcpy(sci.FileName, file); - } - else if (sci.FileName[0]) - { - sci.Key = dli; - sci.Obj[0] = '\0'; /* FIXME */ - sci.LineNumber = dli->line_number; - sci.Address = dli->u.pc_offset; - if (!cb(&sci, user)) break; - } - } - } - regfree(&re); - return TRUE; -} - /****************************************************************** * SymGetSourceFileToken (DBGHELP.@) * diff --git a/dlls/dbghelp/storage.c b/dlls/dbghelp/storage.c index ec8a37d7f3e..d3f59494ab8 100644 --- a/dlls/dbghelp/storage.c +++ b/dlls/dbghelp/storage.c @@ -34,14 +34,16 @@ WINE_DEFAULT_DEBUG_CHANNEL(dbghelp); struct pool_arena { - struct pool_arena* next; - char* current; + struct list entry; + char *current; + char *end; }; -void pool_init(struct pool* a, unsigned arena_size) +void pool_init(struct pool* a, size_t arena_size) { + list_init( &a->arena_list ); + list_init( &a->arena_full ); a->arena_size = arena_size; - a->first = NULL; } void pool_destroy(struct pool* pool) @@ -50,58 +52,73 @@ void pool_destroy(struct pool* pool) struct pool_arena* next; #ifdef USE_STATS - unsigned alloc, used, num; - + size_t alloc, used, num; + alloc = used = num = 0; - arena = pool->first; - while (arena) + LIST_FOR_EACH_ENTRY( arena, &pool->arena_list, struct pool_arena, entry ) { - alloc += pool->arena_size; + alloc += arena->end - (char *)arena; + used += arena->current - (char*)arena; + num++; + } + LIST_FOR_EACH_ENTRY( arena, &pool->arena_full, struct pool_arena, entry ) + { + alloc += arena->end - (char *)arena; used += arena->current - (char*)arena; num++; - arena = arena->next; } if (alloc == 0) alloc = 1; /* avoid division by zero */ - FIXME("STATS: pool %p has allocated %u kbytes, used %u kbytes in %u arenas,\n" - "\t\t\t\tnon-allocation ratio: %.2f%%\n", - pool, alloc >> 10, used >> 10, num, 100.0 - (float)used / (float)alloc * 100.0); + FIXME("STATS: pool %p has allocated %u kbytes, used %u kbytes in %u arenas, non-allocation ratio: %.2f%%\n", + pool, (unsigned)(alloc >> 10), (unsigned)(used >> 10), (unsigned)num, + 100.0 - (float)used / (float)alloc * 100.0); #endif - arena = pool->first; - while (arena) + LIST_FOR_EACH_ENTRY_SAFE( arena, next, &pool->arena_list, struct pool_arena, entry ) + { + list_remove( &arena->entry ); + HeapFree(GetProcessHeap(), 0, arena); + } + LIST_FOR_EACH_ENTRY_SAFE( arena, next, &pool->arena_full, struct pool_arena, entry ) { - next = arena->next; + list_remove( &arena->entry ); HeapFree(GetProcessHeap(), 0, arena); - arena = next; } - pool_init(pool, 0); } -void* pool_alloc(struct pool* pool, unsigned len) +void* pool_alloc(struct pool* pool, size_t len) { struct pool_arena* arena; void* ret; + size_t size; len = (len + 3) & ~3; /* round up size on DWORD boundary */ - assert(sizeof(struct pool_arena) + len <= pool->arena_size && len); - for (arena = pool->first; arena; arena = arena->next) + LIST_FOR_EACH_ENTRY( arena, &pool->arena_list, struct pool_arena, entry ) { - if ((char*)arena + pool->arena_size - arena->current >= len) + if (arena->end - arena->current >= len) { ret = arena->current; arena->current += len; + if (arena->current + 16 >= arena->end) + { + list_remove( &arena->entry ); + list_add_tail( &pool->arena_full, &arena->entry ); + } return ret; } } - arena = HeapAlloc(GetProcessHeap(), 0, pool->arena_size); - if (!arena) {ERR("OOM\n");return NULL;} + size = max( pool->arena_size, len + sizeof(struct pool_arena) ); + arena = HeapAlloc(GetProcessHeap(), 0, size); + if (!arena) {ERR("OOM for %u\n", size);return NULL;} - ret = (char*)arena + sizeof(*arena); - arena->next = pool->first; - pool->first = arena; + ret = arena + 1; arena->current = (char*)ret + len; + arena->end = (char *)arena + size; + if (arena->current + 16 >= arena->end) + list_add_tail( &pool->arena_full, &arena->entry ); + else + list_add_head( &pool->arena_list, &arena->entry ); return ret; } @@ -379,18 +396,6 @@ void hash_table_add(struct hash_table* ht, struct hash_table_elt* elt) ht->num_elts++; } -void* hash_table_find(const struct hash_table* ht, const char* name) -{ - unsigned hash = hash_table_hash(name, ht->num_buckets); - struct hash_table_elt* elt; - - if(!ht->buckets) return NULL; - - for (elt = ht->buckets[hash]; elt; elt = elt->next) - if (!strcmp(name, elt->name)) return elt; - return NULL; -} - void hash_table_iter_init(const struct hash_table* ht, struct hash_table_iter* hti, const char* name) { diff --git a/dlls/dbghelp/symbol.c b/dlls/dbghelp/symbol.c index 4df69d13d47..9e66f00ce6c 100644 --- a/dlls/dbghelp/symbol.c +++ b/dlls/dbghelp/symbol.c @@ -67,11 +67,7 @@ int symt_cmp_addr(const void* p1, const void* p2) return cmp_addr(a1, a2); } -static inline void re_append(char** mask, unsigned* len, char ch) -{ - *mask = HeapReAlloc(GetProcessHeap(), 0, *mask, ++(*len)); - (*mask)[*len - 2] = ch; -} +#ifdef HAVE_REGEX_H /* transforms a dbghelp's regular expression into a POSIX one * Here are the valid dbghelp reg ex characters: @@ -84,47 +80,135 @@ static inline void re_append(char** mask, unsigned* len, char ch) */ static void compile_regex(const char* str, int numchar, regex_t* re, BOOL _case) { - char* mask = HeapAlloc(GetProcessHeap(), 0, 1); - unsigned len = 1; + char *mask, *p; BOOL in_escape = FALSE; unsigned flags = REG_NOSUB; - re_append(&mask, &len, '^'); + if (numchar == -1) numchar = strlen( str ); + + p = mask = HeapAlloc( GetProcessHeap(), 0, 2 * numchar + 3 ); + *p++ = '^'; while (*str && numchar--) { /* FIXME: this shouldn't be valid on '-' */ if (in_escape) { - re_append(&mask, &len, '\\'); - re_append(&mask, &len, *str); + *p++ = '\\'; + *p++ = *str; in_escape = FALSE; } else switch (*str) { case '\\': in_escape = TRUE; break; - case '*': re_append(&mask, &len, '.'); re_append(&mask, &len, '*'); break; - case '?': re_append(&mask, &len, '.'); break; - case '#': re_append(&mask, &len, '*'); break; + case '*': *p++ = '.'; *p++ = '*'; break; + case '?': *p++ = '.'; break; + case '#': *p++ = '*'; break; /* escape some valid characters in dbghelp reg exp:s */ - case '$': re_append(&mask, &len, '\\'); re_append(&mask, &len, '$'); break; + case '$': *p++ = '\\'; *p++ = '$'; break; /* +, [, ], - are the same in dbghelp & POSIX, use them as any other char */ - default: re_append(&mask, &len, *str); break; + default: *p++ = *str; break; } str++; } if (in_escape) { - re_append(&mask, &len, '\\'); - re_append(&mask, &len, '\\'); + *p++ = '\\'; + *p++ = '\\'; } - re_append(&mask, &len, '$'); - mask[len - 1] = '\0'; + *p++ = '$'; + *p = 0; if (_case) flags |= REG_ICASE; if (regcomp(re, mask, flags)) FIXME("Couldn't compile %s\n", mask); HeapFree(GetProcessHeap(), 0, mask); } +static BOOL compile_file_regex(regex_t* re, const char* srcfile) +{ + char *mask, *p; + BOOL ret; + + p = mask = HeapAlloc(GetProcessHeap(), 0, 5 * strlen(srcfile) + 4); + *p++ = '^'; + if (!srcfile || !*srcfile) *p++ = '*'; + else while (*srcfile) + { + switch (*srcfile) + { + case '\\': + case '/': + *p++ = '['; + *p++ = '\\'; + *p++ = '\\'; + *p++ = '/'; + *p++ = ']'; + break; + case '.': + *p++ = '\\'; + *p++ = '.'; + break; + default: + *p++ = *srcfile; + break; + } + srcfile++; + } + *p++ = '$'; + *p = 0; + ret = !regcomp(re, mask, REG_NOSUB); + HeapFree(GetProcessHeap(), 0, mask); + if (!ret) + { + FIXME("Couldn't compile %s\n", mask); + SetLastError(ERROR_INVALID_PARAMETER); + } + return ret; +} + +static int match_regexp( const regex_t *re, const char *str ) +{ + return !regexec( re, str, 0, NULL, 0 ); +} + +#else /* HAVE_REGEX_H */ + +/* if we don't have regexp support, fall back to a simple string comparison */ + +typedef struct +{ + char *str; + BOOL icase; +} regex_t; + +static void compile_regex(const char* str, int numchar, regex_t* re, BOOL _case) +{ + if (numchar == -1) numchar = strlen( str ); + + re->str = HeapAlloc( GetProcessHeap(), 0, numchar + 1 ); + memcpy( re->str, str, numchar ); + re->str[numchar] = 0; + re->icase = _case; +} + +static BOOL compile_file_regex(regex_t* re, const char* srcfile) +{ + compile_regex( srcfile, -1, re, FALSE ); + return TRUE; +} + +static int match_regexp( const regex_t *re, const char *str ) +{ + if (re->icase) return !lstrcmpiA( re->str, str ); + return !strcmp( re->str, str ); +} + +static void regfree( regex_t *re ) +{ + HeapFree( GetProcessHeap(), 0, re->str ); +} + +#endif /* HAVE_REGEX_H */ + struct symt_compiland* symt_new_compiland(struct module* module, unsigned long address, unsigned src_idx) { @@ -662,8 +746,7 @@ static BOOL symt_enum_module(struct module_pair* pair, const regex_t* regex, while ((ptr = hash_table_iter_up(&hti))) { sym = GET_ENTRY(ptr, struct symt_ht, hash_elt); - if (sym->hash_elt.name && - regexec(regex, sym->hash_elt.name, 0, NULL, 0) == 0) + if (sym->hash_elt.name && match_regexp(regex, sym->hash_elt.name)) { se->sym_info->SizeOfStruct = sizeof(SYMBOL_INFO); se->sym_info->MaxNameLen = sizeof(se->buffer) - sizeof(SYMBOL_INFO); @@ -812,7 +895,7 @@ static BOOL symt_enum_locals_helper(struct module_pair* pair, } break; case SymTagData: - if (regexec(preg, symt_get_name(lsym), 0, NULL, 0) == 0) + if (match_regexp(preg, symt_get_name(lsym))) { if (send_symbol(se, pair, func, lsym)) return FALSE; } @@ -916,7 +999,7 @@ static BOOL sym_enum(HANDLE hProcess, ULONG64 BaseOfDll, PCSTR Mask, { if (pair.requested->type == DMT_PE && module_get_debug(&pair)) { - if (regexec(&mod_regex, pair.requested->module_name, 0, NULL, 0) == 0 && + if (match_regexp(&mod_regex, pair.requested->module_name) && symt_enum_module(&pair, &sym_regex, se)) break; } @@ -931,7 +1014,7 @@ static BOOL sym_enum(HANDLE hProcess, ULONG64 BaseOfDll, PCSTR Mask, !module_get_containee(pair.pcs, pair.requested) && module_get_debug(&pair)) { - if (regexec(&mod_regex, pair.requested->module_name, 0, NULL, 0) == 0 && + if (match_regexp(&mod_regex, pair.requested->module_name) && symt_enum_module(&pair, &sym_regex, se)) break; } @@ -1645,7 +1728,7 @@ BOOL WINAPI SymMatchString(PCSTR string, PCSTR re, BOOL _case) TRACE("%s %s %c\n", string, re, _case ? 'Y' : 'N'); compile_regex(re, -1, &preg, _case); - ret = regexec(&preg, string, 0, NULL, 0) == 0; + ret = match_regexp(&preg, string); regfree(&preg); return ret; } @@ -1762,3 +1845,64 @@ BOOL WINAPI SymSetScopeFromAddr(HANDLE hProcess, ULONG64 addr) if (!(pcs = process_find_by_handle(hProcess))) return FALSE; return TRUE; } + +/****************************************************************** + * SymEnumLines (DBGHELP.@) + * + */ +BOOL WINAPI SymEnumLines(HANDLE hProcess, ULONG64 base, PCSTR compiland, + PCSTR srcfile, PSYM_ENUMLINES_CALLBACK cb, PVOID user) +{ + struct module_pair pair; + struct hash_table_iter hti; + struct symt_ht* sym; + regex_t re; + struct line_info* dli; + void* ptr; + SRCCODEINFO sci; + const char* file; + + if (!cb) return FALSE; + if (!(dbghelp_options & SYMOPT_LOAD_LINES)) return TRUE; + + pair.pcs = process_find_by_handle(hProcess); + if (!pair.pcs) return FALSE; + if (compiland) FIXME("Unsupported yet (filtering on compiland %s)\n", compiland); + pair.requested = module_find_by_addr(pair.pcs, base, DMT_UNKNOWN); + if (!module_get_debug(&pair)) return FALSE; + if (!compile_file_regex(&re, srcfile)) return FALSE; + + sci.SizeOfStruct = sizeof(sci); + sci.ModBase = base; + + hash_table_iter_init(&pair.effective->ht_symbols, &hti, NULL); + while ((ptr = hash_table_iter_up(&hti))) + { + unsigned int i; + + sym = GET_ENTRY(ptr, struct symt_ht, hash_elt); + if (sym->symt.tag != SymTagFunction) continue; + + sci.FileName[0] = '\0'; + for (i=0; ivlines); i++) + { + dli = vector_at(&((struct symt_function*)sym)->vlines, i); + if (dli->is_source_file) + { + file = source_get(pair.effective, dli->u.source_file); + if (!match_regexp(&re, file)) file = ""; + strcpy(sci.FileName, file); + } + else if (sci.FileName[0]) + { + sci.Key = dli; + sci.Obj[0] = '\0'; /* FIXME */ + sci.LineNumber = dli->line_number; + sci.Address = dli->u.pc_offset; + if (!cb(&sci, user)) break; + } + } + } + regfree(&re); + return TRUE; +} diff --git a/dlls/dinput/dinput_main.c b/dlls/dinput/dinput_main.c index 46e4e281e73..bdcf557eca0 100644 --- a/dlls/dinput/dinput_main.c +++ b/dlls/dinput/dinput_main.c @@ -885,6 +885,7 @@ HRESULT WINAPI DllGetClassObject(REFCLSID rclsid, REFIID riid, LPVOID *ppv) static LRESULT CALLBACK LL_hook_proc( int code, WPARAM wparam, LPARAM lparam ) { IDirectInputImpl *dinput; + int skip = 0; if (code != HC_ACTION) return CallNextHookEx( 0, code, wparam, lparam ); @@ -899,12 +900,13 @@ static LRESULT CALLBACK LL_hook_proc( int code, WPARAM wparam, LPARAM lparam ) { TRACE("calling %p->%p (%lx %lx)\n", dev, dev->event_proc, wparam, lparam); dev->event_proc( (LPDIRECTINPUTDEVICE8A)dev, wparam, lparam ); + skip |= dev->dwCoopLevel & DISCL_EXCLUSIVE; } LeaveCriticalSection( &dinput->crit ); } LeaveCriticalSection( &dinput_hook_crit ); - return CallNextHookEx( 0, code, wparam, lparam ); + return skip ? 1 : CallNextHookEx( 0, code, wparam, lparam ); } static LRESULT CALLBACK callwndproc_proc( int code, WPARAM wparam, LPARAM lparam ) diff --git a/dlls/dinput/effect_linuxinput.c b/dlls/dinput/effect_linuxinput.c index 155d800d97a..3c86a34489d 100644 --- a/dlls/dinput/effect_linuxinput.c +++ b/dlls/dinput/effect_linuxinput.c @@ -55,6 +55,7 @@ struct LinuxInputEffectImpl struct ff_effect effect; /* Effect data */ int gain; /* Effect gain */ + int first_axis_is_x; int* fd; /* Parent device */ struct list *entry; /* Entry into the parent's list of effects */ }; @@ -512,12 +513,6 @@ static HRESULT WINAPI LinuxInputEffectImpl_Start( } event.type = EV_FF; - - event.code = FF_GAIN; - event.value = This->gain; - if (write(*(This->fd), &event, sizeof(event)) == -1) - FIXME("Failed setting gain. Error: %d \"%s\".\n", errno, strerror(errno)); - event.code = This->effect.id; event.value = dwIterations; if (write(*(This->fd), &event, sizeof(event)) == -1) { @@ -554,6 +549,7 @@ static HRESULT WINAPI LinuxInputEffectImpl_SetParameters( return DIERR_INVALIDPARAM; else if (peff->cAxes < 1) return DIERR_INCOMPLETEEFFECT; + This->first_axis_is_x = peff->rgdwAxes[0] == DIJOFS_X; } /* some of this may look funky, but it's 'cause the linux driver and directx have @@ -578,15 +574,15 @@ static HRESULT WINAPI LinuxInputEffectImpl_SetParameters( } } else { /* two axes */ if (peff->dwFlags & DIEFF_CARTESIAN) { - /* avoid divide-by-zero */ - if (peff->rglDirection[1] == 0) { - if (peff->rglDirection[0] >= 0) - This->effect.direction = 0x4000; - else if (peff->rglDirection[0] < 0) - This->effect.direction = 0xC000; + LONG x, y; + if (This->first_axis_is_x) { + x = peff->rglDirection[0]; + y = peff->rglDirection[1]; } else { - This->effect.direction = (int)(atan(peff->rglDirection[0] / peff->rglDirection[1]) * 0x7FFF / (3 * M_PI)); + x = peff->rglDirection[1]; + y = peff->rglDirection[0]; } + This->effect.direction = (int)((3 * M_PI / 2 - atan2(y, x)) * -0x7FFF / M_PI); } else { /* Polar and spherical are the same for 2 axes */ /* Precision is important here, so we do double math with exact constants */ @@ -627,8 +623,10 @@ static HRESULT WINAPI LinuxInputEffectImpl_SetParameters( /* Gain and Sample Period settings are not supported by the linux * event system */ - if (dwFlags & DIEP_GAIN) + if (dwFlags & DIEP_GAIN) { This->gain = 0xFFFF * peff->dwGain / 10000; + TRACE("Effect gain requested but no effect gain functionality present.\n"); + } if (dwFlags & DIEP_SAMPLEPERIOD) TRACE("Sample period requested but no sample period functionality present.\n"); diff --git a/dlls/dinput/joystick_linuxinput.c b/dlls/dinput/joystick_linuxinput.c index e1b92f7313c..c24ade98ad9 100644 --- a/dlls/dinput/joystick_linuxinput.c +++ b/dlls/dinput/joystick_linuxinput.c @@ -194,6 +194,7 @@ struct JoystickImpl struct list ff_effects; int ff_state; int ff_autocenter; + int ff_gain; }; static void fake_current_js_state(JoystickImpl *ji); @@ -461,6 +462,7 @@ static JoystickImpl *alloc_device(REFGUID rguid, const void *jvt, IDirectInputIm Instead, track it with ff_autocenter, and assume it's initialy enabled. */ newDevice->ff_autocenter = 1; + newDevice->ff_gain = 0xFFFF; InitializeCriticalSection(&newDevice->base.crit); newDevice->base.crit.DebugInfo->Spare[0] = (DWORD_PTR)(__FILE__ ": JoystickImpl*->base.crit"); @@ -670,12 +672,16 @@ static HRESULT WINAPI JoystickAImpl_Acquire(LPDIRECTINPUTDEVICE8A iface) } else { + struct input_event event; + + event.type = EV_FF; + event.code = FF_GAIN; + event.value = This->ff_gain; + if (write(This->joyfd, &event, sizeof(event)) == -1) + ERR("Failed to set gain (%i): %d %s\n", This->ff_gain, errno, strerror(errno)); if (!This->ff_autocenter) { - struct input_event event; - /* Disable autocenter. */ - event.type = EV_FF; event.code = FF_AUTOCENTER; event.value = 0; if (write(This->joyfd, &event, sizeof(event)) == -1) @@ -974,6 +980,23 @@ static HRESULT WINAPI JoystickAImpl_SetProperty(LPDIRECTINPUTDEVICE8A iface, fake_current_js_state(This); break; } + case (DWORD_PTR)DIPROP_FFGAIN: { + LPCDIPROPDWORD pd = (LPCDIPROPDWORD)ph; + + TRACE("DIPROP_FFGAIN(%d)\n", pd->dwData); + This->ff_gain = MulDiv(pd->dwData, 0xFFFF, 10000); + if (This->base.acquired) { + /* Update immediately. */ + struct input_event event; + + event.type = EV_FF; + event.code = FF_GAIN; + event.value = This->ff_gain; + if (write(This->joyfd, &event, sizeof(event)) == -1) + ERR("Failed to set gain (%i): %d %s\n", This->ff_gain, errno, strerror(errno)); + } + break; + } default: return IDirectInputDevice2AImpl_SetProperty(iface, rguid, ph); } @@ -1085,6 +1108,14 @@ static HRESULT WINAPI JoystickAImpl_GetProperty(LPDIRECTINPUTDEVICE8A iface, TRACE("autocenter(%d)\n", pd->dwData); break; } + case (DWORD_PTR) DIPROP_FFGAIN: + { + LPDIPROPDWORD pd = (LPDIPROPDWORD)pdiph; + + pd->dwData = MulDiv(This->ff_gain, 10000, 0xFFFF); + TRACE("DIPROP_FFGAIN(%d)\n", pd->dwData); + break; + } default: return IDirectInputDevice2AImpl_GetProperty(iface, rguid, pdiph); diff --git a/dlls/dinput/tests/joystick.c b/dlls/dinput/tests/joystick.c index 371f7ee9cb0..944dbb1724f 100644 --- a/dlls/dinput/tests/joystick.c +++ b/dlls/dinput/tests/joystick.c @@ -330,6 +330,7 @@ static BOOL CALLBACK EnumJoysticks( LONG cnt1, cnt2; HWND real_hWnd; HINSTANCE hInstance = GetModuleHandle(NULL); + DIPROPDWORD dip_gain_set, dip_gain_get; trace("Testing force-feedback\n"); memset(&eff, 0, sizeof(eff)); @@ -486,6 +487,65 @@ static BOOL CALLBACK EnumJoysticks( ok(hr==DI_OK,"IDirectInputDevice_Acquire() failed: %08x\n", hr); hr = IDirectInputDevice2_GetProperty(pJoystick, DIPROP_AUTOCENTER, &diprop_word.diph); + /* Device gain (DIPROP_FFGAIN). + * From MSDN: + * 0..10000 range, otherwise DIERR_INVALIDPARAM. + * Can be changed even if device is acquired. + * Difference found by tests: + * <0 is refused, >10000 is accepted + */ + dip_gain_set.diph.dwSize = sizeof(DIPROPDWORD); + dip_gain_set.diph.dwHeaderSize = sizeof(DIPROPHEADER); + dip_gain_set.diph.dwObj = 0; + dip_gain_set.diph.dwHow = DIPH_DEVICE; + dip_gain_set.dwData = 10000; + dip_gain_get.diph.dwSize = sizeof(DIPROPDWORD); + dip_gain_get.diph.dwHeaderSize = sizeof(DIPROPHEADER); + dip_gain_get.diph.dwObj = 0; + dip_gain_get.diph.dwHow = DIPH_DEVICE; + dip_gain_get.dwData = 0; + + /* Test device is acquisition (non)impact. */ + hr = IDirectInputDevice_Unacquire(pJoystick); + ok(hr == DI_OK, "IDirectInputDevice_Unacquire() should have returned S_FALSE, got: %08x\n", hr); + dip_gain_set.dwData = 1; + hr = IDirectInputDevice_SetProperty(pJoystick, DIPROP_FFGAIN, &dip_gain_set.diph); + ok(hr==DI_OK, "IDirectInputDevice_SetProperty() failed: %08x\n", hr); + hr = IDirectInputDevice_GetProperty(pJoystick, DIPROP_FFGAIN, &dip_gain_get.diph); + ok(hr==DI_OK, "IDirectInputDevice_GetProperty() failed: %08x\n", hr); + ok(dip_gain_get.dwData==dip_gain_set.dwData, "Gain not udated: %i\n", dip_gain_get.dwData); + hr = IDirectInputDevice_Acquire(pJoystick); + ok(hr==DI_OK,"IDirectInputDevice_Acquire() failed: %08x\n", hr); + dip_gain_set.dwData = 2; + hr = IDirectInputDevice_SetProperty(pJoystick, DIPROP_FFGAIN, &dip_gain_set.diph); + ok(hr==DI_OK, "IDirectInputDevice_SetProperty() failed: %08x\n", hr); + hr = IDirectInputDevice_GetProperty(pJoystick, DIPROP_FFGAIN, &dip_gain_get.diph); + ok(hr==DI_OK, "IDirectInputDevice_GetProperty() failed: %08x\n", hr); + ok(dip_gain_get.dwData==dip_gain_set.dwData, "Gain not udated: %i\n", dip_gain_get.dwData); + /* Test range and internal clamping. */ + dip_gain_set.dwData = -1; + hr = IDirectInputDevice_SetProperty(pJoystick, DIPROP_FFGAIN, &dip_gain_set.diph); + todo_wine ok(hr==DIERR_INVALIDPARAM, "IDirectInputDevice_SetProperty() should have returned %08x: %08x\n", DIERR_INVALIDPARAM, hr); + dip_gain_set.dwData = 0; + hr = IDirectInputDevice_SetProperty(pJoystick, DIPROP_FFGAIN, &dip_gain_set.diph); + ok(hr==DI_OK, "IDirectInputDevice_SetProperty() failed: %08x\n", hr); + hr = IDirectInputDevice_GetProperty(pJoystick, DIPROP_FFGAIN, &dip_gain_get.diph); + ok(hr==DI_OK, "IDirectInputDevice_GetProperty() failed: %08x\n", hr); + ok(dip_gain_get.dwData==dip_gain_set.dwData, "Gain not updated: %i\n", dip_gain_get.dwData); + dip_gain_set.dwData = 10000; + hr = IDirectInputDevice_SetProperty(pJoystick, DIPROP_FFGAIN, &dip_gain_set.diph); + ok(hr==DI_OK, "IDirectInputDevice_SetProperty() failed: %08x\n", hr); + hr = IDirectInputDevice_GetProperty(pJoystick, DIPROP_FFGAIN, &dip_gain_get.diph); + ok(hr==DI_OK, "IDirectInputDevice_GetProperty() failed: %08x\n", hr); + ok(dip_gain_get.dwData==dip_gain_set.dwData, "Gain not updated: %i\n", dip_gain_get.dwData); + /* WARNING: This call succeeds, on the contrary of what is stated on MSDN. */ + dip_gain_set.dwData = 10001; + hr = IDirectInputDevice_SetProperty(pJoystick, DIPROP_FFGAIN, &dip_gain_set.diph); + ok(hr==DI_OK, "IDirectInputDevice_SetProperty() failed: %08x\n", hr); + hr = IDirectInputDevice_GetProperty(pJoystick, DIPROP_FFGAIN, &dip_gain_get.diph); + ok(hr==DI_OK, "IDirectInputDevice_GetProperty() failed: %08x\n", hr); + ok(dip_gain_get.dwData==dip_gain_set.dwData, "Gain not updated: %i\n", dip_gain_get.dwData); + ref = IUnknown_Release(effect); ok(ref == 0, "IDirectInputDevice_Release() reference count = %d\n", ref); } diff --git a/dlls/dmime/segtriggertrack.c b/dlls/dmime/segtriggertrack.c index 1f9e784331f..16fd3c3701d 100644 --- a/dlls/dmime/segtriggertrack.c +++ b/dlls/dmime/segtriggertrack.c @@ -274,7 +274,7 @@ static HRESULT IDirectMusicSegTriggerTrack_IPersistStream_ParseSegment (LPPERSIS TRACE_(dmfile)(": segment item chunk\n"); /** alloc new item entry */ pNewItem = HeapAlloc (GetProcessHeap (), HEAP_ZERO_MEMORY, sizeof(DMUS_PRIVATE_SEGMENT_ITEM)); - if (NULL == pNewItem) { + if (!pNewItem) { ERR(": no more memory\n"); return E_OUTOFMEMORY; } @@ -288,6 +288,10 @@ static HRESULT IDirectMusicSegTriggerTrack_IPersistStream_ParseSegment (LPPERSIS } case DMUS_FOURCC_SEGMENTITEMNAME_CHUNK: { TRACE_(dmfile)(": segment item name chunk\n"); + if (!pNewItem) { + ERR(": pNewItem not allocated, bad chunk order?\n"); + return E_FAIL; + } IStream_Read (pStm, pNewItem->wszName, Chunk.dwSize, NULL); TRACE_(dmfile)(" - name: %s\n", debugstr_w(pNewItem->wszName)); break; @@ -305,6 +309,10 @@ static HRESULT IDirectMusicSegTriggerTrack_IPersistStream_ParseSegment (LPPERSIS ERR(": could not load Reference\n"); return hr; } + if (!pNewItem) { + ERR(": pNewItem not allocated, bad chunk order?\n"); + return E_FAIL; + } pNewItem->pObject = pObject; break; } diff --git a/dlls/dmloader/container.c b/dlls/dmloader/container.c index 081fcce7877..3cd166edf06 100644 --- a/dlls/dmloader/container.c +++ b/dlls/dmloader/container.c @@ -125,29 +125,15 @@ static HRESULT WINAPI IDirectMusicContainerImpl_IDirectMusicContainer_EnumObject TRACE("(%p, %s, %d, %p, %p)\n", This, debugstr_dmguid(rguidClass), dwIndex, pDesc, pwszAlias); - /* check if we can write to whole pDesc */ - if (pDesc) { - if (IsBadReadPtr (pDesc, sizeof(DWORD))) { - ERR(": pDesc->dwSize bad read pointer\n"); - return E_POINTER; - } - if (pDesc->dwSize != sizeof(DMUS_OBJECTDESC)) { - ERR(": invalid pDesc->dwSize\n"); - return E_INVALIDARG; - } - if (IsBadWritePtr (pDesc, sizeof(DMUS_OBJECTDESC))) { - ERR(": pDesc bad write pointer\n"); - return E_POINTER; - } - } - /* check if wszAlias is big enough */ - if (pwszAlias && IsBadWritePtr (pwszAlias, DMUS_MAX_FILENAME_SIZE)) { - ERR(": wszAlias bad write pointer\n"); - return E_POINTER; + if (!pDesc) + return E_POINTER; + if (pDesc->dwSize != sizeof(DMUS_OBJECTDESC)) { + ERR(": invalid pDesc->dwSize %d\n", pDesc->dwSize); + return E_INVALIDARG; } - + DM_STRUCT_INIT(pDesc); - + LIST_FOR_EACH (pEntry, This->pContainedObjects) { pContainedObject = LIST_ENTRY (pEntry, WINE_CONTAINER_ENTRY, entry); diff --git a/dlls/dmstyle/style.c b/dlls/dmstyle/style.c index 79c3fddcf26..eb6e77c8c33 100644 --- a/dlls/dmstyle/style.c +++ b/dlls/dmstyle/style.c @@ -500,9 +500,9 @@ static HRESULT IDirectMusicStyle8Impl_IPersistStream_ParsePartRefList (LPPERSIST case DMUS_FOURCC_PARTREF_CHUNK: { TRACE_(dmfile)(": PartRef chunk\n"); pNewItem = HeapAlloc (GetProcessHeap (), HEAP_ZERO_MEMORY, sizeof(DMUS_PRIVATE_STYLE_PARTREF_ITEM)); - if (NULL == pNewItem) { + if (!pNewItem) { ERR(": no more memory\n"); - return E_OUTOFMEMORY; + return E_OUTOFMEMORY; } hr = IStream_Read (pStm, &pNewItem->part_ref, sizeof(DMUS_IO_PARTREF), NULL); /*TRACE_(dmfile)(" - sizeof %lu\n", sizeof(DMUS_IO_PARTREF));*/ @@ -523,6 +523,10 @@ static HRESULT IDirectMusicStyle8Impl_IPersistStream_ParsePartRefList (LPPERSIST ListCount[1] += sizeof(FOURCC) + sizeof(DWORD) + Chunk.dwSize; TRACE_(dmfile)(": %s chunk (size = %d)", debugstr_fourcc (Chunk.fccID), Chunk.dwSize); + if (!pNewItem) { + ERR(": pNewItem not yet allocated, chunk order bad?\n"); + return E_OUTOFMEMORY; + } hr = IDirectMusicUtils_IPersistStream_ParseUNFOGeneric(&Chunk, pStm, &pNewItem->desc); if (FAILED(hr)) return hr; diff --git a/dlls/dplayx/dplayx_global.c b/dlls/dplayx/dplayx_global.c index 7cafb59cca4..938ade98082 100644 --- a/dlls/dplayx/dplayx_global.c +++ b/dlls/dplayx/dplayx_global.c @@ -450,33 +450,6 @@ BOOL DPLAYX_CreateLobbyApplication( DWORD dwAppID ) return FALSE; } -/* I'm not sure when I'm going to need this, but here it is */ -BOOL DPLAYX_DestroyLobbyApplication( DWORD dwAppID ) -{ - UINT i; - - DPLAYX_AcquireSemaphore(); - - /* Find an empty space in the list and insert the data */ - for( i=0; i < numSupportedLobbies; i++ ) - { - if( lobbyData[ i ].dwAppID == dwAppID ) - { - /* FIXME: Should free up anything unused. Tisk tisk :0 */ - /* Mark this entry unused */ - TRACE( "Marking lobbyData[%u] unused\n", i ); - DPLAYX_InitializeLobbyDataEntry( &lobbyData[ i ] ); - - DPLAYX_ReleaseSemaphore(); - return TRUE; - } - } - - DPLAYX_ReleaseSemaphore(); - ERR( "Unable to find global entry for application\n" ); - return FALSE; -} - BOOL DPLAYX_SetLobbyHandles( DWORD dwAppID, HANDLE hStart, HANDLE hDeath, HANDLE hConnRead ) { diff --git a/dlls/dplayx/name_server.c b/dlls/dplayx/name_server.c index 7bb8e7ba789..e6a6b621d9d 100644 --- a/dlls/dplayx/name_server.c +++ b/dlls/dplayx/name_server.c @@ -83,13 +83,6 @@ void NS_SetLocalComputerAsNameServer( LPCDPSESSIONDESC2 lpsd, LPVOID lpNSInfo ) lpCache->bNsIsLocal = TRUE; } -void NS_SetRemoteComputerAsNameServer( LPCDPSESSIONDESC2 lpsd, LPVOID lpNSInfo ) -{ - lpNSCache lpCache = (lpNSCache)lpNSInfo; - - lpCache->bNsIsLocal = FALSE; -} - static DPQ_DECL_COMPARECB( cbUglyPig, GUID ) { return IsEqualGUID( elem1, elem2 ); diff --git a/dlls/dplayx/name_server.h b/dlls/dplayx/name_server.h index a1d3dd7311e..9c09ec60a7d 100644 --- a/dlls/dplayx/name_server.h +++ b/dlls/dplayx/name_server.h @@ -29,7 +29,6 @@ #include "dplay_global.h" void NS_SetLocalComputerAsNameServer( LPCDPSESSIONDESC2 lpsd, LPVOID lpNSInfo ); -void NS_SetRemoteComputerAsNameServer( LPCDPSESSIONDESC2 lpsd, LPVOID lpNSInfo ); void NS_AddRemoteComputerAsNameServer( LPCVOID lpNSAddrHdr, DWORD dwHdrSize, LPCDPMSG_ENUMSESSIONSREPLY lpcMsg, diff --git a/dlls/dsound/capture.c b/dlls/dsound/capture.c index 1e32d7feec0..6b0cd5b2945 100644 --- a/dlls/dsound/capture.c +++ b/dlls/dsound/capture.c @@ -1634,14 +1634,6 @@ static HRESULT DirectSoundCaptureDevice_Create( return DS_OK; } -ULONG DirectSoundCaptureDevice_AddRef( - DirectSoundCaptureDevice * device) -{ - ULONG ref = InterlockedIncrement(&(device->ref)); - TRACE("(%p) ref was %d\n", device, ref - 1); - return ref; -} - ULONG DirectSoundCaptureDevice_Release( DirectSoundCaptureDevice * device) { diff --git a/dlls/fusion/tests/fusion.c b/dlls/fusion/tests/fusion.c index 878a18e6025..b285ba051c1 100644 --- a/dlls/fusion/tests/fusion.c +++ b/dlls/fusion/tests/fusion.c @@ -34,12 +34,9 @@ static CHAR string1[MAX_PATH], string2[MAX_PATH]; #define ok_w2(format, szString1, szString2) \ \ - if (lstrcmpW(szString1, szString2) != 0) \ - { \ - WideCharToMultiByte(CP_ACP, 0, szString1, -1, string1, MAX_PATH, NULL, NULL); \ - WideCharToMultiByte(CP_ACP, 0, szString2, -1, string2, MAX_PATH, NULL, NULL); \ - ok(0, format, string1, string2); \ - } + WideCharToMultiByte(CP_ACP, 0, szString1, -1, string1, MAX_PATH, NULL, NULL); \ + WideCharToMultiByte(CP_ACP, 0, szString2, -1, string2, MAX_PATH, NULL, NULL); \ + ok(!lstrcmpA(string1, string2), format, string1, string2) static BOOL init_functionpointers(void) { diff --git a/dlls/gdi32/font.c b/dlls/gdi32/font.c index 4e271eaadec..205224bd8fe 100644 --- a/dlls/gdi32/font.c +++ b/dlls/gdi32/font.c @@ -2336,6 +2336,8 @@ DWORD WINAPI GetGlyphOutlineA( HDC hdc, UINT uChar, UINT fuFormat, DWORD ret; UINT c; + if (!lpmat2) return GDI_ERROR; + if(!(fuFormat & GGO_GLYPH_INDEX)) { int len; char mbchs[2]; @@ -2364,12 +2366,15 @@ DWORD WINAPI GetGlyphOutlineW( HDC hdc, UINT uChar, UINT fuFormat, LPGLYPHMETRICS lpgm, DWORD cbBuffer, LPVOID lpBuffer, const MAT2 *lpmat2 ) { - DC *dc = get_dc_ptr(hdc); + DC *dc; DWORD ret; TRACE("(%p, %04x, %04x, %p, %d, %p, %p)\n", hdc, uChar, fuFormat, lpgm, cbBuffer, lpBuffer, lpmat2 ); + if (!lpmat2) return GDI_ERROR; + + dc = get_dc_ptr(hdc); if(!dc) return GDI_ERROR; if(dc->gdiFont) diff --git a/dlls/gdi32/freetype.c b/dlls/gdi32/freetype.c index 5c7b51bbf97..34e4aed8c0f 100644 --- a/dlls/gdi32/freetype.c +++ b/dlls/gdi32/freetype.c @@ -3333,7 +3333,7 @@ GdiFont *WineEngCreateFontInstance(DC *dc, HFONT hfont) { /* Windows 3.1 compatibility mode GM_COMPATIBLE has only limited font scaling abilities. */ - dcmat.eM11 = dcmat.eM22 = fabs(dc->xformWorld2Vport.eM22); + dcmat.eM11 = dcmat.eM22 = dc->vport2WorldValid ? fabs(dc->xformWorld2Vport.eM22) : 1.0; dcmat.eM21 = dcmat.eM12 = 0; } @@ -4417,7 +4417,7 @@ DWORD WineEngGetGlyphOutline(GdiFont *incoming_font, UINT glyph, UINT format, font->gmsize * sizeof(GM*)); } else { if (format == GGO_METRICS && font->gm[original_index / GM_BLOCK_SIZE] != NULL && - FONT_GM(font,original_index)->init && (!lpmat || is_identity_MAT2(lpmat))) + FONT_GM(font,original_index)->init && is_identity_MAT2(lpmat)) { *lpgm = FONT_GM(font,original_index)->gm; TRACE("cached: %u,%u,%s,%d,%d\n", lpgm->gmBlackBoxX, lpgm->gmBlackBoxY, @@ -4499,7 +4499,7 @@ DWORD WineEngGetGlyphOutline(GdiFont *incoming_font, UINT glyph, UINT format, } /* Extra transformation specified by caller */ - if (lpmat && !is_identity_MAT2(lpmat)) + if (!is_identity_MAT2(lpmat)) { FT_Matrix extraMat; extraMat.xx = FT_FixedFromFIXED(lpmat->eM11); @@ -4588,7 +4588,7 @@ DWORD WineEngGetGlyphOutline(GdiFont *incoming_font, UINT glyph, UINT format, lpgm->gmCellIncX, lpgm->gmCellIncY); if ((format == GGO_METRICS || format == GGO_BITMAP || format == WINE_GGO_GRAY16_BITMAP) && - (!lpmat || is_identity_MAT2(lpmat))) /* don't cache custom transforms */ + is_identity_MAT2(lpmat)) /* don't cache custom transforms */ { FONT_GM(font,original_index)->gm = *lpgm; FONT_GM(font,original_index)->adv = adv; @@ -5600,6 +5600,7 @@ static BOOL get_glyph_index_linked(GdiFont *font, UINT c, GdiFont **linked_font, BOOL WineEngGetCharWidth(GdiFont *font, UINT firstChar, UINT lastChar, LPINT buffer) { + static const MAT2 identity = { {0,1},{0,0},{0,0},{0,1} }; UINT c; GLYPHMETRICS gm; FT_UInt glyph_index; @@ -5612,7 +5613,7 @@ BOOL WineEngGetCharWidth(GdiFont *font, UINT firstChar, UINT lastChar, for(c = firstChar; c <= lastChar; c++) { get_glyph_index_linked(font, c, &linked_font, &glyph_index); WineEngGetGlyphOutline(linked_font, glyph_index, GGO_METRICS | GGO_GLYPH_INDEX, - &gm, 0, NULL, NULL); + &gm, 0, NULL, &identity); buffer[c - firstChar] = FONT_GM(linked_font,glyph_index)->adv; } LeaveCriticalSection( &freetype_cs ); @@ -5626,6 +5627,7 @@ BOOL WineEngGetCharWidth(GdiFont *font, UINT firstChar, UINT lastChar, BOOL WineEngGetCharABCWidths(GdiFont *font, UINT firstChar, UINT lastChar, LPABC buffer) { + static const MAT2 identity = { {0,1},{0,0},{0,0},{0,1} }; UINT c; GLYPHMETRICS gm; FT_UInt glyph_index; @@ -5642,7 +5644,7 @@ BOOL WineEngGetCharABCWidths(GdiFont *font, UINT firstChar, UINT lastChar, for(c = firstChar; c <= lastChar; c++) { get_glyph_index_linked(font, c, &linked_font, &glyph_index); WineEngGetGlyphOutline(linked_font, glyph_index, GGO_METRICS | GGO_GLYPH_INDEX, - &gm, 0, NULL, NULL); + &gm, 0, NULL, &identity); buffer[c - firstChar].abcA = FONT_GM(linked_font,glyph_index)->lsb; buffer[c - firstChar].abcB = FONT_GM(linked_font,glyph_index)->bbx; buffer[c - firstChar].abcC = FONT_GM(linked_font,glyph_index)->adv - FONT_GM(linked_font,glyph_index)->lsb - @@ -5659,6 +5661,7 @@ BOOL WineEngGetCharABCWidths(GdiFont *font, UINT firstChar, UINT lastChar, BOOL WineEngGetCharABCWidthsI(GdiFont *font, UINT firstChar, UINT count, LPWORD pgi, LPABC buffer) { + static const MAT2 identity = { {0,1},{0,0},{0,0},{0,1} }; UINT c; GLYPHMETRICS gm; FT_UInt glyph_index; @@ -5674,7 +5677,7 @@ BOOL WineEngGetCharABCWidthsI(GdiFont *font, UINT firstChar, UINT count, LPWORD if (!pgi) for(c = firstChar; c < firstChar+count; c++) { WineEngGetGlyphOutline(linked_font, c, GGO_METRICS | GGO_GLYPH_INDEX, - &gm, 0, NULL, NULL); + &gm, 0, NULL, &identity); buffer[c - firstChar].abcA = FONT_GM(linked_font,c)->lsb; buffer[c - firstChar].abcB = FONT_GM(linked_font,c)->bbx; buffer[c - firstChar].abcC = FONT_GM(linked_font,c)->adv - FONT_GM(linked_font,c)->lsb @@ -5683,7 +5686,7 @@ BOOL WineEngGetCharABCWidthsI(GdiFont *font, UINT firstChar, UINT count, LPWORD else for(c = 0; c < count; c++) { WineEngGetGlyphOutline(linked_font, pgi[c], GGO_METRICS | GGO_GLYPH_INDEX, - &gm, 0, NULL, NULL); + &gm, 0, NULL, &identity); buffer[c].abcA = FONT_GM(linked_font,pgi[c])->lsb; buffer[c].abcB = FONT_GM(linked_font,pgi[c])->bbx; buffer[c].abcC = FONT_GM(linked_font,pgi[c])->adv @@ -5701,6 +5704,7 @@ BOOL WineEngGetCharABCWidthsI(GdiFont *font, UINT firstChar, UINT count, LPWORD BOOL WineEngGetTextExtentExPoint(GdiFont *font, LPCWSTR wstr, INT count, INT max_ext, LPINT pnfit, LPINT dxs, LPSIZE size) { + static const MAT2 identity = { {0,1},{0,0},{0,0},{0,1} }; INT idx; INT nfit = 0, ext; GLYPHMETRICS gm; @@ -5721,7 +5725,7 @@ BOOL WineEngGetTextExtentExPoint(GdiFont *font, LPCWSTR wstr, INT count, for(idx = 0; idx < count; idx++) { get_glyph_index_linked(font, wstr[idx], &linked_font, &glyph_index); WineEngGetGlyphOutline(linked_font, glyph_index, GGO_METRICS | GGO_GLYPH_INDEX, - &gm, 0, NULL, NULL); + &gm, 0, NULL, &identity); size->cx += FONT_GM(linked_font,glyph_index)->adv; ext = size->cx; if (! pnfit || ext <= max_ext) { @@ -5746,6 +5750,7 @@ BOOL WineEngGetTextExtentExPoint(GdiFont *font, LPCWSTR wstr, INT count, BOOL WineEngGetTextExtentExPointI(GdiFont *font, const WORD *indices, INT count, INT max_ext, LPINT pnfit, LPINT dxs, LPSIZE size) { + static const MAT2 identity = { {0,1},{0,0},{0,0},{0,1} }; INT idx; INT nfit = 0, ext; GLYPHMETRICS gm; @@ -5763,7 +5768,7 @@ BOOL WineEngGetTextExtentExPointI(GdiFont *font, const WORD *indices, INT count, for(idx = 0; idx < count; idx++) { WineEngGetGlyphOutline(font, indices[idx], GGO_METRICS | GGO_GLYPH_INDEX, &gm, 0, NULL, - NULL); + &identity); size->cx += FONT_GM(font,indices[idx])->adv; ext = size->cx; if (! pnfit || ext <= max_ext) { diff --git a/dlls/gdi32/gdi16.c b/dlls/gdi32/gdi16.c index b70b44ed04e..1d0344bbd92 100644 --- a/dlls/gdi32/gdi16.c +++ b/dlls/gdi32/gdi16.c @@ -1983,12 +1983,15 @@ DWORD WINAPI GetGlyphOutline16( HDC16 hdc, UINT16 uChar, UINT16 fuFormat, GLYPHMETRICS gm32; ret = GetGlyphOutlineA( HDC_32(hdc), uChar, fuFormat, &gm32, cbBuffer, lpBuffer, lpmat2); - lpgm->gmBlackBoxX = gm32.gmBlackBoxX; - lpgm->gmBlackBoxY = gm32.gmBlackBoxY; - lpgm->gmptGlyphOrigin.x = gm32.gmptGlyphOrigin.x; - lpgm->gmptGlyphOrigin.y = gm32.gmptGlyphOrigin.y; - lpgm->gmCellIncX = gm32.gmCellIncX; - lpgm->gmCellIncY = gm32.gmCellIncY; + if (ret && ret != GDI_ERROR) + { + lpgm->gmBlackBoxX = gm32.gmBlackBoxX; + lpgm->gmBlackBoxY = gm32.gmBlackBoxY; + lpgm->gmptGlyphOrigin.x = gm32.gmptGlyphOrigin.x; + lpgm->gmptGlyphOrigin.y = gm32.gmptGlyphOrigin.y; + lpgm->gmCellIncX = gm32.gmCellIncX; + lpgm->gmCellIncY = gm32.gmCellIncY; + } return ret; } diff --git a/dlls/gdi32/path.c b/dlls/gdi32/path.c index 8df8a1bb2d6..3ad551e8bb3 100644 --- a/dlls/gdi32/path.c +++ b/dlls/gdi32/path.c @@ -1454,17 +1454,18 @@ BOOL PATH_ExtTextOut(DC *dc, INT x, INT y, UINT flags, const RECT *lprc, for (idx = 0; idx < count; idx++) { + static const MAT2 identity = { {0,1},{0,0},{0,0},{0,1} }; GLYPHMETRICS gm; DWORD dwSize; void *outline; - dwSize = GetGlyphOutlineW(hdc, str[idx], GGO_GLYPH_INDEX | GGO_NATIVE, &gm, 0, NULL, NULL); + dwSize = GetGlyphOutlineW(hdc, str[idx], GGO_GLYPH_INDEX | GGO_NATIVE, &gm, 0, NULL, &identity); if (!dwSize) return FALSE; outline = HeapAlloc(GetProcessHeap(), 0, dwSize); if (!outline) return FALSE; - GetGlyphOutlineW(hdc, str[idx], GGO_GLYPH_INDEX | GGO_NATIVE, &gm, dwSize, outline, NULL); + GetGlyphOutlineW(hdc, str[idx], GGO_GLYPH_INDEX | GGO_NATIVE, &gm, dwSize, outline, &identity); PATH_add_outline(dc, org.x + x + xoff, org.x + y + yoff, outline, dwSize); diff --git a/dlls/gdi32/tests/font.c b/dlls/gdi32/tests/font.c index 0aa9af66a37..38339ea3b88 100644 --- a/dlls/gdi32/tests/font.c +++ b/dlls/gdi32/tests/font.c @@ -2477,6 +2477,61 @@ static void test_orientation(void) DeleteDC(hdc); } +static void test_GetGlyphOutline(void) +{ + MAT2 mat = { {0,1}, {0,0}, {0,0}, {0,1} }; + HDC hdc; + GLYPHMETRICS gm; + LOGFONTA lf; + HFONT hfont, old_hfont; + INT ret; + + if (!is_truetype_font_installed("Tahoma")) + { + skip("Tahoma is not installed\n"); + return; + } + + hdc = CreateCompatibleDC(0); + memset(&lf, 0, sizeof(lf)); + lf.lfHeight = 72; + lstrcpyA(lf.lfFaceName, "Tahoma"); + SetLastError(0xdeadbeef); + hfont = CreateFontIndirectA(&lf); + ok(hfont != 0, "CreateFontIndirectA error %u\n", GetLastError()); + old_hfont = SelectObject(hdc, hfont); + + memset(&gm, 0, sizeof(gm)); + SetLastError(0xdeadbeef); + ret = GetGlyphOutlineA(hdc, 'A', GGO_METRICS, &gm, 0, NULL, &mat); + ok(ret != GDI_ERROR, "GetGlyphOutlineA error %u\n", GetLastError()); + + memset(&gm, 0, sizeof(gm)); + SetLastError(0xdeadbeef); + ret = GetGlyphOutlineA(hdc, 'A', GGO_METRICS, &gm, 0, NULL, NULL); + ok(ret == GDI_ERROR, "GetGlyphOutlineA should fail\n"); + ok(GetLastError() == 0xdeadbeef, "expected 0xdeadbeef, got %u\n", GetLastError()); + + memset(&gm, 0, sizeof(gm)); + SetLastError(0xdeadbeef); + ret = GetGlyphOutlineW(hdc, 'A', GGO_METRICS, &gm, 0, NULL, &mat); + if (GetLastError() != ERROR_CALL_NOT_IMPLEMENTED) + ok(ret != GDI_ERROR, "GetGlyphOutlineW error %u\n", GetLastError()); + + memset(&gm, 0, sizeof(gm)); + SetLastError(0xdeadbeef); + ret = GetGlyphOutlineW(hdc, 'A', GGO_METRICS, &gm, 0, NULL, NULL); + if (GetLastError() != ERROR_CALL_NOT_IMPLEMENTED) + { + ok(ret == GDI_ERROR, "GetGlyphOutlineW should fail\n"); + ok(GetLastError() == 0xdeadbeef, "expected 0xdeadbeef, got %u\n", GetLastError()); + } + + SelectObject(hdc, old_hfont); + DeleteObject(hfont); + DeleteDC(hdc); +} + START_TEST(font) { init(); @@ -2514,4 +2569,5 @@ START_TEST(font) test_GetTextMetrics(); test_GdiRealizationInfo(); test_GetTextFace(); + test_GetGlyphOutline(); } diff --git a/dlls/gdiplus/font.c b/dlls/gdiplus/font.c index 22fd3936949..94c93814597 100644 --- a/dlls/gdiplus/font.c +++ b/dlls/gdiplus/font.c @@ -374,6 +374,29 @@ GpStatus WINGDIPAPI GdipGetFontUnit(GpFont *font, Unit *unit) } /******************************************************************************* + * GdipGetLogFontA [GDIPLUS.@] + */ +GpStatus WINGDIPAPI GdipGetLogFontA(GpFont *font, GpGraphics *graphics, + LOGFONTA *lfa) +{ + GpStatus status; + LOGFONTW lfw; + + TRACE("(%p, %p, %p)\n", font, graphics, lfa); + + status = GdipGetLogFontW(font, graphics, &lfw); + if(status != Ok) + return status; + + memcpy(lfa, &lfw, FIELD_OFFSET(LOGFONTA,lfFaceName) ); + + if(!MultiByteToWideChar(CP_ACP, 0, lfa->lfFaceName, -1, lfw.lfFaceName, LF_FACESIZE)) + return GenericError; + + return Ok; +} + +/******************************************************************************* * GdipGetLogFontW [GDIPLUS.@] */ GpStatus WINGDIPAPI GdipGetLogFontW(GpFont *font, GpGraphics *graphics, diff --git a/dlls/gdiplus/gdiplus.spec b/dlls/gdiplus/gdiplus.spec index 3716207834f..0037a74182f 100644 --- a/dlls/gdiplus/gdiplus.spec +++ b/dlls/gdiplus/gdiplus.spec @@ -76,7 +76,7 @@ @ stdcall GdipCreateBitmapFromGdiDib(ptr ptr ptr) @ stdcall GdipCreateBitmapFromGraphics(long long ptr ptr) @ stdcall GdipCreateBitmapFromHBITMAP(long long ptr) -@ stub GdipCreateBitmapFromHICON +@ stdcall GdipCreateBitmapFromHICON(long ptr) @ stdcall GdipCreateBitmapFromResource(long wstr ptr) @ stdcall GdipCreateBitmapFromScan0(long long long long ptr ptr) @ stdcall GdipCreateBitmapFromStream(ptr ptr) @@ -245,8 +245,8 @@ @ stdcall GdipGetCellAscent(ptr long ptr) @ stdcall GdipGetCellDescent(ptr long ptr) @ stdcall GdipGetClip(ptr ptr) -@ stub GdipGetClipBounds -@ stub GdipGetClipBoundsI +@ stdcall GdipGetClipBounds(ptr ptr) +@ stdcall GdipGetClipBoundsI(ptr ptr) @ stdcall GdipGetCompositingMode(ptr ptr) @ stdcall GdipGetCompositingQuality(ptr ptr) @ stdcall GdipGetCustomLineCapBaseCap(ptr ptr) @@ -311,7 +311,7 @@ @ stdcall GdipGetLineSpacing(ptr long ptr) @ stub GdipGetLineTransform @ stdcall GdipGetLineWrapMode(ptr ptr) -@ stub GdipGetLogFontA +@ stdcall GdipGetLogFontA(ptr ptr ptr) @ stdcall GdipGetLogFontW(ptr ptr ptr) @ stdcall GdipGetMatrixElements(ptr ptr) @ stub GdipGetMetafileDownLevelRasterizationLimit @@ -507,7 +507,7 @@ @ stdcall GdipSetAdjustableArrowCapMiddleInset(ptr long) @ stdcall GdipSetAdjustableArrowCapWidth(ptr long) @ stdcall GdipSetClipGraphics(ptr ptr long) -@ stub GdipSetClipHrgn +@ stdcall GdipSetClipHrgn(ptr long long) @ stdcall GdipSetClipPath(ptr ptr long) @ stdcall GdipSetClipRect(ptr long long long long long) @ stdcall GdipSetClipRectI(ptr long long long long long) @@ -609,8 +609,8 @@ @ stdcall GdipTransformPoints(ptr long long ptr long) @ stdcall GdipTransformPointsI(ptr long long ptr long) @ stdcall GdipTransformRegion(ptr ptr) -@ stub GdipTranslateClip -@ stub GdipTranslateClipI +@ stdcall GdipTranslateClip(ptr long long) +@ stdcall GdipTranslateClipI(ptr long long) @ stdcall GdipTranslateLineTransform(ptr long long long) @ stdcall GdipTranslateMatrix(ptr long long long) @ stub GdipTranslatePathGradientTransform diff --git a/dlls/gdiplus/graphics.c b/dlls/gdiplus/graphics.c index 5193334e322..2673042cbee 100644 --- a/dlls/gdiplus/graphics.c +++ b/dlls/gdiplus/graphics.c @@ -2375,18 +2375,39 @@ GpStatus WINGDIPAPI GdipFillRectanglesI(GpGraphics *graphics, GpBrush *brush, GD return ret; } +/***************************************************************************** + * GdipFillRegion [GDIPLUS.@] + */ GpStatus WINGDIPAPI GdipFillRegion(GpGraphics* graphics, GpBrush* brush, GpRegion* region) { + INT save_state; + GpStatus status; + HRGN hrgn; + + TRACE("(%p, %p, %p)\n", graphics, brush, region); + if (!(graphics && brush && region)) return InvalidParameter; if(graphics->busy) return ObjectBusy; - FIXME("(%p, %p, %p): stub\n", graphics, brush, region); + status = GdipGetRegionHRgn(region, graphics, &hrgn); + if(status != Ok) + return status; - return NotImplemented; + save_state = SaveDC(graphics->hdc); + EndPath(graphics->hdc); + SelectObject(graphics->hdc, GetStockObject(NULL_PEN)); + + FillRgn(graphics->hdc, hrgn, brush->gdibrush); + + RestoreDC(graphics->hdc, save_state); + + DeleteObject(hrgn); + + return Ok; } GpStatus WINGDIPAPI GdipFlush(GpGraphics *graphics, GpFlushIntention intention) @@ -2405,6 +2426,38 @@ GpStatus WINGDIPAPI GdipFlush(GpGraphics *graphics, GpFlushIntention intention) return NotImplemented; } +/***************************************************************************** + * GdipGetClipBounds [GDIPLUS.@] + */ +GpStatus WINGDIPAPI GdipGetClipBounds(GpGraphics *graphics, GpRectF *rect) +{ + TRACE("(%p, %p)\n", graphics, rect); + + if(!graphics) + return InvalidParameter; + + if(graphics->busy) + return ObjectBusy; + + return GdipGetRegionBounds(graphics->clip, graphics, rect); +} + +/***************************************************************************** + * GdipGetClipBoundsI [GDIPLUS.@] + */ +GpStatus WINGDIPAPI GdipGetClipBoundsI(GpGraphics *graphics, GpRect *rect) +{ + TRACE("(%p, %p)\n", graphics, rect); + + if(!graphics) + return InvalidParameter; + + if(graphics->busy) + return ObjectBusy; + + return GdipGetRegionBoundsI(graphics->clip, graphics, rect); +} + /* FIXME: Compositing mode is not used anywhere except the getter/setter. */ GpStatus WINGDIPAPI GdipGetCompositingMode(GpGraphics *graphics, CompositingMode *mode) @@ -3057,6 +3110,29 @@ GpStatus WINGDIPAPI GdipTranslateWorldTransform(GpGraphics *graphics, REAL dx, return GdipTranslateMatrix(graphics->worldtrans, dx, dy, order); } +/***************************************************************************** + * GdipSetClipHrgn [GDIPLUS.@] + */ +GpStatus WINGDIPAPI GdipSetClipHrgn(GpGraphics *graphics, HRGN hrgn, CombineMode mode) +{ + GpRegion *region; + GpStatus status; + + TRACE("(%p, %p, %d)\n", graphics, hrgn, mode); + + if(!graphics) + return InvalidParameter; + + status = GdipCreateRegionHrgn(hrgn, ®ion); + if(status != Ok) + return status; + + status = GdipSetClipRegion(graphics, region, mode); + + GdipDeleteRegion(region); + return status; +} + GpStatus WINGDIPAPI GdipSetClipPath(GpGraphics *graphics, GpPath *path, CombineMode mode) { TRACE("(%p, %p, %d)\n", graphics, path, mode); @@ -3318,3 +3394,35 @@ HPALETTE WINGDIPAPI GdipCreateHalftonePalette(void) return NULL; } + +/***************************************************************************** + * GdipTranslateClip [GDIPLUS.@] + */ +GpStatus WINGDIPAPI GdipTranslateClip(GpGraphics *graphics, REAL dx, REAL dy) +{ + TRACE("(%p, %.2f, %.2f)\n", graphics, dx, dy); + + if(!graphics) + return InvalidParameter; + + if(graphics->busy) + return ObjectBusy; + + return GdipTranslateRegion(graphics->clip, dx, dy); +} + +/***************************************************************************** + * GdipTranslateClipI [GDIPLUS.@] + */ +GpStatus WINGDIPAPI GdipTranslateClipI(GpGraphics *graphics, INT dx, INT dy) +{ + TRACE("(%p, %d, %d)\n", graphics, dx, dy); + + if(!graphics) + return InvalidParameter; + + if(graphics->busy) + return ObjectBusy; + + return GdipTranslateRegion(graphics->clip, (REAL)dx, (REAL)dy); +} diff --git a/dlls/gdiplus/image.c b/dlls/gdiplus/image.c index 02f8f5a5655..9944322b371 100644 --- a/dlls/gdiplus/image.c +++ b/dlls/gdiplus/image.c @@ -18,6 +18,8 @@ #include +#define NONAMELESSUNION + #include "windef.h" #include "winbase.h" #include "winuser.h" @@ -429,6 +431,50 @@ GpStatus WINGDIPAPI GdipCreateBitmapFromGraphics(INT width, INT height, return ret; } +GpStatus WINGDIPAPI GdipCreateBitmapFromHICON(HICON hicon, GpBitmap** bitmap) +{ + HICON icon_copy; + ICONINFO iinfo; + PICTDESC desc; + + TRACE("%p, %p\n", hicon, bitmap); + + if(!bitmap || !GetIconInfo(hicon, &iinfo)) + return InvalidParameter; + + *bitmap = GdipAlloc(sizeof(GpBitmap)); + if(!*bitmap) return OutOfMemory; + + icon_copy = CreateIconIndirect(&iinfo); + + if(!icon_copy){ + GdipFree(*bitmap); + return InvalidParameter; + } + + desc.cbSizeofstruct = sizeof(PICTDESC); + desc.picType = PICTYPE_ICON; + desc.u.icon.hicon = icon_copy; + + if(OleCreatePictureIndirect(&desc, &IID_IPicture, TRUE, + (LPVOID*) &((*bitmap)->image.picture)) != S_OK){ + DestroyIcon(icon_copy); + GdipFree(*bitmap); + return GenericError; + } + + (*bitmap)->format = PixelFormat32bppARGB; + (*bitmap)->image.type = ImageTypeBitmap; + (*bitmap)->image.flags = ImageFlagsNone; + (*bitmap)->width = ipicture_pixel_width((*bitmap)->image.picture); + (*bitmap)->height = ipicture_pixel_height((*bitmap)->image.picture); + + DeleteObject(iinfo.hbmColor); + DeleteObject(iinfo.hbmMask); + + return Ok; +} + GpStatus WINGDIPAPI GdipCreateBitmapFromScan0(INT width, INT height, INT stride, PixelFormat format, BYTE* scan0, GpBitmap** bitmap) { diff --git a/dlls/gdiplus/region.c b/dlls/gdiplus/region.c index e4cc7d829db..e42c5cd12ab 100644 --- a/dlls/gdiplus/region.c +++ b/dlls/gdiplus/region.c @@ -634,18 +634,66 @@ GpStatus WINGDIPAPI GdipDeleteRegion(GpRegion *region) return Ok; } +/***************************************************************************** + * GdipGetRegionBounds [GDIPLUS.@] + */ GpStatus WINGDIPAPI GdipGetRegionBounds(GpRegion *region, GpGraphics *graphics, GpRectF *rect) { - FIXME("(%p, %p, %p): stub\n", region, graphics, rect); + HRGN hrgn; + RECT r; + GpStatus status; - return NotImplemented; + TRACE("(%p, %p, %p)\n", region, graphics, rect); + + if(!region || !graphics || !rect) + return InvalidParameter; + + status = GdipGetRegionHRgn(region, graphics, &hrgn); + if(status != Ok) + return status; + + /* infinite */ + if(!hrgn){ + rect->X = rect->Y = -(REAL)(1 << 22); + rect->Width = rect->Height = (REAL)(1 << 23); + return Ok; + } + + if(!GetRgnBox(hrgn, &r)){ + DeleteObject(hrgn); + return GenericError; + } + + rect->X = r.left; + rect->Y = r.top; + rect->Width = r.right - r.left; + rect->Height = r.bottom - r.top; + + return Ok; } +/***************************************************************************** + * GdipGetRegionBoundsI [GDIPLUS.@] + */ GpStatus WINGDIPAPI GdipGetRegionBoundsI(GpRegion *region, GpGraphics *graphics, GpRect *rect) { - FIXME("(%p, %p, %p): stub\n", region, graphics, rect); + GpRectF rectf; + GpStatus status; - return NotImplemented; + TRACE("(%p, %p, %p)\n", region, graphics, rect); + + if(!rect) + return InvalidParameter; + + status = GdipGetRegionBounds(region, graphics, &rectf); + if(status == Ok){ + rect->X = roundr(rectf.X); + rect->Y = roundr(rectf.X); + rect->Width = roundr(rectf.Width); + rect->Height = roundr(rectf.Height); + } + + return status; } static inline void write_dword(DWORD* location, INT* offset, const DWORD write) @@ -1006,12 +1054,39 @@ GpStatus WINGDIPAPI GdipIsEmptyRegion(GpRegion *region, GpGraphics *graphics, BO return Ok; } +/***************************************************************************** + * GdipIsEqualRegion [GDIPLUS.@] + */ GpStatus WINGDIPAPI GdipIsEqualRegion(GpRegion *region, GpRegion *region2, GpGraphics *graphics, BOOL *res) { - FIXME("(%p, %p, %p, %p): stub\n", region, region2, graphics, res); + HRGN hrgn1, hrgn2; + GpStatus stat; - return NotImplemented; + TRACE("(%p, %p, %p, %p)\n", region, region2, graphics, res); + + if(!region || !region2 || !graphics || !res) + return InvalidParameter; + + stat = GdipGetRegionHRgn(region, graphics, &hrgn1); + if(stat != Ok) + return stat; + stat = GdipGetRegionHRgn(region2, graphics, &hrgn2); + if(stat != Ok){ + DeleteObject(hrgn1); + return stat; + } + + *res = EqualRgn(hrgn1, hrgn2); + + /* one of GpRegions is infinite */ + if(*res == ERROR) + *res = (!hrgn1 && !hrgn2); + + DeleteObject(hrgn1); + DeleteObject(hrgn2); + + return Ok; } /***************************************************************************** @@ -1070,16 +1145,54 @@ GpStatus WINGDIPAPI GdipTransformRegion(GpRegion *region, GpMatrix *matrix) return NotImplemented; } +/* Translates GpRegion elements with specified offsets */ +static void translate_region_element(region_element* element, REAL dx, REAL dy) +{ + INT i; + + switch(element->type) + { + case RegionDataEmptyRect: + case RegionDataInfiniteRect: + return; + case RegionDataRect: + element->elementdata.rect.X += dx; + element->elementdata.rect.Y += dy; + return; + case RegionDataPath: + for(i = 0; i < element->elementdata.pathdata.path->pathdata.Count; i++){ + element->elementdata.pathdata.path->pathdata.Points[i].X += dx; + element->elementdata.pathdata.path->pathdata.Points[i].Y += dy; + } + return; + default: + translate_region_element(element->elementdata.combine.left, dx, dy); + translate_region_element(element->elementdata.combine.right, dx, dy); + return; + } +} + +/***************************************************************************** + * GdipTranslateRegion [GDIPLUS.@] + */ GpStatus WINGDIPAPI GdipTranslateRegion(GpRegion *region, REAL dx, REAL dy) { - FIXME("(%p, %f, %f): stub\n", region, dx, dy); + TRACE("(%p, %f, %f)\n", region, dx, dy); - return NotImplemented; + if(!region) + return InvalidParameter; + + translate_region_element(®ion->node, dx, dy); + + return Ok; } +/***************************************************************************** + * GdipTranslateRegionI [GDIPLUS.@] + */ GpStatus WINGDIPAPI GdipTranslateRegionI(GpRegion *region, INT dx, INT dy) { - FIXME("(%p, %d, %d): stub\n", region, dx, dy); + TRACE("(%p, %d, %d)\n", region, dx, dy); - return NotImplemented; + return GdipTranslateRegion(region, (REAL)dx, (REAL)dy); } diff --git a/dlls/gdiplus/stringformat.c b/dlls/gdiplus/stringformat.c index 201201a866f..21053b78e46 100644 --- a/dlls/gdiplus/stringformat.c +++ b/dlls/gdiplus/stringformat.c @@ -284,9 +284,12 @@ GpStatus WINGDIPAPI GdipSetStringFormatTrimming(GpStringFormat *format, return Ok; } -GpStatus WINGDIPAPI GdipSetStringFormatFlags(GDIPCONST GpStringFormat *format, INT flags) +GpStatus WINGDIPAPI GdipSetStringFormatFlags(GpStringFormat *format, INT flags) { - FIXME("format (%p) flags (%d)\n", format, flags); + if(!format) + return InvalidParameter; + + format->attr = flags; return Ok; } diff --git a/dlls/gdiplus/tests/Makefile.in b/dlls/gdiplus/tests/Makefile.in index 7dba3daaaa7..ac5589d2e0d 100644 --- a/dlls/gdiplus/tests/Makefile.in +++ b/dlls/gdiplus/tests/Makefile.in @@ -3,7 +3,7 @@ TOPOBJDIR = ../../.. SRCDIR = @srcdir@ VPATH = @srcdir@ TESTDLL = gdiplus.dll -IMPORTS = gdiplus user32 gdi32 kernel32 +IMPORTS = gdiplus ole32 user32 gdi32 kernel32 CTESTS = \ brush.c \ diff --git a/dlls/gdiplus/tests/graphics.c b/dlls/gdiplus/tests/graphics.c index fb98a3810f7..8091a9adff3 100644 --- a/dlls/gdiplus/tests/graphics.c +++ b/dlls/gdiplus/tests/graphics.c @@ -486,6 +486,7 @@ static void test_Get_Release_DC(void) INT i; BOOL res; ARGB color = 0x00000000; + HRGN hrgn = CreateRectRgn(0, 0, 10, 10); pt[0].X = 10; pt[0].Y = 10; @@ -653,6 +654,10 @@ static void test_Get_Release_DC(void) expect(ObjectBusy, status); status = Ok; status = GdipFlush(graphics, FlushIntentionFlush); expect(ObjectBusy, status); status = Ok; + status = GdipGetClipBounds(graphics, rectf); + expect(ObjectBusy, status); status = Ok; + status = GdipGetClipBoundsI(graphics, rect); + expect(ObjectBusy, status); status = Ok; status = GdipGetCompositingMode(graphics, &compmode); expect(ObjectBusy, status); status = Ok; status = GdipGetCompositingQuality(graphics, &quality); @@ -711,6 +716,8 @@ static void test_Get_Release_DC(void) expect(ObjectBusy, status); status = Ok; status = GdipTranslateWorldTransform(graphics, 0.0, 0.0, MatrixOrderPrepend); expect(ObjectBusy, status); status = Ok; + status = GdipSetClipHrgn(graphics, hrgn, CombineModeReplace); + expect(ObjectBusy, status); status = Ok; status = GdipSetClipPath(graphics, path, CombineModeReplace); expect(ObjectBusy, status); status = Ok; status = GdipSetClipRect(graphics, 0.0, 0.0, 10.0, 10.0, CombineModeReplace); @@ -718,7 +725,11 @@ static void test_Get_Release_DC(void) status = GdipSetClipRectI(graphics, 0, 0, 10, 10, CombineModeReplace); expect(ObjectBusy, status); status = Ok; status = GdipSetClipRegion(graphics, clip, CombineModeReplace); - expect(ObjectBusy, status); + expect(ObjectBusy, status); status = Ok; + status = GdipTranslateClip(graphics, 0.0, 0.0); + expect(ObjectBusy, status); status = Ok; + status = GdipTranslateClipI(graphics, 0, 0); + expect(ObjectBusy, status); status = Ok; status = GdipDrawPolygon(graphics, pen, ptf, 5); expect(ObjectBusy, status); status = Ok; status = GdipDrawPolygonI(graphics, pen, pt, 5); @@ -746,6 +757,7 @@ static void test_Get_Release_DC(void) GdipDeleteBrush((GpBrush*)brush); GdipDeleteRegion(region); GdipDeleteMatrix(m); + DeleteObject(hrgn); ReleaseDC(0, hdc); } diff --git a/dlls/gdiplus/tests/image.c b/dlls/gdiplus/tests/image.c index 19f050061d5..661975925ae 100644 --- a/dlls/gdiplus/tests/image.c +++ b/dlls/gdiplus/tests/image.c @@ -18,11 +18,12 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ +#include + +#include "initguid.h" #include "windows.h" #include "gdiplus.h" #include "wine/test.h" -#include -#include "wingdi.h" #define expect(expected, got) ok(((UINT)got) == ((UINT)expected), "Expected %.8x, got %.8x\n", (UINT)expected, (UINT)got) @@ -530,6 +531,111 @@ static void test_testcontrol(void) ok(param != 0, "Build number expected, got %u\n", param); } +static void test_fromhicon(void) +{ + static const BYTE bmp_bits[1024]; + HBITMAP hbmMask, hbmColor; + ICONINFO info; + HICON hIcon; + GpStatus stat; + GpBitmap *bitmap = NULL; + UINT dim; + ImageType type; + PixelFormat format; + GUID raw; + WCHAR bufferW[39]; + char buffer[39]; + char buffer2[39]; + + /* NULL */ + stat = GdipCreateBitmapFromHICON(NULL, NULL); + expect(InvalidParameter, stat); + stat = GdipCreateBitmapFromHICON(NULL, &bitmap); + expect(InvalidParameter, stat); + + /* color icon 1 bit */ + hbmMask = CreateBitmap(16, 16, 1, 1, bmp_bits); + ok(hbmMask != 0, "CreateBitmap failed\n"); + hbmColor = CreateBitmap(16, 16, 1, 1, bmp_bits); + ok(hbmColor != 0, "CreateBitmap failed\n"); + info.fIcon = TRUE; + info.xHotspot = 8; + info.yHotspot = 8; + info.hbmMask = hbmMask; + info.hbmColor = hbmColor; + hIcon = CreateIconIndirect(&info); + ok(hIcon != 0, "CreateIconIndirect failed\n"); + DeleteObject(hbmMask); + DeleteObject(hbmColor); + + stat = GdipCreateBitmapFromHICON(hIcon, &bitmap); + expect(Ok, stat); + if(stat == Ok){ + /* check attributes */ + stat = GdipGetImageHeight((GpImage*)bitmap, &dim); + expect(Ok, stat); + expect(16, dim); + stat = GdipGetImageWidth((GpImage*)bitmap, &dim); + expect(Ok, stat); + expect(16, dim); + stat = GdipGetImageType((GpImage*)bitmap, &type); + expect(Ok, stat); + expect(ImageTypeBitmap, type); + stat = GdipGetImagePixelFormat((GpImage*)bitmap, &format); + expect(PixelFormat32bppARGB, format); + /* raw format */ + stat = GdipGetImageRawFormat((GpImage*)bitmap, &raw); + StringFromGUID2(&raw, bufferW, sizeof(bufferW)/sizeof(bufferW[0])); + WideCharToMultiByte(CP_ACP, 0, bufferW, sizeof(bufferW)/sizeof(bufferW[0]), buffer, sizeof(buffer), NULL, NULL); + StringFromGUID2(&ImageFormatMemoryBMP, bufferW, sizeof(bufferW)/sizeof(bufferW[0])); + WideCharToMultiByte(CP_ACP, 0, bufferW, sizeof(bufferW)/sizeof(bufferW[0]), buffer2, sizeof(buffer2), NULL, NULL); + todo_wine ok(IsEqualGUID(&raw, &ImageFormatMemoryBMP), "Expected format %s, got %s\n", buffer2, buffer); + GdipDisposeImage((GpImage*)bitmap); + } + DestroyIcon(hIcon); + + /* color icon 8 bpp */ + hbmMask = CreateBitmap(16, 16, 1, 8, bmp_bits); + ok(hbmMask != 0, "CreateBitmap failed\n"); + hbmColor = CreateBitmap(16, 16, 1, 8, bmp_bits); + ok(hbmColor != 0, "CreateBitmap failed\n"); + info.fIcon = TRUE; + info.xHotspot = 8; + info.yHotspot = 8; + info.hbmMask = hbmMask; + info.hbmColor = hbmColor; + hIcon = CreateIconIndirect(&info); + ok(hIcon != 0, "CreateIconIndirect failed\n"); + DeleteObject(hbmMask); + DeleteObject(hbmColor); + + stat = GdipCreateBitmapFromHICON(hIcon, &bitmap); + expect(Ok, stat); + if(stat == Ok){ + /* check attributes */ + stat = GdipGetImageHeight((GpImage*)bitmap, &dim); + expect(Ok, stat); + expect(16, dim); + stat = GdipGetImageWidth((GpImage*)bitmap, &dim); + expect(Ok, stat); + expect(16, dim); + stat = GdipGetImageType((GpImage*)bitmap, &type); + expect(Ok, stat); + expect(ImageTypeBitmap, type); + stat = GdipGetImagePixelFormat((GpImage*)bitmap, &format); + expect(PixelFormat32bppARGB, format); + /* raw format */ + stat = GdipGetImageRawFormat((GpImage*)bitmap, &raw); + StringFromGUID2(&raw, bufferW, sizeof(bufferW)/sizeof(bufferW[0])); + WideCharToMultiByte(CP_ACP, 0, bufferW, sizeof(bufferW)/sizeof(bufferW[0]), buffer, sizeof(buffer), NULL, NULL); + StringFromGUID2(&ImageFormatMemoryBMP, bufferW, sizeof(bufferW)/sizeof(bufferW[0])); + WideCharToMultiByte(CP_ACP, 0, bufferW, sizeof(bufferW)/sizeof(bufferW[0]), buffer2, sizeof(buffer2), NULL, NULL); + todo_wine ok(IsEqualGUID(&raw, &ImageFormatMemoryBMP), "Expected format %s, got %s\n", buffer2, buffer); + GdipDisposeImage((GpImage*)bitmap); + } + DestroyIcon(hIcon); +} + START_TEST(image) { struct GdiplusStartupInput gdiplusStartupInput; @@ -553,6 +659,7 @@ START_TEST(image) test_GdipGetImageFlags(); test_GdipCloneImage(); test_testcontrol(); + test_fromhicon(); GdiplusShutdown(gdiplusToken); } diff --git a/dlls/gdiplus/tests/region.c b/dlls/gdiplus/tests/region.c index 784b1b9d29e..689811cedc4 100644 --- a/dlls/gdiplus/tests/region.c +++ b/dlls/gdiplus/tests/region.c @@ -951,6 +951,236 @@ static void test_gethrgn(void) ReleaseDC(0, hdc); } +static void test_isequal(void) +{ + GpRegion *region1, *region2; + GpGraphics *graphics; + GpRectF rectf; + GpStatus status; + HDC hdc = GetDC(0); + BOOL res; + + status = GdipCreateFromHDC(hdc, &graphics); + ok(status == Ok, "status %08x\n", status); + + status = GdipCreateRegion(®ion1); + ok(status == Ok, "status %08x\n", status); + status = GdipCreateRegion(®ion2); + ok(status == Ok, "status %08x\n", status); + + /* NULL */ + status = GdipIsEqualRegion(NULL, NULL, NULL, NULL); + ok(status == InvalidParameter, "status %08x\n", status); + status = GdipIsEqualRegion(region1, region2, NULL, NULL); + ok(status == InvalidParameter, "status %08x\n", status); + status = GdipIsEqualRegion(region1, region2, graphics, NULL); + ok(status == InvalidParameter, "status %08x\n", status); + status = GdipIsEqualRegion(region1, region2, NULL, &res); + ok(status == InvalidParameter, "status %08x\n", status); + + /* infinite regions */ + res = FALSE; + status = GdipIsEqualRegion(region1, region2, graphics, &res); + ok(status == Ok, "status %08x\n", status); + ok(res, "Expected to be equal.\n"); + /* empty regions */ + status = GdipSetEmpty(region1); + ok(status == Ok, "status %08x\n", status); + status = GdipSetEmpty(region2); + ok(status == Ok, "status %08x\n", status); + res = FALSE; + status = GdipIsEqualRegion(region1, region2, graphics, &res); + ok(status == Ok, "status %08x\n", status); + ok(res, "Expected to be equal.\n"); + /* empty & infinite */ + status = GdipSetInfinite(region1); + ok(status == Ok, "status %08x\n", status); + res = TRUE; + status = GdipIsEqualRegion(region1, region2, graphics, &res); + ok(status == Ok, "status %08x\n", status); + ok(!res, "Expected to be unequal.\n"); + /* rect & (inf/empty) */ + rectf.X = rectf.Y = 0.0; + rectf.Width = rectf.Height = 100.0; + status = GdipCombineRegionRect(region1, &rectf, CombineModeReplace); + ok(status == Ok, "status %08x\n", status); + res = TRUE; + status = GdipIsEqualRegion(region1, region2, graphics, &res); + ok(status == Ok, "status %08x\n", status); + ok(!res, "Expected to be unequal.\n"); + status = GdipSetInfinite(region2); + ok(status == Ok, "status %08x\n", status); + res = TRUE; + status = GdipIsEqualRegion(region1, region2, graphics, &res); + ok(status == Ok, "status %08x\n", status); + ok(!res, "Expected to be unequal.\n"); + /* roughly equal rectangles */ + rectf.X = rectf.Y = 0.0; + rectf.Width = rectf.Height = 100.001; + status = GdipCombineRegionRect(region2, &rectf, CombineModeReplace); + ok(status == Ok, "status %08x\n", status); + res = FALSE; + status = GdipIsEqualRegion(region1, region2, graphics, &res); + ok(status == Ok, "status %08x\n", status); + ok(res, "Expected to be equal.\n"); + /* equal rectangles */ + rectf.X = rectf.Y = 0.0; + rectf.Width = rectf.Height = 100.0; + status = GdipCombineRegionRect(region2, &rectf, CombineModeReplace); + ok(status == Ok, "status %08x\n", status); + res = FALSE; + status = GdipIsEqualRegion(region1, region2, graphics, &res); + ok(status == Ok, "status %08x\n", status); + ok(res, "Expected to be equal.\n"); + + /* cleanup */ + status = GdipDeleteRegion(region1); + ok(status == Ok, "status %08x\n", status); + status = GdipDeleteRegion(region2); + ok(status == Ok, "status %08x\n", status); + status = GdipDeleteGraphics(graphics); + ok(status == Ok, "status %08x\n", status); + ReleaseDC(0, hdc); +} + +static void test_translate(void) +{ + GpRegion *region, *region2; + GpGraphics *graphics; + GpPath *path; + GpRectF rectf; + GpStatus status; + HDC hdc = GetDC(0); + BOOL res; + + status = GdipCreateFromHDC(hdc, &graphics); + ok(status == Ok, "status %08x\n", status); + + status = GdipCreatePath(FillModeAlternate, &path); + ok(status == Ok, "status %08x\n", status); + + status = GdipCreateRegion(®ion); + ok(status == Ok, "status %08x\n", status); + status = GdipCreateRegion(®ion2); + ok(status == Ok, "status %08x\n", status); + + /* NULL */ + status = GdipTranslateRegion(NULL, 0.0, 0.0); + ok(status == InvalidParameter, "status %08x\n", status); + + /* infinite */ + status = GdipTranslateRegion(region, 10.0, 10.0); + ok(status == Ok, "status %08x\n", status); + /* empty */ + status = GdipSetEmpty(region); + ok(status == Ok, "status %08x\n", status); + status = GdipTranslateRegion(region, 10.0, 10.0); + ok(status == Ok, "status %08x\n", status); + /* rect */ + rectf.X = 10.0; rectf.Y = 0.0; + rectf.Width = rectf.Height = 100.0; + status = GdipCombineRegionRect(region, &rectf, CombineModeReplace); + ok(status == Ok, "status %08x\n", status); + rectf.X = 15.0; rectf.Y = -2.0; + rectf.Width = rectf.Height = 100.0; + status = GdipCombineRegionRect(region2, &rectf, CombineModeReplace); + ok(status == Ok, "status %08x\n", status); + status = GdipTranslateRegion(region, 5.0, -2.0); + ok(status == Ok, "status %08x\n", status); + res = FALSE; + status = GdipIsEqualRegion(region, region2, graphics, &res); + ok(status == Ok, "status %08x\n", status); + ok(res, "Expected to be equal.\n"); + /* path */ + status = GdipAddPathEllipse(path, 0.0, 10.0, 100.0, 150.0); + ok(status == Ok, "status %08x\n", status); + status = GdipCombineRegionPath(region, path, CombineModeReplace); + ok(status == Ok, "status %08x\n", status); + status = GdipResetPath(path); + ok(status == Ok, "status %08x\n", status); + status = GdipAddPathEllipse(path, 10.0, 21.0, 100.0, 150.0); + ok(status == Ok, "status %08x\n", status); + status = GdipCombineRegionPath(region2, path, CombineModeReplace); + ok(status == Ok, "status %08x\n", status); + status = GdipTranslateRegion(region, 10.0, 11.0); + ok(status == Ok, "status %08x\n", status); + res = FALSE; + status = GdipIsEqualRegion(region, region2, graphics, &res); + ok(status == Ok, "status %08x\n", status); + ok(res, "Expected to be equal.\n"); + + status = GdipDeleteRegion(region); + ok(status == Ok, "status %08x\n", status); + status = GdipDeleteRegion(region2); + ok(status == Ok, "status %08x\n", status); + status = GdipDeleteGraphics(graphics); + ok(status == Ok, "status %08x\n", status); + status = GdipDeletePath(path); + ok(status == Ok, "status %08x\n", status); + ReleaseDC(0, hdc); +} + +static void test_getbounds(void) +{ + GpRegion *region; + GpGraphics *graphics; + GpStatus status; + GpRectF rectf; + HDC hdc = GetDC(0); + + status = GdipCreateFromHDC(hdc, &graphics); + ok(status == Ok, "status %08x\n", status); + status = GdipCreateRegion(®ion); + ok(status == Ok, "status %08x\n", status); + + /* NULL */ + status = GdipGetRegionBounds(NULL, NULL, NULL); + ok(status == InvalidParameter, "status %08x\n", status); + status = GdipGetRegionBounds(region, NULL, NULL); + ok(status == InvalidParameter, "status %08x\n", status); + status = GdipGetRegionBounds(region, graphics, NULL); + ok(status == InvalidParameter, "status %08x\n", status); + /* infinite */ + rectf.X = rectf.Y = 0.0; + rectf.Height = rectf.Width = 100.0; + status = GdipGetRegionBounds(region, graphics, &rectf); + ok(status == Ok, "status %08x\n", status); + ok(rectf.X == -(REAL)(1 << 22), "Expected X = %.2f, got %.2f\n", -(REAL)(1 << 22), rectf.X); + ok(rectf.Y == -(REAL)(1 << 22), "Expected Y = %.2f, got %.2f\n", -(REAL)(1 << 22), rectf.Y); + ok(rectf.Width == (REAL)(1 << 23), "Expected width = %.2f, got %.2f\n", (REAL)(1 << 23), rectf.Width); + ok(rectf.Height == (REAL)(1 << 23), "Expected height = %.2f, got %.2f\n",(REAL)(1 << 23), rectf.Height); + /* empty */ + rectf.X = rectf.Y = 0.0; + rectf.Height = rectf.Width = 100.0; + status = GdipSetEmpty(region); + ok(status == Ok, "status %08x\n", status); + status = GdipGetRegionBounds(region, graphics, &rectf); + ok(status == Ok, "status %08x\n", status); + ok(rectf.X == 0.0, "Expected X = 0.0, got %.2f\n", rectf.X); + ok(rectf.Y == 0.0, "Expected Y = 0.0, got %.2f\n", rectf.Y); + ok(rectf.Width == 0.0, "Expected width = 0.0, got %.2f\n", rectf.Width); + ok(rectf.Height == 0.0, "Expected height = 0.0, got %.2f\n", rectf.Height); + /* rect */ + rectf.X = 10.0; rectf.Y = 0.0; + rectf.Width = rectf.Height = 100.0; + status = GdipCombineRegionRect(region, &rectf, CombineModeReplace); + ok(status == Ok, "status %08x\n", status); + rectf.X = rectf.Y = 0.0; + rectf.Height = rectf.Width = 0.0; + status = GdipGetRegionBounds(region, graphics, &rectf); + ok(status == Ok, "status %08x\n", status); + ok(rectf.X == 10.0, "Expected X = 0.0, got %.2f\n", rectf.X); + ok(rectf.Y == 0.0, "Expected Y = 0.0, got %.2f\n", rectf.Y); + ok(rectf.Width == 100.0, "Expected width = 0.0, got %.2f\n", rectf.Width); + ok(rectf.Height == 100.0, "Expected height = 0.0, got %.2f\n", rectf.Height); + + status = GdipDeleteRegion(region); + ok(status == Ok, "status %08x\n", status); + status = GdipDeleteGraphics(graphics); + ok(status == Ok, "status %08x\n", status); + ReleaseDC(0, hdc); +} + START_TEST(region) { struct GdiplusStartupInput gdiplusStartupInput; @@ -969,6 +1199,9 @@ START_TEST(region) test_combinereplace(); test_fromhrgn(); test_gethrgn(); + test_isequal(); + test_translate(); + test_getbounds(); GdiplusShutdown(gdiplusToken); } diff --git a/dlls/gdiplus/tests/stringformat.c b/dlls/gdiplus/tests/stringformat.c index 93319128f28..b28dbc6d355 100644 --- a/dlls/gdiplus/tests/stringformat.c +++ b/dlls/gdiplus/tests/stringformat.c @@ -318,6 +318,67 @@ static void test_getgenericdefault(void) expect(Ok, stat); } +static void test_stringformatflags(void) +{ + GpStringFormat *format; + GpStatus stat; + + INT flags; + + stat = GdipCreateStringFormat(0, LANG_NEUTRAL, &format); + expect(Ok, stat); + + /* NULL args */ + stat = GdipSetStringFormatFlags(NULL, 0); + expect(InvalidParameter, stat); + + stat = GdipSetStringFormatFlags(format, 0); + expect(Ok, stat); + stat = GdipGetStringFormatFlags(format, &flags); + expect(Ok, stat); + expect(0, flags); + + /* Check some valid flags */ + stat = GdipSetStringFormatFlags(format, StringFormatFlagsDirectionRightToLeft); + expect(Ok, stat); + stat = GdipGetStringFormatFlags(format, &flags); + expect(Ok, stat); + expect(StringFormatFlagsDirectionRightToLeft, flags); + + stat = GdipSetStringFormatFlags(format, StringFormatFlagsNoFontFallback); + expect(Ok, stat); + stat = GdipGetStringFormatFlags(format, &flags); + expect(Ok, stat); + expect(StringFormatFlagsNoFontFallback, flags); + + /* Check some flag combinations */ + stat = GdipSetStringFormatFlags(format, StringFormatFlagsDirectionVertical + | StringFormatFlagsNoFitBlackBox); + expect(Ok, stat); + stat = GdipGetStringFormatFlags(format, &flags); + expect(Ok, stat); + expect((StringFormatFlagsDirectionVertical + | StringFormatFlagsNoFitBlackBox), flags); + + stat = GdipSetStringFormatFlags(format, StringFormatFlagsDisplayFormatControl + | StringFormatFlagsMeasureTrailingSpaces); + expect(Ok, stat); + stat = GdipGetStringFormatFlags(format, &flags); + expect(Ok, stat); + expect((StringFormatFlagsDisplayFormatControl + | StringFormatFlagsMeasureTrailingSpaces), flags); + + /* Check invalid flags */ + stat = GdipSetStringFormatFlags(format, 0xdeadbeef); + expect(Ok, stat); + stat = GdipGetStringFormatFlags(format, &flags); + expect(Ok, stat); + expect(0xdeadbeef, flags); + + stat = GdipDeleteStringFormat(format); + expect(Ok, stat); +} + START_TEST(stringformat) { struct GdiplusStartupInput gdiplusStartupInput; @@ -336,6 +397,7 @@ START_TEST(stringformat) test_getgenerictypographic(); test_tabstops(); test_getgenericdefault(); + test_stringformatflags(); GdiplusShutdown(gdiplusToken); } diff --git a/dlls/inetcomm/inetcomm_private.h b/dlls/inetcomm/inetcomm_private.h index 1d752c0d831..533c92658df 100644 --- a/dlls/inetcomm/inetcomm_private.h +++ b/dlls/inetcomm/inetcomm_private.h @@ -61,8 +61,6 @@ HRESULT InternetTransport_DropConnection(InternetTransport *This); HRESULT InternetTransport_GetStatus(InternetTransport *This, IXPSTATUS *pCurrentStatus); HRESULT InternetTransport_ChangeStatus(InternetTransport *This, IXPSTATUS Status); -HRESULT InternetTransport_Read(InternetTransport *This, int cbBuffer, - INETXPORT_COMPLETION_FUNCTION fnCompletion); HRESULT InternetTransport_ReadLine(InternetTransport *This, INETXPORT_COMPLETION_FUNCTION fnCompletion); HRESULT InternetTransport_Write(InternetTransport *This, const char *pvData, diff --git a/dlls/inetcomm/internettransport.c b/dlls/inetcomm/internettransport.c index 7cef414434a..f0499bc19a1 100644 --- a/dlls/inetcomm/internettransport.c +++ b/dlls/inetcomm/internettransport.c @@ -204,29 +204,6 @@ HRESULT InternetTransport_ChangeStatus(InternetTransport *This, IXPSTATUS Status return S_OK; } -HRESULT InternetTransport_Read(InternetTransport *This, int cbBuffer, - INETXPORT_COMPLETION_FUNCTION fnCompletion) -{ - if (This->Status == IXP_DISCONNECTED) - return IXP_E_NOT_CONNECTED; - - if (This->fnCompletion) - return IXP_E_BUSY; - - This->fnCompletion = fnCompletion; - - This->cbBuffer = cbBuffer; - This->pBuffer = HeapAlloc(GetProcessHeap(), 0, This->cbBuffer); - This->iCurrentBufferOffset = 0; - - if (WSAAsyncSelect(This->Socket, This->hwnd, IX_READ, FD_READ) == SOCKET_ERROR) - { - ERR("WSAAsyncSelect failed with error %d\n", WSAGetLastError()); - /* FIXME: handle error */ - } - return S_OK; -} - HRESULT InternetTransport_ReadLine(InternetTransport *This, INETXPORT_COMPLETION_FUNCTION fnCompletion) { diff --git a/dlls/iphlpapi/ipstats.c b/dlls/iphlpapi/ipstats.c index 31336f982d0..b112793c40e 100644 --- a/dlls/iphlpapi/ipstats.c +++ b/dlls/iphlpapi/ipstats.c @@ -323,7 +323,7 @@ DWORD getICMPStats(MIB_ICMP *stats) stats->stats.icmpInStats.dwAddrMasks = icmp_stat.icps_inhist[ICMP_MASKREQ]; stats->stats.icmpInStats.dwAddrMaskReps = icmp_stat.icps_inhist[ICMP_MASKREPLY]; - +#ifdef HAVE_ICPS_OUTHIST /* out stats */ stats->stats.icmpOutStats.dwMsgs = icmp_stat.icps_oldshort + icmp_stat.icps_oldicmp; for(i = 0; i <= ICMP_MAXTYPE; i++) @@ -342,9 +342,13 @@ DWORD getICMPStats(MIB_ICMP *stats) stats->stats.icmpOutStats.dwTimestampReps = icmp_stat.icps_outhist[ICMP_TSTAMPREPLY]; stats->stats.icmpOutStats.dwAddrMasks = icmp_stat.icps_outhist[ICMP_MASKREQ]; stats->stats.icmpOutStats.dwAddrMaskReps = icmp_stat.icps_outhist[ICMP_MASKREPLY]; +#else /* ICPS_OUTHIST */ + memset( &stats->stats.icmpOutStats, 0, sizeof(stats->stats.icmpOutStats) ); +#endif /* ICPS_OUTHIST */ return NO_ERROR; -#else + +#else /* ICMPCTL_STATS */ FILE *fp; if (!stats) diff --git a/dlls/itss/chm_lib.c b/dlls/itss/chm_lib.c index 6b80ef2b92a..a98c8ac6cac 100644 --- a/dlls/itss/chm_lib.c +++ b/dlls/itss/chm_lib.c @@ -759,6 +759,10 @@ struct chmFile *chm_openW(const WCHAR *filename) if (newHandle->index_root == -1) newHandle->index_root = newHandle->index_head; + /* initialize cache */ + chm_set_param(newHandle, CHM_PARAM_MAX_BLOCKS_CACHED, + CHM_MAX_BLOCKS_CACHED); + /* By default, compression is enabled. */ newHandle->compression_enabled = 1; @@ -822,10 +826,6 @@ struct chmFile *chm_openW(const WCHAR *filename) #endif } - /* initialize cache */ - chm_set_param(newHandle, CHM_PARAM_MAX_BLOCKS_CACHED, - CHM_MAX_BLOCKS_CACHED); - return newHandle; } @@ -1373,115 +1373,6 @@ LONGINT64 chm_retrieve_object(struct chmFile *h, } } -/* enumerate the objects in the .chm archive */ -int chm_enumerate(struct chmFile *h, - int what, - CHM_ENUMERATOR e, - void *context) -{ - Int32 curPage; - - /* buffer to hold whatever page we're looking at */ - UChar *page_buf = HeapAlloc(GetProcessHeap(), 0, h->block_len); - struct chmPmglHeader header; - UChar *end; - UChar *cur; - unsigned int lenRemain; - UInt64 ui_path_len; - - /* the current ui */ - struct chmUnitInfo ui; - int flag; - - /* starting page */ - curPage = h->index_head; - - /* until we have either returned or given up */ - while (curPage != -1) - { - - /* try to fetch the index page */ - if (_chm_fetch_bytes(h, - page_buf, - h->dir_offset + (UInt64)curPage*h->block_len, - h->block_len) != h->block_len) - { - HeapFree(GetProcessHeap(), 0, page_buf); - return 0; - } - - /* figure out start and end for this page */ - cur = page_buf; - lenRemain = _CHM_PMGL_LEN; - if (! _unmarshal_pmgl_header(&cur, &lenRemain, &header)) - { - HeapFree(GetProcessHeap(), 0, page_buf); - return 0; - } - end = page_buf + h->block_len - (header.free_space); - - /* loop over this page */ - while (cur < end) - { - if (! _chm_parse_PMGL_entry(&cur, &ui)) - { - HeapFree(GetProcessHeap(), 0, page_buf); - return 0; - } - - /* get the length of the path */ - ui_path_len = strlenW(ui.path)-1; - - /* check for DIRS */ - if (ui.path[ui_path_len] == '/' && !(what & CHM_ENUMERATE_DIRS)) - continue; - - /* check for FILES */ - if (ui.path[ui_path_len] != '/' && !(what & CHM_ENUMERATE_FILES)) - continue; - - /* check for NORMAL vs. META */ - if (ui.path[0] == '/') - { - - /* check for NORMAL vs. SPECIAL */ - if (ui.path[1] == '#' || ui.path[1] == '$') - flag = CHM_ENUMERATE_SPECIAL; - else - flag = CHM_ENUMERATE_NORMAL; - } - else - flag = CHM_ENUMERATE_META; - if (! (what & flag)) - continue; - - /* call the enumerator */ - { - int status = (*e)(h, &ui, context); - switch (status) - { - case CHM_ENUMERATOR_FAILURE: - HeapFree(GetProcessHeap(), 0, page_buf); - return 0; - case CHM_ENUMERATOR_CONTINUE: - break; - case CHM_ENUMERATOR_SUCCESS: - HeapFree(GetProcessHeap(), 0, page_buf); - return 1; - default: - break; - } - } - } - - /* advance to next page */ - curPage = header.block_next; - } - - HeapFree(GetProcessHeap(), 0, page_buf); - return 1; -} - int chm_enumerate_dir(struct chmFile *h, const WCHAR *prefix, int what, diff --git a/dlls/itss/chm_lib.h b/dlls/itss/chm_lib.h index 285795c64aa..0b3718c110b 100644 --- a/dlls/itss/chm_lib.h +++ b/dlls/itss/chm_lib.h @@ -104,11 +104,6 @@ typedef int (*CHM_ENUMERATOR)(struct chmFile *h, #define CHM_ENUMERATOR_FAILURE (0) #define CHM_ENUMERATOR_CONTINUE (1) #define CHM_ENUMERATOR_SUCCESS (2) -int chm_enumerate(struct chmFile *h, - int what, - CHM_ENUMERATOR e, - void *context); - int chm_enumerate_dir(struct chmFile *h, const WCHAR *prefix, int what, diff --git a/dlls/jscript/engine.c b/dlls/jscript/engine.c index 423df46ccb3..05c6225daae 100644 --- a/dlls/jscript/engine.c +++ b/dlls/jscript/engine.c @@ -497,7 +497,7 @@ static HRESULT identifier_eval(exec_ctx_t *ctx, BSTR identifier, DWORD flags, ex } if(item) { - exprval_set_idref(ret, (IDispatch*)item->disp, id); + exprval_set_idref(ret, item->disp, id); return S_OK; } diff --git a/dlls/jscript/jscript.c b/dlls/jscript/jscript.c index bc182f48e7f..d53ac2f6a37 100644 --- a/dlls/jscript/jscript.c +++ b/dlls/jscript/jscript.c @@ -24,6 +24,18 @@ WINE_DEFAULT_DEBUG_CHANNEL(jscript); +#ifdef _WIN64 + +#define CTXARG_T DWORDLONG +#define IActiveScriptParseVtbl IActiveScriptParse64Vtbl + +#else + +#define CTXARG_T DWORD +#define IActiveScriptParseVtbl IActiveScriptParse32Vtbl + +#endif + typedef struct { const IActiveScriptVtbl *lpIActiveScriptVtbl; const IActiveScriptParseVtbl *lpIActiveScriptParseVtbl; @@ -44,11 +56,11 @@ typedef struct { parser_ctx_t *queue_tail; } JScript; -#define ACTSCRIPT(x) ((IActiveScript*) &(x)->lpIActiveScriptVtbl) -#define ASPARSE(x) ((IActiveScriptParse*) &(x)->lpIActiveScriptParseVtbl) -#define ASPARSEPROC(x) ((IActiveScriptParseProcedure2*) &(x)->lpIActiveScriptParseProcedure2Vtbl) -#define ACTSCPPROP(x) ((IActiveScriptProperty*) &(x)->lpIActiveScriptPropertyVtbl) -#define OBJSAFETY(x) ((IObjectSafety*) &(x)->lpIObjectSafetyVtbl) +#define ACTSCRIPT(x) ((IActiveScript*) &(x)->lpIActiveScriptVtbl) +#define ASPARSE(x) (&(x)->lpIActiveScriptParseVtbl) +#define ASPARSEPROC(x) (&(x)->lpIActiveScriptParseProcedure2Vtbl) +#define ACTSCPPROP(x) (&(x)->lpIActiveScriptPropertyVtbl) +#define OBJSAFETY(x) (&(x)->lpIObjectSafetyVtbl) void script_release(script_ctx_t *ctx) { @@ -555,29 +567,29 @@ static HRESULT WINAPI JScriptParse_InitNew(IActiveScriptParse *iface) static HRESULT WINAPI JScriptParse_AddScriptlet(IActiveScriptParse *iface, LPCOLESTR pstrDefaultName, LPCOLESTR pstrCode, LPCOLESTR pstrItemName, LPCOLESTR pstrSubItemName, LPCOLESTR pstrEventName, LPCOLESTR pstrDelimiter, - DWORD dwSourceContextCookie, ULONG ulStartingLineNumber, DWORD dwFlags, + CTXARG_T dwSourceContextCookie, ULONG ulStartingLineNumber, DWORD dwFlags, BSTR *pbstrName, EXCEPINFO *pexcepinfo) { JScript *This = ASPARSE_THIS(iface); - FIXME("(%p)->(%s %s %s %s %s %s %x %u %x %p %p)\n", This, debugstr_w(pstrDefaultName), + FIXME("(%p)->(%s %s %s %s %s %s %s %u %x %p %p)\n", This, debugstr_w(pstrDefaultName), debugstr_w(pstrCode), debugstr_w(pstrItemName), debugstr_w(pstrSubItemName), - debugstr_w(pstrEventName), debugstr_w(pstrDelimiter), dwSourceContextCookie, + debugstr_w(pstrEventName), debugstr_w(pstrDelimiter), wine_dbgstr_longlong(dwSourceContextCookie), ulStartingLineNumber, dwFlags, pbstrName, pexcepinfo); return E_NOTIMPL; } static HRESULT WINAPI JScriptParse_ParseScriptText(IActiveScriptParse *iface, LPCOLESTR pstrCode, LPCOLESTR pstrItemName, IUnknown *punkContext, - LPCOLESTR pstrDelimiter, DWORD dwSourceContextCookie, ULONG ulStartingLine, + LPCOLESTR pstrDelimiter, CTXARG_T dwSourceContextCookie, ULONG ulStartingLine, DWORD dwFlags, VARIANT *pvarResult, EXCEPINFO *pexcepinfo) { JScript *This = ASPARSE_THIS(iface); parser_ctx_t *parser_ctx; HRESULT hres; - TRACE("(%p)->(%s %s %p %s %x %u %x %p %p)\n", This, debugstr_w(pstrCode), + TRACE("(%p)->(%s %s %p %s %s %u %x %p %p)\n", This, debugstr_w(pstrCode), debugstr_w(pstrItemName), punkContext, debugstr_w(pstrDelimiter), - dwSourceContextCookie, ulStartingLine, dwFlags, pvarResult, pexcepinfo); + wine_dbgstr_longlong(dwSourceContextCookie), ulStartingLine, dwFlags, pvarResult, pexcepinfo); if(This->thread_id != GetCurrentThreadId() || This->ctx->state == SCRIPTSTATE_CLOSED) return E_UNEXPECTED; diff --git a/dlls/jscript/lex.c b/dlls/jscript/lex.c index a937804da7a..bf298bfe605 100644 --- a/dlls/jscript/lex.c +++ b/dlls/jscript/lex.c @@ -479,7 +479,7 @@ int parser_lex(void *lval, parser_ctx_t *ctx) if(ret) return ret; - return parse_identifier(ctx, (const WCHAR**)lval); + return parse_identifier(ctx, lval); } if(isdigitW(*ctx->ptr)) @@ -684,7 +684,7 @@ int parser_lex(void *lval, parser_ctx_t *ctx) case '\"': case '\'': - return parse_string_literal(ctx, (const WCHAR**)lval, *ctx->ptr); + return parse_string_literal(ctx, lval, *ctx->ptr); case '_': case '$': diff --git a/dlls/jscript/regexp.c b/dlls/jscript/regexp.c index c531f26eac2..8ae215232e3 100644 --- a/dlls/jscript/regexp.c +++ b/dlls/jscript/regexp.c @@ -559,7 +559,7 @@ EmitREBytecode(CompilerState *state, JSRegExp *re, size_t treeDepth, emitStateSP->jumpToJumpFlag = FALSE; ++emitStateSP; assert((size_t)(emitStateSP - emitStateStack) <= treeDepth); - t = (RENode *) t->kid; + t = t->kid; op = t->op; assert(op < REOP_LIMIT); continue; @@ -572,7 +572,7 @@ EmitREBytecode(CompilerState *state, JSRegExp *re, size_t treeDepth, emitStateSP->continueOp = REOP_ENDALT; ++emitStateSP; assert((size_t)(emitStateSP - emitStateStack) <= treeDepth); - t = (RENode *) t->u.kid2; + t = t->u.kid2; op = t->op; assert(op < REOP_LIMIT); continue; @@ -676,7 +676,7 @@ EmitREBytecode(CompilerState *state, JSRegExp *re, size_t treeDepth, emitStateSP->jumpToJumpFlag = FALSE; ++emitStateSP; assert((size_t)(emitStateSP - emitStateStack) <= treeDepth); - t = (RENode *) t->kid; + t = t->kid; op = t->op; assert(op < REOP_LIMIT); continue; @@ -699,7 +699,7 @@ EmitREBytecode(CompilerState *state, JSRegExp *re, size_t treeDepth, while (t->next && t->next->op == REOP_FLAT && (WCHAR*)t->kid + t->u.flat.length == - (WCHAR*)t->next->kid) { + t->next->kid) { t->u.flat.length += t->next->u.flat.length; t->next = t->next->next; } @@ -727,7 +727,7 @@ EmitREBytecode(CompilerState *state, JSRegExp *re, size_t treeDepth, emitStateSP->continueOp = REOP_RPAREN; ++emitStateSP; assert((size_t)(emitStateSP - emitStateStack) <= treeDepth); - t = (RENode *) t->kid; + t = t->kid; op = t->op; continue; @@ -747,7 +747,7 @@ EmitREBytecode(CompilerState *state, JSRegExp *re, size_t treeDepth, emitStateSP->continueOp = REOP_ASSERTTEST; ++emitStateSP; assert((size_t)(emitStateSP - emitStateStack) <= treeDepth); - t = (RENode *) t->kid; + t = t->kid; op = t->op; continue; @@ -765,7 +765,7 @@ EmitREBytecode(CompilerState *state, JSRegExp *re, size_t treeDepth, emitStateSP->continueOp = REOP_ASSERTNOTTEST; ++emitStateSP; assert((size_t)(emitStateSP - emitStateStack) <= treeDepth); - t = (RENode *) t->kid; + t = t->kid; op = t->op; continue; @@ -793,7 +793,7 @@ EmitREBytecode(CompilerState *state, JSRegExp *re, size_t treeDepth, emitStateSP->continueOp = REOP_ENDCHILD; ++emitStateSP; assert((size_t)(emitStateSP - emitStateStack) <= treeDepth); - t = (RENode *) t->kid; + t = t->kid; op = t->op; continue; diff --git a/dlls/jscript/tests/jscript.c b/dlls/jscript/tests/jscript.c index ac6505833d4..9d9681c299b 100644 --- a/dlls/jscript/tests/jscript.c +++ b/dlls/jscript/tests/jscript.c @@ -304,10 +304,10 @@ static void test_jscript(void) test_state(script, SCRIPTSTATE_UNINITIALIZED); test_safety(unk); - hres = IActiveScriptParse_InitNew(parse); + hres = IActiveScriptParse64_InitNew(parse); ok(hres == S_OK, "InitNew failed: %08x\n", hres); - hres = IActiveScriptParse_InitNew(parse); + hres = IActiveScriptParse64_InitNew(parse); ok(hres == E_UNEXPECTED, "InitNew failed: %08x, expected E_UNEXPECTED\n", hres); hres = IActiveScript_SetScriptSite(script, NULL); @@ -345,7 +345,7 @@ static void test_jscript(void) test_state(script, SCRIPTSTATE_CLOSED); test_script_dispatch(script, FALSE); - IActiveScriptParse_Release(parse); + IUnknown_Release(parse); IActiveScript_Release(script); ref = IUnknown_Release(unk); @@ -387,11 +387,11 @@ static void test_jscript2(void) test_state(script, SCRIPTSTATE_UNINITIALIZED); SET_EXPECT(OnStateChange_INITIALIZED); - hres = IActiveScriptParse_InitNew(parse); + hres = IActiveScriptParse64_InitNew(parse); ok(hres == S_OK, "InitNew failed: %08x\n", hres); CHECK_CALLED(OnStateChange_INITIALIZED); - hres = IActiveScriptParse_InitNew(parse); + hres = IActiveScriptParse64_InitNew(parse); ok(hres == E_UNEXPECTED, "InitNew failed: %08x, expected E_UNEXPECTED\n", hres); SET_EXPECT(OnStateChange_CONNECTED); @@ -413,7 +413,7 @@ static void test_jscript2(void) test_state(script, SCRIPTSTATE_CLOSED); test_script_dispatch(script, FALSE); - IActiveScriptParse_Release(parse); + IUnknown_Release(parse); IActiveScript_Release(script); ref = IUnknown_Release(unk); diff --git a/dlls/jscript/tests/run.c b/dlls/jscript/tests/run.c index 66c312ebfe9..39577cd8b49 100644 --- a/dlls/jscript/tests/run.c +++ b/dlls/jscript/tests/run.c @@ -580,7 +580,7 @@ static void parse_script(BSTR script_str) return; } - hres = IActiveScriptParse_InitNew(parser); + hres = IActiveScriptParse64_InitNew(parser); ok(hres == S_OK, "InitNew failed: %08x\n", hres); hres = IActiveScript_SetScriptSite(engine, &ActiveScriptSite); @@ -593,11 +593,11 @@ static void parse_script(BSTR script_str) hres = IActiveScript_SetScriptState(engine, SCRIPTSTATE_STARTED); ok(hres == S_OK, "SetScriptState(SCRIPTSTATE_STARTED) failed: %08x\n", hres); - hres = IActiveScriptParse_ParseScriptText(parser, script_str, NULL, NULL, NULL, 0, 0, 0, NULL, NULL); + hres = IActiveScriptParse64_ParseScriptText(parser, script_str, NULL, NULL, NULL, 0, 0, 0, NULL, NULL); ok(hres == S_OK, "ParseScriptText failed: %08x\n", hres); IActiveScript_Release(engine); - IActiveScriptParse_Release(parser); + IUnknown_Release(parser); } static void parse_script_a(const char *src) @@ -707,7 +707,7 @@ static void test_isvisible(BOOL global_members) return; } - hres = IActiveScriptParse_InitNew(parser); + hres = IActiveScriptParse64_InitNew(parser); ok(hres == S_OK, "InitNew failed: %08x\n", hres); hres = IActiveScript_SetScriptSite(engine, &ActiveScriptSite); @@ -727,16 +727,16 @@ static void test_isvisible(BOOL global_members) if(!global_members) SET_EXPECT(GetItemInfo_testVal); - hres = IActiveScriptParse_ParseScriptText(parser, script_textW, NULL, NULL, NULL, 0, 0, 0, NULL, NULL); + hres = IActiveScriptParse64_ParseScriptText(parser, script_textW, NULL, NULL, NULL, 0, 0, 0, NULL, NULL); ok(hres == S_OK, "ParseScriptText failed: %08x\n", hres); if(!global_members) CHECK_CALLED(GetItemInfo_testVal); - hres = IActiveScriptParse_ParseScriptText(parser, script_textW, NULL, NULL, NULL, 0, 0, 0, NULL, NULL); + hres = IActiveScriptParse64_ParseScriptText(parser, script_textW, NULL, NULL, NULL, 0, 0, 0, NULL, NULL); ok(hres == S_OK, "ParseScriptText failed: %08x\n", hres); IActiveScript_Release(engine); - IActiveScriptParse_Release(parser); + IUnknown_Release(parser); } static void run_tests(void) diff --git a/dlls/kernel32/process.c b/dlls/kernel32/process.c index 942b97a3e19..56e23b88ff5 100644 --- a/dlls/kernel32/process.c +++ b/dlls/kernel32/process.c @@ -495,6 +495,7 @@ static void set_additional_environment(void) MultiByteToWideChar( CP_UNIXCP, 0, name, -1, user_name, len ); SetEnvironmentVariableW( usernameW, user_name ); } + else WARN( "user name %s not convertible.\n", debugstr_a(name) ); /* set the USERPROFILE and ALLUSERSPROFILE variables */ @@ -522,8 +523,10 @@ static void set_additional_environment(void) strcpyW( value, profile_dir ); p = value + strlenW(value); if (p > value && p[-1] != '\\') *p++ = '\\'; - strcpyW( p, user_name ); - SetEnvironmentVariableW( userprofileW, value ); + if (user_name) { + strcpyW( p, user_name ); + SetEnvironmentVariableW( userprofileW, value ); + } if (all_users_dir) { strcpyW( p, all_users_dir ); diff --git a/dlls/kernel32/tests/directory.c b/dlls/kernel32/tests/directory.c index 47e77013a1d..a0ccd9f924d 100644 --- a/dlls/kernel32/tests/directory.c +++ b/dlls/kernel32/tests/directory.c @@ -339,27 +339,32 @@ static void test_CreateDirectoryW(void) ret = CreateDirectoryW(NULL, NULL); if (!ret && GetLastError()==ERROR_CALL_NOT_IMPLEMENTED) return; - ok(ret == FALSE && GetLastError() == ERROR_PATH_NOT_FOUND, "should not create NULL path\n"); + ok(ret == FALSE && GetLastError() == ERROR_PATH_NOT_FOUND, + "should not create NULL path ret %u err %u\n", ret, GetLastError()); ret = CreateDirectoryW(empty_strW, NULL); - ok(ret == FALSE && GetLastError() == ERROR_PATH_NOT_FOUND, "should not create empty path\n"); + ok(ret == FALSE && GetLastError() == ERROR_PATH_NOT_FOUND, + "should not create empty path ret %u err %u\n", ret, GetLastError()); ret = GetSystemDirectoryW(tmpdir, MAX_PATH); ok(ret < MAX_PATH, "System directory should fit into MAX_PATH\n"); ret = SetCurrentDirectoryW(tmpdir); - ok(ret == TRUE, "could not chdir to the System directory\n"); + ok(ret == TRUE, "could not chdir to the System directory ret %u err %u\n", ret, GetLastError()); ret = CreateDirectoryW(dotW, NULL); - ok(ret == FALSE && GetLastError() == ERROR_ALREADY_EXISTS, "should not create existing path\n"); + ok(ret == FALSE && GetLastError() == ERROR_ALREADY_EXISTS, + "should not create existing path ret %u err %u\n", ret, GetLastError()); ret = CreateDirectoryW(dotdotW, NULL); - ok(ret == FALSE && GetLastError() == ERROR_ALREADY_EXISTS, "should not create existing path\n"); + ok(ret == FALSE && GetLastError() == ERROR_ALREADY_EXISTS, + "should not create existing path ret %u err %u\n", ret, GetLastError()); GetTempPathW(MAX_PATH, tmpdir); tmpdir[3] = 0; /* truncate the path */ ret = CreateDirectoryW(tmpdir, NULL); - ok(ret == FALSE && GetLastError() == ERROR_ACCESS_DENIED, "should deny access to the drive root\n"); + ok(ret == FALSE && (GetLastError() == ERROR_ACCESS_DENIED || GetLastError() == ERROR_ALREADY_EXISTS), + "should deny access to the drive root ret %u err %u\n", ret, GetLastError()); GetTempPathW(MAX_PATH, tmpdir); lstrcatW(tmpdir, tmp_dir_name); @@ -367,7 +372,8 @@ static void test_CreateDirectoryW(void) ok(ret == TRUE, "CreateDirectoryW should always succeed\n"); ret = CreateDirectoryW(tmpdir, NULL); - ok(ret == FALSE && GetLastError() == ERROR_ALREADY_EXISTS, "should not create existing path\n"); + ok(ret == FALSE && GetLastError() == ERROR_ALREADY_EXISTS, + "should not create existing path ret %u err %u\n", ret, GetLastError()); ret = RemoveDirectoryW(tmpdir); ok(ret == TRUE, "RemoveDirectoryW should always succeed\n"); @@ -391,8 +397,9 @@ static void test_CreateDirectoryW(void) lstrcatW(tmpdir, slashW); lstrcatW(tmpdir, tmp_dir_name); ret = CreateDirectoryW(tmpdir, NULL); - ok(ret == FALSE && GetLastError() == ERROR_PATH_NOT_FOUND, - "CreateDirectoryW with multiple nonexistent directories in path should fail\n"); + ok(ret == FALSE && GetLastError() == ERROR_PATH_NOT_FOUND, + "CreateDirectoryW with multiple nonexistent directories in path should fail ret %u err %u\n", + ret, GetLastError()); ret = RemoveDirectoryW(tmpdir); } diff --git a/dlls/kernel32/tests/drive.c b/dlls/kernel32/tests/drive.c index a94cbdfea6e..81e04bfcbb2 100644 --- a/dlls/kernel32/tests/drive.c +++ b/dlls/kernel32/tests/drive.c @@ -118,7 +118,10 @@ static void test_GetDiskFreeSpaceA(void) else { ok(ret || - (!ret && (GetLastError() == ERROR_NOT_READY || GetLastError() == ERROR_INVALID_DRIVE)), + GetLastError() == ERROR_NOT_READY || + GetLastError() == ERROR_INVALID_DRIVE || + GetLastError() == ERROR_PATH_NOT_FOUND || + GetLastError() == ERROR_UNRECOGNIZED_VOLUME, "GetDiskFreeSpaceA(%s): ret=%d GetLastError=%d\n", drive, ret, GetLastError()); if( GetVersion() & 0x80000000) @@ -132,7 +135,10 @@ static void test_GetDiskFreeSpaceA(void) tot.QuadPart = sectors_per_cluster; tot.QuadPart = (tot.QuadPart * bytes_per_sector) * total_clusters; ret = pGetDiskFreeSpaceExA( drive, &d, &totEx, NULL); - ok( ret || (!ret && ERROR_NOT_READY == GetLastError()), + ok( ret || + GetLastError() == ERROR_NOT_READY || + GetLastError() == ERROR_PATH_NOT_FOUND || + GetLastError() == ERROR_UNRECOGNIZED_VOLUME, "GetDiskFreeSpaceExA( %s ) failed. GetLastError=%d\n", drive, GetLastError()); ok( bytes_per_sector == 0 || /* empty cd rom drive */ totEx.QuadPart <= tot.QuadPart, @@ -188,7 +194,10 @@ static void test_GetDiskFreeSpaceW(void) "GetDiskFreeSpaceW(%c): ret=%d GetLastError=%d\n", drive[0], ret, GetLastError()); else - ok(ret || GetLastError() == ERROR_NOT_READY, + ok( ret || + GetLastError() == ERROR_NOT_READY || + GetLastError() == ERROR_PATH_NOT_FOUND || + GetLastError() == ERROR_UNRECOGNIZED_VOLUME, "GetDiskFreeSpaceW(%c): ret=%d GetLastError=%d\n", drive[0], ret, GetLastError()); } diff --git a/dlls/kernel32/tests/file.c b/dlls/kernel32/tests/file.c index 1196d7af012..a96ea922d81 100644 --- a/dlls/kernel32/tests/file.c +++ b/dlls/kernel32/tests/file.c @@ -1323,6 +1323,7 @@ static void test_FindFirstFileA(void) int err; char buffer[5] = "C:\\"; char buffer2[100]; + char nonexistent[MAX_PATH]; /* try FindFirstFileA on "C:\" */ buffer[0] = get_windows_drive(); @@ -1360,8 +1361,10 @@ static void test_FindFirstFileA(void) /* try FindFirstFileA on "C:\foo\" */ SetLastError( 0xdeadbeaf ); - strcpy(buffer2, buffer); - strcat(buffer2, "foo\\"); + GetTempFileNameA( buffer, "foo", 0, nonexistent ); + DeleteFileA( nonexistent ); + strcpy(buffer2, nonexistent); + strcat(buffer2, "\\"); handle = FindFirstFileA(buffer2, &data); err = GetLastError(); ok ( handle == INVALID_HANDLE_VALUE, "FindFirstFile on %s should Fail\n", buffer2 ); @@ -1371,8 +1374,8 @@ static void test_FindFirstFileA(void) /* try FindFirstFileA on "C:\foo\bar.txt" */ SetLastError( 0xdeadbeaf ); - strcpy(buffer2, buffer); - strcat(buffer2, "foo\\bar.txt"); + strcpy(buffer2, nonexistent); + strcat(buffer2, "\\bar.txt"); handle = FindFirstFileA(buffer2, &data); err = GetLastError(); ok ( handle == INVALID_HANDLE_VALUE, "FindFirstFile on %s should Fail\n", buffer2 ); @@ -1380,8 +1383,8 @@ static void test_FindFirstFileA(void) /* try FindFirstFileA on "C:\foo\*.*" */ SetLastError( 0xdeadbeaf ); - strcpy(buffer2, buffer); - strcat(buffer2, "foo\\*.*"); + strcpy(buffer2, nonexistent); + strcat(buffer2, "\\*.*"); handle = FindFirstFileA(buffer2, &data); err = GetLastError(); ok ( handle == INVALID_HANDLE_VALUE, "FindFirstFile on %s should Fail\n", buffer2 ); @@ -1389,7 +1392,8 @@ static void test_FindFirstFileA(void) /* try FindFirstFileA on "foo\bar.txt" */ SetLastError( 0xdeadbeaf ); - strcpy(buffer2, "foo\\bar.txt"); + strcpy(buffer2, nonexistent + 3); + strcat(buffer2, "\\bar.txt"); handle = FindFirstFileA(buffer2, &data); err = GetLastError(); ok ( handle == INVALID_HANDLE_VALUE, "FindFirstFile on %s should Fail\n", buffer2 ); diff --git a/dlls/kernel32/tests/path.c b/dlls/kernel32/tests/path.c index a272b567ec5..397d4f46962 100644 --- a/dlls/kernel32/tests/path.c +++ b/dlls/kernel32/tests/path.c @@ -384,14 +384,16 @@ static void test_InitPathA(CHAR *newdir, CHAR *curDrive, CHAR *otherDrive) ok(CreateDirectoryA(tmpstr,NULL),"CreateDirectoryA failed\n"); sprintf(tmpstr,"%s\\%s",newdir,LONGDIR); ok(CreateDirectoryA(tmpstr,NULL),"CreateDirectoryA failed\n"); - bRes = CreateDirectoryA("c:",NULL); - ok(!bRes && (GetLastError() == ERROR_ACCESS_DENIED || + sprintf(tmpstr,"%c:", *curDrive); + bRes = CreateDirectoryA(tmpstr,NULL); + ok(!bRes && (GetLastError() == ERROR_ACCESS_DENIED || GetLastError() == ERROR_ALREADY_EXISTS), - "CreateDirectoryA(\"c:\" should have failed (%d)\n", GetLastError()); - bRes = CreateDirectoryA("c:\\",NULL); + "CreateDirectoryA(\"%s\" should have failed (%d)\n", tmpstr, GetLastError()); + sprintf(tmpstr,"%c:\\", *curDrive); + bRes = CreateDirectoryA(tmpstr,NULL); ok(!bRes && (GetLastError() == ERROR_ACCESS_DENIED || GetLastError() == ERROR_ALREADY_EXISTS), - "CreateDirectoryA(\"c:\\\" should have failed (%d)\n", GetLastError()); + "CreateDirectoryA(\"%s\" should have failed (%d)\n", tmpstr, GetLastError()); sprintf(tmpstr,"%s\\%s\\%s",newdir,SHORTDIR,SHORTFILE); hndl=CreateFileA(tmpstr,GENERIC_WRITE,0,NULL, CREATE_NEW,FILE_ATTRIBUTE_NORMAL,NULL); diff --git a/dlls/kernel32/tests/profile.c b/dlls/kernel32/tests/profile.c index 5292c33a7b6..2e5678cb94c 100644 --- a/dlls/kernel32/tests/profile.c +++ b/dlls/kernel32/tests/profile.c @@ -174,13 +174,17 @@ static void test_profile_sections(void) SetLastError(0xdeadbeef); ret = GetPrivateProfileSectionA( NULL, buf, sizeof(buf), testfile4 ); ok( ret == 0, "expected return size 0, got %d\n", ret ); - ok( GetLastError() == ERROR_INVALID_PARAMETER, "expected ERROR_INVALID_PARAMETER, got %d\n", GetLastError()); + ok( GetLastError() == ERROR_INVALID_PARAMETER || + broken(GetLastError() == 0xdeadbeef), /* Win9x, WinME */ + "expected ERROR_INVALID_PARAMETER, got %d\n", GetLastError()); SetLastError(0xdeadbeef); ret = GetPrivateProfileSectionA( "section1", buf, sizeof(buf), NULL ); ok( ret == 0, "expected return size 0, got %d\n", ret ); todo_wine - ok( GetLastError() == ERROR_FILE_NOT_FOUND, "expected ERROR_FILE_NOT_FOUND, got %d\n", GetLastError()); + ok( GetLastError() == ERROR_FILE_NOT_FOUND || + broken(GetLastError() == 0xdeadbeef), /* Win9x, WinME */ + "expected ERROR_FILE_NOT_FOUND, got %d\n", GetLastError()); /* And a real one */ SetLastError(0xdeadbeef); @@ -190,7 +194,9 @@ static void test_profile_sections(void) ok( ret == 35 && !strcmp( buf, "name1=val1,name2=,name3,name4=val4"), "wrong section returned(%d): %s\n", ret, buf); ok( buf[ret-1] == 0 && buf[ret] == 0, "returned buffer not terminated with double-null\n" ); - ok( GetLastError() == ERROR_SUCCESS, "expected ERROR_SUCCESS, got %d\n", GetLastError()); + ok( GetLastError() == ERROR_SUCCESS || + broken(GetLastError() == 0xdeadbeef), /* Win9x, WinME */ + "expected ERROR_SUCCESS, got %d\n", GetLastError()); DeleteFileA( testfile4 ); } @@ -371,8 +377,11 @@ static void test_profile_existing(void) ok(INVALID_HANDLE_VALUE != h, "%d: CreateFile failed\n",i); SetLastError(0xdeadbeef); ret = GetPrivateProfileStringA(SECTION, KEY, NULL, buffer, MAX_PATH, testfile2); + /* Win9x and WinME returns 0 for all cases except the first one */ if (!pe[i].read_error) - ok( ret, "%d: GetPrivateProfileString failed with error %u\n", i, GetLastError() ); + ok( ret || + broken(!ret && GetLastError() == 0xdeadbeef), /* Win9x, WinME */ + "%d: GetPrivateProfileString failed with error %u\n", i, GetLastError() ); else ok( !ret, "%d: GetPrivateProfileString succeeded\n", i ); CloseHandle(h); @@ -393,8 +402,11 @@ static void test_profile_delete_on_close(void) "Cannot write test file: %x\n", GetLastError() ); ok( size == sizeof contents - 1, "Test file: partial write\n"); + SetLastError(0xdeadbeef); res = GetPrivateProfileInt(SECTION, KEY, 0, testfile); - ok( res == 123, "Got %d instead of 123\n", res); + ok( res == 123 || + broken(res == 0 && GetLastError() == ERROR_SHARING_VIOLATION), /* Win9x, WinME */ + "Got %d instead of 123\n", res); /* This also deletes the file */ CloseHandle(h); @@ -414,8 +426,11 @@ static void test_profile_refresh(void) "Cannot write test file: %x\n", GetLastError() ); ok( size == sizeof contents1 - 1, "Test file: partial write\n"); + SetLastError(0xdeadbeef); res = GetPrivateProfileInt(SECTION, KEY, 0, testfile); - ok( res == 123, "Got %d instead of 123\n", res); + ok( res == 123 || + broken(res == 0 && GetLastError() == ERROR_SHARING_VIOLATION), /* Win9x, WinME */ + "Got %d instead of 123\n", res); CloseHandle(h); @@ -427,8 +442,11 @@ static void test_profile_refresh(void) "Cannot write test file: %x\n", GetLastError() ); ok( size == sizeof contents2 - 1, "Test file: partial write\n"); + SetLastError(0xdeadbeef); res = GetPrivateProfileInt(SECTION, KEY, 0, testfile); - ok( res == 124, "Got %d instead of 124\n", res); + ok( res == 124 || + broken(res == 0 && GetLastError() == 0xdeadbeef), /* Win9x, WinME */ + "Got %d instead of 124\n", res); /* This also deletes the file */ CloseHandle(h); @@ -494,6 +512,7 @@ static void test_GetPrivateProfileString(const char *content, const char *descri Sleep(2500); /* lpAppName is NULL */ + memset(buf, 0xc, sizeof(buf)); lstrcpyA(buf, "kumquat"); ret = GetPrivateProfileStringA(NULL, "name1", "default", buf, MAX_PATH, filename); @@ -501,10 +520,11 @@ static void test_GetPrivateProfileString(const char *content, const char *descri broken(ret == 19), /* Win9x and WinME */ "Expected 18, got %d\n", ret); len = lstrlenA("section1") + sizeof(CHAR) + lstrlenA("section2") + 2 * sizeof(CHAR); - ok(!memcmp(buf, "section1\0section2\0", len), - "Expected \"section1\\0section2\\0\", got \"%s\"\n", buf); + ok(!memcmp(buf, "section1\0section2\0\0", len), + "Expected \"section1\\0section2\\0\\0\", got \"%s\"\n", buf); /* lpAppName is empty */ + memset(buf, 0xc, sizeof(buf)); lstrcpyA(buf, "kumquat"); ret = GetPrivateProfileStringA(emptystr, "name1", "default", buf, MAX_PATH, filename); @@ -513,6 +533,7 @@ static void test_GetPrivateProfileString(const char *content, const char *descri ok(emptystr_ok(emptystr), "AppName modified\n"); /* lpAppName is missing */ + memset(buf, 0xc,sizeof(buf)); lstrcpyA(buf, "kumquat"); ret = GetPrivateProfileStringA("notasection", "name1", "default", buf, MAX_PATH, filename); @@ -520,6 +541,7 @@ static void test_GetPrivateProfileString(const char *content, const char *descri ok(!lstrcmpA(buf, "default"), "Expected \"default\", got \"%s\"\n", buf); /* lpAppName is empty, lpDefault is NULL */ + memset(buf, 0xc,sizeof(buf)); lstrcpyA(buf, "kumquat"); ret = GetPrivateProfileStringA(emptystr, "name1", NULL, buf, MAX_PATH, filename); @@ -530,6 +552,7 @@ static void test_GetPrivateProfileString(const char *content, const char *descri ok(emptystr_ok(emptystr), "AppName modified\n"); /* lpAppName is empty, lpDefault is empty */ + memset(buf, 0xc,sizeof(buf)); lstrcpyA(buf, "kumquat"); ret = GetPrivateProfileStringA(emptystr, "name1", "", buf, MAX_PATH, filename); @@ -538,6 +561,7 @@ static void test_GetPrivateProfileString(const char *content, const char *descri ok(emptystr_ok(emptystr), "AppName modified\n"); /* lpAppName is empty, lpDefault has trailing blank characters */ + memset(buf, 0xc,sizeof(buf)); lstrcpyA(buf, "kumquat"); /* lpDefault must be writable (trailing blanks are removed inplace in win9x) */ lstrcpyA(def_val, "default "); @@ -548,6 +572,7 @@ static void test_GetPrivateProfileString(const char *content, const char *descri ok(emptystr_ok(emptystr), "AppName modified\n"); /* lpAppName is empty, many blank characters in lpDefault */ + memset(buf, 0xc,sizeof(buf)); lstrcpyA(buf, "kumquat"); /* lpDefault must be writable (trailing blanks are removed inplace in win9x) */ lstrcpyA(def_val, "one two "); @@ -558,6 +583,7 @@ static void test_GetPrivateProfileString(const char *content, const char *descri ok(emptystr_ok(emptystr), "AppName modified\n"); /* lpAppName is empty, blank character but not trailing in lpDefault */ + memset(buf, 0xc,sizeof(buf)); lstrcpyA(buf, "kumquat"); ret = GetPrivateProfileStringA(emptystr, "name1", "one two", buf, MAX_PATH, filename); @@ -566,6 +592,7 @@ static void test_GetPrivateProfileString(const char *content, const char *descri ok(emptystr_ok(emptystr), "AppName modified\n"); /* lpKeyName is NULL */ + memset(buf, 0xc,sizeof(buf)); lstrcpyA(buf, "kumquat"); ret = GetPrivateProfileStringA("section1", NULL, "default", buf, MAX_PATH, filename); @@ -574,6 +601,7 @@ static void test_GetPrivateProfileString(const char *content, const char *descri "Expected \"name1\\0name2\\0name4\\0\", got \"%s\"\n", buf); /* lpKeyName is empty */ + memset(buf, 0xc,sizeof(buf)); lstrcpyA(buf, "kumquat"); ret = GetPrivateProfileStringA("section1", emptystr, "default", buf, MAX_PATH, filename); @@ -582,6 +610,7 @@ static void test_GetPrivateProfileString(const char *content, const char *descri ok(emptystr_ok(emptystr), "KeyName modified\n"); /* lpKeyName is missing */ + memset(buf, 0xc,sizeof(buf)); lstrcpyA(buf, "kumquat"); ret = GetPrivateProfileStringA("section1", "notakey", "default", buf, MAX_PATH, filename); @@ -589,6 +618,7 @@ static void test_GetPrivateProfileString(const char *content, const char *descri ok(!lstrcmpA(buf, "default"), "Expected \"default\", got \"%s\"\n", buf); /* lpKeyName is empty, lpDefault is NULL */ + memset(buf, 0xc,sizeof(buf)); lstrcpyA(buf, "kumquat"); ret = GetPrivateProfileStringA("section1", emptystr, NULL, buf, MAX_PATH, filename); @@ -599,6 +629,7 @@ static void test_GetPrivateProfileString(const char *content, const char *descri ok(emptystr_ok(emptystr), "KeyName modified\n"); /* lpKeyName is empty, lpDefault is empty */ + memset(buf, 0xc,sizeof(buf)); lstrcpyA(buf, "kumquat"); ret = GetPrivateProfileStringA("section1", emptystr, "", buf, MAX_PATH, filename); @@ -607,6 +638,7 @@ static void test_GetPrivateProfileString(const char *content, const char *descri ok(emptystr_ok(emptystr), "KeyName modified\n"); /* lpKeyName is empty, lpDefault has trailing blank characters */ + memset(buf, 0xc,sizeof(buf)); lstrcpyA(buf, "kumquat"); /* lpDefault must be writable (trailing blanks are removed inplace in win9x) */ lstrcpyA(def_val, "default "); @@ -624,6 +656,7 @@ static void test_GetPrivateProfileString(const char *content, const char *descri } /* lpFileName is NULL */ + memset(buf, 0xc,sizeof(buf)); lstrcpyA(buf, "kumquat"); ret = GetPrivateProfileStringA("section1", "name1", "default", buf, MAX_PATH, NULL); @@ -635,6 +668,7 @@ static void test_GetPrivateProfileString(const char *content, const char *descri "Expected \"default\", got \"%s\"\n", buf); /* lpFileName is empty */ + memset(buf, 0xc,sizeof(buf)); lstrcpyA(buf, "kumquat"); ret = GetPrivateProfileStringA("section1", "name1", "default", buf, MAX_PATH, ""); @@ -642,6 +676,7 @@ static void test_GetPrivateProfileString(const char *content, const char *descri ok(!lstrcmpA(buf, "default"), "Expected \"default\", got \"%s\"\n", buf); /* lpFileName is nonexistent */ + memset(buf, 0xc,sizeof(buf)); lstrcpyA(buf, "kumquat"); ret = GetPrivateProfileStringA("section1", "name1", "default", buf, MAX_PATH, "nonexistent"); @@ -649,6 +684,7 @@ static void test_GetPrivateProfileString(const char *content, const char *descri ok(!lstrcmpA(buf, "default"), "Expected \"default\", got \"%s\"\n", buf); /* nSize is 0 */ + memset(buf, 0xc,sizeof(buf)); lstrcpyA(buf, "kumquat"); ret = GetPrivateProfileStringA("section1", "name1", "default", buf, 0, filename); @@ -656,6 +692,7 @@ static void test_GetPrivateProfileString(const char *content, const char *descri ok(!lstrcmpA(buf, "kumquat"), "Expected buf to be unchanged, got \"%s\"\n", buf); /* nSize is exact size of output */ + memset(buf, 0xc,sizeof(buf)); lstrcpyA(buf, "kumquat"); ret = GetPrivateProfileStringA("section1", "name1", "default", buf, 4, filename); @@ -663,6 +700,7 @@ static void test_GetPrivateProfileString(const char *content, const char *descri ok(!lstrcmpA(buf, "val"), "Expected \"val\", got \"%s\"\n", buf); /* nSize has room for NULL terminator */ + memset(buf, 0xc,sizeof(buf)); lstrcpyA(buf, "kumquat"); ret = GetPrivateProfileStringA("section1", "name1", "default", buf, 5, filename); @@ -670,6 +708,7 @@ static void test_GetPrivateProfileString(const char *content, const char *descri ok(!lstrcmpA(buf, "val1"), "Expected \"val1\", got \"%s\"\n", buf); /* output is 1 character */ + memset(buf, 0xc,sizeof(buf)); lstrcpyA(buf, "kumquat"); ret = GetPrivateProfileStringA("section1", "name4", "default", buf, MAX_PATH, filename); @@ -677,6 +716,7 @@ static void test_GetPrivateProfileString(const char *content, const char *descri ok(!lstrcmpA(buf, "a"), "Expected \"a\", got \"%s\"\n", buf); /* output is 1 character, no room for NULL terminator */ + memset(buf, 0xc,sizeof(buf)); lstrcpyA(buf, "kumquat"); ret = GetPrivateProfileStringA("section1", "name4", "default", buf, 1, filename); @@ -684,25 +724,30 @@ static void test_GetPrivateProfileString(const char *content, const char *descri ok(!lstrcmpA(buf, ""), "Expected \"\", got \"%s\"\n", buf); /* lpAppName is NULL, not enough room for final section name */ + memset(buf, 0xc,sizeof(buf)); lstrcpyA(buf, "kumquat"); ret = GetPrivateProfileStringA(NULL, "name1", "default", buf, 16, filename); ok(ret == 14, "Expected 14, got %d\n", ret); len = lstrlenA("section1") + 2 * sizeof(CHAR); - ok(!memcmp(buf, "section1\0secti\0", ret + 1) || + todo_wine + ok(!memcmp(buf, "section1\0secti\0\0", ret + 2) || broken(!memcmp(buf, "section1\0\0", len)), /* Win9x, WinME */ - "Expected \"section1\\0secti\\0\", got \"%s\"\n", buf); + "Expected \"section1\\0secti\\0\\0\", got \"%s\"\n", buf); /* lpKeyName is NULL, not enough room for final key name */ + memset(buf, 0xc,sizeof(buf)); lstrcpyA(buf, "kumquat"); ret = GetPrivateProfileStringA("section1", NULL, "default", buf, 16, filename); ok(ret == 14, "Expected 14, got %d\n", ret); - ok(!memcmp(buf, "name1\0name2\0na\0", ret + 1) || + todo_wine + ok(!memcmp(buf, "name1\0name2\0na\0\0", ret + 2) || broken(!memcmp(buf, "name1\0name2\0n\0\0", ret + 1)), /* Win9x, WinME */ - "Expected \"name1\\0name2\\0na\\0\", got \"%s\"\n", buf); + "Expected \"name1\\0name2\\0na\\0\\0\", got \"%s\"\n", buf); /* key value has quotation marks which are stripped */ + memset(buf, 0xc,sizeof(buf)); lstrcpyA(buf, "kumquat"); ret = GetPrivateProfileStringA("section1", "name2", "default", buf, MAX_PATH, filename); @@ -710,6 +755,7 @@ static void test_GetPrivateProfileString(const char *content, const char *descri ok(!lstrcmpA(buf, "val2"), "Expected \"val2\", got \"%s\"\n", buf); /* case does not match */ + memset(buf, 0xc,sizeof(buf)); lstrcpyA(buf, "kumquat"); ret = GetPrivateProfileStringA("section1", "NaMe1", "default", buf, MAX_PATH, filename); @@ -717,6 +763,7 @@ static void test_GetPrivateProfileString(const char *content, const char *descri ok(!lstrcmpA(buf, "val1"), "Expected \"val1\", got \"%s\"\n", buf); /* only filename is used */ + memset(buf, 0xc,sizeof(buf)); lstrcpyA(buf, "kumquat"); ret = GetPrivateProfileStringA("section1", "NaMe1", "default", buf, MAX_PATH, "winetest.ini"); @@ -736,6 +783,7 @@ static void test_GetPrivateProfileString(const char *content, const char *descri create_test_file(path, content, lstrlenA(content)); /* only filename is used, file exists in windows directory */ + memset(buf, 0xc,sizeof(buf)); lstrcpyA(buf, "kumquat"); ret = GetPrivateProfileStringA("section1", "NaMe1", "default", buf, MAX_PATH, tempfile); @@ -743,6 +791,7 @@ static void test_GetPrivateProfileString(const char *content, const char *descri ok(!lstrcmpA(buf, "val1"), "Expected \"val1\", got \"%s\"\n", buf); /* successful case */ + memset(buf, 0xc,sizeof(buf)); lstrcpyA(buf, "kumquat"); ret = GetPrivateProfileStringA("section1", "name1", "default", buf, MAX_PATH, filename); diff --git a/dlls/localspl/localspl_main.c b/dlls/localspl/localspl_main.c index 7137d9721f8..18b51acbe3e 100644 --- a/dlls/localspl/localspl_main.c +++ b/dlls/localspl/localspl_main.c @@ -129,6 +129,8 @@ static const WCHAR win40_subdirW[] = {'w','i','n','4','0',0}; static const WCHAR version0_regpathW[] = {'\\','V','e','r','s','i','o','n','-','0',0}; static const WCHAR version0_subdirW[] = {'\\','0',0}; +static const WCHAR x64_envnameW[] = {'W','i','n','d','o','w','s',' ','x','6','4',0}; +static const WCHAR x64_subdirW[] = {'x','6','4',0}; static const WCHAR x86_envnameW[] = {'W','i','n','d','o','w','s',' ','N','T',' ','x','8','6',0}; static const WCHAR x86_subdirW[] = {'w','3','2','x','8','6',0}; static const WCHAR version3_regpathW[] = {'\\','V','e','r','s','i','o','n','-','3',0}; @@ -138,10 +140,13 @@ static const WCHAR version3_subdirW[] = {'\\','3',0}; static const printenv_t env_x86 = {x86_envnameW, x86_subdirW, 3, version3_regpathW, version3_subdirW}; +static const printenv_t env_x64 = {x64_envnameW, x64_subdirW, 3, + version3_regpathW, version3_subdirW}; + static const printenv_t env_win40 = {win40_envnameW, win40_subdirW, 0, version0_regpathW, version0_subdirW}; -static const printenv_t * const all_printenv[] = {&env_x86, &env_win40}; +static const printenv_t * const all_printenv[] = {&env_x86, &env_x64, &env_win40}; static const DWORD di_sizeof[] = {0, sizeof(DRIVER_INFO_1W), sizeof(DRIVER_INFO_2W), diff --git a/dlls/mapi32/tests/prop.c b/dlls/mapi32/tests/prop.c index 0e979d15e08..8bee893a0ee 100644 --- a/dlls/mapi32/tests/prop.c +++ b/dlls/mapi32/tests/prop.c @@ -239,7 +239,8 @@ static void test_UlPropSize(void) } res = pUlPropSize(&pv); - ok(res == exp, "pt= %d: Expected %d, got %d\n", pt, exp, res); + ok(res == exp || broken(!res) /* Win9x */, + "pt= %d: Expected %d, got %d\n", pt, exp, res); } } @@ -280,30 +281,30 @@ static void test_FPropContainsProp(void) pvRight.Value.lpszA = szFull; bRet = pFPropContainsProp(&pvLeft, &pvRight, FL_FULLSTRING); - ok(bRet == TRUE, "(full,full)[] match failed\n"); + ok(bRet == TRUE || broken(!bRet) /* Win9x */, "(full,full)[] match failed\n"); pvRight.Value.lpszA = szPrefix; bRet = pFPropContainsProp(&pvLeft, &pvRight, FL_FULLSTRING); ok(bRet == FALSE, "(full,prefix)[] match failed\n"); bRet = pFPropContainsProp(&pvLeft, &pvRight, FL_PREFIX); ok(bRet == TRUE, "(full,prefix)[PREFIX] match failed\n"); bRet = pFPropContainsProp(&pvLeft, &pvRight, FL_SUBSTRING); - ok(bRet == TRUE, "(full,prefix)[SUBSTRING] match failed\n"); + ok(bRet == TRUE || broken(!bRet) /* Win9x */, "(full,prefix)[SUBSTRING] match failed\n"); pvRight.Value.lpszA = szPrefixLower; bRet = pFPropContainsProp(&pvLeft, &pvRight, FL_PREFIX); ok(bRet == FALSE, "(full,prefixlow)[PREFIX] match failed\n"); bRet = pFPropContainsProp(&pvLeft, &pvRight, FL_SUBSTRING); ok(bRet == FALSE, "(full,prefixlow)[SUBSTRING] match failed\n"); bRet = pFPropContainsProp(&pvLeft, &pvRight, FL_PREFIX|FL_IGNORECASE); - ok(bRet == TRUE, "(full,prefixlow)[PREFIX|IGNORECASE] match failed\n"); + ok(bRet == TRUE || broken(!bRet) /* Win9x */, "(full,prefixlow)[PREFIX|IGNORECASE] match failed\n"); bRet = pFPropContainsProp(&pvLeft, &pvRight, FL_SUBSTRING|FL_IGNORECASE); - ok(bRet == TRUE, "(full,prefixlow)[SUBSTRING|IGNORECASE] match failed\n"); + ok(bRet == TRUE || broken(!bRet) /* Win9x */, "(full,prefixlow)[SUBSTRING|IGNORECASE] match failed\n"); pvRight.Value.lpszA = szSubstring; bRet = pFPropContainsProp(&pvLeft, &pvRight, FL_FULLSTRING); ok(bRet == FALSE, "(full,substr)[] match failed\n"); bRet = pFPropContainsProp(&pvLeft, &pvRight, FL_PREFIX); ok(bRet == FALSE, "(full,substr)[PREFIX] match failed\n"); bRet = pFPropContainsProp(&pvLeft, &pvRight, FL_SUBSTRING); - ok(bRet == TRUE, "(full,substr)[SUBSTRING] match failed\n"); + ok(bRet == TRUE || broken(!bRet) /* Win9x */, "(full,substr)[SUBSTRING] match failed\n"); pvRight.Value.lpszA = szSubstringLower; bRet = pFPropContainsProp(&pvLeft, &pvRight, FL_PREFIX); ok(bRet == FALSE, "(full,substrlow)[PREFIX] match failed\n"); @@ -312,10 +313,10 @@ static void test_FPropContainsProp(void) bRet = pFPropContainsProp(&pvLeft, &pvRight, FL_PREFIX|FL_IGNORECASE); ok(bRet == FALSE, "(full,substrlow)[PREFIX|IGNORECASE] match failed\n"); bRet = pFPropContainsProp(&pvLeft, &pvRight, FL_SUBSTRING|FL_IGNORECASE); - ok(bRet == TRUE, "(full,substrlow)[SUBSTRING|IGNORECASE] match failed\n"); + ok(bRet == TRUE || broken(!bRet) /* Win9x */, "(full,substrlow)[SUBSTRING|IGNORECASE] match failed\n"); pvRight.Value.lpszA = szFullLower; bRet = pFPropContainsProp(&pvLeft, &pvRight, FL_FULLSTRING|FL_IGNORECASE); - ok(bRet == TRUE, "(full,fulllow)[IGNORECASE] match failed\n"); + ok(bRet == TRUE || broken(!bRet) /* Win9x */, "(full,fulllow)[IGNORECASE] match failed\n"); pvLeft.ulPropTag = pvRight.ulPropTag = PT_BINARY; pvLeft.Value.bin.lpb = (LPBYTE)szFull; @@ -323,15 +324,15 @@ static void test_FPropContainsProp(void) pvLeft.Value.bin.cb = pvRight.Value.bin.cb = strlen(szFull); bRet = pFPropContainsProp(&pvLeft, &pvRight, FL_FULLSTRING); - ok(bRet == TRUE, "bin(full,full)[] match failed\n"); + ok(bRet == TRUE || broken(!bRet) /* Win9x */, "bin(full,full)[] match failed\n"); pvRight.Value.bin.lpb = (LPBYTE)szPrefix; pvRight.Value.bin.cb = strlen(szPrefix); bRet = pFPropContainsProp(&pvLeft, &pvRight, FL_FULLSTRING); ok(bRet == FALSE, "bin(full,prefix)[] match failed\n"); bRet = pFPropContainsProp(&pvLeft, &pvRight, FL_PREFIX); - ok(bRet == TRUE, "bin(full,prefix)[PREFIX] match failed\n"); + ok(bRet == TRUE || broken(!bRet) /* Win9x */, "bin(full,prefix)[PREFIX] match failed\n"); bRet = pFPropContainsProp(&pvLeft, &pvRight, FL_SUBSTRING); - ok(bRet == TRUE, "bin(full,prefix)[SUBSTRING] match failed\n"); + ok(bRet == TRUE || broken(!bRet) /* Win9x */, "bin(full,prefix)[SUBSTRING] match failed\n"); pvRight.Value.bin.lpb = (LPBYTE)szPrefixLower; pvRight.Value.bin.cb = strlen(szPrefixLower); bRet = pFPropContainsProp(&pvLeft, &pvRight, FL_PREFIX); @@ -349,7 +350,7 @@ static void test_FPropContainsProp(void) bRet = pFPropContainsProp(&pvLeft, &pvRight, FL_PREFIX); ok(bRet == FALSE, "bin(full,substr)[PREFIX] match failed\n"); bRet = pFPropContainsProp(&pvLeft, &pvRight, FL_SUBSTRING); - ok(bRet == TRUE, "bin(full,substr)[SUBSTRING] match failed\n"); + ok(bRet == TRUE || broken(!bRet) /* Win9x */, "bin(full,substr)[SUBSTRING] match failed\n"); pvRight.Value.bin.lpb = (LPBYTE)szSubstringLower; pvRight.Value.bin.cb = strlen(szSubstringLower); bRet = pFPropContainsProp(&pvLeft, &pvRight, FL_PREFIX); @@ -502,7 +503,8 @@ static void test_FPropCompareProp(void) } bRet = pFPropCompareProp(&pvLeft, FPCProp_Results[j].relOp, &pvRight); - ok(bRet == bExp, "pt %d (%d,%d,%s): expected %d, got %d\n", ptTypes[i], + ok(bRet == bExp || broken(!bRet) /* Win9x */, + "pt %d (%d,%d,%s): expected %d, got %d\n", ptTypes[i], FPCProp_Results[j].lVal, FPCProp_Results[j].rVal, relops[FPCProp_Results[j].relOp], bExp, bRet); } @@ -625,7 +627,8 @@ static void test_LPropCompareProp(void) } iRet = pLPropCompareProp(&pvLeft, &pvRight); - ok(iRet == iExp, "pt %d (%d,%d): expected %d, got %d\n", ptTypes[i], + ok(iRet == iExp || broken(iRet == 0) /* Win9x */, + "pt %d (%d,%d): expected %d, got %d\n", ptTypes[i], LPCProp_Results[j].lVal, LPCProp_Results[j].rVal, iExp, iRet); } } @@ -646,7 +649,8 @@ static void test_PpropFindProp(void) pvProp.ulPropTag = ptTypes[i]; pRet = pPpropFindProp(&pvProp, 1u, ptTypes[i]); - ok(pRet == &pvProp, "PpropFindProp[%d]: Didn't find existing propery\n", + ok(pRet == &pvProp || broken(pRet != &pvProp) /* Win9x */, + "PpropFindProp[%d]: Didn't find existing propery\n", ptTypes[i]); pRet = pPpropFindProp(&pvProp, 1u, i ? ptTypes[i-1] : ptTypes[i+1]); @@ -882,7 +886,8 @@ static void test_LpValFindProp(void) pvProp.ulPropTag = PROP_TAG(ptTypes[i], 1u); pRet = pLpValFindProp(PROP_TAG(ptTypes[i], 1u), 1u, &pvProp); - ok(pRet == &pvProp, "LpValFindProp[%d]: Didn't find existing propery id/type\n", + ok(pRet == &pvProp || broken(pRet != &pvProp) /* Win9x */, + "LpValFindProp[%d]: Didn't find existing propery id/type\n", ptTypes[i]); pRet = pLpValFindProp(PROP_TAG(ptTypes[i], 0u), 1u, &pvProp); @@ -894,7 +899,8 @@ static void test_LpValFindProp(void) ptTypes[i]); pRet = pLpValFindProp(PROP_TAG(PT_NULL, 1u), 1u, &pvProp); - ok(pRet == &pvProp, "LpValFindProp[%d]: Didn't find existing propery id\n", + ok(pRet == &pvProp || broken(pRet != &pvProp) /* Win9x */, + "LpValFindProp[%d]: Didn't find existing propery id\n", ptTypes[i]); } } @@ -990,7 +996,8 @@ static void test_FBadPropTag(void) if (bBad) ok(res != 0, "pt= %d: Expected non-zero, got 0\n", pt); else - ok(res == 0, "pt= %d: Expected zero, got %d\n", pt, res); + ok(res == 0 || broken(res) /* Win9x */, + "pt= %d: Expected zero, got %d\n", pt, res); } } @@ -1079,7 +1086,8 @@ static void test_FBadProp(void) if (bBad) ok(res != 0, "pt= %d: Expected non-zero, got 0\n", pt); else - ok(res == 0, "pt= %d: Expected zero, got %d\n", pt, res); + ok(res == 0 || broken(res) /* Win9x */, + "pt= %d: Expected zero, got %d\n", pt, res); } } @@ -1130,7 +1138,8 @@ static void test_FBadColumnSet(void) if (bBad) ok(res != 0, "pt= %d: Expected non-zero, got 0\n", pt); else - ok(res == 0, "pt= %d: Expected zero, got %d\n", pt, res); + ok(res == 0 || broken(res) /* Win9x */, + "pt= %d: Expected zero, got %d\n", pt, res); } } diff --git a/dlls/mapi32/tests/util.c b/dlls/mapi32/tests/util.c index 2ae42f1c814..7283fc16269 100644 --- a/dlls/mapi32/tests/util.c +++ b/dlls/mapi32/tests/util.c @@ -51,7 +51,8 @@ static void test_SwapPword(void) shorts[1] = 0x10ff; shorts[2] = 0x2001; pSwapPword(shorts, 2); - ok(shorts[0] == 0x01ff && shorts[1] == 0xff10 && shorts[2] == 0x2001, + ok((shorts[0] == 0x01ff && shorts[1] == 0xff10 && shorts[2] == 0x2001) || + broken(shorts[0] == 0xff01 && shorts[1] == 0x10ff && shorts[2] == 0x2001) /* Win9x */, "Expected {0x01ff,0xff10,0x2001}, got {0x%04x,0x%04x,0x%04x}\n", shorts[0], shorts[1], shorts[2]); } @@ -68,7 +69,8 @@ static void test_SwapPlong(void) longs[1] = 0x1000ffff; longs[2] = 0x20000001; pSwapPlong(longs, 2); - ok(longs[0] == 0x0100ffff && longs[1] == 0xffff0010 && longs[2] == 0x20000001, + ok((longs[0] == 0x0100ffff && longs[1] == 0xffff0010 && longs[2] == 0x20000001) || + broken(longs[0] == 0xffff0001 && longs[1] == 0x1000ffff && longs[2] == 0x20000001) /* Win9x */, "Expected {0x0100ffff,0xffff0010,0x20000001}, got {0x%08x,0x%08x,0x%08x}\n", longs[0], longs[1], longs[2]); } @@ -151,7 +153,8 @@ static void test_CbOfEncoded(void) memset(buff, '\0', sizeof(buff)); memset(buff, '?', i); ulRet = pCbOfEncoded(buff); - ok(ulRet == ulExpected, "CbOfEncoded(length %d): expected %d, got %d\n", + ok(ulRet == ulExpected || broken(ulRet == 0) /* Win9x */, + "CbOfEncoded(length %d): expected %d, got %d\n", i, ulExpected, ulRet); } } diff --git a/dlls/mlang/mlang.c b/dlls/mlang/mlang.c index e002046fba2..11fa366c5e8 100644 --- a/dlls/mlang/mlang.c +++ b/dlls/mlang/mlang.c @@ -43,8 +43,6 @@ WINE_DEFAULT_DEBUG_CHANNEL(mlang); #define CP_UNICODE 1200 -#define ICOM_THIS_MULTI(impl,field,iface) impl* const This=(impl*)((char*)(iface) - offsetof(impl,field)) - static HRESULT MultiLanguage_create(IUnknown *pUnkOuter, LPVOID *ppObj); static HRESULT EnumRfc1766_create(LANGID LangId, IEnumRfc1766 **ppEnum); @@ -450,10 +448,11 @@ static const struct mlang_data const MIME_CP_INFO *mime_cp_info; const char *fixed_font; const char *proportional_font; + SCRIPT_ID sid; } mlang_data[] = { { "Arabic",1256,sizeof(arabic_cp)/sizeof(arabic_cp[0]),arabic_cp, - "Courier","Arial" }, /* FIXME */ + "Courier","Arial", sidArabic }, /* FIXME */ { "Baltic",1257,sizeof(baltic_cp)/sizeof(baltic_cp[0]),baltic_cp, "Courier","Arial" }, /* FIXME */ { "Chinese Simplified",936,sizeof(chinese_simplified_cp)/sizeof(chinese_simplified_cp[0]),chinese_simplified_cp, @@ -463,23 +462,23 @@ static const struct mlang_data { "Central European",1250,sizeof(central_european_cp)/sizeof(central_european_cp[0]),central_european_cp, "Courier","Arial" }, /* FIXME */ { "Cyrillic",1251,sizeof(cyrillic_cp)/sizeof(cyrillic_cp[0]),cyrillic_cp, - "Courier","Arial" }, /* FIXME */ + "Courier","Arial", sidCyrillic }, /* FIXME */ { "Greek",1253,sizeof(greek_cp)/sizeof(greek_cp[0]),greek_cp, - "Courier","Arial" }, /* FIXME */ + "Courier","Arial", sidGreek }, /* FIXME */ { "Hebrew",1255,sizeof(hebrew_cp)/sizeof(hebrew_cp[0]),hebrew_cp, - "Courier","Arial" }, /* FIXME */ + "Courier","Arial", sidHebrew }, /* FIXME */ { "Japanese",932,sizeof(japanese_cp)/sizeof(japanese_cp[0]),japanese_cp, "MS Gothic","MS PGothic" }, { "Korean",949,sizeof(korean_cp)/sizeof(korean_cp[0]),korean_cp, "Courier","Arial" }, /* FIXME */ { "Thai",874,sizeof(thai_cp)/sizeof(thai_cp[0]),thai_cp, - "Courier","Arial" }, /* FIXME */ + "Courier","Arial", sidThai }, /* FIXME */ { "Turkish",1254,sizeof(turkish_cp)/sizeof(turkish_cp[0]),turkish_cp, "Courier","Arial" }, /* FIXME */ { "Vietnamese",1258,sizeof(vietnamese_cp)/sizeof(vietnamese_cp[0]),vietnamese_cp, "Courier","Arial" }, /* FIXME */ { "Western European",1252,sizeof(western_cp)/sizeof(western_cp[0]),western_cp, - "Courier","Arial" }, /* FIXME */ + "Courier","Arial", sidLatin }, /* FIXME */ { "Unicode",CP_UNICODE,sizeof(unicode_cp)/sizeof(unicode_cp[0]),unicode_cp, "Courier","Arial" } /* FIXME */ }; @@ -800,22 +799,30 @@ static UINT ConvertUnknownJapaneseToUnicode(LPCSTR input, DWORD count, int code = DetectJapaneseCode(input,count); TRACE("Japanese code %i\n",code); - if (code == 932) + switch (code) { + case 0: + if (output) + rc = MultiByteToWideChar(CP_ACP,0,input,count,output,out_count); + else + rc = MultiByteToWideChar(CP_ACP,0,input,count,0,0); + break; + + case 932: if (output) rc = MultiByteToWideChar(932,0,input,count,output,out_count); else rc = MultiByteToWideChar(932,0,input,count,0,0); - } - else if (code == 51932) - { + break; + + case 51932: if (output) rc = MultiByteToWideChar(20932,0,input,count,output,out_count); else rc = MultiByteToWideChar(20932,0,input,count,0,0); - } - else if (code == 50220) - { + break; + + case 50220: sjis_string = HeapAlloc(GetProcessHeap(),0,count); rc = ConvertJIS2SJIS(input,count,sjis_string); if (rc) @@ -827,6 +834,7 @@ static UINT ConvertUnknownJapaneseToUnicode(LPCSTR input, DWORD count, rc = MultiByteToWideChar(932,0,sjis_string,rc,0,0); } HeapFree(GetProcessHeap(),0,sjis_string); + break; } return rc; } @@ -1485,12 +1493,17 @@ typedef struct tagEnumCodePage_impl DWORD total, pos; } EnumCodePage_impl; +static inline EnumCodePage_impl *impl_from_IEnumCodePage( IEnumCodePage *iface ) +{ + return (EnumCodePage_impl *)CONTAINING_RECORD( iface, EnumCodePage_impl, vtbl_IEnumCodePage ); +} + static HRESULT WINAPI fnIEnumCodePage_QueryInterface( IEnumCodePage* iface, REFIID riid, void** ppvObject) { - ICOM_THIS_MULTI(EnumCodePage_impl, vtbl_IEnumCodePage, iface); + EnumCodePage_impl *This = impl_from_IEnumCodePage( iface ); TRACE("%p -> %s\n", This, debugstr_guid(riid) ); @@ -1510,14 +1523,14 @@ static HRESULT WINAPI fnIEnumCodePage_QueryInterface( static ULONG WINAPI fnIEnumCodePage_AddRef( IEnumCodePage* iface) { - ICOM_THIS_MULTI(EnumCodePage_impl, vtbl_IEnumCodePage, iface); + EnumCodePage_impl *This = impl_from_IEnumCodePage( iface ); return InterlockedIncrement(&This->ref); } static ULONG WINAPI fnIEnumCodePage_Release( IEnumCodePage* iface) { - ICOM_THIS_MULTI(EnumCodePage_impl, vtbl_IEnumCodePage, iface); + EnumCodePage_impl *This = impl_from_IEnumCodePage( iface ); ULONG ref = InterlockedDecrement(&This->ref); TRACE("%p ref = %d\n", This, ref); @@ -1535,7 +1548,7 @@ static HRESULT WINAPI fnIEnumCodePage_Clone( IEnumCodePage* iface, IEnumCodePage** ppEnum) { - ICOM_THIS_MULTI(EnumCodePage_impl, vtbl_IEnumCodePage, iface); + EnumCodePage_impl *This = impl_from_IEnumCodePage( iface ); FIXME("%p %p\n", This, ppEnum); return E_NOTIMPL; } @@ -1547,8 +1560,8 @@ static HRESULT WINAPI fnIEnumCodePage_Next( ULONG* pceltFetched) { ULONG i; + EnumCodePage_impl *This = impl_from_IEnumCodePage( iface ); - ICOM_THIS_MULTI(EnumCodePage_impl, vtbl_IEnumCodePage, iface); TRACE("%p %u %p %p\n", This, celt, rgelt, pceltFetched); if (!pceltFetched) return S_FALSE; @@ -1584,7 +1597,8 @@ static HRESULT WINAPI fnIEnumCodePage_Next( static HRESULT WINAPI fnIEnumCodePage_Reset( IEnumCodePage* iface) { - ICOM_THIS_MULTI(EnumCodePage_impl, vtbl_IEnumCodePage, iface); + EnumCodePage_impl *This = impl_from_IEnumCodePage( iface ); + TRACE("%p\n", This); This->pos = 0; @@ -1595,7 +1609,8 @@ static HRESULT WINAPI fnIEnumCodePage_Skip( IEnumCodePage* iface, ULONG celt) { - ICOM_THIS_MULTI(EnumCodePage_impl, vtbl_IEnumCodePage, iface); + EnumCodePage_impl *This = impl_from_IEnumCodePage( iface ); + TRACE("%p %u\n", This, celt); if (celt >= This->total) return S_FALSE; @@ -1671,12 +1686,17 @@ typedef struct tagEnumScript_impl DWORD total, pos; } EnumScript_impl; +static inline EnumScript_impl *impl_from_IEnumScript( IEnumScript *iface ) +{ + return (EnumScript_impl *)CONTAINING_RECORD( iface, EnumScript_impl, vtbl_IEnumScript ); +} + static HRESULT WINAPI fnIEnumScript_QueryInterface( IEnumScript* iface, REFIID riid, void** ppvObject) { - ICOM_THIS_MULTI(EnumScript_impl, vtbl_IEnumScript, iface); + EnumScript_impl *This = impl_from_IEnumScript( iface ); TRACE("%p -> %s\n", This, debugstr_guid(riid) ); @@ -1696,14 +1716,14 @@ static HRESULT WINAPI fnIEnumScript_QueryInterface( static ULONG WINAPI fnIEnumScript_AddRef( IEnumScript* iface) { - ICOM_THIS_MULTI(EnumScript_impl, vtbl_IEnumScript, iface); + EnumScript_impl *This = impl_from_IEnumScript( iface ); return InterlockedIncrement(&This->ref); } static ULONG WINAPI fnIEnumScript_Release( IEnumScript* iface) { - ICOM_THIS_MULTI(EnumScript_impl, vtbl_IEnumScript, iface); + EnumScript_impl *This = impl_from_IEnumScript( iface ); ULONG ref = InterlockedDecrement(&This->ref); TRACE("%p ref = %d\n", This, ref); @@ -1721,7 +1741,7 @@ static HRESULT WINAPI fnIEnumScript_Clone( IEnumScript* iface, IEnumScript** ppEnum) { - ICOM_THIS_MULTI(EnumScript_impl, vtbl_IEnumScript, iface); + EnumScript_impl *This = impl_from_IEnumScript( iface ); FIXME("%p %p: stub!\n", This, ppEnum); return E_NOTIMPL; } @@ -1732,7 +1752,8 @@ static HRESULT WINAPI fnIEnumScript_Next( PSCRIPTINFO rgelt, ULONG* pceltFetched) { - ICOM_THIS_MULTI(EnumScript_impl, vtbl_IEnumScript, iface); + EnumScript_impl *This = impl_from_IEnumScript( iface ); + TRACE("%p %u %p %p\n", This, celt, rgelt, pceltFetched); if (!pceltFetched || !rgelt) return E_FAIL; @@ -1754,7 +1775,8 @@ static HRESULT WINAPI fnIEnumScript_Next( static HRESULT WINAPI fnIEnumScript_Reset( IEnumScript* iface) { - ICOM_THIS_MULTI(EnumScript_impl, vtbl_IEnumScript, iface); + EnumScript_impl *This = impl_from_IEnumScript( iface ); + TRACE("%p\n", This); This->pos = 0; @@ -1765,7 +1787,8 @@ static HRESULT WINAPI fnIEnumScript_Skip( IEnumScript* iface, ULONG celt) { - ICOM_THIS_MULTI(EnumScript_impl, vtbl_IEnumScript, iface); + EnumScript_impl *This = impl_from_IEnumScript( iface ); + TRACE("%p %u\n", This, celt); if (celt >= This->total) return S_FALSE; @@ -1825,26 +1848,31 @@ static HRESULT EnumScript_create( MLang_impl* mlang, DWORD dwFlags, /******************************************************************************/ +static inline MLang_impl *impl_from_IMLangFontLink( IMLangFontLink *iface ) +{ + return (MLang_impl *)CONTAINING_RECORD( iface, MLang_impl, vtbl_IMLangFontLink ); +} + static HRESULT WINAPI fnIMLangFontLink_QueryInterface( IMLangFontLink* iface, REFIID riid, void** ppvObject) { - ICOM_THIS_MULTI(MLang_impl, vtbl_IMLangFontLink, iface); + MLang_impl *This = impl_from_IMLangFontLink( iface ); return MLang_QueryInterface( This, riid, ppvObject ); } static ULONG WINAPI fnIMLangFontLink_AddRef( IMLangFontLink* iface) { - ICOM_THIS_MULTI(MLang_impl, vtbl_IMLangFontLink, iface); + MLang_impl *This = impl_from_IMLangFontLink( iface ); return MLang_AddRef( This ); } static ULONG WINAPI fnIMLangFontLink_Release( IMLangFontLink* iface) { - ICOM_THIS_MULTI(MLang_impl, vtbl_IMLangFontLink, iface); + MLang_impl *This = impl_from_IMLangFontLink( iface ); return MLang_Release( This ); } @@ -1895,7 +1923,7 @@ static HRESULT WINAPI fnIMLangFontLink_CodePageToCodePages( UINT uCodePage, DWORD* pdwCodePages) { - ICOM_THIS_MULTI(MLang_impl, vtbl_IMLangFontLink, iface); + MLang_impl *This = impl_from_IMLangFontLink( iface ); CHARSETINFO cs; BOOL rc; @@ -1921,7 +1949,7 @@ static HRESULT WINAPI fnIMLangFontLink_CodePagesToCodePage( UINT uDefaultCodePage, UINT* puCodePage) { - ICOM_THIS_MULTI(MLang_impl, vtbl_IMLangFontLink, iface); + MLang_impl *This = impl_from_IMLangFontLink( iface ); DWORD mask = 0x00000000; UINT i; CHARSETINFO cs; @@ -1974,7 +2002,7 @@ static HRESULT WINAPI fnIMLangFontLink_GetFontCodePages( { HFONT old_font; FONTSIGNATURE fontsig; - ICOM_THIS_MULTI(MLang_impl, vtbl_IMLangFontLink, iface); + MLang_impl *This = impl_from_IMLangFontLink( iface ); TRACE("(%p)\n",This); @@ -2032,24 +2060,29 @@ static const IMLangFontLinkVtbl IMLangFontLink_vtbl = /******************************************************************************/ +static inline MLang_impl *impl_from_IMultiLanguage( IMultiLanguage *iface ) +{ + return (MLang_impl *)CONTAINING_RECORD( iface, MLang_impl, vtbl_IMultiLanguage ); +} + static HRESULT WINAPI fnIMultiLanguage_QueryInterface( IMultiLanguage* iface, REFIID riid, void** ppvObject) { - ICOM_THIS_MULTI(MLang_impl, vtbl_IMultiLanguage, iface); + MLang_impl *This = impl_from_IMultiLanguage( iface ); return MLang_QueryInterface( This, riid, ppvObject ); } static ULONG WINAPI fnIMultiLanguage_AddRef( IMultiLanguage* iface ) { - ICOM_THIS_MULTI(MLang_impl, vtbl_IMultiLanguage, iface); + MLang_impl *This = impl_from_IMultiLanguage( iface ); return IMLangFontLink_AddRef( ((IMLangFontLink*)This) ); } static ULONG WINAPI fnIMultiLanguage_Release( IMultiLanguage* iface ) { - ICOM_THIS_MULTI(MLang_impl, vtbl_IMultiLanguage, iface); + MLang_impl *This = impl_from_IMultiLanguage( iface ); return IMLangFontLink_Release( ((IMLangFontLink*)This) ); } @@ -2067,8 +2100,8 @@ static HRESULT WINAPI fnIMultiLanguage_GetCodePageInfo( PMIMECPINFO pCodePageInfo) { UINT i, n; + MLang_impl *This = impl_from_IMultiLanguage( iface ); - ICOM_THIS_MULTI(MLang_impl, vtbl_IMultiLanguage, iface); TRACE("%p, %u, %p\n", This, uiCodePage, pCodePageInfo); for (i = 0; i < sizeof(mlang_data)/sizeof(mlang_data[0]); i++) @@ -2099,7 +2132,8 @@ static HRESULT WINAPI fnIMultiLanguage_EnumCodePages( DWORD grfFlags, IEnumCodePage** ppEnumCodePage) { - ICOM_THIS_MULTI(MLang_impl, vtbl_IMultiLanguage, iface); + MLang_impl *This = impl_from_IMultiLanguage( iface ); + TRACE("%p %08x %p\n", This, grfFlags, ppEnumCodePage); return EnumCodePage_create( This, grfFlags, 0, ppEnumCodePage ); @@ -2110,7 +2144,7 @@ static HRESULT WINAPI fnIMultiLanguage_GetCharsetInfo( BSTR Charset, PMIMECSETINFO pCharsetInfo) { - ICOM_THIS_MULTI(MLang_impl, vtbl_IMultiLanguage, iface); + MLang_impl *This = impl_from_IMultiLanguage( iface ); return IMultiLanguage3_GetCharsetInfo((IMultiLanguage3*)&This->vtbl_IMultiLanguage3, Charset, pCharsetInfo); } @@ -2219,12 +2253,17 @@ typedef struct tagEnumRfc1766_impl DWORD total, pos; } EnumRfc1766_impl; +static inline EnumRfc1766_impl *impl_from_IEnumRfc1766( IEnumRfc1766 *iface ) +{ + return (EnumRfc1766_impl *)CONTAINING_RECORD( iface, EnumRfc1766_impl, vtbl_IEnumRfc1766 ); +} + static HRESULT WINAPI fnIEnumRfc1766_QueryInterface( IEnumRfc1766 *iface, REFIID riid, void** ppvObject) { - ICOM_THIS_MULTI(EnumRfc1766_impl, vtbl_IEnumRfc1766, iface); + EnumRfc1766_impl *This = impl_from_IEnumRfc1766( iface ); TRACE("%p -> %s\n", This, debugstr_guid(riid) ); @@ -2244,14 +2283,14 @@ static HRESULT WINAPI fnIEnumRfc1766_QueryInterface( static ULONG WINAPI fnIEnumRfc1766_AddRef( IEnumRfc1766 *iface) { - ICOM_THIS_MULTI(EnumRfc1766_impl, vtbl_IEnumRfc1766, iface); + EnumRfc1766_impl *This = impl_from_IEnumRfc1766( iface ); return InterlockedIncrement(&This->ref); } static ULONG WINAPI fnIEnumRfc1766_Release( IEnumRfc1766 *iface) { - ICOM_THIS_MULTI(EnumRfc1766_impl, vtbl_IEnumRfc1766, iface); + EnumRfc1766_impl *This = impl_from_IEnumRfc1766( iface ); ULONG ref = InterlockedDecrement(&This->ref); TRACE("%p ref = %d\n", This, ref); @@ -2268,7 +2307,8 @@ static HRESULT WINAPI fnIEnumRfc1766_Clone( IEnumRfc1766 *iface, IEnumRfc1766 **ppEnum) { - ICOM_THIS_MULTI(EnumRfc1766_impl, vtbl_IEnumRfc1766, iface); + EnumRfc1766_impl *This = impl_from_IEnumRfc1766( iface ); + FIXME("%p %p\n", This, ppEnum); return E_NOTIMPL; } @@ -2280,8 +2320,8 @@ static HRESULT WINAPI fnIEnumRfc1766_Next( ULONG *pceltFetched) { ULONG i; + EnumRfc1766_impl *This = impl_from_IEnumRfc1766( iface ); - ICOM_THIS_MULTI(EnumRfc1766_impl, vtbl_IEnumRfc1766, iface); TRACE("%p %u %p %p\n", This, celt, rgelt, pceltFetched); if (!pceltFetched) return S_FALSE; @@ -2311,7 +2351,8 @@ static HRESULT WINAPI fnIEnumRfc1766_Next( static HRESULT WINAPI fnIEnumRfc1766_Reset( IEnumRfc1766 *iface) { - ICOM_THIS_MULTI(EnumRfc1766_impl, vtbl_IEnumRfc1766, iface); + EnumRfc1766_impl *This = impl_from_IEnumRfc1766( iface ); + TRACE("%p\n", This); This->pos = 0; @@ -2322,7 +2363,8 @@ static HRESULT WINAPI fnIEnumRfc1766_Skip( IEnumRfc1766 *iface, ULONG celt) { - ICOM_THIS_MULTI(EnumRfc1766_impl, vtbl_IEnumRfc1766, iface); + EnumRfc1766_impl *This = impl_from_IEnumRfc1766( iface ); + TRACE("%p %u\n", This, celt); if (celt >= This->total) return S_FALSE; @@ -2427,7 +2469,8 @@ static HRESULT WINAPI fnIMultiLanguage_EnumRfc1766( IMultiLanguage *iface, IEnumRfc1766 **ppEnumRfc1766) { - ICOM_THIS_MULTI(MLang_impl, vtbl_IMultiLanguage, iface); + MLang_impl *This = impl_from_IMultiLanguage( iface ); + TRACE("%p %p\n", This, ppEnumRfc1766); return EnumRfc1766_create(0, ppEnumRfc1766); @@ -2480,24 +2523,29 @@ static const IMultiLanguageVtbl IMultiLanguage_vtbl = /******************************************************************************/ +static inline MLang_impl *impl_from_IMultiLanguage3( IMultiLanguage3 *iface ) +{ + return (MLang_impl *)CONTAINING_RECORD( iface, MLang_impl, vtbl_IMultiLanguage3 ); +} + static HRESULT WINAPI fnIMultiLanguage2_QueryInterface( IMultiLanguage3* iface, REFIID riid, void** ppvObject) { - ICOM_THIS_MULTI(MLang_impl, vtbl_IMultiLanguage3, iface); + MLang_impl *This = impl_from_IMultiLanguage3( iface ); return MLang_QueryInterface( This, riid, ppvObject ); } static ULONG WINAPI fnIMultiLanguage2_AddRef( IMultiLanguage3* iface ) { - ICOM_THIS_MULTI(MLang_impl, vtbl_IMultiLanguage3, iface); + MLang_impl *This = impl_from_IMultiLanguage3( iface ); return MLang_AddRef( This ); } static ULONG WINAPI fnIMultiLanguage2_Release( IMultiLanguage3* iface ) { - ICOM_THIS_MULTI(MLang_impl, vtbl_IMultiLanguage3, iface); + MLang_impl *This = impl_from_IMultiLanguage3( iface ); return MLang_Release( This ); } @@ -2505,7 +2553,8 @@ static HRESULT WINAPI fnIMultiLanguage2_GetNumberOfCodePageInfo( IMultiLanguage3* iface, UINT* pcCodePage) { - ICOM_THIS_MULTI(MLang_impl, vtbl_IMultiLanguage3, iface); + MLang_impl *This = impl_from_IMultiLanguage3( iface ); + TRACE("%p, %p\n", This, pcCodePage); if (!pcCodePage) return S_FALSE; @@ -2559,8 +2608,8 @@ static HRESULT WINAPI fnIMultiLanguage2_GetCodePageInfo( PMIMECPINFO pCodePageInfo) { UINT i, n; + MLang_impl *This = impl_from_IMultiLanguage3( iface ); - ICOM_THIS_MULTI(MLang_impl, vtbl_IMultiLanguage3, iface); TRACE("%p, %u, %04x, %p\n", This, uiCodePage, LangId, pCodePageInfo); for (i = 0; i < sizeof(mlang_data)/sizeof(mlang_data[0]); i++) @@ -2592,7 +2641,8 @@ static HRESULT WINAPI fnIMultiLanguage2_EnumCodePages( LANGID LangId, IEnumCodePage** ppEnumCodePage) { - ICOM_THIS_MULTI(MLang_impl, vtbl_IMultiLanguage3, iface); + MLang_impl *This = impl_from_IMultiLanguage3( iface ); + TRACE("%p %08x %04x %p\n", This, grfFlags, LangId, ppEnumCodePage); return EnumCodePage_create( This, grfFlags, LangId, ppEnumCodePage ); @@ -2604,8 +2654,8 @@ static HRESULT WINAPI fnIMultiLanguage2_GetCharsetInfo( PMIMECSETINFO pCharsetInfo) { UINT i, n; + MLang_impl *This = impl_from_IMultiLanguage3( iface ); - ICOM_THIS_MULTI(MLang_impl, vtbl_IMultiLanguage3, iface); TRACE("%p %s %p\n", This, debugstr_w(Charset), pCharsetInfo); if (!pCharsetInfo) return E_FAIL; @@ -2752,7 +2802,8 @@ static HRESULT WINAPI fnIMultiLanguage2_EnumRfc1766( LANGID LangId, IEnumRfc1766** ppEnumRfc1766) { - ICOM_THIS_MULTI(MLang_impl, vtbl_IMultiLanguage, iface); + MLang_impl *This = impl_from_IMultiLanguage3( iface ); + TRACE("%p %p\n", This, ppEnumRfc1766); return EnumRfc1766_create(LangId, ppEnumRfc1766); @@ -2961,7 +3012,8 @@ static HRESULT WINAPI fnIMultiLanguage2_GetNumberOfScripts( IMultiLanguage3* iface, UINT* pnScripts) { - ICOM_THIS_MULTI(MLang_impl, vtbl_IMultiLanguage3, iface); + MLang_impl *This = impl_from_IMultiLanguage3( iface ); + TRACE("%p %p\n", This, pnScripts); if (!pnScripts) return S_FALSE; @@ -2976,7 +3028,8 @@ static HRESULT WINAPI fnIMultiLanguage2_EnumScripts( LANGID LangId, IEnumScript** ppEnumScript) { - ICOM_THIS_MULTI(MLang_impl, vtbl_IMultiLanguage3, iface); + MLang_impl *This = impl_from_IMultiLanguage3( iface ); + TRACE("%p %08x %04x %p\n", This, dwFlags, LangId, ppEnumScript); return EnumScript_create( This, dwFlags, LangId, ppEnumScript ); @@ -2989,7 +3042,7 @@ static HRESULT WINAPI fnIMultiLanguage2_ValidateCodePageEx( DWORD dwfIODControl) { int i; - ICOM_THIS_MULTI(MLang_impl, vtbl_IMultiLanguage3, iface); + MLang_impl *This = impl_from_IMultiLanguage3( iface ); TRACE("%p %u %p %08x\n", This, uiCodePage, hwnd, dwfIODControl); @@ -3025,7 +3078,8 @@ static HRESULT WINAPI fnIMultiLanguage3_DetectOutboundCodePage( UINT *pnDetectedCodePages, WCHAR *lpSpecialChar) { - ICOM_THIS_MULTI(MLang_impl, vtbl_IMultiLanguage3, iface); + MLang_impl *This = impl_from_IMultiLanguage3( iface ); + FIXME("(%p)->(%08x %s %u %p %u %p %p %p)\n", This, dwFlags, debugstr_w(lpWideCharStr), cchWideChar, puiPreferredCodePages, nPreferredCodePages, puiDetectedCodePages, pnDetectedCodePages, lpSpecialChar); @@ -3042,7 +3096,8 @@ static HRESULT WINAPI fnIMultiLanguage3_DetectOutboundCodePageInIStream( UINT *pnDetectedCodePages, WCHAR *lpSpecialChar) { - ICOM_THIS_MULTI(MLang_impl, vtbl_IMultiLanguage3, iface); + MLang_impl *This = impl_from_IMultiLanguage3( iface ); + FIXME("(%p)->(%08x %p %p %u %p %p %p)\n", This, dwFlags, pStrIn, puiPreferredCodePages, nPreferredCodePages, puiDetectedCodePages, pnDetectedCodePages, lpSpecialChar); @@ -3086,24 +3141,30 @@ static const IMultiLanguage3Vtbl IMultiLanguage3_vtbl = }; /******************************************************************************/ + +static inline MLang_impl *impl_from_IMLangFontLink2( IMLangFontLink2 *iface ) +{ + return (MLang_impl *)CONTAINING_RECORD( iface, MLang_impl, vtbl_IMLangFontLink2 ); +} + static HRESULT WINAPI fnIMLangFontLink2_QueryInterface( IMLangFontLink2 * iface, REFIID riid, void** ppvObject) { - ICOM_THIS_MULTI(MLang_impl, vtbl_IMLangFontLink2, iface); + MLang_impl *This = impl_from_IMLangFontLink2( iface ); return MLang_QueryInterface( This, riid, ppvObject ); } static ULONG WINAPI fnIMLangFontLink2_AddRef( IMLangFontLink2* iface ) { - ICOM_THIS_MULTI(MLang_impl, vtbl_IMLangFontLink2, iface); + MLang_impl *This = impl_from_IMLangFontLink2( iface ); return MLang_AddRef( This ); } static ULONG WINAPI fnIMLangFontLink2_Release( IMLangFontLink2* iface ) { - ICOM_THIS_MULTI(MLang_impl, vtbl_IMLangFontLink2, iface); + MLang_impl *This = impl_from_IMLangFontLink2( iface ); return MLang_Release( This ); } @@ -3177,8 +3238,37 @@ static HRESULT WINAPI fnIMLangFontLink2_GetScriptFontInfo(IMLangFontLink2* This, SCRIPT_ID sid, DWORD dwFlags, UINT *puiFonts, SCRIPTFONTINFO *pScriptFont) { - FIXME("(%p)->%i %i %p %p\n",This, sid, dwFlags, puiFonts, pScriptFont); - return E_NOTIMPL; + UINT i, j; + + TRACE("(%p)->%u %x %p %p\n", This, sid, dwFlags, puiFonts, pScriptFont); + + if (!dwFlags) dwFlags = SCRIPTCONTF_PROPORTIONAL_FONT; + + for (i = 0, j = 0; i < sizeof(mlang_data)/sizeof(mlang_data[0]); i++) + { + if (sid == mlang_data[i].sid) + { + if (pScriptFont) + { + if (j >= *puiFonts) break; + + pScriptFont[j].scripts = 1 << mlang_data[i].sid; + if (dwFlags == SCRIPTCONTF_FIXED_FONT) + { + MultiByteToWideChar(CP_ACP, 0, mlang_data[i].fixed_font, -1, + pScriptFont[j].wszFont, MAX_MIMEFACE_NAME); + } + else if (dwFlags == SCRIPTCONTF_PROPORTIONAL_FONT) + { + MultiByteToWideChar(CP_ACP, 0, mlang_data[i].proportional_font, -1, + pScriptFont[j].wszFont, MAX_MIMEFACE_NAME); + } + } + j++; + } + } + *puiFonts = j; + return S_OK; } static HRESULT WINAPI fnIMLangFontLink2_CodePageToScriptID(IMLangFontLink2* This, @@ -3208,26 +3298,31 @@ static const IMLangFontLink2Vtbl IMLangFontLink2_vtbl = /******************************************************************************/ +static inline MLang_impl *impl_from_IMLangLineBreakConsole( IMLangLineBreakConsole *iface ) +{ + return (MLang_impl *)CONTAINING_RECORD( iface, MLang_impl, vtbl_IMLangLineBreakConsole ); +} + static HRESULT WINAPI fnIMLangLineBreakConsole_QueryInterface( IMLangLineBreakConsole* iface, REFIID riid, void** ppvObject) { - ICOM_THIS_MULTI(MLang_impl, vtbl_IMLangLineBreakConsole, iface); + MLang_impl *This = impl_from_IMLangLineBreakConsole( iface ); return MLang_QueryInterface( This, riid, ppvObject ); } static ULONG WINAPI fnIMLangLineBreakConsole_AddRef( IMLangLineBreakConsole* iface ) { - ICOM_THIS_MULTI(MLang_impl, vtbl_IMLangLineBreakConsole, iface); + MLang_impl *This = impl_from_IMLangLineBreakConsole( iface ); return MLang_AddRef( This ); } static ULONG WINAPI fnIMLangLineBreakConsole_Release( IMLangLineBreakConsole* iface ) { - ICOM_THIS_MULTI(MLang_impl, vtbl_IMLangLineBreakConsole, iface); + MLang_impl *This = impl_from_IMLangLineBreakConsole( iface ); return MLang_Release( This ); } diff --git a/dlls/mlang/mlang.spec b/dlls/mlang/mlang.spec dissimilarity index 67% index 1e8f0228313..dc9630ac903 100644 --- a/dlls/mlang/mlang.spec +++ b/dlls/mlang/mlang.spec @@ -1,14 +1,15 @@ -@ stdcall ConvertINetMultiByteToUnicode(ptr long ptr ptr ptr ptr) -@ stub ConvertINetReset -@ stdcall ConvertINetString(ptr long long ptr ptr ptr ptr) -@ stdcall ConvertINetUnicodeToMultiByte(ptr long ptr ptr ptr ptr) -@ stdcall -private DllCanUnloadNow() -@ stdcall -private DllGetClassObject(ptr ptr ptr) -@ stdcall -private DllRegisterServer() -@ stdcall -private DllUnregisterServer() -@ stdcall GetGlobalFontLinkObject() -@ stdcall IsConvertINetStringAvailable(long long) -@ stdcall LcidToRfc1766A(long ptr long) -@ stdcall LcidToRfc1766W(long ptr long) -@ stdcall Rfc1766ToLcidA(ptr str) -@ stdcall Rfc1766ToLcidW(ptr wstr) +110 stdcall IsConvertINetStringAvailable(long long) +111 stdcall ConvertINetString(ptr long long ptr ptr ptr ptr) +112 stdcall ConvertINetUnicodeToMultiByte(ptr long ptr ptr ptr ptr) +113 stdcall ConvertINetMultiByteToUnicode(ptr long ptr ptr ptr ptr) +114 stub ConvertINetReset +120 stdcall LcidToRfc1766A(long ptr long) +121 stdcall LcidToRfc1766W(long ptr long) +122 stdcall Rfc1766ToLcidA(ptr str) +123 stdcall Rfc1766ToLcidW(ptr wstr) + +@ stdcall -private DllCanUnloadNow() +@ stdcall -private DllGetClassObject(ptr ptr ptr) +@ stdcall -private DllRegisterServer() +@ stdcall -private DllUnregisterServer() +@ stdcall GetGlobalFontLinkObject() diff --git a/dlls/mlang/tests/mlang.c b/dlls/mlang/tests/mlang.c index 1506963bddc..ae5060a7cdc 100644 --- a/dlls/mlang/tests/mlang.c +++ b/dlls/mlang/tests/mlang.c @@ -1369,10 +1369,49 @@ static void test_JapaneseConversion(void) ok(memcmp(outputW,&unc_jp[i][1],destsz)==0,"(%i) Strings do not match\n",i); } +static void test_GetScriptFontInfo(IMLangFontLink2 *font_link) +{ + HRESULT hr; + UINT nfonts; + SCRIPTFONTINFO sfi[1]; + + nfonts = 0; + hr = IMLangFontLink2_GetScriptFontInfo(font_link, sidLatin, 0, &nfonts, NULL); + ok(hr == S_OK, "GetScriptFontInfo failed %u\n", GetLastError()); + ok(nfonts, "unexpected result\n"); + + nfonts = 0; + hr = IMLangFontLink2_GetScriptFontInfo(font_link, sidLatin, SCRIPTCONTF_FIXED_FONT, &nfonts, NULL); + ok(hr == S_OK, "GetScriptFontInfo failed %u\n", GetLastError()); + ok(nfonts, "unexpected result\n"); + + nfonts = 0; + hr = IMLangFontLink2_GetScriptFontInfo(font_link, sidLatin, SCRIPTCONTF_PROPORTIONAL_FONT, &nfonts, NULL); + ok(hr == S_OK, "GetScriptFontInfo failed %u\n", GetLastError()); + ok(nfonts, "unexpected result\n"); + + nfonts = 1; + memset(sfi, 0, sizeof(sfi)); + hr = IMLangFontLink2_GetScriptFontInfo(font_link, sidLatin, SCRIPTCONTF_FIXED_FONT, &nfonts, sfi); + ok(hr == S_OK, "GetScriptFontInfo failed %u\n", GetLastError()); + ok(nfonts == 1, "got %u, expected 1\n", nfonts); + ok(sfi[0].scripts, "unexpected result\n"); + ok(sfi[0].wszFont[0], "unexpected result\n"); + + nfonts = 1; + memset(sfi, 0, sizeof(sfi)); + hr = IMLangFontLink2_GetScriptFontInfo(font_link, sidLatin, SCRIPTCONTF_PROPORTIONAL_FONT, &nfonts, sfi); + ok(hr == S_OK, "GetScriptFontInfo failed %u\n", GetLastError()); + ok(nfonts == 1, "got %u, expected 1\n", nfonts); + ok(sfi[0].scripts, "unexpected result\n"); + ok(sfi[0].wszFont[0], "unexpected result\n"); +} + START_TEST(mlang) { IMultiLanguage2 *iML2 = NULL; IMLangFontLink *iMLFL = NULL; + IMLangFontLink2 *iMLFL2 = NULL; HRESULT ret; if (!init_function_ptrs()) @@ -1415,10 +1454,17 @@ START_TEST(mlang) ret = CoCreateInstance(&CLSID_CMultiLanguage, NULL, CLSCTX_INPROC_SERVER, &IID_IMLangFontLink, (void **)&iMLFL); - if (ret != S_OK || !iML2) return; + if (ret != S_OK || !iMLFL) return; IMLangFontLink_Test(iMLFL); IMLangFontLink_Release(iMLFL); + ret = CoCreateInstance(&CLSID_CMultiLanguage, NULL, CLSCTX_INPROC_SERVER, + &IID_IMLangFontLink2, (void **)&iMLFL2); + if (ret != S_OK || !iMLFL2) return; + + test_GetScriptFontInfo(iMLFL2); + IMLangFontLink2_Release(iMLFL2); + CoUninitialize(); } diff --git a/dlls/msacm32/driver.c b/dlls/msacm32/driver.c index 0287ebe1cca..e481d688e2f 100644 --- a/dlls/msacm32/driver.c +++ b/dlls/msacm32/driver.c @@ -312,12 +312,13 @@ MMRESULT WINAPI acmDriverDetailsW(HACMDRIVERID hadid, PACMDRIVERDETAILSW padd, D /*********************************************************************** * acmDriverEnum (MSACM32.@) */ -MMRESULT WINAPI acmDriverEnum(ACMDRIVERENUMCB fnCallback, DWORD dwInstance, DWORD fdwEnum) +MMRESULT WINAPI acmDriverEnum(ACMDRIVERENUMCB fnCallback, DWORD_PTR dwInstance, + DWORD fdwEnum) { PWINE_ACMDRIVERID padid; DWORD fdwSupport; - TRACE("(%p, %08x, %08x)\n", fnCallback, dwInstance, fdwEnum); + TRACE("(%p, %08lx, %08x)\n", fnCallback, dwInstance, fdwEnum); if (!fnCallback) { WARN("invalid parameter\n"); diff --git a/dlls/msacm32/filter.c b/dlls/msacm32/filter.c index 89ffc3547e2..37b807ee247 100644 --- a/dlls/msacm32/filter.c +++ b/dlls/msacm32/filter.c @@ -144,7 +144,7 @@ struct MSACM_FilterEnumWtoA_Instance { static BOOL CALLBACK MSACM_FilterEnumCallbackWtoA(HACMDRIVERID hadid, PACMFILTERDETAILSW pafdw, - DWORD dwInstance, + DWORD_PTR dwInstance, DWORD fdwSupport) { struct MSACM_FilterEnumWtoA_Instance* pafei; @@ -165,8 +165,8 @@ static BOOL CALLBACK MSACM_FilterEnumCallbackWtoA(HACMDRIVERID hadid, * acmFilterEnumA (MSACM32.@) */ MMRESULT WINAPI acmFilterEnumA(HACMDRIVER had, PACMFILTERDETAILSA pafda, - ACMFILTERENUMCBA fnCallback, DWORD dwInstance, - DWORD fdwEnum) + ACMFILTERENUMCBA fnCallback, + DWORD_PTR dwInstance, DWORD fdwEnum) { ACMFILTERDETAILSW afdw; struct MSACM_FilterEnumWtoA_Instance afei; @@ -222,13 +222,13 @@ static BOOL MSACM_FilterEnumHelper(PWINE_ACMDRIVERID padid, HACMDRIVER had, * acmFilterEnumW (MSACM32.@) */ MMRESULT WINAPI acmFilterEnumW(HACMDRIVER had, PACMFILTERDETAILSW pafd, - ACMFILTERENUMCBW fnCallback, DWORD dwInstance, - DWORD fdwEnum) + ACMFILTERENUMCBW fnCallback, + DWORD_PTR dwInstance, DWORD fdwEnum) { PWINE_ACMDRIVERID padid; BOOL ret; - TRACE("(%p, %p, %p, %d, %d)\n", + TRACE("(%p, %p, %p, %ld, %d)\n", had, pafd, fnCallback, dwInstance, fdwEnum); if (pafd->cbStruct < sizeof(*pafd)) return MMSYSERR_INVALPARAM; @@ -375,7 +375,7 @@ struct MSACM_FilterTagEnumWtoA_Instance { static BOOL CALLBACK MSACM_FilterTagEnumCallbackWtoA(HACMDRIVERID hadid, PACMFILTERTAGDETAILSW paftdw, - DWORD dwInstance, + DWORD_PTR dwInstance, DWORD fdwSupport) { struct MSACM_FilterTagEnumWtoA_Instance* paftei; @@ -398,8 +398,8 @@ static BOOL CALLBACK MSACM_FilterTagEnumCallbackWtoA(HACMDRIVERID hadid, * acmFilterTagEnumA (MSACM32.@) */ MMRESULT WINAPI acmFilterTagEnumA(HACMDRIVER had, PACMFILTERTAGDETAILSA paftda, - ACMFILTERTAGENUMCBA fnCallback, DWORD dwInstance, - DWORD fdwEnum) + ACMFILTERTAGENUMCBA fnCallback, + DWORD_PTR dwInstance, DWORD fdwEnum) { ACMFILTERTAGDETAILSW aftdw; struct MSACM_FilterTagEnumWtoA_Instance aftei; @@ -421,13 +421,13 @@ MMRESULT WINAPI acmFilterTagEnumA(HACMDRIVER had, PACMFILTERTAGDETAILSA paftda, * acmFilterTagEnumW (MSACM32.@) */ MMRESULT WINAPI acmFilterTagEnumW(HACMDRIVER had, PACMFILTERTAGDETAILSW paftd, - ACMFILTERTAGENUMCBW fnCallback, DWORD dwInstance, - DWORD fdwEnum) + ACMFILTERTAGENUMCBW fnCallback, + DWORD_PTR dwInstance, DWORD fdwEnum) { PWINE_ACMDRIVERID padid; unsigned int i; - TRACE("(%p, %p, %p, %d, %d)\n", + TRACE("(%p, %p, %p, %ld, %d)\n", had, paftd, fnCallback, dwInstance, fdwEnum); if (paftd->cbStruct < sizeof(*paftd)) return MMSYSERR_INVALPARAM; diff --git a/dlls/msacm32/format.c b/dlls/msacm32/format.c index 66f3b3ceecc..31e0c551310 100644 --- a/dlls/msacm32/format.c +++ b/dlls/msacm32/format.c @@ -54,7 +54,8 @@ struct MSACM_FillFormatData { static BOOL CALLBACK MSACM_FillFormatTagsCB(HACMDRIVERID hadid, PACMFORMATTAGDETAILSA paftd, - DWORD dwInstance, DWORD fdwSupport) + DWORD_PTR dwInstance, + DWORD fdwSupport) { struct MSACM_FillFormatData* affd = (struct MSACM_FillFormatData*)dwInstance; @@ -383,7 +384,7 @@ struct MSACM_FormatEnumWtoA_Instance { static BOOL CALLBACK MSACM_FormatEnumCallbackWtoA(HACMDRIVERID hadid, PACMFORMATDETAILSW pafdw, - DWORD dwInstance, + DWORD_PTR dwInstance, DWORD fdwSupport) { struct MSACM_FormatEnumWtoA_Instance* pafei; @@ -404,8 +405,8 @@ static BOOL CALLBACK MSACM_FormatEnumCallbackWtoA(HACMDRIVERID hadid, * acmFormatEnumA (MSACM32.@) */ MMRESULT WINAPI acmFormatEnumA(HACMDRIVER had, PACMFORMATDETAILSA pafda, - ACMFORMATENUMCBA fnCallback, DWORD dwInstance, - DWORD fdwEnum) + ACMFORMATENUMCBA fnCallback, + DWORD_PTR dwInstance, DWORD fdwEnum) { ACMFORMATDETAILSW afdw; struct MSACM_FormatEnumWtoA_Instance afei; @@ -484,14 +485,14 @@ static BOOL MSACM_FormatEnumHelper(PWINE_ACMDRIVERID padid, HACMDRIVER had, /**********************************************************************/ MMRESULT WINAPI acmFormatEnumW(HACMDRIVER had, PACMFORMATDETAILSW pafd, - ACMFORMATENUMCBW fnCallback, DWORD dwInstance, - DWORD fdwEnum) + ACMFORMATENUMCBW fnCallback, + DWORD_PTR dwInstance, DWORD fdwEnum) { PWINE_ACMDRIVERID padid; WAVEFORMATEX wfxRef; BOOL ret; - TRACE("(%p, %p, %p, %d, %d)\n", + TRACE("(%p, %p, %p, %ld, %d)\n", had, pafd, fnCallback, dwInstance, fdwEnum); if (!pafd) @@ -711,7 +712,7 @@ struct MSACM_FormatTagEnumWtoA_Instance { static BOOL CALLBACK MSACM_FormatTagEnumCallbackWtoA(HACMDRIVERID hadid, PACMFORMATTAGDETAILSW paftdw, - DWORD dwInstance, + DWORD_PTR dwInstance, DWORD fdwSupport) { struct MSACM_FormatTagEnumWtoA_Instance* paftei; @@ -734,8 +735,8 @@ static BOOL CALLBACK MSACM_FormatTagEnumCallbackWtoA(HACMDRIVERID hadid, * acmFormatTagEnumA (MSACM32.@) */ MMRESULT WINAPI acmFormatTagEnumA(HACMDRIVER had, PACMFORMATTAGDETAILSA paftda, - ACMFORMATTAGENUMCBA fnCallback, DWORD dwInstance, - DWORD fdwEnum) + ACMFORMATTAGENUMCBA fnCallback, + DWORD_PTR dwInstance, DWORD fdwEnum) { ACMFORMATTAGDETAILSW aftdw; struct MSACM_FormatTagEnumWtoA_Instance aftei; @@ -766,14 +767,14 @@ MMRESULT WINAPI acmFormatTagEnumA(HACMDRIVER had, PACMFORMATTAGDETAILSA paftda, * acmFormatTagEnumW (MSACM32.@) */ MMRESULT WINAPI acmFormatTagEnumW(HACMDRIVER had, PACMFORMATTAGDETAILSW paftd, - ACMFORMATTAGENUMCBW fnCallback, DWORD dwInstance, - DWORD fdwEnum) + ACMFORMATTAGENUMCBW fnCallback, + DWORD_PTR dwInstance, DWORD fdwEnum) { PWINE_ACMDRIVERID padid; unsigned int i; BOOL bPcmDone = FALSE; - TRACE("(%p, %p, %p, %d, %d)\n", + TRACE("(%p, %p, %p, %ld, %d)\n", had, paftd, fnCallback, dwInstance, fdwEnum); if (!paftd) diff --git a/dlls/msacm32/internal.c b/dlls/msacm32/internal.c index cf76a574ab6..4100aae1918 100644 --- a/dlls/msacm32/internal.c +++ b/dlls/msacm32/internal.c @@ -289,18 +289,29 @@ PWINE_ACMDRIVERID MSACM_RegisterDriver(LPCWSTR pszDriverAlias, LPCWSTR pszFileNa debugstr_w(pszDriverAlias), debugstr_w(pszFileName), pLocalDriver); padid = HeapAlloc(MSACM_hHeap, 0, sizeof(WINE_ACMDRIVERID)); + if (!padid) + return NULL; padid->obj.dwType = WINE_ACMOBJ_DRIVERID; padid->obj.pACMDriverID = padid; padid->pszDriverAlias = NULL; if (pszDriverAlias) { padid->pszDriverAlias = HeapAlloc( MSACM_hHeap, 0, (strlenW(pszDriverAlias)+1) * sizeof(WCHAR) ); + if (!padid->pszDriverAlias) { + HeapFree(MSACM_hHeap, 0, padid); + return NULL; + } strcpyW( padid->pszDriverAlias, pszDriverAlias ); } padid->pszFileName = NULL; if (pszFileName) { padid->pszFileName = HeapAlloc( MSACM_hHeap, 0, (strlenW(pszFileName)+1) * sizeof(WCHAR) ); + if (!padid->pszFileName) { + HeapFree(MSACM_hHeap, 0, padid->pszDriverAlias); + HeapFree(MSACM_hHeap, 0, padid); + return NULL; + } strcpyW( padid->pszFileName, pszFileName ); } padid->pLocalDriver = pLocalDriver; diff --git a/dlls/msacm32/stream.c b/dlls/msacm32/stream.c index b05948d6719..a2065f392ab 100644 --- a/dlls/msacm32/stream.c +++ b/dlls/msacm32/stream.c @@ -141,9 +141,10 @@ MMRESULT WINAPI acmStreamMessage(HACMSTREAM has, UINT uMsg, LPARAM lParam1, /*********************************************************************** * acmStreamOpen (MSACM32.@) */ -MMRESULT WINAPI acmStreamOpen(PHACMSTREAM phas, HACMDRIVER had, PWAVEFORMATEX pwfxSrc, - PWAVEFORMATEX pwfxDst, PWAVEFILTER pwfltr, DWORD dwCallback, - DWORD dwInstance, DWORD fdwOpen) +MMRESULT WINAPI acmStreamOpen(PHACMSTREAM phas, HACMDRIVER had, + PWAVEFORMATEX pwfxSrc, PWAVEFORMATEX pwfxDst, + PWAVEFILTER pwfltr, DWORD_PTR dwCallback, + DWORD_PTR dwInstance, DWORD fdwOpen) { PWINE_ACMSTREAM was; PWINE_ACMDRIVER wad; @@ -152,7 +153,7 @@ MMRESULT WINAPI acmStreamOpen(PHACMSTREAM phas, HACMDRIVER had, PWAVEFORMATEX pw int wfxDstSize; WAVEFORMATEX wfxSrc, wfxDst; - TRACE("(%p, %p, %p, %p, %p, %d, %d, %d)\n", + TRACE("(%p, %p, %p, %p, %p, %ld, %ld, %d)\n", phas, had, pwfxSrc, pwfxDst, pwfltr, dwCallback, dwInstance, fdwOpen); /* NOTE: pwfxSrc and/or pwfxDst can point to a structure smaller than diff --git a/dlls/msacm32/tests/msacm.c b/dlls/msacm32/tests/msacm.c index 6efcb84b9d0..956b78554bd 100644 --- a/dlls/msacm32/tests/msacm.c +++ b/dlls/msacm32/tests/msacm.c @@ -34,7 +34,7 @@ static BOOL CALLBACK FormatTagEnumProc(HACMDRIVERID hadid, PACMFORMATTAGDETAILS paftd, - DWORD dwInstance, + DWORD_PTR dwInstance, DWORD fdwSupport) { if (winetest_interactive) @@ -45,7 +45,7 @@ static BOOL CALLBACK FormatTagEnumProc(HACMDRIVERID hadid, static BOOL CALLBACK FormatEnumProc(HACMDRIVERID hadid, LPACMFORMATDETAILS pafd, - DWORD dwInstance, + DWORD_PTR dwInstance, DWORD fd) { if (winetest_interactive) @@ -55,7 +55,7 @@ static BOOL CALLBACK FormatEnumProc(HACMDRIVERID hadid, } static BOOL CALLBACK DriverEnumProc(HACMDRIVERID hadid, - DWORD dwInstance, + DWORD_PTR dwInstance, DWORD fdwSupport) { MMRESULT rc; diff --git a/dlls/msadp32.acm/msadp32.c b/dlls/msadp32.acm/msadp32.c index 40b8260f935..f3454508ade 100644 --- a/dlls/msadp32.acm/msadp32.c +++ b/dlls/msadp32.acm/msadp32.c @@ -618,6 +618,9 @@ static LRESULT ADPCM_StreamClose(PACMDRVSTREAMINSTANCE adsi) */ static LRESULT ADPCM_StreamSize(const ACMDRVSTREAMINSTANCE *adsi, PACMDRVSTREAMSIZE adss) { + DWORD nblocks; + WORD wSamplesPerBlock; + /* wSamplesPerBlock formula comes from MSDN ADPCMWAVEFORMAT page.*/ switch (adss->fdwSize) { case ACM_STREAMSIZEF_DESTINATION: @@ -625,14 +628,20 @@ static LRESULT ADPCM_StreamSize(const ACMDRVSTREAMINSTANCE *adsi, PACMDRVSTREAMS if (adsi->pwfxSrc->wFormatTag == WAVE_FORMAT_PCM && adsi->pwfxDst->wFormatTag == WAVE_FORMAT_ADPCM) { - /* don't take block overhead into account, doesn't matter too much */ - adss->cbSrcLength = adss->cbDstLength * 4; + wSamplesPerBlock = adsi->pwfxDst->nBlockAlign * 2 / adsi->pwfxDst->nChannels - 12; + nblocks = adss->cbDstLength / adsi->pwfxDst->nBlockAlign; + if (nblocks == 0) + return ACMERR_NOTPOSSIBLE; + adss->cbSrcLength = nblocks * adsi->pwfxSrc->nBlockAlign * wSamplesPerBlock; } else if (adsi->pwfxSrc->wFormatTag == WAVE_FORMAT_ADPCM && adsi->pwfxDst->wFormatTag == WAVE_FORMAT_PCM) { - FIXME("misses the block header overhead\n"); - adss->cbSrcLength = 256 + adss->cbDstLength / 4; + wSamplesPerBlock = adsi->pwfxSrc->nBlockAlign * 2 / adsi->pwfxSrc->nChannels - 12; + nblocks = adss->cbDstLength / (adsi->pwfxDst->nBlockAlign * wSamplesPerBlock); + if (nblocks == 0) + return ACMERR_NOTPOSSIBLE; + adss->cbSrcLength = nblocks * adsi->pwfxSrc->nBlockAlign; } else { @@ -644,14 +653,26 @@ static LRESULT ADPCM_StreamSize(const ACMDRVSTREAMINSTANCE *adsi, PACMDRVSTREAMS if (adsi->pwfxSrc->wFormatTag == WAVE_FORMAT_PCM && adsi->pwfxDst->wFormatTag == WAVE_FORMAT_ADPCM) { - FIXME("misses the block header overhead\n"); - adss->cbDstLength = 256 + adss->cbSrcLength / 4; + wSamplesPerBlock = adsi->pwfxDst->nBlockAlign * 2 / adsi->pwfxDst->nChannels - 12; + nblocks = adss->cbSrcLength / (adsi->pwfxSrc->nBlockAlign * wSamplesPerBlock); + if (nblocks == 0) + return ACMERR_NOTPOSSIBLE; + if (adss->cbSrcLength % (adsi->pwfxSrc->nBlockAlign * wSamplesPerBlock)) + /* Round block count up. */ + nblocks++; + adss->cbDstLength = nblocks * adsi->pwfxSrc->nBlockAlign; } else if (adsi->pwfxSrc->wFormatTag == WAVE_FORMAT_ADPCM && adsi->pwfxDst->wFormatTag == WAVE_FORMAT_PCM) { - /* don't take block overhead into account, doesn't matter too much */ - adss->cbDstLength = adss->cbSrcLength * 4; + wSamplesPerBlock = adsi->pwfxSrc->nBlockAlign * 2 / adsi->pwfxSrc->nChannels - 12; + nblocks = adss->cbSrcLength / adsi->pwfxSrc->nBlockAlign; + if (nblocks == 0) + return ACMERR_NOTPOSSIBLE; + if (adss->cbSrcLength % adsi->pwfxSrc->nBlockAlign) + /* Round block count up. */ + nblocks++; + adss->cbDstLength = nblocks * adsi->pwfxSrc->nBlockAlign * wSamplesPerBlock; } else { diff --git a/dlls/msctf/Makefile.in b/dlls/msctf/Makefile.in index 687255109bf..5502bd6f953 100644 --- a/dlls/msctf/Makefile.in +++ b/dlls/msctf/Makefile.in @@ -6,6 +6,10 @@ MODULE = msctf.dll IMPORTS = uuid ole32 user32 advapi32 kernel32 ntdll C_SRCS = \ + categorymgr.c \ + context.c \ + documentmgr.c \ + inputprocessor.c \ msctf.c \ regsvr.c \ threadmgr.c diff --git a/dlls/msctf/categorymgr.c b/dlls/msctf/categorymgr.c new file mode 100644 index 00000000000..23580724286 --- /dev/null +++ b/dlls/msctf/categorymgr.c @@ -0,0 +1,289 @@ +/* + * ITfCategoryMgr implementation + * + * Copyright 2009 Aric Stewart, CodeWeavers + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA + */ + +#include "config.h" + +#include + +#define COBJMACROS + +#include "wine/debug.h" +#include "windef.h" +#include "winbase.h" +#include "winreg.h" +#include "winuser.h" +#include "shlwapi.h" +#include "winerror.h" +#include "objbase.h" + +#include "wine/unicode.h" + +#include "msctf.h" +#include "msctf_internal.h" + +WINE_DEFAULT_DEBUG_CHANNEL(msctf); + +typedef struct tagCategoryMgr { + const ITfCategoryMgrVtbl *CategoryMgrVtbl; + LONG refCount; +} CategoryMgr; + +static void CategoryMgr_Destructor(CategoryMgr *This) +{ + TRACE("destroying %p\n", This); + HeapFree(GetProcessHeap(),0,This); +} + +static HRESULT WINAPI CategoryMgr_QueryInterface(ITfCategoryMgr *iface, REFIID iid, LPVOID *ppvOut) +{ + CategoryMgr *This = (CategoryMgr *)iface; + *ppvOut = NULL; + + if (IsEqualIID(iid, &IID_IUnknown) || IsEqualIID(iid, &IID_ITfCategoryMgr)) + { + *ppvOut = This; + } + + if (*ppvOut) + { + IUnknown_AddRef(iface); + return S_OK; + } + + WARN("unsupported interface: %s\n", debugstr_guid(iid)); + return E_NOINTERFACE; +} + +static ULONG WINAPI CategoryMgr_AddRef(ITfCategoryMgr *iface) +{ + CategoryMgr *This = (CategoryMgr *)iface; + return InterlockedIncrement(&This->refCount); +} + +static ULONG WINAPI CategoryMgr_Release(ITfCategoryMgr *iface) +{ + CategoryMgr *This = (CategoryMgr *)iface; + ULONG ret; + + ret = InterlockedDecrement(&This->refCount); + if (ret == 0) + CategoryMgr_Destructor(This); + return ret; +} + +/***************************************************** + * ITfCategoryMgr functions + *****************************************************/ + +static HRESULT WINAPI CategoryMgr_RegisterCategory ( ITfCategoryMgr *iface, + REFCLSID rclsid, REFGUID rcatid, REFGUID rguid) +{ + WCHAR fullkey[110]; + WCHAR buf[39]; + WCHAR buf2[39]; + ULONG res; + HKEY tipkey,catkey,itmkey; + CategoryMgr *This = (CategoryMgr*)iface; + + static const WCHAR ctg[] = {'C','a','t','e','g','o','r','y',0}; + static const WCHAR itm[] = {'I','t','e','m',0}; + static const WCHAR fmt[] = {'%','s','\\','%','s',0}; + static const WCHAR fmt2[] = {'%','s','\\','%','s','\\','%','s','\\','%','s',0}; + + TRACE("(%p) %s %s %s\n",This,debugstr_guid(rclsid), debugstr_guid(rcatid), debugstr_guid(rguid)); + + StringFromGUID2(rclsid, buf, 39); + sprintfW(fullkey,fmt,szwSystemTIPKey,buf); + + if (RegOpenKeyExW(HKEY_LOCAL_MACHINE,fullkey, 0, KEY_READ | KEY_WRITE, + &tipkey ) != ERROR_SUCCESS) + return E_FAIL; + + StringFromGUID2(rcatid, buf, 39); + StringFromGUID2(rguid, buf2, 39); + sprintfW(fullkey,fmt2,ctg,ctg,buf,buf2); + + res = RegCreateKeyExW(tipkey, fullkey, 0, NULL, 0, KEY_READ | KEY_WRITE, + NULL, &catkey, NULL); + RegCloseKey(catkey); + + if (!res) + { + sprintfW(fullkey,fmt2,ctg,itm,buf2,buf); + res = RegCreateKeyExW(tipkey, fullkey, 0, NULL, 0, KEY_READ | KEY_WRITE, + NULL, &itmkey, NULL); + + RegCloseKey(itmkey); + } + + RegCloseKey(tipkey); + + if (!res) + return S_OK; + else + return E_FAIL; +} + +static HRESULT WINAPI CategoryMgr_UnregisterCategory ( ITfCategoryMgr *iface, + REFCLSID rclsid, REFGUID rcatid, REFGUID rguid) +{ + CategoryMgr *This = (CategoryMgr*)iface; + FIXME("STUB:(%p)\n",This); + return E_NOTIMPL; +} + +static HRESULT WINAPI CategoryMgr_EnumCategoriesInItem ( ITfCategoryMgr *iface, + REFGUID rguid, IEnumGUID **ppEnum) +{ + CategoryMgr *This = (CategoryMgr*)iface; + FIXME("STUB:(%p)\n",This); + return E_NOTIMPL; +} + +static HRESULT WINAPI CategoryMgr_EnumItemsInCategory ( ITfCategoryMgr *iface, + REFGUID rcatid, IEnumGUID **ppEnum) +{ + CategoryMgr *This = (CategoryMgr*)iface; + FIXME("STUB:(%p)\n",This); + return E_NOTIMPL; +} + +static HRESULT WINAPI CategoryMgr_FindClosestCategory ( ITfCategoryMgr *iface, + REFGUID rguid, GUID *pcatid, const GUID **ppcatidList, ULONG ulCount) +{ + CategoryMgr *This = (CategoryMgr*)iface; + FIXME("STUB:(%p)\n",This); + return E_NOTIMPL; +} + +static HRESULT WINAPI CategoryMgr_RegisterGUIDDescription ( + ITfCategoryMgr *iface, REFCLSID rclsid, REFGUID rguid, + const WCHAR *pchDesc, ULONG cch) +{ + CategoryMgr *This = (CategoryMgr*)iface; + FIXME("STUB:(%p)\n",This); + return E_NOTIMPL; +} + +static HRESULT WINAPI CategoryMgr_UnregisterGUIDDescription ( + ITfCategoryMgr *iface, REFCLSID rclsid, REFGUID rguid) +{ + CategoryMgr *This = (CategoryMgr*)iface; + FIXME("STUB:(%p)\n",This); + return E_NOTIMPL; +} + +static HRESULT WINAPI CategoryMgr_GetGUIDDescription ( ITfCategoryMgr *iface, + REFGUID rguid, BSTR *pbstrDesc) +{ + CategoryMgr *This = (CategoryMgr*)iface; + FIXME("STUB:(%p)\n",This); + return E_NOTIMPL; +} + +static HRESULT WINAPI CategoryMgr_RegisterGUIDDWORD ( ITfCategoryMgr *iface, + REFCLSID rclsid, REFGUID rguid, DWORD dw) +{ + CategoryMgr *This = (CategoryMgr*)iface; + FIXME("STUB:(%p)\n",This); + return E_NOTIMPL; +} + +static HRESULT WINAPI CategoryMgr_UnregisterGUIDDWORD ( ITfCategoryMgr *iface, + REFCLSID rclsid, REFGUID rguid) +{ + CategoryMgr *This = (CategoryMgr*)iface; + FIXME("STUB:(%p)\n",This); + return E_NOTIMPL; +} + +static HRESULT WINAPI CategoryMgr_GetGUIDDWORD ( ITfCategoryMgr *iface, + REFGUID rguid, DWORD *pdw) +{ + CategoryMgr *This = (CategoryMgr*)iface; + FIXME("STUB:(%p)\n",This); + return E_NOTIMPL; +} + +static HRESULT WINAPI CategoryMgr_RegisterGUID ( ITfCategoryMgr *iface, + REFGUID rguid, TfGuidAtom *pguidatom +) +{ + CategoryMgr *This = (CategoryMgr*)iface; + FIXME("STUB:(%p)\n",This); + return E_NOTIMPL; +} + +static HRESULT WINAPI CategoryMgr_GetGUID ( ITfCategoryMgr *iface, + TfGuidAtom guidatom, GUID *pguid) +{ + CategoryMgr *This = (CategoryMgr*)iface; + FIXME("STUB:(%p)\n",This); + return E_NOTIMPL; +} + +static HRESULT WINAPI CategoryMgr_IsEqualTfGuidAtom ( ITfCategoryMgr *iface, + TfGuidAtom guidatom, REFGUID rguid, BOOL *pfEqual) +{ + CategoryMgr *This = (CategoryMgr*)iface; + FIXME("STUB:(%p)\n",This); + return E_NOTIMPL; +} + + +static const ITfCategoryMgrVtbl CategoryMgr_CategoryMgrVtbl = +{ + CategoryMgr_QueryInterface, + CategoryMgr_AddRef, + CategoryMgr_Release, + + CategoryMgr_RegisterCategory, + CategoryMgr_UnregisterCategory, + CategoryMgr_EnumCategoriesInItem, + CategoryMgr_EnumItemsInCategory, + CategoryMgr_FindClosestCategory, + CategoryMgr_RegisterGUIDDescription, + CategoryMgr_UnregisterGUIDDescription, + CategoryMgr_GetGUIDDescription, + CategoryMgr_RegisterGUIDDWORD, + CategoryMgr_UnregisterGUIDDWORD, + CategoryMgr_GetGUIDDWORD, + CategoryMgr_RegisterGUID, + CategoryMgr_GetGUID, + CategoryMgr_IsEqualTfGuidAtom +}; + +HRESULT CategoryMgr_Constructor(IUnknown *pUnkOuter, IUnknown **ppOut) +{ + CategoryMgr *This; + if (pUnkOuter) + return CLASS_E_NOAGGREGATION; + + This = HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,sizeof(CategoryMgr)); + if (This == NULL) + return E_OUTOFMEMORY; + + This->CategoryMgrVtbl= &CategoryMgr_CategoryMgrVtbl; + This->refCount = 1; + + TRACE("returning %p\n", This); + *ppOut = (IUnknown *)This; + return S_OK; +} diff --git a/dlls/msctf/context.c b/dlls/msctf/context.c new file mode 100644 index 00000000000..593f0ad33a3 --- /dev/null +++ b/dlls/msctf/context.c @@ -0,0 +1,418 @@ +/* + * ITfContext implementation + * + * Copyright 2009 Aric Stewart, CodeWeavers + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA + */ + +#include "config.h" + +#include + +#define COBJMACROS + +#include "wine/debug.h" +#include "windef.h" +#include "winbase.h" +#include "winreg.h" +#include "winuser.h" +#include "shlwapi.h" +#include "winerror.h" +#include "objbase.h" +#include "olectl.h" + +#include "wine/unicode.h" +#include "wine/list.h" + +#include "msctf.h" +#include "msctf_internal.h" + +WINE_DEFAULT_DEBUG_CHANNEL(msctf); + +typedef struct tagContextSink { + struct list entry; + union { + /* Context Sinks */ + IUnknown *pIUnknown; + /* ITfContextKeyEventSink *pITfContextKeyEventSink; */ + /* ITfEditTransactionSink *pITfEditTransactionSink; */ + /* ITfStatusSink *pITfStatusSink; */ + ITfTextEditSink *pITfTextEditSink; + /* ITfTextLayoutSink *pITfTextLayoutSink; */ + } interfaces; +} ContextSink; + +typedef struct tagContext { + const ITfContextVtbl *ContextVtbl; + const ITfSourceVtbl *SourceVtbl; + LONG refCount; + + TfClientId tidOwner; + IUnknown *punk; /* possible ITextStoreACP or ITfContextOwnerCompositionSink */ + + /* kept as seperate lists to reduce unnesseccary iterations */ + struct list pContextKeyEventSink; + struct list pEditTransactionSink; + struct list pStatusSink; + struct list pTextEditSink; + struct list pTextLayoutSink; + +} Context; + +static inline Context *impl_from_ITfSourceVtbl(ITfSource *iface) +{ + return (Context *)((char *)iface - FIELD_OFFSET(Context,SourceVtbl)); +} + +static void free_sink(ContextSink *sink) +{ + IUnknown_Release(sink->interfaces.pIUnknown); + HeapFree(GetProcessHeap(),0,sink); +} + +static void Context_Destructor(Context *This) +{ + struct list *cursor, *cursor2; + TRACE("destroying %p\n", This); + + LIST_FOR_EACH_SAFE(cursor, cursor2, &This->pContextKeyEventSink) + { + ContextSink* sink = LIST_ENTRY(cursor,ContextSink,entry); + list_remove(cursor); + free_sink(sink); + } + LIST_FOR_EACH_SAFE(cursor, cursor2, &This->pEditTransactionSink) + { + ContextSink* sink = LIST_ENTRY(cursor,ContextSink,entry); + list_remove(cursor); + free_sink(sink); + } + LIST_FOR_EACH_SAFE(cursor, cursor2, &This->pStatusSink) + { + ContextSink* sink = LIST_ENTRY(cursor,ContextSink,entry); + list_remove(cursor); + free_sink(sink); + } + LIST_FOR_EACH_SAFE(cursor, cursor2, &This->pTextEditSink) + { + ContextSink* sink = LIST_ENTRY(cursor,ContextSink,entry); + list_remove(cursor); + free_sink(sink); + } + LIST_FOR_EACH_SAFE(cursor, cursor2, &This->pTextLayoutSink) + { + ContextSink* sink = LIST_ENTRY(cursor,ContextSink,entry); + list_remove(cursor); + free_sink(sink); + } + + HeapFree(GetProcessHeap(),0,This); +} + +static HRESULT WINAPI Context_QueryInterface(ITfContext *iface, REFIID iid, LPVOID *ppvOut) +{ + Context *This = (Context *)iface; + *ppvOut = NULL; + + if (IsEqualIID(iid, &IID_IUnknown) || IsEqualIID(iid, &IID_ITfContext)) + { + *ppvOut = This; + } + else if (IsEqualIID(iid, &IID_ITfSource)) + { + *ppvOut = &This->SourceVtbl; + } + + if (*ppvOut) + { + IUnknown_AddRef(iface); + return S_OK; + } + + WARN("unsupported interface: %s\n", debugstr_guid(iid)); + return E_NOINTERFACE; +} + +static ULONG WINAPI Context_AddRef(ITfContext *iface) +{ + Context *This = (Context *)iface; + return InterlockedIncrement(&This->refCount); +} + +static ULONG WINAPI Context_Release(ITfContext *iface) +{ + Context *This = (Context *)iface; + ULONG ret; + + ret = InterlockedDecrement(&This->refCount); + if (ret == 0) + Context_Destructor(This); + return ret; +} + +/***************************************************** + * ITfContext functions + *****************************************************/ +static HRESULT WINAPI Context_RequestEditSession (ITfContext *iface, + TfClientId tid, ITfEditSession *pes, DWORD dwFlags, + HRESULT *phrSession) +{ + Context *This = (Context *)iface; + FIXME("STUB:(%p)\n",This); + return E_NOTIMPL; +} + +static HRESULT WINAPI Context_InWriteSession (ITfContext *iface, + TfClientId tid, + BOOL *pfWriteSession) +{ + Context *This = (Context *)iface; + FIXME("STUB:(%p)\n",This); + return E_NOTIMPL; +} + +static HRESULT WINAPI Context_GetSelection (ITfContext *iface, + TfEditCookie ec, ULONG ulIndex, ULONG ulCount, + TF_SELECTION *pSelection, ULONG *pcFetched) +{ + Context *This = (Context *)iface; + FIXME("STUB:(%p)\n",This); + return E_NOTIMPL; +} + +static HRESULT WINAPI Context_SetSelection (ITfContext *iface, + TfEditCookie ec, ULONG ulCount, const TF_SELECTION *pSelection) +{ + Context *This = (Context *)iface; + FIXME("STUB:(%p)\n",This); + return E_NOTIMPL; +} + +static HRESULT WINAPI Context_GetStart (ITfContext *iface, + TfEditCookie ec, ITfRange **ppStart) +{ + Context *This = (Context *)iface; + FIXME("STUB:(%p)\n",This); + return E_NOTIMPL; +} + +static HRESULT WINAPI Context_GetEnd (ITfContext *iface, + TfEditCookie ec, ITfRange **ppEnd) +{ + Context *This = (Context *)iface; + FIXME("STUB:(%p)\n",This); + return E_NOTIMPL; +} + +static HRESULT WINAPI Context_GetActiveView (ITfContext *iface, + ITfContextView **ppView) +{ + Context *This = (Context *)iface; + FIXME("STUB:(%p)\n",This); + return E_NOTIMPL; +} + +static HRESULT WINAPI Context_EnumViews (ITfContext *iface, + IEnumTfContextViews **ppEnum) +{ + Context *This = (Context *)iface; + FIXME("STUB:(%p)\n",This); + return E_NOTIMPL; +} + +static HRESULT WINAPI Context_GetStatus (ITfContext *iface, + TF_STATUS *pdcs) +{ + Context *This = (Context *)iface; + FIXME("STUB:(%p)\n",This); + return E_NOTIMPL; +} + +static HRESULT WINAPI Context_GetProperty (ITfContext *iface, + REFGUID guidProp, ITfProperty **ppProp) +{ + Context *This = (Context *)iface; + FIXME("STUB:(%p)\n",This); + return E_NOTIMPL; +} + +static HRESULT WINAPI Context_GetAppProperty (ITfContext *iface, + REFGUID guidProp, ITfReadOnlyProperty **ppProp) +{ + Context *This = (Context *)iface; + FIXME("STUB:(%p)\n",This); + return E_NOTIMPL; +} + +static HRESULT WINAPI Context_TrackProperties (ITfContext *iface, + const GUID **prgProp, ULONG cProp, const GUID **prgAppProp, + ULONG cAppProp, ITfReadOnlyProperty **ppProperty) +{ + Context *This = (Context *)iface; + FIXME("STUB:(%p)\n",This); + return E_NOTIMPL; +} + +static HRESULT WINAPI Context_EnumProperties (ITfContext *iface, + IEnumTfProperties **ppEnum) +{ + Context *This = (Context *)iface; + FIXME("STUB:(%p)\n",This); + return E_NOTIMPL; +} + +static HRESULT WINAPI Context_GetDocumentMgr (ITfContext *iface, + ITfDocumentMgr **ppDm) +{ + Context *This = (Context *)iface; + FIXME("STUB:(%p)\n",This); + return E_NOTIMPL; +} + +static HRESULT WINAPI Context_CreateRangeBackup (ITfContext *iface, + TfEditCookie ec, ITfRange *pRange, ITfRangeBackup **ppBackup) +{ + Context *This = (Context *)iface; + FIXME("STUB:(%p)\n",This); + return E_NOTIMPL; +} + +static const ITfContextVtbl Context_ContextVtbl = +{ + Context_QueryInterface, + Context_AddRef, + Context_Release, + + Context_RequestEditSession, + Context_InWriteSession, + Context_GetSelection, + Context_SetSelection, + Context_GetStart, + Context_GetEnd, + Context_GetActiveView, + Context_EnumViews, + Context_GetStatus, + Context_GetProperty, + Context_GetAppProperty, + Context_TrackProperties, + Context_EnumProperties, + Context_GetDocumentMgr, + Context_CreateRangeBackup +}; + +static HRESULT WINAPI Source_QueryInterface(ITfSource *iface, REFIID iid, LPVOID *ppvOut) +{ + Context *This = impl_from_ITfSourceVtbl(iface); + return Context_QueryInterface((ITfContext *)This, iid, *ppvOut); +} + +static ULONG WINAPI Source_AddRef(ITfSource *iface) +{ + Context *This = impl_from_ITfSourceVtbl(iface); + return Context_AddRef((ITfContext *)This); +} + +static ULONG WINAPI Source_Release(ITfSource *iface) +{ + Context *This = impl_from_ITfSourceVtbl(iface); + return Context_Release((ITfContext *)This); +} + +/***************************************************** + * ITfSource functions + *****************************************************/ +static WINAPI HRESULT ContextSource_AdviseSink(ITfSource *iface, + REFIID riid, IUnknown *punk, DWORD *pdwCookie) +{ + ContextSink *es; + Context *This = impl_from_ITfSourceVtbl(iface); + TRACE("(%p) %s %p %p\n",This,debugstr_guid(riid),punk,pdwCookie); + + if (!riid || !punk || !pdwCookie) + return E_INVALIDARG; + + if (IsEqualIID(riid, &IID_ITfTextEditSink)) + { + es = HeapAlloc(GetProcessHeap(),0,sizeof(ContextSink)); + if (!es) + return E_OUTOFMEMORY; + if (!SUCCEEDED(IUnknown_QueryInterface(punk, riid, (LPVOID*)&es->interfaces.pITfTextEditSink))) + { + HeapFree(GetProcessHeap(),0,es); + return CONNECT_E_CANNOTCONNECT; + } + list_add_head(&This->pTextEditSink ,&es->entry); + *pdwCookie = (DWORD)es; + } + else + { + FIXME("(%p) Unhandled Sink: %s\n",This,debugstr_guid(riid)); + return E_NOTIMPL; + } + + TRACE("cookie %x\n",*pdwCookie); + return S_OK; +} + +static WINAPI HRESULT ContextSource_UnadviseSink(ITfSource *iface, DWORD pdwCookie) +{ + ContextSink *sink = (ContextSink*)pdwCookie; + Context *This = impl_from_ITfSourceVtbl(iface); + TRACE("(%p) %x\n",This,pdwCookie); + + list_remove(&sink->entry); + free_sink(sink); + + return S_OK; +} + +static const ITfSourceVtbl Context_SourceVtbl = +{ + Source_QueryInterface, + Source_AddRef, + Source_Release, + + ContextSource_AdviseSink, + ContextSource_UnadviseSink, +}; + +HRESULT Context_Constructor(TfClientId tidOwner, IUnknown *punk, ITfContext **ppOut, TfEditCookie *pecTextStore) +{ + Context *This; + + This = HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,sizeof(Context)); + if (This == NULL) + return E_OUTOFMEMORY; + + This->ContextVtbl= &Context_ContextVtbl; + This->SourceVtbl = &Context_SourceVtbl; + This->refCount = 1; + This->tidOwner = tidOwner; + This->punk = punk; + + TRACE("returning %p\n", This); + *ppOut = (ITfContext*)This; + /* FIXME */ + *pecTextStore = 0xdeaddead; + + list_init(&This->pContextKeyEventSink); + list_init(&This->pEditTransactionSink); + list_init(&This->pStatusSink); + list_init(&This->pTextEditSink); + list_init(&This->pTextLayoutSink); + + return S_OK; +} diff --git a/dlls/msctf/documentmgr.c b/dlls/msctf/documentmgr.c new file mode 100644 index 00000000000..c87514556ad --- /dev/null +++ b/dlls/msctf/documentmgr.c @@ -0,0 +1,280 @@ +/* + * ITfDocumentMgr implementation + * + * Copyright 2009 Aric Stewart, CodeWeavers + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA + */ + +#include "config.h" + +#include + +#define COBJMACROS + +#include "wine/debug.h" +#include "windef.h" +#include "winbase.h" +#include "winreg.h" +#include "winuser.h" +#include "shlwapi.h" +#include "winerror.h" +#include "objbase.h" + +#include "wine/unicode.h" + +#include "msctf.h" +#include "msctf_internal.h" + +WINE_DEFAULT_DEBUG_CHANNEL(msctf); + +typedef struct tagDocumentMgr { + const ITfDocumentMgrVtbl *DocumentMgrVtbl; + const ITfSourceVtbl *SourceVtbl; + LONG refCount; + + ITfContext* contextStack[2]; /* limit of 2 contexts */ +} DocumentMgr; + +static inline DocumentMgr *impl_from_ITfSourceVtbl(ITfSource *iface) +{ + return (DocumentMgr *)((char *)iface - FIELD_OFFSET(DocumentMgr,SourceVtbl)); +} + +static void DocumentMgr_Destructor(DocumentMgr *This) +{ + TRACE("destroying %p\n", This); + if (This->contextStack[0]) + ITfContext_Release(This->contextStack[0]); + if (This->contextStack[1]) + ITfContext_Release(This->contextStack[1]); + HeapFree(GetProcessHeap(),0,This); +} + +static HRESULT WINAPI DocumentMgr_QueryInterface(ITfDocumentMgr *iface, REFIID iid, LPVOID *ppvOut) +{ + DocumentMgr *This = (DocumentMgr *)iface; + *ppvOut = NULL; + + if (IsEqualIID(iid, &IID_IUnknown) || IsEqualIID(iid, &IID_ITfDocumentMgr)) + { + *ppvOut = This; + } + else if (IsEqualIID(iid, &IID_ITfSource)) + { + *ppvOut = &This->SourceVtbl; + } + + if (*ppvOut) + { + IUnknown_AddRef(iface); + return S_OK; + } + + WARN("unsupported interface: %s\n", debugstr_guid(iid)); + return E_NOINTERFACE; +} + +static ULONG WINAPI DocumentMgr_AddRef(ITfDocumentMgr *iface) +{ + DocumentMgr *This = (DocumentMgr *)iface; + return InterlockedIncrement(&This->refCount); +} + +static ULONG WINAPI DocumentMgr_Release(ITfDocumentMgr *iface) +{ + DocumentMgr *This = (DocumentMgr *)iface; + ULONG ret; + + ret = InterlockedDecrement(&This->refCount); + if (ret == 0) + DocumentMgr_Destructor(This); + return ret; +} + +/***************************************************** + * ITfDocumentMgr functions + *****************************************************/ +static HRESULT WINAPI DocumentMgr_CreateContext(ITfDocumentMgr *iface, + TfClientId tidOwner, + DWORD dwFlags, IUnknown *punk, ITfContext **ppic, + TfEditCookie *pecTextStore) +{ + DocumentMgr *This = (DocumentMgr *)iface; + TRACE("(%p) 0x%x 0x%x %p %p %p\n",This,tidOwner,dwFlags,punk,ppic,pecTextStore); + return Context_Constructor(tidOwner, punk, ppic, pecTextStore); +} + +static HRESULT WINAPI DocumentMgr_Push(ITfDocumentMgr *iface, ITfContext *pic) +{ + DocumentMgr *This = (DocumentMgr *)iface; + ITfContext *check; + + TRACE("(%p) %p\n",This,pic); + + if (This->contextStack[1]) /* FUll */ + return TF_E_STACKFULL; + + if (!pic || FAILED(IUnknown_QueryInterface(pic,&IID_ITfContext,(LPVOID*) &check))) + return E_INVALIDARG; + + This->contextStack[1] = This->contextStack[0]; + This->contextStack[0] = check; + + return S_OK; +} + +static HRESULT WINAPI DocumentMgr_Pop(ITfDocumentMgr *iface, DWORD dwFlags) +{ + DocumentMgr *This = (DocumentMgr *)iface; + TRACE("(%p) 0x%x\n",This,dwFlags); + + if (dwFlags == TF_POPF_ALL) + { + if (This->contextStack[0]) + ITfContext_Release(This->contextStack[0]); + if (This->contextStack[1]) + ITfContext_Release(This->contextStack[1]); + This->contextStack[0] = This->contextStack[1] = NULL; + return S_OK; + } + + if (dwFlags) + return E_INVALIDARG; + + if (This->contextStack[0] == NULL) /* Cannot pop last context */ + return E_FAIL; + + ITfContext_Release(This->contextStack[0]); + This->contextStack[0] = This->contextStack[1]; + This->contextStack[1] = NULL; + + return S_OK; +} + +static HRESULT WINAPI DocumentMgr_GetTop(ITfDocumentMgr *iface, ITfContext **ppic) +{ + DocumentMgr *This = (DocumentMgr *)iface; + TRACE("(%p)\n",This); + if (!ppic) + return E_INVALIDARG; + + if (This->contextStack[0]) + ITfContext_AddRef(This->contextStack[0]); + + *ppic = This->contextStack[0]; + + return S_OK; +} + +static HRESULT WINAPI DocumentMgr_GetBase(ITfDocumentMgr *iface, ITfContext **ppic) +{ + DocumentMgr *This = (DocumentMgr *)iface; + TRACE("(%p)\n",This); + if (!ppic) + return E_INVALIDARG; + + if (This->contextStack[1]) + ITfContext_AddRef(This->contextStack[1]); + + *ppic = This->contextStack[1]; + + return S_OK; +} + +static HRESULT WINAPI DocumentMgr_EnumContexts(ITfDocumentMgr *iface, IEnumTfContexts **ppEnum) +{ + DocumentMgr *This = (DocumentMgr *)iface; + FIXME("STUB:(%p)\n",This); + return E_NOTIMPL; +} + +static const ITfDocumentMgrVtbl DocumentMgr_DocumentMgrVtbl = +{ + DocumentMgr_QueryInterface, + DocumentMgr_AddRef, + DocumentMgr_Release, + + DocumentMgr_CreateContext, + DocumentMgr_Push, + DocumentMgr_Pop, + DocumentMgr_GetTop, + DocumentMgr_GetBase, + DocumentMgr_EnumContexts +}; + + +static HRESULT WINAPI Source_QueryInterface(ITfSource *iface, REFIID iid, LPVOID *ppvOut) +{ + DocumentMgr *This = impl_from_ITfSourceVtbl(iface); + return DocumentMgr_QueryInterface((ITfDocumentMgr*)This, iid, *ppvOut); +} + +static ULONG WINAPI Source_AddRef(ITfSource *iface) +{ + DocumentMgr *This = impl_from_ITfSourceVtbl(iface); + return DocumentMgr_AddRef((ITfDocumentMgr*)This); +} + +static ULONG WINAPI Source_Release(ITfSource *iface) +{ + DocumentMgr *This = impl_from_ITfSourceVtbl(iface); + return DocumentMgr_Release((ITfDocumentMgr*)This); +} + +/***************************************************** + * ITfSource functions + *****************************************************/ +static WINAPI HRESULT DocumentMgrSource_AdviseSink(ITfSource *iface, + REFIID riid, IUnknown *punk, DWORD *pdwCookie) +{ + DocumentMgr *This = impl_from_ITfSourceVtbl(iface); + FIXME("STUB:(%p)\n",This); + return E_NOTIMPL; +} + +static WINAPI HRESULT DocumentMgrSource_UnadviseSink(ITfSource *iface, DWORD pdwCookie) +{ + DocumentMgr *This = impl_from_ITfSourceVtbl(iface); + FIXME("STUB:(%p)\n",This); + return E_NOTIMPL; +} + +static const ITfSourceVtbl DocumentMgr_SourceVtbl = +{ + Source_QueryInterface, + Source_AddRef, + Source_Release, + + DocumentMgrSource_AdviseSink, + DocumentMgrSource_UnadviseSink, +}; + +HRESULT DocumentMgr_Constructor(ITfDocumentMgr **ppOut) +{ + DocumentMgr *This; + + This = HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,sizeof(DocumentMgr)); + if (This == NULL) + return E_OUTOFMEMORY; + + This->DocumentMgrVtbl= &DocumentMgr_DocumentMgrVtbl; + This->SourceVtbl = &DocumentMgr_SourceVtbl; + This->refCount = 1; + + TRACE("returning %p\n", This); + *ppOut = (ITfDocumentMgr*)This; + return S_OK; +} diff --git a/dlls/msctf/inputprocessor.c b/dlls/msctf/inputprocessor.c new file mode 100644 index 00000000000..893a88ffe14 --- /dev/null +++ b/dlls/msctf/inputprocessor.c @@ -0,0 +1,360 @@ +/* + * ITfInputProcessorProfiles implementation + * + * Copyright 2009 Aric Stewart, CodeWeavers + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA + */ + +#include "config.h" + +#include + +#define COBJMACROS + +#include "wine/debug.h" +#include "windef.h" +#include "winbase.h" +#include "winreg.h" +#include "winuser.h" +#include "shlwapi.h" +#include "winerror.h" +#include "objbase.h" + +#include "wine/unicode.h" + +#include "msctf.h" +#include "msctf_internal.h" + +WINE_DEFAULT_DEBUG_CHANNEL(msctf); + +typedef struct tagInputProcessorProfiles { + const ITfInputProcessorProfilesVtbl *InputProcessorProfilesVtbl; + LONG refCount; + + LANGID currentLanguage; +} InputProcessorProfiles; + +static void InputProcessorProfiles_Destructor(InputProcessorProfiles *This) +{ + TRACE("destroying %p\n", This); + HeapFree(GetProcessHeap(),0,This); +} + +static HRESULT WINAPI InputProcessorProfiles_QueryInterface(ITfInputProcessorProfiles *iface, REFIID iid, LPVOID *ppvOut) +{ + InputProcessorProfiles *This = (InputProcessorProfiles *)iface; + *ppvOut = NULL; + + if (IsEqualIID(iid, &IID_IUnknown) || IsEqualIID(iid, &IID_ITfInputProcessorProfiles)) + { + *ppvOut = This; + } + + if (*ppvOut) + { + IUnknown_AddRef(iface); + return S_OK; + } + + WARN("unsupported interface: %s\n", debugstr_guid(iid)); + return E_NOINTERFACE; +} + +static ULONG WINAPI InputProcessorProfiles_AddRef(ITfInputProcessorProfiles *iface) +{ + InputProcessorProfiles *This = (InputProcessorProfiles *)iface; + return InterlockedIncrement(&This->refCount); +} + +static ULONG WINAPI InputProcessorProfiles_Release(ITfInputProcessorProfiles *iface) +{ + InputProcessorProfiles *This = (InputProcessorProfiles *)iface; + ULONG ret; + + ret = InterlockedDecrement(&This->refCount); + if (ret == 0) + InputProcessorProfiles_Destructor(This); + return ret; +} + +/***************************************************** + * ITfInputProcessorProfiles functions + *****************************************************/ +static HRESULT WINAPI InputProcessorProfiles_Register( + ITfInputProcessorProfiles *iface, REFCLSID rclsid) +{ + InputProcessorProfiles *This = (InputProcessorProfiles*)iface; + HKEY tipkey; + WCHAR buf[39]; + static const WCHAR fmt[] = {'%','s','\\','%','s',0}; + WCHAR fullkey[68]; + + TRACE("(%p) %s\n",This,debugstr_guid(rclsid)); + + StringFromGUID2(rclsid, buf, 39); + sprintfW(fullkey,fmt,szwSystemTIPKey,buf); + + if (RegCreateKeyExW(HKEY_LOCAL_MACHINE,fullkey, 0, NULL, 0, + KEY_READ | KEY_WRITE, NULL, &tipkey, NULL) != ERROR_SUCCESS) + return E_FAIL; + + RegCloseKey(tipkey); + + return S_OK; +} + +static HRESULT WINAPI InputProcessorProfiles_Unregister( + ITfInputProcessorProfiles *iface, REFCLSID rclsid) +{ + InputProcessorProfiles *This = (InputProcessorProfiles*)iface; + FIXME("STUB:(%p)\n",This); + return E_NOTIMPL; +} + +static HRESULT WINAPI InputProcessorProfiles_AddLanguageProfile( + ITfInputProcessorProfiles *iface, REFCLSID rclsid, + LANGID langid, REFGUID guidProfile, const WCHAR *pchDesc, + ULONG cchDesc, const WCHAR *pchIconFile, ULONG cchFile, + ULONG uIconIndex) +{ + HKEY tipkey,fmtkey; + WCHAR buf[39]; + WCHAR fullkey[100]; + ULONG res; + + static const WCHAR fmt[] = {'%','s','\\','%','s',0}; + static const WCHAR fmt2[] = {'%','s','\\','0','x','%','0','8','x','\\','%','s',0}; + static const WCHAR lngp[] = {'L','a','n','g','u','a','g','e','P','r','o','f','i','l','e',0}; + static const WCHAR desc[] = {'D','e','s','c','r','i','p','t','i','o','n',0}; + static const WCHAR icnf[] = {'I','c','o','n','F','i','l','e',0}; + static const WCHAR icni[] = {'I','c','o','n','I','n','d','e','x',0}; + + InputProcessorProfiles *This = (InputProcessorProfiles*)iface; + + TRACE("(%p) %s %x %s %s %s %i\n",This,debugstr_guid(rclsid), langid, + debugstr_guid(guidProfile), debugstr_wn(pchDesc,cchDesc), + debugstr_wn(pchIconFile,cchFile),uIconIndex); + + StringFromGUID2(rclsid, buf, 39); + sprintfW(fullkey,fmt,szwSystemTIPKey,buf); + + if (RegOpenKeyExW(HKEY_LOCAL_MACHINE,fullkey, 0, KEY_READ | KEY_WRITE, + &tipkey ) != ERROR_SUCCESS) + return E_FAIL; + + StringFromGUID2(guidProfile, buf, 39); + sprintfW(fullkey,fmt2,lngp,langid,buf); + + res = RegCreateKeyExW(tipkey,fullkey, 0, NULL, 0, KEY_READ | KEY_WRITE, + NULL, &fmtkey, NULL); + + if (!res) + { + RegSetValueExW(fmtkey, desc, 0, REG_SZ, (LPBYTE)pchDesc, cchDesc * sizeof(WCHAR)); + RegSetValueExW(fmtkey, icnf, 0, REG_SZ, (LPBYTE)pchIconFile, cchFile * sizeof(WCHAR)); + RegSetValueExW(fmtkey, icni, 0, REG_DWORD, (LPBYTE)&uIconIndex, sizeof(DWORD)); + RegCloseKey(fmtkey); + } + RegCloseKey(tipkey); + + if (!res) + return S_OK; + else + return E_FAIL; +} + +static HRESULT WINAPI InputProcessorProfiles_RemoveLanguageProfile( + ITfInputProcessorProfiles *iface, REFCLSID rclsid, LANGID langid, + REFGUID guidProfile) +{ + InputProcessorProfiles *This = (InputProcessorProfiles*)iface; + FIXME("STUB:(%p)\n",This); + return E_NOTIMPL; +} + +static HRESULT WINAPI InputProcessorProfiles_EnumInputProcessorInfo( + ITfInputProcessorProfiles *iface, IEnumGUID **ppEnum) +{ + InputProcessorProfiles *This = (InputProcessorProfiles*)iface; + FIXME("STUB:(%p)\n",This); + return E_NOTIMPL; +} + +static HRESULT WINAPI InputProcessorProfiles_GetDefaultLanguageProfile( + ITfInputProcessorProfiles *iface, LANGID langid, REFGUID catid, + CLSID *pclsid, GUID *pguidProfile) +{ + InputProcessorProfiles *This = (InputProcessorProfiles*)iface; + FIXME("STUB:(%p)\n",This); + return E_NOTIMPL; +} + +static HRESULT WINAPI InputProcessorProfiles_SetDefaultLanguageProfile( + ITfInputProcessorProfiles *iface, LANGID langid, REFCLSID rclsid, + REFGUID guidProfiles) +{ + InputProcessorProfiles *This = (InputProcessorProfiles*)iface; + FIXME("STUB:(%p)\n",This); + return E_NOTIMPL; +} + +static HRESULT WINAPI InputProcessorProfiles_ActivateLanguageProfile( + ITfInputProcessorProfiles *iface, REFCLSID rclsid, LANGID langid, + REFGUID guidProfiles) +{ + InputProcessorProfiles *This = (InputProcessorProfiles*)iface; + FIXME("STUB:(%p)\n",This); + return E_NOTIMPL; +} + +static HRESULT WINAPI InputProcessorProfiles_GetActiveLanguageProfile( + ITfInputProcessorProfiles *iface, REFCLSID rclsid, LANGID *plangid, + GUID *pguidProfile) +{ + InputProcessorProfiles *This = (InputProcessorProfiles*)iface; + FIXME("STUB:(%p)\n",This); + return E_NOTIMPL; +} + +static HRESULT WINAPI InputProcessorProfiles_GetLanguageProfileDescription( + ITfInputProcessorProfiles *iface, REFCLSID rclsid, LANGID langid, + REFGUID guidProfile, BSTR *pbstrProfile) +{ + InputProcessorProfiles *This = (InputProcessorProfiles*)iface; + FIXME("STUB:(%p)\n",This); + return E_NOTIMPL; +} + +static HRESULT WINAPI InputProcessorProfiles_GetCurrentLanguage( + ITfInputProcessorProfiles *iface, LANGID *plangid) +{ + InputProcessorProfiles *This = (InputProcessorProfiles*)iface; + TRACE("(%p) 0x%x\n",This,This->currentLanguage); + + if (!plangid) + return E_INVALIDARG; + + *plangid = This->currentLanguage; + + return S_OK; +} + +static HRESULT WINAPI InputProcessorProfiles_ChangeCurrentLanguage( + ITfInputProcessorProfiles *iface, LANGID langid) +{ + InputProcessorProfiles *This = (InputProcessorProfiles*)iface; + FIXME("STUB:(%p)\n",This); + return E_NOTIMPL; +} + +static HRESULT WINAPI InputProcessorProfiles_GetLanguageList( + ITfInputProcessorProfiles *iface, LANGID **ppLangId, ULONG *pulCount) +{ + InputProcessorProfiles *This = (InputProcessorProfiles*)iface; + FIXME("STUB:(%p)\n",This); + return E_NOTIMPL; +} + +static HRESULT WINAPI InputProcessorProfiles_EnumLanguageProfiles( + ITfInputProcessorProfiles *iface, LANGID langid, + IEnumTfLanguageProfiles **ppEnum) +{ + InputProcessorProfiles *This = (InputProcessorProfiles*)iface; + FIXME("STUB:(%p)\n",This); + return E_NOTIMPL; +} + +static HRESULT WINAPI InputProcessorProfiles_EnableLanguageProfile( + ITfInputProcessorProfiles *iface, REFCLSID rclsid, LANGID langid, + REFGUID guidProfile, BOOL fEnable) +{ + InputProcessorProfiles *This = (InputProcessorProfiles*)iface; + FIXME("STUB:(%p)\n",This); + return E_NOTIMPL; +} + +static HRESULT WINAPI InputProcessorProfiles_IsEnabledLanguageProfile( + ITfInputProcessorProfiles *iface, REFCLSID rclsid, LANGID langid, + REFGUID guidProfile, BOOL *pfEnable) +{ + InputProcessorProfiles *This = (InputProcessorProfiles*)iface; + FIXME("STUB:(%p)\n",This); + return E_NOTIMPL; +} + +static HRESULT WINAPI InputProcessorProfiles_EnableLanguageProfileByDefault( + ITfInputProcessorProfiles *iface, REFCLSID rclsid, LANGID langid, + REFGUID guidProfile, BOOL fEnable) +{ + InputProcessorProfiles *This = (InputProcessorProfiles*)iface; + FIXME("STUB:(%p)\n",This); + return E_NOTIMPL; +} + +static HRESULT WINAPI InputProcessorProfiles_SubstituteKeyboardLayout( + ITfInputProcessorProfiles *iface, REFCLSID rclsid, LANGID langid, + REFGUID guidProfile, HKL hKL) +{ + InputProcessorProfiles *This = (InputProcessorProfiles*)iface; + FIXME("STUB:(%p)\n",This); + return E_NOTIMPL; +} + + +static const ITfInputProcessorProfilesVtbl InputProcessorProfiles_InputProcessorProfilesVtbl = +{ + InputProcessorProfiles_QueryInterface, + InputProcessorProfiles_AddRef, + InputProcessorProfiles_Release, + + InputProcessorProfiles_Register, + InputProcessorProfiles_Unregister, + InputProcessorProfiles_AddLanguageProfile, + InputProcessorProfiles_RemoveLanguageProfile, + InputProcessorProfiles_EnumInputProcessorInfo, + InputProcessorProfiles_GetDefaultLanguageProfile, + InputProcessorProfiles_SetDefaultLanguageProfile, + InputProcessorProfiles_ActivateLanguageProfile, + InputProcessorProfiles_GetActiveLanguageProfile, + InputProcessorProfiles_GetLanguageProfileDescription, + InputProcessorProfiles_GetCurrentLanguage, + InputProcessorProfiles_ChangeCurrentLanguage, + InputProcessorProfiles_GetLanguageList, + InputProcessorProfiles_EnumLanguageProfiles, + InputProcessorProfiles_EnableLanguageProfile, + InputProcessorProfiles_IsEnabledLanguageProfile, + InputProcessorProfiles_EnableLanguageProfileByDefault, + InputProcessorProfiles_SubstituteKeyboardLayout +}; + +HRESULT InputProcessorProfiles_Constructor(IUnknown *pUnkOuter, IUnknown **ppOut) +{ + InputProcessorProfiles *This; + if (pUnkOuter) + return CLASS_E_NOAGGREGATION; + + This = HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,sizeof(InputProcessorProfiles)); + if (This == NULL) + return E_OUTOFMEMORY; + + This->InputProcessorProfilesVtbl= &InputProcessorProfiles_InputProcessorProfilesVtbl; + This->refCount = 1; + This->currentLanguage = GetUserDefaultLCID(); + + TRACE("returning %p\n", This); + *ppOut = (IUnknown *)This; + return S_OK; +} diff --git a/dlls/msctf/msctf.c b/dlls/msctf/msctf.c index 254444bacb7..78b2bc347ab 100644 --- a/dlls/msctf/msctf.c +++ b/dlls/msctf/msctf.c @@ -43,6 +43,10 @@ static LONG MSCTF_refCount; static HINSTANCE MSCTF_hinstance; +DWORD tlsIndex = 0; + +const WCHAR szwSystemTIPKey[] = {'S','O','F','T','W','A','R','E','\\','M','i','c','r','o','s','o','f','t','\\','C','T','F','\\','T','I','P',0}; + typedef HRESULT (*LPFNCONSTRUCTOR)(IUnknown *pUnkOuter, IUnknown **ppvOut); static const struct { @@ -50,6 +54,8 @@ static const struct { LPFNCONSTRUCTOR ctor; } ClassesTable[] = { {&CLSID_TF_ThreadMgr, ThreadMgr_Constructor}, + {&CLSID_TF_InputProcessorProfiles, InputProcessorProfiles_Constructor}, + {&CLSID_TF_CategoryMgr, CategoryMgr_Constructor}, {NULL, NULL} }; @@ -159,8 +165,11 @@ BOOL WINAPI DllMain(HINSTANCE hinst, DWORD fdwReason, LPVOID fImpLoad) case DLL_WINE_PREATTACH: return FALSE; /* prefer native version */ case DLL_PROCESS_ATTACH: - DisableThreadLibraryCalls(hinst); MSCTF_hinstance = hinst; + tlsIndex = TlsAlloc(); + break; + case DLL_PROCESS_DETACH: + TlsFree(tlsIndex); break; } return TRUE; @@ -192,3 +201,26 @@ HRESULT WINAPI DllGetClassObject(REFCLSID clsid, REFIID iid, LPVOID *ppvOut) FIXME("CLSID %s not supported\n", debugstr_guid(clsid)); return CLASS_E_CLASSNOTAVAILABLE; } + +/*********************************************************************** + * TF_CreateThreadMgr (MSCTF.@) + */ +HRESULT WINAPI TF_CreateThreadMgr(ITfThreadMgr **pptim) +{ + TRACE("\n"); + return ThreadMgr_Constructor(NULL,(IUnknown**)pptim); +} + +/*********************************************************************** + * TF_GetThreadMgr (MSCTF.@) + */ +HRESULT WINAPI TF_GetThreadMgr(ITfThreadMgr **pptim) +{ + TRACE("\n"); + *pptim = (ITfThreadMgr*)TlsGetValue(tlsIndex); + + if (*pptim) + ITfThreadMgr_AddRef(*pptim); + + return S_OK; +} diff --git a/dlls/msctf/msctf.spec b/dlls/msctf/msctf.spec index 24cb4a33387..faa90194550 100644 --- a/dlls/msctf/msctf.spec +++ b/dlls/msctf/msctf.spec @@ -5,3 +5,30 @@ @ stub SetInputScope @ stub SetInputScopeXML @ stub SetInputScopes +@ stub TF_CUASAppFix +@ stub TF_CheckThreadInputIdle +@ stub TF_ClearLangBarAddIns +@ stub TF_CreateCategoryMgr +@ stub TF_CreateCicLoadMutex +@ stub TF_CreateDisplayAttributeMgr +@ stub TF_CreateInputProcessorProfiles +@ stub TF_CreateLangBarItemMgr +@ stub TF_CreateLangBarMgr +@ stdcall TF_CreateThreadMgr(ptr) +@ stub TF_DllDetachInOther +@ stub TF_GetGlobalCompartment +@ stub TF_GetInputScope +@ stub TF_GetLangIcon +@ stub TF_GetMlngHKL +@ stub TF_GetMlngIconIndex +@ stub TF_GetThreadFlags +@ stdcall TF_GetThreadMgr(ptr) +@ stub TF_InatExtractIcon +@ stub TF_InitMlngInfo +@ stub TF_InitSystem +@ stub TF_InvalidAssemblyListCache +@ stub TF_InvalidAssemblyListCacheIfExist +@ stub TF_IsCtfmonRunning +@ stub TF_IsInMarshaling +@ stub TF_MlngInfoCount +@ stub TF_RunInputCPL diff --git a/dlls/msctf/msctf_internal.h b/dlls/msctf/msctf_internal.h index b8fd3ba7d21..4d83aa392bd 100644 --- a/dlls/msctf/msctf_internal.h +++ b/dlls/msctf/msctf_internal.h @@ -20,7 +20,13 @@ #ifndef __WINE_MSCTF_I_H #define __WINE_MSCTF_I_H +extern DWORD tlsIndex; extern HRESULT ThreadMgr_Constructor(IUnknown *pUnkOuter, IUnknown **ppOut); +extern HRESULT DocumentMgr_Constructor(ITfDocumentMgr **ppOut); +extern HRESULT Context_Constructor(TfClientId tidOwner, IUnknown *punk, ITfContext **ppOut, TfEditCookie *pecTextStore); +extern HRESULT InputProcessorProfiles_Constructor(IUnknown *pUnkOuter, IUnknown **ppOut); +extern HRESULT CategoryMgr_Constructor(IUnknown *pUnkOuter, IUnknown **ppOut); +extern const WCHAR szwSystemTIPKey[]; #endif /* __WINE_MSCTF_I_H */ diff --git a/dlls/msctf/regsvr.c b/dlls/msctf/regsvr.c index c461cd8b418..a47d984296f 100644 --- a/dlls/msctf/regsvr.c +++ b/dlls/msctf/regsvr.c @@ -448,6 +448,20 @@ static struct regsvr_coclass const coclass_list[] = { "msctf.dll", "Apartment" }, + { + &CLSID_TF_InputProcessorProfiles, + "TF_InputProcessorProfiles", + NULL, + "msctf.dll", + "Apartment" + }, + { + &CLSID_TF_CategoryMgr, + "TF_CategoryMgr", + NULL, + "msctf.dll", + "Apartment" + }, { NULL } /* list terminator */ }; diff --git a/dlls/msctf/threadmgr.c b/dlls/msctf/threadmgr.c index 18675708cb8..76c1fd61afd 100644 --- a/dlls/msctf/threadmgr.c +++ b/dlls/msctf/threadmgr.c @@ -42,12 +42,23 @@ WINE_DEFAULT_DEBUG_CHANNEL(msctf); typedef struct tagACLMulti { const ITfThreadMgrVtbl *ThreadMgrVtbl; + const ITfSourceVtbl *SourceVtbl; LONG refCount; + + ITfDocumentMgr *focus; } ThreadMgr; +static inline ThreadMgr *impl_from_ITfSourceVtbl(ITfSource *iface) +{ + return (ThreadMgr *)((char *)iface - FIELD_OFFSET(ThreadMgr,SourceVtbl)); +} + static void ThreadMgr_Destructor(ThreadMgr *This) { + TlsSetValue(tlsIndex,NULL); TRACE("destroying %p\n", This); + if (This->focus) + ITfDocumentMgr_Release(This->focus); HeapFree(GetProcessHeap(),0,This); } @@ -60,6 +71,10 @@ static HRESULT WINAPI ThreadMgr_QueryInterface(ITfThreadMgr *iface, REFIID iid, { *ppvOut = This; } + else if (IsEqualIID(iid, &IID_ITfSource)) + { + *ppvOut = &This->SourceVtbl; + } if (*ppvOut) { @@ -109,9 +124,8 @@ static HRESULT WINAPI ThreadMgr_fnDeactivate( ITfThreadMgr* iface) static HRESULT WINAPI ThreadMgr_CreateDocumentMgr( ITfThreadMgr* iface, ITfDocumentMgr **ppdim) { - ThreadMgr *This = (ThreadMgr *)iface; - FIXME("STUB:(%p)\n",This); - return E_NOTIMPL; + TRACE("(%p)\n",iface); + return DocumentMgr_Constructor(ppdim); } static HRESULT WINAPI ThreadMgr_EnumDocumentMgrs( ITfThreadMgr* iface, IEnumTfDocumentMgrs @@ -126,15 +140,38 @@ static HRESULT WINAPI ThreadMgr_GetFocus( ITfThreadMgr* iface, ITfDocumentMgr **ppdimFocus) { ThreadMgr *This = (ThreadMgr *)iface; - FIXME("STUB:(%p)\n",This); - return E_NOTIMPL; + TRACE("(%p)\n",This); + + if (!ppdimFocus) + return E_INVALIDARG; + + *ppdimFocus = This->focus; + + TRACE("->%p\n",This->focus); + + if (This->focus == NULL) + return S_FALSE; + + ITfDocumentMgr_AddRef(This->focus); + + return S_OK; } static HRESULT WINAPI ThreadMgr_SetFocus( ITfThreadMgr* iface, ITfDocumentMgr *pdimFocus) { + ITfDocumentMgr *check; ThreadMgr *This = (ThreadMgr *)iface; - FIXME("STUB:(%p)\n",This); - return E_NOTIMPL; + + TRACE("(%p) %p\n",This,pdimFocus); + + if (!pdimFocus || FAILED(IUnknown_QueryInterface(pdimFocus,&IID_ITfDocumentMgr,(LPVOID*) &check))) + return E_INVALIDARG; + + if (This->focus) + ITfDocumentMgr_Release(This->focus); + + This->focus = check; + return S_OK; } static HRESULT WINAPI ThreadMgr_AssociateFocus( ITfThreadMgr* iface, HWND hwnd, @@ -195,18 +232,76 @@ static const ITfThreadMgrVtbl ThreadMgr_ThreadMgrVtbl = ThreadMgr_GetGlobalCompartment }; + +static HRESULT WINAPI Source_QueryInterface(ITfSource *iface, REFIID iid, LPVOID *ppvOut) +{ + ThreadMgr *This = impl_from_ITfSourceVtbl(iface); + return ThreadMgr_QueryInterface((ITfThreadMgr *)This, iid, *ppvOut); +} + +static ULONG WINAPI Source_AddRef(ITfSource *iface) +{ + ThreadMgr *This = impl_from_ITfSourceVtbl(iface); + return ThreadMgr_AddRef((ITfThreadMgr*)This); +} + +static ULONG WINAPI Source_Release(ITfSource *iface) +{ + ThreadMgr *This = impl_from_ITfSourceVtbl(iface); + return ThreadMgr_Release((ITfThreadMgr *)This); +} + +/***************************************************** + * ITfSource functions + *****************************************************/ +static WINAPI HRESULT ThreadMgrSource_AdviseSink(ITfSource *iface, + REFIID riid, IUnknown *punk, DWORD *pdwCookie) +{ + ThreadMgr *This = impl_from_ITfSourceVtbl(iface); + FIXME("STUB:(%p)\n",This); + return E_NOTIMPL; +} + +static WINAPI HRESULT ThreadMgrSource_UnadviseSink(ITfSource *iface, DWORD pdwCookie) +{ + ThreadMgr *This = impl_from_ITfSourceVtbl(iface); + FIXME("STUB:(%p)\n",This); + return E_NOTIMPL; +} + +static const ITfSourceVtbl ThreadMgr_SourceVtbl = +{ + Source_QueryInterface, + Source_AddRef, + Source_Release, + + ThreadMgrSource_AdviseSink, + ThreadMgrSource_UnadviseSink, +}; + HRESULT ThreadMgr_Constructor(IUnknown *pUnkOuter, IUnknown **ppOut) { ThreadMgr *This; if (pUnkOuter) return CLASS_E_NOAGGREGATION; + /* Only 1 ThreadMgr is created per thread */ + This = TlsGetValue(tlsIndex); + if (This) + { + ThreadMgr_AddRef((ITfThreadMgr*)This); + *ppOut = (IUnknown*)This; + return S_OK; + } + This = HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,sizeof(ThreadMgr)); if (This == NULL) return E_OUTOFMEMORY; This->ThreadMgrVtbl= &ThreadMgr_ThreadMgrVtbl; + This->SourceVtbl = &ThreadMgr_SourceVtbl; This->refCount = 1; + TlsSetValue(tlsIndex,This); TRACE("returning %p\n", This); *ppOut = (IUnknown *)This; diff --git a/dlls/mshtml/Makefile.in b/dlls/mshtml/Makefile.in index 9d326ff0286..241ec9d22ed 100644 --- a/dlls/mshtml/Makefile.in +++ b/dlls/mshtml/Makefile.in @@ -35,6 +35,7 @@ C_SRCS = \ htmlselect.c \ htmlstyle.c \ htmlstyle2.c \ + htmlstyle3.c \ htmlstylesheet.c \ htmltable.c \ htmltablerow.c \ diff --git a/dlls/mshtml/editor.c b/dlls/mshtml/editor.c index 7cbdf2e46d9..e92cf96e834 100644 --- a/dlls/mshtml/editor.c +++ b/dlls/mshtml/editor.c @@ -588,7 +588,7 @@ static HRESULT exec_fontname(HTMLDocument *This, DWORD cmdexecopt, VARIANT *in, len = MultiByteToWideChar(CP_ACP, 0, stra, -1, NULL, 0); strw = heap_alloc(len*sizeof(WCHAR)); - MultiByteToWideChar(CP_ACP, 0, stra, -1, strw, -1); + MultiByteToWideChar(CP_ACP, 0, stra, -1, strw, len); nsfree(stra); V_BSTR(out) = SysAllocString(strw); diff --git a/dlls/mshtml/htmlstyle.c b/dlls/mshtml/htmlstyle.c index f252c703648..ad9d09532ec 100644 --- a/dlls/mshtml/htmlstyle.c +++ b/dlls/mshtml/htmlstyle.c @@ -468,6 +468,12 @@ static HRESULT WINAPI HTMLStyle_QueryInterface(IHTMLStyle *iface, REFIID riid, v }else if(IsEqualGUID(&IID_IHTMLStyle2, riid)) { TRACE("(%p)->(IID_IHTMLStyle2 %p)\n", This, ppv); *ppv = HTMLSTYLE2(This); + }else if(IsEqualGUID(&IID_IHTMLStyle3, riid)) { + TRACE("(%p)->(IID_IHTMLStyle3 %p)\n", This, ppv); + *ppv = HTMLSTYLE3(This); + }else if(IsEqualGUID(&IID_IHTMLStyle4, riid)) { + TRACE("(%p)->(IID_IHTMLStyle4 %p)\n", This, ppv); + *ppv = HTMLSTYLE4(This); }else if(dispex_query_interface(&This->dispex, riid, ppv)) { return *ppv ? S_OK : E_NOINTERFACE; } @@ -2425,6 +2431,7 @@ IHTMLStyle *HTMLStyle_Create(nsIDOMCSSStyleDeclaration *nsstyle) ret->ref = 1; ret->nsstyle = nsstyle; HTMLStyle2_Init(ret); + HTMLStyle3_Init(ret); nsIDOMCSSStyleDeclaration_AddRef(nsstyle); diff --git a/dlls/mshtml/htmlstyle.h b/dlls/mshtml/htmlstyle.h index b5433803cf7..a9ff53566e0 100644 --- a/dlls/mshtml/htmlstyle.h +++ b/dlls/mshtml/htmlstyle.h @@ -20,6 +20,8 @@ struct HTMLStyle { DispatchEx dispex; const IHTMLStyleVtbl *lpHTMLStyleVtbl; const IHTMLStyle2Vtbl *lpHTMLStyle2Vtbl; + const IHTMLStyle3Vtbl *lpHTMLStyle3Vtbl; + const IHTMLStyle4Vtbl *lpHTMLStyle4Vtbl; LONG ref; @@ -28,6 +30,8 @@ struct HTMLStyle { #define HTMLSTYLE(x) ((IHTMLStyle*) &(x)->lpHTMLStyleVtbl) #define HTMLSTYLE2(x) ((IHTMLStyle2*) &(x)->lpHTMLStyle2Vtbl) +#define HTMLSTYLE3(x) ((IHTMLStyle3*) &(x)->lpHTMLStyle3Vtbl) +#define HTMLSTYLE4(x) ((IHTMLStyle4*) &(x)->lpHTMLStyle4Vtbl) /* NOTE: Make sure to keep in sync with style_tbl in htmlstyle.c */ typedef enum { @@ -68,6 +72,7 @@ typedef enum { } styleid_t; void HTMLStyle2_Init(HTMLStyle*); +void HTMLStyle3_Init(HTMLStyle*); HRESULT get_nsstyle_attr(nsIDOMCSSStyleDeclaration*,styleid_t,BSTR*); HRESULT set_nsstyle_attr(nsIDOMCSSStyleDeclaration*,styleid_t,LPCWSTR,DWORD); diff --git a/dlls/mshtml/htmlstyle3.c b/dlls/mshtml/htmlstyle3.c new file mode 100644 index 00000000000..f5ed8b523c3 --- /dev/null +++ b/dlls/mshtml/htmlstyle3.c @@ -0,0 +1,441 @@ +/* + * Copyright 2009 Alistair Leslie-Hughes + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA + */ + +#include + +#define COBJMACROS + +#include "windef.h" +#include "winbase.h" +#include "winuser.h" +#include "ole2.h" + +#include "mshtml_private.h" +#include "htmlstyle.h" + +#include "wine/debug.h" +#include "wine/unicode.h" + +WINE_DEFAULT_DEBUG_CHANNEL(mshtml); + +#define HTMLSTYLE3_THIS(iface) DEFINE_THIS(HTMLStyle, HTMLStyle3, iface) + +static HRESULT WINAPI HTMLStyle3_QueryInterface(IHTMLStyle3 *iface, REFIID riid, void **ppv) +{ + HTMLStyle *This = HTMLSTYLE3_THIS(iface); + + return IHTMLStyle_QueryInterface(HTMLSTYLE(This), riid, ppv); +} + +static ULONG WINAPI HTMLStyle3_AddRef(IHTMLStyle3 *iface) +{ + HTMLStyle *This = HTMLSTYLE3_THIS(iface); + + return IHTMLStyle_AddRef(HTMLSTYLE(This)); +} + +static ULONG WINAPI HTMLStyle3_Release(IHTMLStyle3 *iface) +{ + HTMLStyle *This = HTMLSTYLE3_THIS(iface); + + return IHTMLStyle_Release(HTMLSTYLE(This)); +} + +static HRESULT WINAPI HTMLStyle3_GetTypeInfoCount(IHTMLStyle3 *iface, UINT *pctinfo) +{ + HTMLStyle *This = HTMLSTYLE3_THIS(iface); + return IDispatchEx_GetTypeInfoCount(DISPATCHEX(&This->dispex), pctinfo); +} + +static HRESULT WINAPI HTMLStyle3_GetTypeInfo(IHTMLStyle3 *iface, UINT iTInfo, + LCID lcid, ITypeInfo **ppTInfo) +{ + HTMLStyle *This = HTMLSTYLE3_THIS(iface); + return IDispatchEx_GetTypeInfo(DISPATCHEX(&This->dispex), iTInfo, lcid, ppTInfo); +} + +static HRESULT WINAPI HTMLStyle3_GetIDsOfNames(IHTMLStyle3 *iface, REFIID riid, + LPOLESTR *rgszNames, UINT cNames, + LCID lcid, DISPID *rgDispId) +{ + HTMLStyle *This = HTMLSTYLE3_THIS(iface); + return IDispatchEx_GetIDsOfNames(DISPATCHEX(&This->dispex), riid, rgszNames, cNames, lcid, rgDispId); +} + +static HRESULT WINAPI HTMLStyle3_Invoke(IHTMLStyle3 *iface, DISPID dispIdMember, + REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS *pDispParams, + VARIANT *pVarResult, EXCEPINFO *pExcepInfo, UINT *puArgErr) +{ + HTMLStyle *This = HTMLSTYLE3_THIS(iface); + return IDispatchEx_Invoke(DISPATCHEX(&This->dispex), dispIdMember, riid, lcid, + wFlags, pDispParams, pVarResult, pExcepInfo, puArgErr); +} + +static HRESULT WINAPI HTMLStyle3_put_layoutFlow(IHTMLStyle3 *iface, BSTR v) +{ + HTMLStyle *This = HTMLSTYLE3_THIS(iface); + FIXME("(%p)->(%s)\n", This, debugstr_w(v)); + return E_NOTIMPL; +} + +static HRESULT WINAPI HTMLStyle3_get_layoutFlow(IHTMLStyle3 *iface, BSTR *p) +{ + HTMLStyle *This = HTMLSTYLE3_THIS(iface); + FIXME("(%p)->(%p)\n", This, p); + return E_NOTIMPL; +} + +static HRESULT WINAPI HTMLStyle3_put_zoom(IHTMLStyle3 *iface, VARIANT v) +{ + HTMLStyle *This = HTMLSTYLE3_THIS(iface); + FIXME("(%p)->(%s)\n", This, debugstr_variant(&v)); + return E_NOTIMPL; +} + +static HRESULT WINAPI HTMLStyle3_get_zoom(IHTMLStyle3 *iface, VARIANT *p) +{ + HTMLStyle *This = HTMLSTYLE3_THIS(iface); + FIXME("(%p)->(%p)\n", This, p); + return E_NOTIMPL; +} + +static HRESULT WINAPI HTMLStyle3_put_wordWrap(IHTMLStyle3 *iface, BSTR v) +{ + HTMLStyle *This = HTMLSTYLE3_THIS(iface); + FIXME("(%p)->(%s)\n", This, debugstr_w(v)); + return E_NOTIMPL; +} + +static HRESULT WINAPI HTMLStyle3_get_wordWrap(IHTMLStyle3 *iface, BSTR *p) +{ + HTMLStyle *This = HTMLSTYLE3_THIS(iface); + FIXME("(%p)->(%p)\n", This, p); + return E_NOTIMPL; +} + +static HRESULT WINAPI HTMLStyle3_put_textUnderlinePosition(IHTMLStyle3 *iface, BSTR v) +{ + HTMLStyle *This = HTMLSTYLE3_THIS(iface); + FIXME("(%p)->(%s)\n", This, debugstr_w(v)); + return E_NOTIMPL; +} + +static HRESULT WINAPI HTMLStyle3_get_textUnderlinePosition(IHTMLStyle3 *iface, BSTR *p) +{ + HTMLStyle *This = HTMLSTYLE3_THIS(iface); + FIXME("(%p)->(%p)\n", This, p); + return E_NOTIMPL; +} + +static HRESULT WINAPI HTMLStyle3_put_scrollbarBaseColor(IHTMLStyle3 *iface, VARIANT v) +{ + HTMLStyle *This = HTMLSTYLE3_THIS(iface); + FIXME("(%p)->(%s)\n", This, debugstr_variant(&v)); + return E_NOTIMPL; +} + +static HRESULT WINAPI HTMLStyle3_get_scrollbarBaseColor(IHTMLStyle3 *iface, VARIANT *p) +{ + HTMLStyle *This = HTMLSTYLE3_THIS(iface); + FIXME("(%p)->(%p)\n", This, p); + return E_NOTIMPL; +} + +static HRESULT WINAPI HTMLStyle3_put_scrollbarFaceColor(IHTMLStyle3 *iface, VARIANT v) +{ + HTMLStyle *This = HTMLSTYLE3_THIS(iface); + FIXME("(%p)->(%s)\n", This, debugstr_variant(&v)); + return E_NOTIMPL; +} + +static HRESULT WINAPI HTMLStyle3_get_scrollbarFaceColor(IHTMLStyle3 *iface, VARIANT *p) +{ + HTMLStyle *This = HTMLSTYLE3_THIS(iface); + FIXME("(%p)->(%p)\n", This, p); + return E_NOTIMPL; +} + +static HRESULT WINAPI HTMLStyle3_put_scrollbar3dLightColor(IHTMLStyle3 *iface, VARIANT v) +{ + HTMLStyle *This = HTMLSTYLE3_THIS(iface); + FIXME("(%p)->(%s)\n", This, debugstr_variant(&v)); + return E_NOTIMPL; +} + +static HRESULT WINAPI HTMLStyle3_get_scrollbar3dLightColor(IHTMLStyle3 *iface, VARIANT *p) +{ + HTMLStyle *This = HTMLSTYLE3_THIS(iface); + FIXME("(%p)->(%p)\n", This, p); + return E_NOTIMPL; +} + +static HRESULT WINAPI HTMLStyle3_put_scrollbarShadowColor(IHTMLStyle3 *iface, VARIANT v) +{ + HTMLStyle *This = HTMLSTYLE3_THIS(iface); + FIXME("(%p)->(%s)\n", This, debugstr_variant(&v)); + return E_NOTIMPL; +} + +static HRESULT WINAPI HTMLStyle3_get_scrollbarShadowColor(IHTMLStyle3 *iface, VARIANT *p) +{ + HTMLStyle *This = HTMLSTYLE3_THIS(iface); + FIXME("(%p)->(%p)\n", This, p); + return E_NOTIMPL; +} + +static HRESULT WINAPI HTMLStyle3_put_scrollbarHighlightColor(IHTMLStyle3 *iface, VARIANT v) +{ + HTMLStyle *This = HTMLSTYLE3_THIS(iface); + FIXME("(%p)->(%s)\n", This, debugstr_variant(&v)); + return E_NOTIMPL; +} + +static HRESULT WINAPI HTMLStyle3_get_scrollbarHighlightColor(IHTMLStyle3 *iface, VARIANT *p) +{ + HTMLStyle *This = HTMLSTYLE3_THIS(iface); + FIXME("(%p)->(%p)\n", This, p); + return E_NOTIMPL; +} + +static HRESULT WINAPI HTMLStyle3_put_scrollbarDarkShadowColor(IHTMLStyle3 *iface, VARIANT v) +{ + HTMLStyle *This = HTMLSTYLE3_THIS(iface); + FIXME("(%p)->(%s)\n", This, debugstr_variant(&v)); + return E_NOTIMPL; +} + +static HRESULT WINAPI HTMLStyle3_get_scrollbarDarkShadowColor(IHTMLStyle3 *iface, VARIANT *p) +{ + HTMLStyle *This = HTMLSTYLE3_THIS(iface); + FIXME("(%p)->(%p)\n", This, p); + return E_NOTIMPL; +} + +static HRESULT WINAPI HTMLStyle3_put_scrollbarArrowColor(IHTMLStyle3 *iface, VARIANT v) +{ + HTMLStyle *This = HTMLSTYLE3_THIS(iface); + FIXME("(%p)->(%s)\n", This, debugstr_variant(&v)); + return E_NOTIMPL; +} + +static HRESULT WINAPI HTMLStyle3_get_scrollbarArrowColor(IHTMLStyle3 *iface, VARIANT *p) +{ + HTMLStyle *This = HTMLSTYLE3_THIS(iface); + FIXME("(%p)->(%p)\n", This, p); + return E_NOTIMPL; +} + +static HRESULT WINAPI HTMLStyle3_put_scrollbarTrackColor(IHTMLStyle3 *iface, VARIANT v) +{ + HTMLStyle *This = HTMLSTYLE3_THIS(iface); + FIXME("(%p)->(%s)\n", This, debugstr_variant(&v)); + return E_NOTIMPL; +} + +static HRESULT WINAPI HTMLStyle3_get_scrollbarTrackColor(IHTMLStyle3 *iface, VARIANT *p) +{ + HTMLStyle *This = HTMLSTYLE3_THIS(iface); + FIXME("(%p)->(%p)\n", This, p); + return E_NOTIMPL; +} + +static HRESULT WINAPI HTMLStyle3_put_writingMode(IHTMLStyle3 *iface, BSTR v) +{ + HTMLStyle *This = HTMLSTYLE3_THIS(iface); + FIXME("(%p)->(%s)\n", This, debugstr_w(v)); + return E_NOTIMPL; +} + +static HRESULT WINAPI HTMLStyle3_get_writingMode(IHTMLStyle3 *iface, BSTR *p) +{ + HTMLStyle *This = HTMLSTYLE3_THIS(iface); + FIXME("(%p)->(%p)\n", This, p); + return E_NOTIMPL; +} + +static HRESULT WINAPI HTMLStyle3_put_textAlignLast(IHTMLStyle3 *iface, BSTR v) +{ + HTMLStyle *This = HTMLSTYLE3_THIS(iface); + FIXME("(%p)->(%s)\n", This, debugstr_w(v)); + return E_NOTIMPL; +} + +static HRESULT WINAPI HTMLStyle3_get_textAlignLast(IHTMLStyle3 *iface, BSTR *p) +{ + HTMLStyle *This = HTMLSTYLE3_THIS(iface); + FIXME("(%p)->(%p)\n", This, p); + return E_NOTIMPL; +} + +static HRESULT WINAPI HTMLStyle3_put_textKashidaSpace(IHTMLStyle3 *iface, VARIANT v) +{ + HTMLStyle *This = HTMLSTYLE3_THIS(iface); + FIXME("(%p)->(%s)\n", This, debugstr_variant(&v)); + return E_NOTIMPL; +} + +static HRESULT WINAPI HTMLStyle3_get_textKashidaSpace(IHTMLStyle3 *iface, VARIANT *p) +{ + HTMLStyle *This = HTMLSTYLE3_THIS(iface); + FIXME("(%p)->(%p)\n", This, p); + return E_NOTIMPL; +} + +static const IHTMLStyle3Vtbl HTMLStyle3Vtbl = { + HTMLStyle3_QueryInterface, + HTMLStyle3_AddRef, + HTMLStyle3_Release, + HTMLStyle3_GetTypeInfoCount, + HTMLStyle3_GetTypeInfo, + HTMLStyle3_GetIDsOfNames, + HTMLStyle3_Invoke, + HTMLStyle3_put_layoutFlow, + HTMLStyle3_get_layoutFlow, + HTMLStyle3_put_zoom, + HTMLStyle3_get_zoom, + HTMLStyle3_put_wordWrap, + HTMLStyle3_get_wordWrap, + HTMLStyle3_put_textUnderlinePosition, + HTMLStyle3_get_textUnderlinePosition, + HTMLStyle3_put_scrollbarBaseColor, + HTMLStyle3_get_scrollbarBaseColor, + HTMLStyle3_put_scrollbarFaceColor, + HTMLStyle3_get_scrollbarFaceColor, + HTMLStyle3_put_scrollbar3dLightColor, + HTMLStyle3_get_scrollbar3dLightColor, + HTMLStyle3_put_scrollbarShadowColor, + HTMLStyle3_get_scrollbarShadowColor, + HTMLStyle3_put_scrollbarHighlightColor, + HTMLStyle3_get_scrollbarHighlightColor, + HTMLStyle3_put_scrollbarDarkShadowColor, + HTMLStyle3_get_scrollbarDarkShadowColor, + HTMLStyle3_put_scrollbarArrowColor, + HTMLStyle3_get_scrollbarArrowColor, + HTMLStyle3_put_scrollbarTrackColor, + HTMLStyle3_get_scrollbarTrackColor, + HTMLStyle3_put_writingMode, + HTMLStyle3_get_writingMode, + HTMLStyle3_put_textAlignLast, + HTMLStyle3_get_textAlignLast, + HTMLStyle3_put_textKashidaSpace, + HTMLStyle3_get_textKashidaSpace +}; + +/* + * IHTMLStyle4 Interface + */ +#define HTMLSTYLE4_THIS(iface) DEFINE_THIS(HTMLStyle, HTMLStyle4, iface) + +static HRESULT WINAPI HTMLStyle4_QueryInterface(IHTMLStyle4 *iface, REFIID riid, void **ppv) +{ + HTMLStyle *This = HTMLSTYLE4_THIS(iface); + + return IHTMLStyle_QueryInterface(HTMLSTYLE(This), riid, ppv); +} + +static ULONG WINAPI HTMLStyle4_AddRef(IHTMLStyle4 *iface) +{ + HTMLStyle *This = HTMLSTYLE4_THIS(iface); + + return IHTMLStyle_AddRef(HTMLSTYLE(This)); +} + +static ULONG WINAPI HTMLStyle4_Release(IHTMLStyle4 *iface) +{ + HTMLStyle *This = HTMLSTYLE4_THIS(iface); + + return IHTMLStyle_Release(HTMLSTYLE(This)); +} + +static HRESULT WINAPI HTMLStyle4_GetTypeInfoCount(IHTMLStyle4 *iface, UINT *pctinfo) +{ + HTMLStyle *This = HTMLSTYLE4_THIS(iface); + return IDispatchEx_GetTypeInfoCount(DISPATCHEX(&This->dispex), pctinfo); +} + +static HRESULT WINAPI HTMLStyle4_GetTypeInfo(IHTMLStyle4 *iface, UINT iTInfo, + LCID lcid, ITypeInfo **ppTInfo) +{ + HTMLStyle *This = HTMLSTYLE4_THIS(iface); + return IDispatchEx_GetTypeInfo(DISPATCHEX(&This->dispex), iTInfo, lcid, ppTInfo); +} + +static HRESULT WINAPI HTMLStyle4_GetIDsOfNames(IHTMLStyle4 *iface, REFIID riid, + LPOLESTR *rgszNames, UINT cNames, + LCID lcid, DISPID *rgDispId) +{ + HTMLStyle *This = HTMLSTYLE4_THIS(iface); + return IDispatchEx_GetIDsOfNames(DISPATCHEX(&This->dispex), riid, rgszNames, cNames, lcid, rgDispId); +} + +static HRESULT WINAPI HTMLStyle4_Invoke(IHTMLStyle4 *iface, DISPID dispIdMember, + REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS *pDispParams, + VARIANT *pVarResult, EXCEPINFO *pExcepInfo, UINT *puArgErr) +{ + HTMLStyle *This = HTMLSTYLE4_THIS(iface); + return IDispatchEx_Invoke(DISPATCHEX(&This->dispex), dispIdMember, riid, lcid, + wFlags, pDispParams, pVarResult, pExcepInfo, puArgErr); +} + +static HRESULT WINAPI HTMLStyle4_put_textOverflow(IHTMLStyle4 *iface, BSTR v) +{ + HTMLStyle *This = HTMLSTYLE4_THIS(iface); + FIXME("(%p)->(%s)\n", This, debugstr_w(v)); + return E_NOTIMPL; +} + +static HRESULT WINAPI HTMLStyle4_get_textOverflow(IHTMLStyle4 *iface, BSTR *p) +{ + HTMLStyle *This = HTMLSTYLE4_THIS(iface); + FIXME("(%p)->(%p)\n", This, p); + return E_NOTIMPL; +} + +static HRESULT WINAPI HTMLStyle4_put_minHeight(IHTMLStyle4 *iface, VARIANT v) +{ + HTMLStyle *This = HTMLSTYLE4_THIS(iface); + FIXME("(%p)->(%s)\n", This, debugstr_variant(&v)); + return E_NOTIMPL; +} + +static HRESULT WINAPI HTMLStyle4_get_minHeight(IHTMLStyle4 *iface, VARIANT *p) +{ + HTMLStyle *This = HTMLSTYLE4_THIS(iface); + FIXME("(%p)->(%p)\n", This, p); + return E_NOTIMPL; +} + +static const IHTMLStyle4Vtbl HTMLStyle4Vtbl = { + HTMLStyle4_QueryInterface, + HTMLStyle4_AddRef, + HTMLStyle4_Release, + HTMLStyle4_GetTypeInfoCount, + HTMLStyle4_GetTypeInfo, + HTMLStyle4_GetIDsOfNames, + HTMLStyle4_Invoke, + HTMLStyle4_put_textOverflow, + HTMLStyle4_get_textOverflow, + HTMLStyle4_put_minHeight, + HTMLStyle4_get_minHeight +}; + +void HTMLStyle3_Init(HTMLStyle *This) +{ + This->lpHTMLStyle3Vtbl = &HTMLStyle3Vtbl; + This->lpHTMLStyle4Vtbl = &HTMLStyle4Vtbl; +} diff --git a/dlls/mshtml/htmlstylesheet.c b/dlls/mshtml/htmlstylesheet.c index adbe740db45..5be78b850f7 100644 --- a/dlls/mshtml/htmlstylesheet.c +++ b/dlls/mshtml/htmlstylesheet.c @@ -32,21 +32,21 @@ WINE_DEFAULT_DEBUG_CHANNEL(mshtml); -typedef struct { +struct HTMLStyleSheet { const IHTMLStyleSheetVtbl *lpHTMLStyleSheetVtbl; LONG ref; nsIDOMCSSStyleSheet *nsstylesheet; -} HTMLStyleSheet; +}; -typedef struct { +struct HTMLStyleSheetsCollection { const IHTMLStyleSheetsCollectionVtbl *lpHTMLStyleSheetsCollectionVtbl; LONG ref; nsIDOMStyleSheetList *nslist; -} HTMLStyleSheetsCollection; +}; typedef struct { const IHTMLStyleSheetRulesCollectionVtbl *lpHTMLStyleSheetRulesCollectionVtbl; diff --git a/dlls/mshtml/install.c b/dlls/mshtml/install.c index 605fa055cb1..df8c8be3cb5 100644 --- a/dlls/mshtml/install.c +++ b/dlls/mshtml/install.c @@ -193,18 +193,21 @@ static BOOL install_from_unix_file(const char *file_name) close(fd); - if(!wine_get_dos_file_name) { + if(!wine_get_dos_file_name) wine_get_dos_file_name = (void*)GetProcAddress(GetModuleHandleW(kernel32W), "wine_get_dos_file_name"); - if(!wine_get_dos_file_name) { - ERR("Could not get wine_get_dos_file_name function.\n"); - return FALSE; - } - } - dos_file_name = wine_get_dos_file_name(file_name); - if(!dos_file_name) { - ERR("Could not get dos file name of %s\n", debugstr_a(file_name)); - return FALSE; + if(wine_get_dos_file_name) { /* Wine UNIX mode */ + dos_file_name = wine_get_dos_file_name(file_name); + if(!dos_file_name) { + ERR("Could not get dos file name of %s\n", debugstr_a(file_name)); + return FALSE; + } + } else { /* Windows mode */ + UINT res; + WARN("Could not get wine_get_dos_file_name function, calling install_cab directly.\n"); + res = MultiByteToWideChar( CP_ACP, 0, file_name, -1, 0, 0); + dos_file_name = heap_alloc (res*sizeof(WCHAR)); + MultiByteToWideChar( CP_ACP, 0, file_name, -1, dos_file_name, res); } ret = install_cab(dos_file_name); @@ -383,10 +386,12 @@ static HRESULT WINAPI InstallCallback_OnDataAvailable(IBindStatusCallback *iface HRESULT hres; do { + DWORD written; + size = 0; hres = IStream_Read(str, buf, sizeof(buf), &size); if(size) - WriteFile(tmp_file, buf, size, NULL, NULL); + WriteFile(tmp_file, buf, size, &written, NULL); }while(hres == S_OK); return S_OK; @@ -442,7 +447,7 @@ static LPWSTR get_url(void) if(size > sizeof(httpW) && !memcmp(url, httpW, sizeof(httpW))) { strcatW(url, v_formatW); - MultiByteToWideChar(CP_ACP, 0, GECKO_VERSION, -1, url+strlenW(url), -1); + MultiByteToWideChar(CP_ACP, 0, GECKO_VERSION, -1, url+strlenW(url), (size-strlenW(url))/sizeof(WCHAR)); } TRACE("Got URL %s\n", debugstr_w(url)); diff --git a/dlls/mshtml/mshtml_private.h b/dlls/mshtml/mshtml_private.h index d884ca325a9..e4c98a72231 100644 --- a/dlls/mshtml/mshtml_private.h +++ b/dlls/mshtml/mshtml_private.h @@ -199,14 +199,14 @@ struct ConnectionPoint { ConnectionPoint *next; }; -typedef struct { +struct HTMLLocation { DispatchEx dispex; const IHTMLLocationVtbl *lpHTMLLocationVtbl; LONG ref; HTMLDocument *doc; -} HTMLLocation; +}; typedef struct { const IHTMLOptionElementFactoryVtbl *lpHTMLOptionElementFactoryVtbl; diff --git a/dlls/mshtml/mutation.c b/dlls/mshtml/mutation.c index 39948885c04..ea61d5ad94e 100644 --- a/dlls/mshtml/mutation.c +++ b/dlls/mshtml/mutation.c @@ -358,7 +358,7 @@ static nsresult NSAPI nsDocumentObserver_QueryInterface(nsIDocumentObserver *ifa if(IsEqualGUID(&IID_nsISupports, riid)) { TRACE("(%p)->(IID_nsISupports, %p)\n", This, result); - *result = NSWBCHROME(This); + *result = NSDOCOBS(This); }else if(IsEqualGUID(&IID_nsIMutationObserver, riid)) { TRACE("(%p)->(IID_nsIMutationObserver %p)\n", This, result); *result = NSDOCOBS(This); diff --git a/dlls/mshtml/navigate.c b/dlls/mshtml/navigate.c index 188cdd7ba00..6e41699b280 100644 --- a/dlls/mshtml/navigate.c +++ b/dlls/mshtml/navigate.c @@ -657,7 +657,7 @@ static void parse_post_data(nsIInputStream *post_data_stream, LPWSTR *headers_re else headers = heap_alloc((len+1)*sizeof(WCHAR)); - len = MultiByteToWideChar(CP_ACP, 0, ptr2, ptr-ptr2, headers+headers_len, -1); + len = MultiByteToWideChar(CP_ACP, 0, ptr2, ptr-ptr2, headers+headers_len, len); headers_len += len; ptr2 = ptr; diff --git a/dlls/mshtml/script.c b/dlls/mshtml/script.c index a3dfdedba1d..43373e4168b 100644 --- a/dlls/mshtml/script.c +++ b/dlls/mshtml/script.c @@ -119,7 +119,7 @@ static BOOL init_script_engine(ScriptHost *script_host) WARN("Could not get IActiveScriptProperty: %08x\n", hres); } - hres = IActiveScriptParse_InitNew(script_host->parse); + hres = IActiveScriptParse64_InitNew(script_host->parse); if(FAILED(hres)) { WARN("InitNew failed: %08x\n", hres); return FALSE; @@ -180,7 +180,7 @@ static void release_script_engine(ScriptHost *This) } if(This->parse) { - IActiveScriptParse_Release(This->parse); + IUnknown_Release(This->parse); This->parse = NULL; } } @@ -552,7 +552,7 @@ static void parse_text(ScriptHost *script_host, LPCWSTR text) VariantInit(&var); memset(&excepinfo, 0, sizeof(excepinfo)); - hres = IActiveScriptParse_ParseScriptText(script_host->parse, text, windowW, NULL, script_endW, + hres = IActiveScriptParse64_ParseScriptText(script_host->parse, text, windowW, NULL, script_endW, 0, 0, SCRIPTTEXT_ISVISIBLE|SCRIPTTEXT_HOSTMANAGESSOURCE, &var, &excepinfo); if(FAILED(hres)) diff --git a/dlls/mshtml/tests/dom.c b/dlls/mshtml/tests/dom.c index 36946808f89..62a07bcaffc 100644 --- a/dlls/mshtml/tests/dom.c +++ b/dlls/mshtml/tests/dom.c @@ -307,6 +307,8 @@ static const IID * const style_iids[] = { &IID_IDispatchEx, &IID_IHTMLStyle, &IID_IHTMLStyle2, + &IID_IHTMLStyle3, + &IID_IHTMLStyle4, NULL }; diff --git a/dlls/mshtml/tests/script.c b/dlls/mshtml/tests/script.c index 6178cdf3fc9..d6a5e5f050b 100644 --- a/dlls/mshtml/tests/script.c +++ b/dlls/mshtml/tests/script.c @@ -36,6 +36,18 @@ DEFINE_GUID(CLSID_IdentityUnmarshal,0x0000001b,0x0000,0x0000,0xc0,0x00,0x00,0x00,0x00,0x00,0x00,0x46); +#ifdef _WIN64 + +#define CTXARG_T DWORDLONG +#define IActiveScriptParseVtbl IActiveScriptParse64Vtbl + +#else + +#define CTXARG_T DWORD +#define IActiveScriptParseVtbl IActiveScriptParse32Vtbl + +#endif + #define DEFINE_EXPECT(func) \ static BOOL expect_ ## func = FALSE, called_ ## func = FALSE @@ -579,7 +591,7 @@ static HRESULT WINAPI ActiveScriptParse_InitNew(IActiveScriptParse *iface) static HRESULT WINAPI ActiveScriptParse_AddScriptlet(IActiveScriptParse *iface, LPCOLESTR pstrDefaultName, LPCOLESTR pstrCode, LPCOLESTR pstrItemName, LPCOLESTR pstrSubItemName, LPCOLESTR pstrEventName, LPCOLESTR pstrDelimiter, - DWORD dwSourceContextCookie, ULONG ulStartingLineNumber, DWORD dwFlags, + CTXARG_T dwSourceContextCookie, ULONG ulStartingLineNumber, DWORD dwFlags, BSTR *pbstrName, EXCEPINFO *pexcepinfo) { ok(0, "unexpected call\n"); @@ -588,7 +600,7 @@ static HRESULT WINAPI ActiveScriptParse_AddScriptlet(IActiveScriptParse *iface, static HRESULT WINAPI ActiveScriptParse_ParseScriptText(IActiveScriptParse *iface, LPCOLESTR pstrCode, LPCOLESTR pstrItemName, IUnknown *punkContext, - LPCOLESTR pstrDelimiter, DWORD dwSourceContextCookie, ULONG ulStartingLine, + LPCOLESTR pstrDelimiter, CTXARG_T dwSourceContextCookie, ULONG ulStartingLine, DWORD dwFlags, VARIANT *pvarResult, EXCEPINFO *pexcepinfo) { IDispatchEx *document; diff --git a/dlls/msi/msiserver.idl b/dlls/msi/msiserver.idl index ac442dbd076..2189fc4c9af 100644 --- a/dlls/msi/msiserver.idl +++ b/dlls/msi/msiserver.idl @@ -29,7 +29,6 @@ typedef int INSTALLMESSAGE; typedef int MSICONDITION; typedef int MSIRUNMODE; typedef int INSTALLSTATE; -typedef WORD LANGID; cpp_quote("#endif") [ diff --git a/dlls/msi/script.c b/dlls/msi/script.c index 014ba6b7346..8dfa6d2ac05 100644 --- a/dlls/msi/script.c +++ b/dlls/msi/script.c @@ -138,14 +138,14 @@ DWORD call_script(MSIHANDLE hPackage, INT type, LPCWSTR script, LPCWSTR function if (FAILED(hr)) goto done; /* Initialize the script engine */ - hr = IActiveScriptParse_InitNew(pActiveScriptParse); + hr = IActiveScriptParse64_InitNew(pActiveScriptParse); if (FAILED(hr)) goto done; /* Add the session object */ hr = IActiveScript_AddNamedItem(pActiveScript, szSession, SCRIPTITEM_ISVISIBLE); /* Pass the script to the engine */ - hr = IActiveScriptParse_ParseScriptText(pActiveScriptParse, script, NULL, NULL, NULL, 0, 0, 0L, NULL, NULL); + hr = IActiveScriptParse64_ParseScriptText(pActiveScriptParse, script, NULL, NULL, NULL, 0, 0, 0L, NULL, NULL); if (FAILED(hr)) goto done; /* Start processing the script */ diff --git a/dlls/ntdll/exception.c b/dlls/ntdll/exception.c index 91a269bd804..f7ae9475d20 100644 --- a/dlls/ntdll/exception.c +++ b/dlls/ntdll/exception.c @@ -243,7 +243,10 @@ static LONG call_vectored_handlers( EXCEPTION_RECORD *rec, CONTEXT *context ) LIST_FOR_EACH( ptr, &vectored_handlers ) { VECTORED_HANDLER *handler = LIST_ENTRY( ptr, VECTORED_HANDLER, entry ); + TRACE( "calling handler at %p code=%x flags=%x\n", + handler->func, rec->ExceptionCode, rec->ExceptionFlags ); ret = handler->func( &except_ptrs ); + TRACE( "handler at %p returned %x\n", handler->func, ret ); if (ret == EXCEPTION_CONTINUE_EXECUTION) break; } RtlLeaveCriticalSection( &vectored_handlers_section ); diff --git a/dlls/ntoskrnl.exe/ntoskrnl.c b/dlls/ntoskrnl.exe/ntoskrnl.c index a62f02a5447..0dc9aaf32f3 100644 --- a/dlls/ntoskrnl.exe/ntoskrnl.c +++ b/dlls/ntoskrnl.exe/ntoskrnl.c @@ -1166,17 +1166,18 @@ PVOID WINAPI MmGetSystemRoutineAddress(PUNICODE_STRING SystemRoutineName) */ BOOL WINAPI DllMain( HINSTANCE inst, DWORD reason, LPVOID reserved ) { + static void *handler; LARGE_INTEGER count; switch(reason) { case DLL_PROCESS_ATTACH: DisableThreadLibraryCalls( inst ); - RtlAddVectoredExceptionHandler( TRUE, vectored_handler ); + handler = RtlAddVectoredExceptionHandler( TRUE, vectored_handler ); KeQueryTickCount( &count ); /* initialize the global KeTickCount */ break; case DLL_PROCESS_DETACH: - RtlRemoveVectoredExceptionHandler( vectored_handler ); + RtlRemoveVectoredExceptionHandler( handler ); break; } return TRUE; diff --git a/dlls/ole32/comcat.c b/dlls/ole32/comcat.c index f757cf9cc07..ace478915e2 100644 --- a/dlls/ole32/comcat.c +++ b/dlls/ole32/comcat.c @@ -226,12 +226,6 @@ static HRESULT COMCAT_IsClassOfCategories( HKEY key, struct class_categories const* categories) { - static const WCHAR impl_keyname[] = { 'I', 'm', 'p', 'l', 'e', 'm', 'e', 'n', - 't', 'e', 'd', ' ', 'C', 'a', 't', 'e', - 'g', 'o', 'r', 'i', 'e', 's', 0 }; - static const WCHAR req_keyname[] = { 'R', 'e', 'q', 'u', 'i', 'r', 'e', 'd', - ' ', 'C', 'a', 't', 'e', 'g', 'o', 'r', - 'i', 'e', 's', 0 }; HKEY subkey; HRESULT res; DWORD index; diff --git a/dlls/ole32/moniker.c b/dlls/ole32/moniker.c index 68a4cc6be2e..db0756618a0 100644 --- a/dlls/ole32/moniker.c +++ b/dlls/ole32/moniker.c @@ -1660,7 +1660,7 @@ HRESULT MonikerMarshal_Create(IMoniker *inner, IUnknown **outer) return S_OK; } -void * __RPC_USER MIDL_user_allocate(size_t size) +void * __RPC_USER MIDL_user_allocate(SIZE_T size) { return HeapAlloc(GetProcessHeap(), 0, size); } diff --git a/dlls/ole32/tests/usrmarshal.c b/dlls/ole32/tests/usrmarshal.c index 3ce71bc1d40..cbb7dc3658b 100644 --- a/dlls/ole32/tests/usrmarshal.c +++ b/dlls/ole32/tests/usrmarshal.c @@ -44,6 +44,37 @@ unsigned char * __RPC_USER HMETAFILEPICT_UserMarshal (ULONG *, unsigned char *, unsigned char * __RPC_USER HMETAFILEPICT_UserUnmarshal(ULONG *, unsigned char *, HMETAFILEPICT *); void __RPC_USER HMETAFILEPICT_UserFree(ULONG *, HMETAFILEPICT *); +static void * WINAPI user_allocate(SIZE_T size) +{ + return CoTaskMemAlloc(size); +} + +static void WINAPI user_free(void *p) +{ + CoTaskMemFree(p); +} + +static void init_user_marshal_cb(USER_MARSHAL_CB *umcb, + PMIDL_STUB_MESSAGE stub_msg, + PRPC_MESSAGE rpc_msg, unsigned char *buffer, + unsigned int size, MSHCTX context) +{ + memset(rpc_msg, 0, sizeof(*rpc_msg)); + rpc_msg->Buffer = buffer; + rpc_msg->BufferLength = size; + + memset(stub_msg, 0, sizeof(*stub_msg)); + stub_msg->RpcMsg = rpc_msg; + stub_msg->Buffer = buffer; + stub_msg->pfnAllocate = user_allocate; + stub_msg->pfnFree = user_free; + + memset(umcb, 0, sizeof(*umcb)); + umcb->Flags = MAKELONG(context, NDR_LOCAL_DATA_REPRESENTATION); + umcb->pStubMsg = stub_msg; + umcb->Signature = USER_MARSHAL_CB_SIGNATURE; + umcb->CBType = buffer ? USER_MARSHAL_CB_UNMARSHALL : USER_MARSHAL_CB_BUFFER_SIZE; +} static const char cf_marshaled[] = { @@ -59,94 +90,112 @@ static const char cf_marshaled[] = static void test_marshal_CLIPFORMAT(void) { + USER_MARSHAL_CB umcb; + MIDL_STUB_MESSAGE stub_msg; + RPC_MESSAGE rpc_msg; unsigned char *buffer; ULONG size; - ULONG flags = MAKELONG(MSHCTX_DIFFERENTMACHINE, NDR_LOCAL_DATA_REPRESENTATION); wireCLIPFORMAT wirecf; CLIPFORMAT cf = RegisterClipboardFormatA("MyFormat"); CLIPFORMAT cf2; - size = CLIPFORMAT_UserSize(&flags, 0, &cf); + init_user_marshal_cb(&umcb, &stub_msg, &rpc_msg, NULL, 0, MSHCTX_DIFFERENTMACHINE); + size = CLIPFORMAT_UserSize(&umcb.Flags, 0, &cf); ok(size == sizeof(*wirecf) + sizeof(cf_marshaled), "Wrong size %d\n", size); buffer = HeapAlloc(GetProcessHeap(), 0, size); - CLIPFORMAT_UserMarshal(&flags, buffer, &cf); + init_user_marshal_cb(&umcb, &stub_msg, &rpc_msg, buffer, size, MSHCTX_DIFFERENTMACHINE); + CLIPFORMAT_UserMarshal(&umcb.Flags, buffer, &cf); wirecf = (wireCLIPFORMAT)buffer; ok(wirecf->fContext == WDT_REMOTE_CALL, "Context should be WDT_REMOTE_CALL instead of 0x%08lx\n", wirecf->fContext); ok(wirecf->u.dwValue == cf, "Marshaled value should be 0x%04x instead of 0x%04x\n", cf, wirecf->u.dwValue); ok(!memcmp(wirecf+1, cf_marshaled, sizeof(cf_marshaled)), "Marshaled data differs\n"); - CLIPFORMAT_UserUnmarshal(&flags, buffer, &cf2); + init_user_marshal_cb(&umcb, &stub_msg, &rpc_msg, buffer, size, MSHCTX_DIFFERENTMACHINE); + CLIPFORMAT_UserUnmarshal(&umcb.Flags, buffer, &cf2); ok(cf == cf2, "Didn't unmarshal properly\n"); HeapFree(GetProcessHeap(), 0, buffer); - CLIPFORMAT_UserFree(&flags, &cf2); + init_user_marshal_cb(&umcb, &stub_msg, &rpc_msg, NULL, 0, MSHCTX_DIFFERENTMACHINE); + CLIPFORMAT_UserFree(&umcb.Flags, &cf2); } static void test_marshal_HWND(void) { + USER_MARSHAL_CB umcb; + MIDL_STUB_MESSAGE stub_msg; + RPC_MESSAGE rpc_msg; unsigned char *buffer; ULONG size; - ULONG flags = MAKELONG(MSHCTX_LOCAL, NDR_LOCAL_DATA_REPRESENTATION); HWND hwnd = GetDesktopWindow(); HWND hwnd2; wireHWND wirehwnd; - size = HWND_UserSize(&flags, 0, &hwnd); + init_user_marshal_cb(&umcb, &stub_msg, &rpc_msg, NULL, 0, MSHCTX_LOCAL); + size = HWND_UserSize(&umcb.Flags, 0, &hwnd); ok(size == sizeof(*wirehwnd), "Wrong size %d\n", size); buffer = HeapAlloc(GetProcessHeap(), 0, size); - HWND_UserMarshal(&flags, buffer, &hwnd); + init_user_marshal_cb(&umcb, &stub_msg, &rpc_msg, buffer, size, MSHCTX_LOCAL); + HWND_UserMarshal(&umcb.Flags, buffer, &hwnd); wirehwnd = (wireHWND)buffer; ok(wirehwnd->fContext == WDT_INPROC_CALL, "Context should be WDT_INPROC_CALL instead of 0x%08lx\n", wirehwnd->fContext); ok(wirehwnd->u.hInproc == (LONG_PTR)hwnd, "Marshaled value should be %p instead of %p\n", hwnd, (HANDLE)wirehwnd->u.hRemote); - HWND_UserUnmarshal(&flags, buffer, &hwnd2); + init_user_marshal_cb(&umcb, &stub_msg, &rpc_msg, buffer, size, MSHCTX_LOCAL); + HWND_UserUnmarshal(&umcb.Flags, buffer, &hwnd2); ok(hwnd == hwnd2, "Didn't unmarshal properly\n"); HeapFree(GetProcessHeap(), 0, buffer); - HWND_UserFree(&flags, &hwnd2); + init_user_marshal_cb(&umcb, &stub_msg, &rpc_msg, NULL, 0, MSHCTX_LOCAL); + HWND_UserFree(&umcb.Flags, &hwnd2); } static void test_marshal_HGLOBAL(void) { + USER_MARSHAL_CB umcb; + MIDL_STUB_MESSAGE stub_msg; + RPC_MESSAGE rpc_msg; unsigned char *buffer; ULONG size; - ULONG flags = MAKELONG(MSHCTX_LOCAL, NDR_LOCAL_DATA_REPRESENTATION); HGLOBAL hglobal; HGLOBAL hglobal2; unsigned char *wirehglobal; int i; hglobal = NULL; - flags = MAKELONG(MSHCTX_LOCAL, NDR_LOCAL_DATA_REPRESENTATION); - size = HGLOBAL_UserSize(&flags, 0, &hglobal); + init_user_marshal_cb(&umcb, &stub_msg, &rpc_msg, NULL, 0, MSHCTX_LOCAL); + size = HGLOBAL_UserSize(&umcb.Flags, 0, &hglobal); /* native is poorly programmed and allocates 4 bytes more than it needs to * here - Wine doesn't have to emulate that */ ok((size == 8) || (size == 12), "Size should be 12, instead of %d\n", size); buffer = HeapAlloc(GetProcessHeap(), 0, size); - HGLOBAL_UserMarshal(&flags, buffer, &hglobal); + init_user_marshal_cb(&umcb, &stub_msg, &rpc_msg, buffer, size, MSHCTX_LOCAL); + HGLOBAL_UserMarshal(&umcb.Flags, buffer, &hglobal); wirehglobal = buffer; ok(*(ULONG *)wirehglobal == WDT_REMOTE_CALL, "Context should be WDT_REMOTE_CALL instead of 0x%08x\n", *(ULONG *)wirehglobal); wirehglobal += sizeof(ULONG); ok(*(ULONG *)wirehglobal == (ULONG)hglobal, "buffer+4 should be HGLOBAL\n"); - HGLOBAL_UserUnmarshal(&flags, buffer, &hglobal2); + init_user_marshal_cb(&umcb, &stub_msg, &rpc_msg, buffer, size, MSHCTX_LOCAL); + HGLOBAL_UserUnmarshal(&umcb.Flags, buffer, &hglobal2); ok(hglobal2 == hglobal, "Didn't unmarshal properly\n"); HeapFree(GetProcessHeap(), 0, buffer); - HGLOBAL_UserFree(&flags, &hglobal2); + init_user_marshal_cb(&umcb, &stub_msg, &rpc_msg, NULL, 0, MSHCTX_LOCAL); + HGLOBAL_UserFree(&umcb.Flags, &hglobal2); hglobal = GlobalAlloc(0, 4); buffer = GlobalLock(hglobal); for (i = 0; i < 4; i++) buffer[i] = i; GlobalUnlock(hglobal); - flags = MAKELONG(MSHCTX_LOCAL, NDR_LOCAL_DATA_REPRESENTATION); - size = HGLOBAL_UserSize(&flags, 0, &hglobal); + init_user_marshal_cb(&umcb, &stub_msg, &rpc_msg, NULL, 0, MSHCTX_LOCAL); + size = HGLOBAL_UserSize(&umcb.Flags, 0, &hglobal); /* native is poorly programmed and allocates 4 bytes more than it needs to * here - Wine doesn't have to emulate that */ ok((size == 24) || (size == 28), "Size should be 24 or 28, instead of %d\n", size); buffer = HeapAlloc(GetProcessHeap(), 0, size); - HGLOBAL_UserMarshal(&flags, buffer, &hglobal); + init_user_marshal_cb(&umcb, &stub_msg, &rpc_msg, buffer, size, MSHCTX_LOCAL); + HGLOBAL_UserMarshal(&umcb.Flags, buffer, &hglobal); wirehglobal = buffer; ok(*(ULONG *)wirehglobal == WDT_REMOTE_CALL, "Context should be WDT_REMOTE_CALL instead of 0x%08x\n", *(ULONG *)wirehglobal); wirehglobal += sizeof(ULONG); @@ -160,10 +209,12 @@ static void test_marshal_HGLOBAL(void) wirehglobal += sizeof(ULONG); for (i = 0; i < 4; i++) ok(wirehglobal[i] == i, "buffer+0x%x should be %d\n", 0x10 + i, i); - HGLOBAL_UserUnmarshal(&flags, buffer, &hglobal2); + init_user_marshal_cb(&umcb, &stub_msg, &rpc_msg, buffer, size, MSHCTX_LOCAL); + HGLOBAL_UserUnmarshal(&umcb.Flags, buffer, &hglobal2); ok(hglobal2 != NULL, "Didn't unmarshal properly\n"); HeapFree(GetProcessHeap(), 0, buffer); - HGLOBAL_UserFree(&flags, &hglobal2); + init_user_marshal_cb(&umcb, &stub_msg, &rpc_msg, NULL, 0, MSHCTX_LOCAL); + HGLOBAL_UserFree(&umcb.Flags, &hglobal2); GlobalFree(hglobal); } @@ -177,19 +228,23 @@ static HENHMETAFILE create_emf(void) static void test_marshal_HENHMETAFILE(void) { + USER_MARSHAL_CB umcb; + MIDL_STUB_MESSAGE stub_msg; + RPC_MESSAGE rpc_msg; unsigned char *buffer; ULONG size; - ULONG flags = MAKELONG(MSHCTX_DIFFERENTMACHINE, NDR_LOCAL_DATA_REPRESENTATION); HENHMETAFILE hemf; HENHMETAFILE hemf2 = NULL; unsigned char *wirehemf; hemf = create_emf(); - size = HENHMETAFILE_UserSize(&flags, 0, &hemf); + init_user_marshal_cb(&umcb, &stub_msg, &rpc_msg, NULL, 0, MSHCTX_DIFFERENTMACHINE); + size = HENHMETAFILE_UserSize(&umcb.Flags, 0, &hemf); ok(size > 20, "size should be at least 20 bytes, not %d\n", size); buffer = HeapAlloc(GetProcessHeap(), 0, size); - HENHMETAFILE_UserMarshal(&flags, buffer, &hemf); + init_user_marshal_cb(&umcb, &stub_msg, &rpc_msg, buffer, size, MSHCTX_DIFFERENTMACHINE); + HENHMETAFILE_UserMarshal(&umcb.Flags, buffer, &hemf); wirehemf = buffer; ok(*(DWORD *)wirehemf == WDT_REMOTE_CALL, "wirestgm + 0x0 should be WDT_REMOTE_CALL instead of 0x%08x\n", *(DWORD *)wirehemf); wirehemf += sizeof(DWORD); @@ -204,29 +259,35 @@ static void test_marshal_HENHMETAFILE(void) /* ... rest of data not tested - refer to tests for GetEnhMetaFileBits * at this point */ - HENHMETAFILE_UserUnmarshal(&flags, buffer, &hemf2); + init_user_marshal_cb(&umcb, &stub_msg, &rpc_msg, buffer, size, MSHCTX_DIFFERENTMACHINE); + HENHMETAFILE_UserUnmarshal(&umcb.Flags, buffer, &hemf2); ok(hemf2 != NULL, "HENHMETAFILE didn't unmarshal\n"); HeapFree(GetProcessHeap(), 0, buffer); - HENHMETAFILE_UserFree(&flags, &hemf2); + init_user_marshal_cb(&umcb, &stub_msg, &rpc_msg, NULL, 0, MSHCTX_DIFFERENTMACHINE); + HENHMETAFILE_UserFree(&umcb.Flags, &hemf2); DeleteEnhMetaFile(hemf); /* test NULL emf */ hemf = NULL; - size = HENHMETAFILE_UserSize(&flags, 0, &hemf); + init_user_marshal_cb(&umcb, &stub_msg, &rpc_msg, NULL, 0, MSHCTX_DIFFERENTMACHINE); + size = HENHMETAFILE_UserSize(&umcb.Flags, 0, &hemf); ok(size == 8, "size should be 8 bytes, not %d\n", size); buffer = HeapAlloc(GetProcessHeap(), 0, size); - HENHMETAFILE_UserMarshal(&flags, buffer, &hemf); + init_user_marshal_cb(&umcb, &stub_msg, &rpc_msg, buffer, size, MSHCTX_DIFFERENTMACHINE); + HENHMETAFILE_UserMarshal(&umcb.Flags, buffer, &hemf); wirehemf = buffer; ok(*(DWORD *)wirehemf == WDT_REMOTE_CALL, "wirestgm + 0x0 should be WDT_REMOTE_CALL instead of 0x%08x\n", *(DWORD *)wirehemf); wirehemf += sizeof(DWORD); ok(*(DWORD *)wirehemf == (DWORD)(DWORD_PTR)hemf, "wirestgm + 0x4 should be hemf instead of 0x%08x\n", *(DWORD *)wirehemf); wirehemf += sizeof(DWORD); - HENHMETAFILE_UserUnmarshal(&flags, buffer, &hemf2); + init_user_marshal_cb(&umcb, &stub_msg, &rpc_msg, buffer, size, MSHCTX_DIFFERENTMACHINE); + HENHMETAFILE_UserUnmarshal(&umcb.Flags, buffer, &hemf2); ok(hemf2 == NULL, "NULL HENHMETAFILE didn't unmarshal\n"); HeapFree(GetProcessHeap(), 0, buffer); - HENHMETAFILE_UserFree(&flags, &hemf2); + init_user_marshal_cb(&umcb, &stub_msg, &rpc_msg, NULL, 0, MSHCTX_DIFFERENTMACHINE); + HENHMETAFILE_UserFree(&umcb.Flags, &hemf2); } static HMETAFILE create_mf(void) @@ -239,19 +300,23 @@ static HMETAFILE create_mf(void) static void test_marshal_HMETAFILE(void) { + USER_MARSHAL_CB umcb; + MIDL_STUB_MESSAGE stub_msg; + RPC_MESSAGE rpc_msg; unsigned char *buffer; ULONG size; - ULONG flags = MAKELONG(MSHCTX_DIFFERENTMACHINE, NDR_LOCAL_DATA_REPRESENTATION); HMETAFILE hmf; HMETAFILE hmf2 = NULL; unsigned char *wirehmf; hmf = create_mf(); - size = HMETAFILE_UserSize(&flags, 0, &hmf); + init_user_marshal_cb(&umcb, &stub_msg, &rpc_msg, NULL, 0, MSHCTX_DIFFERENTMACHINE); + size = HMETAFILE_UserSize(&umcb.Flags, 0, &hmf); ok(size > 20, "size should be at least 20 bytes, not %d\n", size); buffer = HeapAlloc(GetProcessHeap(), 0, size); - HMETAFILE_UserMarshal(&flags, buffer, &hmf); + init_user_marshal_cb(&umcb, &stub_msg, &rpc_msg, buffer, size, MSHCTX_DIFFERENTMACHINE); + HMETAFILE_UserMarshal(&umcb.Flags, buffer, &hmf); wirehmf = buffer; ok(*(DWORD *)wirehmf == WDT_REMOTE_CALL, "wirestgm + 0x0 should be WDT_REMOTE_CALL instead of 0x%08x\n", *(DWORD *)wirehmf); wirehmf += sizeof(DWORD); @@ -266,29 +331,32 @@ static void test_marshal_HMETAFILE(void) /* ... rest of data not tested - refer to tests for GetMetaFileBits * at this point */ - HMETAFILE_UserUnmarshal(&flags, buffer, &hmf2); + init_user_marshal_cb(&umcb, &stub_msg, &rpc_msg, buffer, size, MSHCTX_DIFFERENTMACHINE); + HMETAFILE_UserUnmarshal(&umcb.Flags, buffer, &hmf2); ok(hmf2 != NULL, "HMETAFILE didn't unmarshal\n"); HeapFree(GetProcessHeap(), 0, buffer); - HMETAFILE_UserFree(&flags, &hmf2); + HMETAFILE_UserFree(&umcb.Flags, &hmf2); DeleteMetaFile(hmf); /* test NULL emf */ hmf = NULL; - size = HMETAFILE_UserSize(&flags, 0, &hmf); + size = HMETAFILE_UserSize(&umcb.Flags, 0, &hmf); ok(size == 8, "size should be 8 bytes, not %d\n", size); buffer = HeapAlloc(GetProcessHeap(), 0, size); - HMETAFILE_UserMarshal(&flags, buffer, &hmf); + init_user_marshal_cb(&umcb, &stub_msg, &rpc_msg, buffer, size, MSHCTX_DIFFERENTMACHINE); + HMETAFILE_UserMarshal(&umcb.Flags, buffer, &hmf); wirehmf = buffer; ok(*(DWORD *)wirehmf == WDT_REMOTE_CALL, "wirestgm + 0x0 should be WDT_REMOTE_CALL instead of 0x%08x\n", *(DWORD *)wirehmf); wirehmf += sizeof(DWORD); ok(*(DWORD *)wirehmf == (DWORD)(DWORD_PTR)hmf, "wirestgm + 0x4 should be hmf instead of 0x%08x\n", *(DWORD *)wirehmf); wirehmf += sizeof(DWORD); - HMETAFILE_UserUnmarshal(&flags, buffer, &hmf2); + init_user_marshal_cb(&umcb, &stub_msg, &rpc_msg, buffer, size, MSHCTX_DIFFERENTMACHINE); + HMETAFILE_UserUnmarshal(&umcb.Flags, buffer, &hmf2); ok(hmf2 == NULL, "NULL HMETAFILE didn't unmarshal\n"); HeapFree(GetProcessHeap(), 0, buffer); - HMETAFILE_UserFree(&flags, &hmf2); + HMETAFILE_UserFree(&umcb.Flags, &hmf2); } #define USER_MARSHAL_PTR_PREFIX \ @@ -297,9 +365,11 @@ static void test_marshal_HMETAFILE(void) static void test_marshal_HMETAFILEPICT(void) { + USER_MARSHAL_CB umcb; + MIDL_STUB_MESSAGE stub_msg; + RPC_MESSAGE rpc_msg; unsigned char *buffer, *buffer_end; ULONG size; - ULONG flags = MAKELONG(MSHCTX_DIFFERENTMACHINE, NDR_LOCAL_DATA_REPRESENTATION); HMETAFILEPICT hmfp; HMETAFILEPICT hmfp2 = NULL; METAFILEPICT *pmfp; @@ -313,11 +383,13 @@ static void test_marshal_HMETAFILEPICT(void) pmfp->hMF = create_mf(); GlobalUnlock(hmfp); - size = HMETAFILEPICT_UserSize(&flags, 0, &hmfp); + init_user_marshal_cb(&umcb, &stub_msg, &rpc_msg, NULL, 0, MSHCTX_DIFFERENTMACHINE); + size = HMETAFILEPICT_UserSize(&umcb.Flags, 0, &hmfp); ok(size > 20, "size should be at least 20 bytes, not %d\n", size); trace("size is %d\n", size); buffer = HeapAlloc(GetProcessHeap(), 0, size); - buffer_end = HMETAFILEPICT_UserMarshal(&flags, buffer, &hmfp); + init_user_marshal_cb(&umcb, &stub_msg, &rpc_msg, buffer, size, MSHCTX_DIFFERENTMACHINE); + buffer_end = HMETAFILEPICT_UserMarshal(&umcb.Flags, buffer, &hmfp); wirehmfp = buffer; ok(*(DWORD *)wirehmfp == WDT_REMOTE_CALL, "wirestgm + 0x0 should be WDT_REMOTE_CALL instead of 0x%08x\n", *(DWORD *)wirehmfp); wirehmfp += sizeof(DWORD); @@ -348,10 +420,12 @@ static void test_marshal_HMETAFILEPICT(void) /* ... rest of data not tested - refer to tests for GetMetaFileBits * at this point */ - HMETAFILEPICT_UserUnmarshal(&flags, buffer, &hmfp2); + init_user_marshal_cb(&umcb, &stub_msg, &rpc_msg, buffer, size, MSHCTX_DIFFERENTMACHINE); + HMETAFILEPICT_UserUnmarshal(&umcb.Flags, buffer, &hmfp2); ok(hmfp2 != NULL, "HMETAFILEPICT didn't unmarshal\n"); HeapFree(GetProcessHeap(), 0, buffer); - HMETAFILEPICT_UserFree(&flags, &hmfp2); + init_user_marshal_cb(&umcb, &stub_msg, &rpc_msg, NULL, 0, MSHCTX_DIFFERENTMACHINE); + HMETAFILEPICT_UserFree(&umcb.Flags, &hmfp2); pmfp = GlobalLock(hmfp); DeleteMetaFile(pmfp->hMF); GlobalUnlock(hmfp); @@ -360,10 +434,12 @@ static void test_marshal_HMETAFILEPICT(void) /* test NULL emf */ hmfp = NULL; - size = HMETAFILEPICT_UserSize(&flags, 0, &hmfp); + init_user_marshal_cb(&umcb, &stub_msg, &rpc_msg, NULL, 0, MSHCTX_DIFFERENTMACHINE); + size = HMETAFILEPICT_UserSize(&umcb.Flags, 0, &hmfp); ok(size == 8, "size should be 8 bytes, not %d\n", size); buffer = HeapAlloc(GetProcessHeap(), 0, size); - HMETAFILEPICT_UserMarshal(&flags, buffer, &hmfp); + init_user_marshal_cb(&umcb, &stub_msg, &rpc_msg, buffer, size, MSHCTX_DIFFERENTMACHINE); + HMETAFILEPICT_UserMarshal(&umcb.Flags, buffer, &hmfp); wirehmfp = buffer; ok(*(DWORD *)wirehmfp == WDT_REMOTE_CALL, "wirestgm + 0x0 should be WDT_REMOTE_CALL instead of 0x%08x\n", *(DWORD *)wirehmfp); wirehmfp += sizeof(DWORD); @@ -371,10 +447,12 @@ static void test_marshal_HMETAFILEPICT(void) wirehmfp += sizeof(DWORD); hmfp2 = NULL; - HMETAFILEPICT_UserUnmarshal(&flags, buffer, &hmfp2); + init_user_marshal_cb(&umcb, &stub_msg, &rpc_msg, buffer, size, MSHCTX_DIFFERENTMACHINE); + HMETAFILEPICT_UserUnmarshal(&umcb.Flags, buffer, &hmfp2); ok(hmfp2 == NULL, "NULL HMETAFILE didn't unmarshal\n"); HeapFree(GetProcessHeap(), 0, buffer); - HMETAFILEPICT_UserFree(&flags, &hmfp2); + init_user_marshal_cb(&umcb, &stub_msg, &rpc_msg, NULL, 0, MSHCTX_DIFFERENTMACHINE); + HMETAFILEPICT_UserFree(&umcb.Flags, &hmfp2); } static HRESULT WINAPI Test_IUnknown_QueryInterface( @@ -421,27 +499,21 @@ void __RPC_USER WdtpInterfacePointer_UserFree(IUnknown *); static void test_marshal_WdtpInterfacePointer(void) { + USER_MARSHAL_CB umcb; + MIDL_STUB_MESSAGE stub_msg; + RPC_MESSAGE rpc_msg; unsigned char *buffer, *buffer_end; ULONG size; - MIDL_STUB_MESSAGE stubmsg; - USER_MARSHAL_CB umcb; IUnknown *unk; IUnknown *unk2; unsigned char *wireip; const IID *iid; - memset(&stubmsg, 0xcc, sizeof(stubmsg)); - stubmsg.dwDestContext = MSHCTX_INPROC; - stubmsg.pvDestContext = NULL; - - memset(&umcb, 0xcc, sizeof(umcb)); - umcb.Flags = MAKELONG(MSHCTX_INPROC, NDR_LOCAL_DATA_REPRESENTATION); - umcb.pStubMsg = &stubmsg; - /* shows that the WdtpInterfacePointer functions don't marshal anything for * NULL pointers, so code using these functions must handle that case * itself */ unk = NULL; + init_user_marshal_cb(&umcb, &stub_msg, &rpc_msg, NULL, 0, MSHCTX_INPROC); size = WdtpInterfacePointer_UserSize(&umcb.Flags, umcb.Flags, 0, unk, &IID_IUnknown); ok(size == 0, "size should be 0 bytes, not %d\n", size); buffer = HeapAlloc(GetProcessHeap(), 0, size); @@ -450,11 +522,13 @@ static void test_marshal_WdtpInterfacePointer(void) HeapFree(GetProcessHeap(), 0, buffer); unk = &Test_Unknown; + init_user_marshal_cb(&umcb, &stub_msg, &rpc_msg, NULL, 0, MSHCTX_INPROC); size = WdtpInterfacePointer_UserSize(&umcb.Flags, umcb.Flags, 0, unk, &IID_IUnknown); todo_wine ok(size > 28, "size should be > 28 bytes, not %d\n", size); trace("WdtpInterfacePointer_UserSize returned %d\n", size); buffer = HeapAlloc(GetProcessHeap(), 0, size); + init_user_marshal_cb(&umcb, &stub_msg, &rpc_msg, buffer, size, MSHCTX_INPROC); buffer_end = WdtpInterfacePointer_UserMarshal(&umcb.Flags, umcb.Flags, buffer, unk, &IID_IUnknown); wireip = buffer; if (size >= 28) @@ -482,10 +556,12 @@ static void test_marshal_WdtpInterfacePointer(void) } unk2 = NULL; + init_user_marshal_cb(&umcb, &stub_msg, &rpc_msg, buffer, size, MSHCTX_INPROC); WdtpInterfacePointer_UserUnmarshal(&umcb.Flags, buffer, &unk2, &IID_IUnknown); todo_wine ok(unk2 != NULL, "IUnknown object didn't unmarshal properly\n"); HeapFree(GetProcessHeap(), 0, buffer); + init_user_marshal_cb(&umcb, &stub_msg, &rpc_msg, NULL, 0, MSHCTX_INPROC); WdtpInterfacePointer_UserFree(unk2); } diff --git a/dlls/oleaut32/tests/usrmarshal.c b/dlls/oleaut32/tests/usrmarshal.c index 9b12b2e0002..cb6f45d2a60 100644 --- a/dlls/oleaut32/tests/usrmarshal.c +++ b/dlls/oleaut32/tests/usrmarshal.c @@ -35,10 +35,8 @@ # define V_U2(A) (*(A)) #endif -/* doesn't work on Windows due to needing more of the - * MIDL_STUB_MESSAGE structure to be filled out */ -#define LPSAFEARRAY_UNMARSHAL_WORKS 0 -#define BSTR_UNMARSHAL_WORKS 0 +#define LPSAFEARRAY_UNMARSHAL_WORKS 1 +#define BSTR_UNMARSHAL_WORKS 1 #define VARIANT_UNMARSHAL_WORKS 1 static inline SF_TYPE get_union_type(SAFEARRAY *psa) @@ -165,22 +163,51 @@ static void check_safearray(void *buffer, LPSAFEARRAY lpsa) /* elements are now pointed to by wiresa */ } +static void * WINAPI user_allocate(SIZE_T size) +{ + return CoTaskMemAlloc(size); +} + +static void WINAPI user_free(void *p) +{ + CoTaskMemFree(p); +} + +static void init_user_marshal_cb(USER_MARSHAL_CB *umcb, + PMIDL_STUB_MESSAGE stub_msg, + PRPC_MESSAGE rpc_msg, unsigned char *buffer, + unsigned int size, MSHCTX context) +{ + memset(rpc_msg, 0, sizeof(*rpc_msg)); + rpc_msg->Buffer = buffer; + rpc_msg->BufferLength = size; + + memset(stub_msg, 0, sizeof(*stub_msg)); + stub_msg->RpcMsg = rpc_msg; + stub_msg->Buffer = buffer; + stub_msg->pfnAllocate = user_allocate; + stub_msg->pfnFree = user_free; + + memset(umcb, 0, sizeof(*umcb)); + umcb->Flags = MAKELONG(context, NDR_LOCAL_DATA_REPRESENTATION); + umcb->pStubMsg = stub_msg; + umcb->Signature = USER_MARSHAL_CB_SIGNATURE; + umcb->CBType = buffer ? USER_MARSHAL_CB_UNMARSHALL : USER_MARSHAL_CB_BUFFER_SIZE; +} + static void test_marshal_LPSAFEARRAY(void) { unsigned char *buffer; - unsigned long size; + ULONG size; LPSAFEARRAY lpsa; LPSAFEARRAY lpsa2 = NULL; SAFEARRAYBOUND sab; - MIDL_STUB_MESSAGE stubMsg = { 0 }; - USER_MARSHAL_CB umcb = { 0 }; + RPC_MESSAGE rpc_msg; + MIDL_STUB_MESSAGE stub_msg; + USER_MARSHAL_CB umcb; HRESULT hr; VARTYPE vt; - umcb.Flags = MAKELONG(MSHCTX_DIFFERENTMACHINE, NDR_LOCAL_DATA_REPRESENTATION); - umcb.pReserve = NULL; - umcb.pStubMsg = &stubMsg; - sab.lLbound = 5; sab.cElements = 10; @@ -188,11 +215,14 @@ static void test_marshal_LPSAFEARRAY(void) *(DWORD *)lpsa->pvData = 0xcafebabe; lpsa->cLocks = 7; + init_user_marshal_cb(&umcb, &stub_msg, &rpc_msg, NULL, 0, MSHCTX_DIFFERENTMACHINE); size = LPSAFEARRAY_UserSize(&umcb.Flags, 1, &lpsa); - ok(size == 68, "size should be 68 bytes, not %ld\n", size); + ok(size == 68, "size should be 68 bytes, not %d\n", size); + init_user_marshal_cb(&umcb, &stub_msg, &rpc_msg, NULL, 0, MSHCTX_DIFFERENTMACHINE); size = LPSAFEARRAY_UserSize(&umcb.Flags, 0, &lpsa); - ok(size == 64, "size should be 64 bytes, not %ld\n", size); + ok(size == 64, "size should be 64 bytes, not %d\n", size); buffer = HeapAlloc(GetProcessHeap(), 0, size); + init_user_marshal_cb(&umcb, &stub_msg, &rpc_msg, buffer, size, MSHCTX_DIFFERENTMACHINE); LPSAFEARRAY_UserMarshal(&umcb.Flags, buffer, &lpsa); check_safearray(buffer, lpsa); @@ -200,11 +230,13 @@ static void test_marshal_LPSAFEARRAY(void) if (LPSAFEARRAY_UNMARSHAL_WORKS) { VARTYPE vt, vt2; + init_user_marshal_cb(&umcb, &stub_msg, &rpc_msg, buffer, size, MSHCTX_DIFFERENTMACHINE); LPSAFEARRAY_UserUnmarshal(&umcb.Flags, buffer, &lpsa2); ok(lpsa2 != NULL, "LPSAFEARRAY didn't unmarshal\n"); SafeArrayGetVartype(lpsa, &vt); SafeArrayGetVartype(lpsa2, &vt2); ok(vt == vt2, "vts differ %x %x\n", vt, vt2); + init_user_marshal_cb(&umcb, &stub_msg, &rpc_msg, NULL, 0, MSHCTX_DIFFERENTMACHINE); LPSAFEARRAY_UserFree(&umcb.Flags, &lpsa2); } HeapFree(GetProcessHeap(), 0, buffer); @@ -214,16 +246,20 @@ static void test_marshal_LPSAFEARRAY(void) /* test NULL safe array */ lpsa = NULL; + init_user_marshal_cb(&umcb, &stub_msg, &rpc_msg, NULL, 0, MSHCTX_DIFFERENTMACHINE); size = LPSAFEARRAY_UserSize(&umcb.Flags, 0, &lpsa); - ok(size == 4, "size should be 4 bytes, not %ld\n", size); + ok(size == 4, "size should be 4 bytes, not %d\n", size); buffer = HeapAlloc(GetProcessHeap(), 0, size); + init_user_marshal_cb(&umcb, &stub_msg, &rpc_msg, buffer, size, MSHCTX_DIFFERENTMACHINE); LPSAFEARRAY_UserMarshal(&umcb.Flags, buffer, &lpsa); check_safearray(buffer, lpsa); if (LPSAFEARRAY_UNMARSHAL_WORKS) { + init_user_marshal_cb(&umcb, &stub_msg, &rpc_msg, buffer, size, MSHCTX_DIFFERENTMACHINE); LPSAFEARRAY_UserUnmarshal(&umcb.Flags, buffer, &lpsa2); ok(lpsa2 == NULL, "NULL LPSAFEARRAY didn't unmarshal\n"); + init_user_marshal_cb(&umcb, &stub_msg, &rpc_msg, NULL, 0, MSHCTX_DIFFERENTMACHINE); LPSAFEARRAY_UserFree(&umcb.Flags, &lpsa2); } HeapFree(GetProcessHeap(), 0, buffer); @@ -235,11 +271,14 @@ static void test_marshal_LPSAFEARRAY(void) *(double *)lpsa->pvData = 3.1415; lpsa->cLocks = 7; + init_user_marshal_cb(&umcb, &stub_msg, &rpc_msg, NULL, 0, MSHCTX_DIFFERENTMACHINE); size = LPSAFEARRAY_UserSize(&umcb.Flags, 1, &lpsa); - ok(size == 128, "size should be 128 bytes, not %ld\n", size); + ok(size == 128, "size should be 128 bytes, not %d\n", size); + init_user_marshal_cb(&umcb, &stub_msg, &rpc_msg, NULL, 0, MSHCTX_DIFFERENTMACHINE); size = LPSAFEARRAY_UserSize(&umcb.Flags, 0, &lpsa); - ok(size == 128, "size should be 128 bytes, not %ld\n", size); + ok(size == 128, "size should be 128 bytes, not %d\n", size); buffer = HeapAlloc(GetProcessHeap(), 0, size); + init_user_marshal_cb(&umcb, &stub_msg, &rpc_msg, buffer, size, MSHCTX_DIFFERENTMACHINE); LPSAFEARRAY_UserMarshal(&umcb.Flags, buffer, &lpsa); check_safearray(buffer, lpsa); @@ -260,9 +299,11 @@ static void test_marshal_LPSAFEARRAY(void) hr = SafeArrayGetVartype(lpsa, &vt); ok(hr == E_INVALIDARG, "ret %08x\n", hr); + init_user_marshal_cb(&umcb, &stub_msg, &rpc_msg, NULL, 0, MSHCTX_DIFFERENTMACHINE); size = LPSAFEARRAY_UserSize(&umcb.Flags, 0, &lpsa); - ok(size == 432, "size %ld\n", size); + ok(size == 432, "size %d\n", size); buffer = HeapAlloc(GetProcessHeap(), 0, size); + init_user_marshal_cb(&umcb, &stub_msg, &rpc_msg, buffer, size, MSHCTX_DIFFERENTMACHINE); LPSAFEARRAY_UserMarshal(&umcb.Flags, buffer, &lpsa); check_safearray(buffer, lpsa); HeapFree(GetProcessHeap(), 0, buffer); @@ -282,10 +323,12 @@ static void test_marshal_LPSAFEARRAY(void) hr = SafeArrayGetVartype(lpsa, &vt); ok(hr == E_INVALIDARG, "ret %08x\n", hr); + init_user_marshal_cb(&umcb, &stub_msg, &rpc_msg, NULL, 0, MSHCTX_DIFFERENTMACHINE); size = LPSAFEARRAY_UserSize(&umcb.Flags, 0, &lpsa); todo_wine - ok(size == 1388, "size %ld\n", size); + ok(size == 1388, "size %d\n", size); buffer = HeapAlloc(GetProcessHeap(), 0, size); + init_user_marshal_cb(&umcb, &stub_msg, &rpc_msg, buffer, size, MSHCTX_DIFFERENTMACHINE); LPSAFEARRAY_UserMarshal(&umcb.Flags, buffer, &lpsa); check_safearray(buffer, lpsa); HeapFree(GetProcessHeap(), 0, buffer); @@ -316,30 +359,31 @@ static void check_bstr(void *buffer, BSTR b) static void test_marshal_BSTR(void) { - unsigned long size; - MIDL_STUB_MESSAGE stubMsg = { 0 }; - USER_MARSHAL_CB umcb = { 0 }; + ULONG size; + RPC_MESSAGE rpc_msg; + MIDL_STUB_MESSAGE stub_msg; + USER_MARSHAL_CB umcb; unsigned char *buffer, *next; BSTR b, b2; WCHAR str[] = {'m','a','r','s','h','a','l',' ','t','e','s','t','1',0}; DWORD len; - umcb.Flags = MAKELONG(MSHCTX_DIFFERENTMACHINE, NDR_LOCAL_DATA_REPRESENTATION); - umcb.pReserve = NULL; - umcb.pStubMsg = &stubMsg; - b = SysAllocString(str); len = SysStringLen(b); ok(len == 13, "get %d\n", len); /* BSTRs are DWORD aligned */ + + init_user_marshal_cb(&umcb, &stub_msg, &rpc_msg, NULL, 0, MSHCTX_DIFFERENTMACHINE); size = BSTR_UserSize(&umcb.Flags, 1, &b); - ok(size == 42, "size %ld\n", size); + ok(size == 42, "size %d\n", size); + init_user_marshal_cb(&umcb, &stub_msg, &rpc_msg, NULL, 0, MSHCTX_DIFFERENTMACHINE); size = BSTR_UserSize(&umcb.Flags, 0, &b); - ok(size == 38, "size %ld\n", size); + ok(size == 38, "size %d\n", size); buffer = HeapAlloc(GetProcessHeap(), 0, size); + init_user_marshal_cb(&umcb, &stub_msg, &rpc_msg, buffer, size, MSHCTX_DIFFERENTMACHINE); next = BSTR_UserMarshal(&umcb.Flags, buffer, &b); ok(next == buffer + size, "got %p expect %p\n", next, buffer + size); check_bstr(buffer, b); @@ -347,10 +391,12 @@ static void test_marshal_BSTR(void) if (BSTR_UNMARSHAL_WORKS) { b2 = NULL; + init_user_marshal_cb(&umcb, &stub_msg, &rpc_msg, buffer, size, MSHCTX_DIFFERENTMACHINE); next = BSTR_UserUnmarshal(&umcb.Flags, buffer, &b2); ok(next == buffer + size, "got %p expect %p\n", next, buffer + size); ok(b2 != NULL, "BSTR didn't unmarshal\n"); ok(!memcmp(b, b2, (len + 1) * 2), "strings differ\n"); + init_user_marshal_cb(&umcb, &stub_msg, &rpc_msg, NULL, 0, MSHCTX_DIFFERENTMACHINE); BSTR_UserFree(&umcb.Flags, &b2); } @@ -358,10 +404,12 @@ static void test_marshal_BSTR(void) SysFreeString(b); b = NULL; + init_user_marshal_cb(&umcb, &stub_msg, &rpc_msg, NULL, 0, MSHCTX_DIFFERENTMACHINE); size = BSTR_UserSize(&umcb.Flags, 0, &b); - ok(size == 12, "size %ld\n", size); + ok(size == 12, "size %d\n", size); buffer = HeapAlloc(GetProcessHeap(), 0, size); + init_user_marshal_cb(&umcb, &stub_msg, &rpc_msg, buffer, size, MSHCTX_DIFFERENTMACHINE); next = BSTR_UserMarshal(&umcb.Flags, buffer, &b); ok(next == buffer + size, "got %p expect %p\n", next, buffer + size); @@ -369,9 +417,11 @@ static void test_marshal_BSTR(void) if (BSTR_UNMARSHAL_WORKS) { b2 = NULL; + init_user_marshal_cb(&umcb, &stub_msg, &rpc_msg, buffer, size, MSHCTX_DIFFERENTMACHINE); next = BSTR_UserUnmarshal(&umcb.Flags, buffer, &b2); ok(next == buffer + size, "got %p expect %p\n", next, buffer + size); ok(b2 == NULL, "NULL BSTR didn't unmarshal\n"); + init_user_marshal_cb(&umcb, &stub_msg, &rpc_msg, NULL, 0, MSHCTX_DIFFERENTMACHINE); BSTR_UserFree(&umcb.Flags, &b2); } HeapFree(GetProcessHeap(), 0, buffer); @@ -383,11 +433,13 @@ static void test_marshal_BSTR(void) len = SysStringByteLen(b); ok(len == 3, "get %d\n", len); + init_user_marshal_cb(&umcb, &stub_msg, &rpc_msg, NULL, 0, MSHCTX_DIFFERENTMACHINE); size = BSTR_UserSize(&umcb.Flags, 0, &b); - ok(size == 16, "size %ld\n", size); + ok(size == 16, "size %d\n", size); buffer = HeapAlloc(GetProcessHeap(), 0, size); memset(buffer, 0xcc, size); + init_user_marshal_cb(&umcb, &stub_msg, &rpc_msg, buffer, size, MSHCTX_DIFFERENTMACHINE); next = BSTR_UserMarshal(&umcb.Flags, buffer, &b); ok(next == buffer + size, "got %p expect %p\n", next, buffer + size); check_bstr(buffer, b); @@ -396,10 +448,12 @@ static void test_marshal_BSTR(void) if (BSTR_UNMARSHAL_WORKS) { b2 = NULL; + init_user_marshal_cb(&umcb, &stub_msg, &rpc_msg, buffer, size, MSHCTX_DIFFERENTMACHINE); next = BSTR_UserUnmarshal(&umcb.Flags, buffer, &b2); ok(next == buffer + size, "got %p expect %p\n", next, buffer + size); ok(b2 != NULL, "BSTR didn't unmarshal\n"); ok(!memcmp(b, b2, len), "strings differ\n"); + init_user_marshal_cb(&umcb, &stub_msg, &rpc_msg, NULL, 0, MSHCTX_DIFFERENTMACHINE); BSTR_UserFree(&umcb.Flags, &b2); } HeapFree(GetProcessHeap(), 0, buffer); @@ -411,10 +465,12 @@ static void test_marshal_BSTR(void) len = SysStringByteLen(b); ok(len == 0, "get %d\n", len); + init_user_marshal_cb(&umcb, &stub_msg, &rpc_msg, NULL, 0, MSHCTX_DIFFERENTMACHINE); size = BSTR_UserSize(&umcb.Flags, 0, &b); - ok(size == 12, "size %ld\n", size); + ok(size == 12, "size %d\n", size); buffer = HeapAlloc(GetProcessHeap(), 0, size); + init_user_marshal_cb(&umcb, &stub_msg, &rpc_msg, buffer, size, MSHCTX_DIFFERENTMACHINE); next = BSTR_UserMarshal(&umcb.Flags, buffer, &b); ok(next == buffer + size, "got %p expect %p\n", next, buffer + size); check_bstr(buffer, b); @@ -422,11 +478,13 @@ static void test_marshal_BSTR(void) if (BSTR_UNMARSHAL_WORKS) { b2 = NULL; + init_user_marshal_cb(&umcb, &stub_msg, &rpc_msg, buffer, size, MSHCTX_DIFFERENTMACHINE); next = BSTR_UserUnmarshal(&umcb.Flags, buffer, &b2); ok(next == buffer + size, "got %p expect %p\n", next, buffer + size); ok(b2 != NULL, "NULL LPSAFEARRAY didn't unmarshal\n"); len = SysStringByteLen(b2); ok(len == 0, "byte len %d\n", len); + init_user_marshal_cb(&umcb, &stub_msg, &rpc_msg, NULL, 0, MSHCTX_DIFFERENTMACHINE); BSTR_UserFree(&umcb.Flags, &b2); } HeapFree(GetProcessHeap(), 0, buffer); @@ -472,12 +530,12 @@ static const IUnknownVtbl HeapUnknown_Vtbl = HeapUnknown_Release }; -static void check_variant_header(DWORD *wirev, VARIANT *v, unsigned long size) +static void check_variant_header(DWORD *wirev, VARIANT *v, ULONG size) { WORD *wp; DWORD switch_is; - ok(*wirev == (size + 7) >> 3, "wv[0] %08x, expected %08lx\n", *wirev, (size + 7) >> 3); + ok(*wirev == (size + 7) >> 3, "wv[0] %08x, expected %08x\n", *wirev, (size + 7) >> 3); wirev++; ok(*wirev == 0, "wv[1] %08x\n", *wirev); wirev++; diff --git a/dlls/oleaut32/tests/varformat.c b/dlls/oleaut32/tests/varformat.c index b8de8e26c3a..738c3064cd3 100644 --- a/dlls/oleaut32/tests/varformat.c +++ b/dlls/oleaut32/tests/varformat.c @@ -230,6 +230,7 @@ static const FMTDATERES VarFormat_date_results[] = static void test_VarFormat(void) { static const WCHAR szTesting[] = { 't','e','s','t','i','n','g','\0' }; + static const WCHAR szNum[] = { '3','9','6','9','7','.','1','1','\0' }; size_t i; WCHAR buffW[256]; char buff[256]; @@ -315,6 +316,10 @@ static void test_VarFormat(void) VARFMT(VT_BSTR,V_BSTR,bstrin,"<&&",S_OK,"testing"); VARFMT(VT_BSTR,V_BSTR,bstrin,"<&>&",S_OK,"testing"); SysFreeString(bstrin); + bstrin = SysAllocString(szNum); + todo_wine VARFMT(VT_BSTR,V_BSTR,bstrin,"hh:mm",S_OK,"02:38"); + todo_wine VARFMT(VT_BSTR,V_BSTR,bstrin,"mm-dd-yy",S_OK,"09-06-08"); + SysFreeString(bstrin); /* Numeric values are converted to strings then output */ VARFMT(VT_I1,V_I1,1,"<&>&",S_OK,"1"); diff --git a/dlls/oleaut32/typelib.c b/dlls/oleaut32/typelib.c index 503aaf768ea..d3168ecc6d5 100644 --- a/dlls/oleaut32/typelib.c +++ b/dlls/oleaut32/typelib.c @@ -3952,23 +3952,23 @@ static ITypeLib2* ITypeLib2_Constructor_SLTG(LPVOID pLib, DWORD dwTLBLength) } - if(pTITail) { /* could get cFuncs, cVars and cImplTypes from here + /* could get cFuncs, cVars and cImplTypes from here but we've already set those */ #define X(x) TRACE_(typelib)("tt "#x": %x\n",pTITail->res##x); - X(06); - X(16); - X(18); - X(1a); - X(1e); - X(24); - X(26); - X(2a); - X(2c); - X(2e); - X(30); - X(32); - X(34); - } + X(06); + X(16); + X(18); + X(1a); + X(1e); + X(24); + X(26); + X(2a); + X(2c); + X(2e); + X(30); + X(32); + X(34); +#undef X ppTypeInfoImpl = &((*ppTypeInfoImpl)->next); pBlk = (char*)pBlk + pBlkEntry[order].len; } diff --git a/dlls/propsys/propsys.spec b/dlls/propsys/propsys.spec index a2ae5222783..5fa0d9619e8 100644 --- a/dlls/propsys/propsys.spec +++ b/dlls/propsys/propsys.spec @@ -89,7 +89,7 @@ @ stub PSLookupPropertyHandlerCLSID @ stub PSPropertyKeyFromString @ stub PSRefreshPropertySchema -@ stub PSRegisterPropertySchema +@ stdcall PSRegisterPropertySchema(wstr) @ stub PSSetPropertyValue @ stub PSStringFromPropertyKey @ stub PSUnregisterPropertySchema diff --git a/dlls/propsys/propsys_main.c b/dlls/propsys/propsys_main.c index 1010d3377b4..ccdf3ed662f 100644 --- a/dlls/propsys/propsys_main.c +++ b/dlls/propsys/propsys_main.c @@ -47,3 +47,10 @@ BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved) return TRUE; } + +HRESULT WINAPI PSRegisterPropertySchema(PCWSTR path) +{ + FIXME("stub\n"); + + return E_NOTIMPL; +} diff --git a/dlls/riched20/context.c b/dlls/riched20/context.c index 6d4a2a93580..93d5caaed69 100644 --- a/dlls/riched20/context.c +++ b/dlls/riched20/context.c @@ -22,7 +22,7 @@ void ME_InitContext(ME_Context *c, ME_TextEditor *editor, HDC hDC) { - c->nSequence = editor->nSequence++; + c->nSequence = editor->nSequence++; c->hDC = hDC; c->editor = editor; c->pt.x = 0; @@ -35,6 +35,10 @@ void ME_InitContext(ME_Context *c, ME_TextEditor *editor, HDC hDC) } else { c->dpi.cx = c->dpi.cy = 96; } + if (editor->nAvailWidth) + c->nAvailWidth = ME_twips2pointsX(c, editor->nAvailWidth); + else + c->nAvailWidth = c->rcView.right - c->rcView.left; } void ME_DestroyContext(ME_Context *c) diff --git a/dlls/riched20/editor.c b/dlls/riched20/editor.c index 574118aede4..ca1eb9704ca 100644 --- a/dlls/riched20/editor.c +++ b/dlls/riched20/editor.c @@ -69,7 +69,7 @@ ! - EM_GETTHUMB + EM_GETTEXTEX 2.0 + EM_GETTEXTLENGTHEX (GTL_PRECISE unimplemented) - - EM_GETTEXTMODE 2.0 + + EM_GETTEXTMODE 2.0 ? + EM_GETTEXTRANGE (ANSI&Unicode) - EM_GETTYPOGRAPHYOPTIONS 3.0 - EM_GETUNDONAME @@ -1763,7 +1763,6 @@ ME_FindText(ME_TextEditor *editor, DWORD flags, const CHARRANGE *chrg, const WCH if (nCurStart + nMatched == ME_StrLen(pCurItem->member.run.strText)) { pCurItem = ME_FindItemFwd(pCurItem, diRun); - para = ME_GetParagraph(pCurItem); nCurStart = -nMatched; } } @@ -1814,14 +1813,13 @@ ME_FindText(ME_TextEditor *editor, DWORD flags, const CHARRANGE *chrg, const WCH ME_DisplayItem *pCurItem = item; int nCurEnd = nEnd; int nMatched = 0; - - if (nCurEnd - nMatched == 0) + + if (nCurEnd == 0) { pCurItem = ME_FindItemBack(pCurItem, diRun); - para = ME_GetParagraph(pCurItem); nCurEnd = ME_StrLen(pCurItem->member.run.strText) + nMatched; } - + while (pCurItem && ME_CharCompare(pCurItem->member.run.strText->szData[nCurEnd - nMatched - 1], text[nLen - nMatched - 1], (flags & FR_MATCHCASE))) { if ((flags & FR_WHOLEWORD) && isalnumW(wLastChar)) @@ -1853,7 +1851,8 @@ ME_FindText(ME_TextEditor *editor, DWORD flags, const CHARRANGE *chrg, const WCH break; } - nStart = para->member.para.nCharOfs + pCurItem->member.run.nCharOfs + nCurEnd - nMatched; + nStart = ME_GetParagraph(pCurItem)->member.para.nCharOfs + + pCurItem->member.run.nCharOfs + nCurEnd - nMatched; if (chrgText) { chrgText->cpMin = nStart; @@ -1867,7 +1866,6 @@ ME_FindText(ME_TextEditor *editor, DWORD flags, const CHARRANGE *chrg, const WCH pCurItem = ME_FindItemBack(pCurItem, diRun); /* Don't care about pCurItem becoming NULL here; it's already taken * care of in the exterior loop condition */ - para = ME_GetParagraph(pCurItem); nCurEnd = ME_StrLen(pCurItem->member.run.strText) + nMatched; } } @@ -2680,7 +2678,7 @@ ME_TextEditor *ME_MakeEditor(ITextHost *texthost, BOOL bEmulateVersion10) ed->bHideSelection = FALSE; ed->pfnWordBreak = NULL; ed->lpOleCallback = NULL; - ed->mode = TM_RICHTEXT | TM_MULTILEVELUNDO | TM_MULTICODEPAGE; + ed->mode = TM_MULTILEVELUNDO | TM_MULTICODEPAGE; ed->mode |= (props & TXTBIT_RICHTEXT) ? TM_RICHTEXT : TM_PLAINTEXT; ed->AutoURLDetect_bEnable = FALSE; ed->bHaveFocus = FALSE; @@ -2999,7 +2997,6 @@ LRESULT ME_HandleMessage(ME_TextEditor *editor, UINT msg, WPARAM wParam, UNSUPPORTED_MSG(EM_SETIMESTATUS) UNSUPPORTED_MSG(EM_GETLANGOPTIONS) UNSUPPORTED_MSG(EM_GETREDONAME) - UNSUPPORTED_MSG(EM_GETTEXTMODE) UNSUPPORTED_MSG(EM_GETTYPOGRAPHYOPTIONS) UNSUPPORTED_MSG(EM_GETUNDONAME) UNSUPPORTED_MSG(EM_GETWORDBREAKPROCEX) @@ -4290,6 +4287,8 @@ LRESULT ME_HandleMessage(ME_TextEditor *editor, UINT msg, WPARAM wParam, editor->pfnWordBreak = (EDITWORDBREAKPROCW)lParam; return (LRESULT)pfnOld; } + case EM_GETTEXTMODE: + return editor->mode; case EM_SETTEXTMODE: { LRESULT ret; @@ -4332,14 +4331,23 @@ LRESULT ME_HandleMessage(ME_TextEditor *editor, UINT msg, WPARAM wParam, if (wParam == 0) { BOOL new = (lParam == 0); - if (editor->bWordWrap != new) + if (editor->nAvailWidth || editor->bWordWrap != new) { editor->bWordWrap = new; + editor->nAvailWidth = 0; /* wrap to client area */ + ME_RewrapRepaint(editor); + } + } else { + int width = max(0, lParam); + if (!editor->bWordWrap || editor->nAvailWidth != width) + { + editor->nAvailWidth = width; + editor->bWordWrap = TRUE; ME_RewrapRepaint(editor); } + FIXME("EM_SETTARGETDEVICE doesn't use non-NULL target devices\n"); } - else FIXME("Unsupported yet non NULL device in EM_SETTARGETDEVICE\n"); - break; + return TRUE; default: do_default: *phresult = S_FALSE; diff --git a/dlls/riched20/editstr.h b/dlls/riched20/editstr.h index a6450753712..63ef7f97277 100644 --- a/dlls/riched20/editstr.h +++ b/dlls/riched20/editstr.h @@ -342,6 +342,7 @@ typedef struct tagME_TextEditor SIZE sizeWindow; int nTotalLength, nLastTotalLength; int nTotalWidth, nLastTotalWidth; + int nAvailWidth; /* 0 = wrap to client area, else wrap width in twips */ int nUDArrowX; int nSequence; COLORREF rgbBackColor; @@ -396,6 +397,7 @@ typedef struct tagME_Context RECT rcView; HBRUSH hbrMargin; SIZE dpi; + int nAvailWidth; /* those are valid inside ME_WrapTextParagraph and related */ POINT ptFirstRun; @@ -413,9 +415,9 @@ typedef struct tagME_WrapContext POINT pt; BOOL bOverflown, bWordWrap; ME_DisplayItem *pRowStart; - + ME_DisplayItem *pLastSplittableRun; POINT ptLastSplittableRun; -} ME_WrapContext; +} ME_WrapContext; #endif diff --git a/dlls/riched20/tests/editor.c b/dlls/riched20/tests/editor.c index 29d3124ec3a..f8da3faf109 100644 --- a/dlls/riched20/tests/editor.c +++ b/dlls/riched20/tests/editor.c @@ -5939,12 +5939,12 @@ static void test_word_wrap(void) /* Test the effect of EM_SETTARGETDEVICE on word wrap. */ res = SendMessage(hwnd, EM_SETTARGETDEVICE, 0, 1); - todo_wine ok(res, "EM_SETTARGETDEVICE failed (returned %d).\n", res); + ok(res, "EM_SETTARGETDEVICE failed (returned %d).\n", res); pos = SendMessage(hwnd, EM_CHARFROMPOS, 0, (LPARAM) &point); ok(!pos, "pos=%d indicating word wrap when none is expected.\n", pos); res = SendMessage(hwnd, EM_SETTARGETDEVICE, 0, 0); - todo_wine ok(res, "EM_SETTARGETDEVICE failed (returned %d).\n", res); + ok(res, "EM_SETTARGETDEVICE failed (returned %d).\n", res); pos = SendMessage(hwnd, EM_CHARFROMPOS, 0, (LPARAM) &point); ok(pos, "pos=%d indicating no word wrap when it is expected.\n", pos); DestroyWindow(hwnd); diff --git a/dlls/riched20/wrap.c b/dlls/riched20/wrap.c index 4edbbb2d849..a2da5ebdd3c 100644 --- a/dlls/riched20/wrap.c +++ b/dlls/riched20/wrap.c @@ -77,7 +77,7 @@ static void ME_BeginRow(ME_WrapContext *wc, ME_DisplayItem *para) - (wc->nRow ? wc->nLeftMargin : wc->nFirstMargin) - wc->nRightMargin; wc->bWordWrap = TRUE; } else { - wc->nAvailWidth = wc->context->rcView.right - wc->context->rcView.left + wc->nAvailWidth = wc->context->nAvailWidth - (wc->nRow ? wc->nLeftMargin : wc->nFirstMargin) - wc->nRightMargin; } wc->pt.x = wc->context->pt.x; diff --git a/dlls/riched32/tests/editor.c b/dlls/riched32/tests/editor.c index ac98d16518e..6216001afd1 100644 --- a/dlls/riched32/tests/editor.c +++ b/dlls/riched32/tests/editor.c @@ -450,6 +450,10 @@ static void test_EM_LINELENGTH(void) SendMessage(hwndRichEdit, WM_SETTEXT, 0, (LPARAM) text); result = SendMessage(hwndRichEdit, EM_GETLINECOUNT, 0, 0); + if (result == 4) { + win_skip("Win9x, WinME and NT4 don't handle '\\r only' correctly\n"); + return; + } ok(result == 9, "Incorrect line count of %ld\n", result); for (i = 0; i < sizeof(offset_test)/sizeof(offset_test[0]); i++) { @@ -672,15 +676,8 @@ static void run_tests_EM_FINDTEXT(HWND hwnd, const char *name, struct find_s *fi int i; for (i = 0; i < num_tests; i++) { - if (*name == '3' && i == 0) { - todo_wine { - check_EM_FINDTEXT(hwnd, name, &find[i], i); - check_EM_FINDTEXTEX(hwnd, name, &find[i], i); - } - } else { - check_EM_FINDTEXT(hwnd, name, &find[i], i); - check_EM_FINDTEXTEX(hwnd, name, &find[i], i); - } + check_EM_FINDTEXT(hwnd, name, &find[i], i); + check_EM_FINDTEXTEX(hwnd, name, &find[i], i); } } @@ -897,12 +894,12 @@ static void test_word_wrap(void) /* Test the effect of EM_SETTARGETDEVICE on word wrap. */ res = SendMessage(hwnd, EM_SETTARGETDEVICE, 0, 1); - todo_wine ok(res, "EM_SETTARGETDEVICE failed (returned %d).\n", res); + ok(res, "EM_SETTARGETDEVICE failed (returned %d).\n", res); pos = SendMessage(hwnd, EM_CHARFROMPOS, 0, (LPARAM) &point); ok(!pos, "pos=%d indicating word wrap when none is expected.\n", pos); res = SendMessage(hwnd, EM_SETTARGETDEVICE, 0, 0); - todo_wine ok(res, "EM_SETTARGETDEVICE failed (returned %d).\n", res); + ok(res, "EM_SETTARGETDEVICE failed (returned %d).\n", res); pos = SendMessage(hwnd, EM_CHARFROMPOS, 0, (LPARAM) &point); ok(pos, "pos=%d indicating no word wrap when it is expected.\n", pos); DestroyWindow(hwnd); diff --git a/dlls/rpcrt4/ndr_ole.c b/dlls/rpcrt4/ndr_ole.c index 729ab0b9f1e..a3264e70122 100644 --- a/dlls/rpcrt4/ndr_ole.c +++ b/dlls/rpcrt4/ndr_ole.c @@ -354,7 +354,7 @@ void WINAPI NdrInterfacePointerFree(PMIDL_STUB_MESSAGE pStubMsg, /*********************************************************************** * NdrOleAllocate [RPCRT4.@] */ -void * WINAPI NdrOleAllocate(size_t Size) +void * WINAPI NdrOleAllocate(SIZE_T Size) { if (!LoadCOM()) return NULL; return COM_MemAlloc(Size); diff --git a/dlls/rpcrt4/rpc_epmap.c b/dlls/rpcrt4/rpc_epmap.c index 36170dcb554..8547eaa753b 100644 --- a/dlls/rpcrt4/rpc_epmap.c +++ b/dlls/rpcrt4/rpc_epmap.c @@ -596,7 +596,7 @@ RPC_STATUS WINAPI TowerConstruct( return RPC_S_OK; } -void __RPC_FAR * __RPC_USER MIDL_user_allocate(size_t len) +void __RPC_FAR * __RPC_USER MIDL_user_allocate(SIZE_T len) { return HeapAlloc(GetProcessHeap(), 0, len); } diff --git a/dlls/rpcrt4/tests/cstub.c b/dlls/rpcrt4/tests/cstub.c index c2531eed8b9..88bf0e5a3c1 100644 --- a/dlls/rpcrt4/tests/cstub.c +++ b/dlls/rpcrt4/tests/cstub.c @@ -48,7 +48,7 @@ static GUID IID_if4 = {0x1234567b, 1234, 5678, {12,34,56,78,90,0xab,0xcd,0xef}}; static int my_alloc_called; static int my_free_called; -static void * CALLBACK my_alloc(size_t size) +static void * CALLBACK my_alloc(SIZE_T size) { my_alloc_called++; return NdrOleAllocate(size); diff --git a/dlls/rpcrt4/tests/ndr_marshall.c b/dlls/rpcrt4/tests/ndr_marshall.c index cba135a3d47..0139e5dfe88 100644 --- a/dlls/rpcrt4/tests/ndr_marshall.c +++ b/dlls/rpcrt4/tests/ndr_marshall.c @@ -36,7 +36,7 @@ static int my_alloc_called; static int my_free_called; -static void * CALLBACK my_alloc(size_t size) +static void * CALLBACK my_alloc(SIZE_T size) { my_alloc_called++; return NdrOleAllocate(size); diff --git a/dlls/rpcrt4/tests/server.c b/dlls/rpcrt4/tests/server.c index 9f39f01115d..b48eda2751b 100644 --- a/dlls/rpcrt4/tests/server.c +++ b/dlls/rpcrt4/tests/server.c @@ -51,7 +51,7 @@ static void InitFunctionPointers(void) } void __RPC_FAR *__RPC_USER -midl_user_allocate(size_t n) +midl_user_allocate(SIZE_T n) { return malloc(n); } diff --git a/dlls/rsaenh/handle.c b/dlls/rsaenh/handle.c index 0773813caa0..672c296096c 100644 --- a/dlls/rsaenh/handle.c +++ b/dlls/rsaenh/handle.c @@ -44,10 +44,7 @@ WINE_DEFAULT_DEBUG_CHANNEL(handle); * lpTable [I] Pointer to the HANDLETABLE structure, which is to be initalized. * * NOTES - * Note that alloc_handle_table calls init_handle_table on it's own, which - * means that you only have to call init_handle_table, if you use a global - * variable of type HANDLETABLE for your handle table. However, in this - * case you have to call destroy_handle_table when you don't need the table + * You have to call destroy_handle_table when you don't need the table * any more. */ void init_handle_table(HANDLETABLE *lpTable) @@ -68,9 +65,6 @@ void init_handle_table(HANDLETABLE *lpTable) * * PARAMS * lpTable [I] Pointer to the handle table, which is to be destroyed. - * - * NOTES - * Note that release_handle_table takes care of this. */ void destroy_handle_table(HANDLETABLE *lpTable) { @@ -124,82 +118,6 @@ exit: } /****************************************************************************** - * release_all_handles - * - * Releases all valid handles in the given handle table and shrinks the table - * to zero size. - * - * PARAMS - * lpTable [I] The table of which all valid handles shall be released. - */ -static void release_all_handles(HANDLETABLE *lpTable) -{ - unsigned int i; - - TRACE("(lpTable=%p)\n", lpTable); - - EnterCriticalSection(&lpTable->mutex); - for (i=0; iiEntries; i++) - if (lpTable->paEntries[i].pObject) - release_handle(lpTable, lpTable->paEntries[i].pObject->dwType, INDEX2HANDLE(i)); - LeaveCriticalSection(&lpTable->mutex); -} - -/****************************************************************************** - * alloc_handle_table - * - * Allocates a new handle table - * - * PARAMS - * lplpTable [O] Pointer to the variable, to which the pointer to the newly - * allocated handle table is written. - * RETURNS - * non zero, if successful - * zero, if not successful (out of process heap memory) - * - * NOTES - * If all you need is a single handle table, you may as well declare a global - * variable of type HANDLETABLE and call init_handle_table on your own. - */ -int alloc_handle_table(HANDLETABLE **lplpTable) -{ - TRACE("(lplpTable=%p)\n", lplpTable); - - *lplpTable = HeapAlloc(GetProcessHeap(), 0, sizeof(HANDLETABLE)); - if (*lplpTable) - { - init_handle_table(*lplpTable); - return 1; - } - else - return 0; -} - -/****************************************************************************** - * release_handle_table - * - * Releases a handle table and frees the resources it used. - * - * PARAMS - * lpTable [I] Pointer to the handle table, which is to be released. - * - * RETURNS - * non zero, if successful - * zero, if not successful - * - * NOTES - * All valid handles still in the table are released also. - */ -int release_handle_table(HANDLETABLE *lpTable) -{ - TRACE("(lpTable=%p)\n", lpTable); - - release_all_handles(lpTable); - destroy_handle_table(lpTable); - return HeapFree(GetProcessHeap(), 0, lpTable); -} - -/****************************************************************************** * grow_handle_table [Internal] * * Grows the number of entries in the given table by TABLE_SIZE_INCREMENT diff --git a/dlls/rsaenh/handle.h b/dlls/rsaenh/handle.h index d17afad2eb2..1d7b927b96a 100644 --- a/dlls/rsaenh/handle.h +++ b/dlls/rsaenh/handle.h @@ -56,9 +56,7 @@ typedef struct tagHANDLETABLE CRITICAL_SECTION mutex; } HANDLETABLE; -int alloc_handle_table (HANDLETABLE **lplpTable); void init_handle_table (HANDLETABLE *lpTable); -int release_handle_table(HANDLETABLE *lpTable); void destroy_handle_table(HANDLETABLE *lpTable); int release_handle (HANDLETABLE *lpTable, HCRYPTKEY handle, DWORD dwType); int copy_handle (HANDLETABLE *lpTable, HCRYPTKEY handle, DWORD dwType, HCRYPTKEY *copy); diff --git a/dlls/rsaenh/tests/rsaenh.c b/dlls/rsaenh/tests/rsaenh.c index ad53c729f7d..8e12b2a7d3e 100644 --- a/dlls/rsaenh/tests/rsaenh.c +++ b/dlls/rsaenh/tests/rsaenh.c @@ -2033,8 +2033,12 @@ static void test_null_provider(void) uniquecontainer(container); todo_wine { - ok(dataLen == strlen(container)+1, "Expected a param length of 70, got %d\n", dataLen); - ok(!strcmp(container, szName), "Wrong container name : %s\n", szName); + ok(dataLen == strlen(container)+1 || + broken(dataLen == strlen(szContainer)+1) /* WinME */, + "Expected a param length of 70, got %d\n", dataLen); + ok(!strcmp(container, szName) || + broken(!strcmp(szName, szContainer)) /* WinME */, + "Wrong container name : %s\n", szName); } } result = CryptGetUserKey(prov, AT_KEYEXCHANGE, &key); diff --git a/dlls/sane.ds/ds_ctrl.c b/dlls/sane.ds/ds_ctrl.c index dbd3f3eded7..2c8d3126aca 100644 --- a/dlls/sane.ds/ds_ctrl.c +++ b/dlls/sane.ds/ds_ctrl.c @@ -101,9 +101,24 @@ TW_UINT16 SANE_CapabilityGetDefault (pTW_IDENTITY pOrigin, TW_MEMREF pData) TW_UINT16 SANE_CapabilityQuerySupport (pTW_IDENTITY pOrigin, TW_MEMREF pData) { - FIXME ("stub!\n"); + TW_UINT16 twRC = TWRC_SUCCESS, twCC = TWCC_SUCCESS; + pTW_CAPABILITY pCapability = (pTW_CAPABILITY) pData; - return TWRC_FAILURE; + TRACE("DG_CONTROL/DAT_CAPABILITY/MSG_QUERYSUPPORT\n"); + + if (activeDS.currentState < 4 || activeDS.currentState > 7) + { + twRC = TWRC_FAILURE; + activeDS.twCC = TWCC_SEQERROR; + } + else + { + twCC = SANE_SaneCapability (pCapability, MSG_QUERYSUPPORT); + twRC = (twCC == TWCC_SUCCESS)?TWRC_SUCCESS:TWRC_FAILURE; + activeDS.twCC = twCC; + } + + return twRC; } /* DG_CONTROL/DAT_CAPABILITY/MSG_RESET */ diff --git a/dlls/secur32/tests/secur32.c b/dlls/secur32/tests/secur32.c index 39edeeab3fe..27e07fbd0b2 100644 --- a/dlls/secur32/tests/secur32.c +++ b/dlls/secur32/tests/secur32.c @@ -102,9 +102,15 @@ static void test_InitSecurityInterface(void) sftA = pInitSecurityInterfaceA(); ok(sftA != NULL, "pInitSecurityInterfaceA failed\n"); ok(sftA->dwVersion == SECURITY_SUPPORT_PROVIDER_INTERFACE_VERSION, "wrong dwVersion %d in security function table\n", sftA->dwVersion); - ok(!sftA->Reserved2, "Reserved2 should be NULL instead of %p in security function table\n", sftA->Reserved2); - ok(sftA->Reserved3 == sftA->EncryptMessage, "Reserved3 should be equal to EncryptMessage in the security function table\n"); - ok(sftA->Reserved4 == sftA->DecryptMessage, "Reserved4 should be equal to DecryptMessage in the security function table\n"); + ok(!sftA->Reserved2 || broken(sftA->Reserved2 != NULL) /* WinME */, + "Reserved2 should be NULL instead of %p in security function table\n", + sftA->Reserved2); + ok(sftA->Reserved3 == sftA->EncryptMessage || + broken(sftA->Reserved3 != sftA->EncryptMessage) /* Win9x */, + "Reserved3 should be equal to EncryptMessage in the security function table\n"); + ok(sftA->Reserved4 == sftA->DecryptMessage || + broken(sftA->Reserved4 != sftA->DecryptMessage) /* Win9x */, + "Reserved4 should be equal to DecryptMessage in the security function table\n"); if (!pInitSecurityInterfaceW) { diff --git a/dlls/setupapi/tests/parser.c b/dlls/setupapi/tests/parser.c index ddfd0f29a81..0aa78c12d53 100644 --- a/dlls/setupapi/tests/parser.c +++ b/dlls/setupapi/tests/parser.c @@ -439,6 +439,11 @@ static void test_key_names(void) !strcmp( field, A1200), /* Vista, W2K8 */ "line %u: bad field %s/%s\n", i, field, key_names[i].fields[index] ); + else /* don't compare drive letter of paths */ + if (field[0] && field[1] == ':' && field[2] == '\\') + ok( !strcmp( field + 1, key_names[i].fields[index] + 1 ), + "line %u: bad field %s/%s\n", + i, field, key_names[i].fields[index] ); else ok( !strcmp( field, key_names[i].fields[index] ), "line %u: bad field %s/%s\n", i, field, key_names[i].fields[index] ); @@ -584,18 +589,18 @@ static void test_SetupGetIntField(void) retb = SetupGetIntField( &context, keys[i].index, &intfield ); if ( keys[i].err == ERROR_SUCCESS ) { - ok( retb, "Expected success\n" ); + ok( retb, "%u: Expected success\n", i ); ok( GetLastError() == ERROR_SUCCESS || GetLastError() == 0xdeadbeef /* win9x, NT4 */, - "Expected ERROR_SUCCESS or 0xdeadbeef, got %u\n", GetLastError() ); + "%u: Expected ERROR_SUCCESS or 0xdeadbeef, got %u\n", i, GetLastError() ); } else { - ok( !retb, "Expected failure\n" ); + ok( !retb, "%u: Expected failure\n", i ); ok( GetLastError() == keys[i].err, - "Expected %d, got %u\n", keys[i].err, GetLastError() ); + "%u: Expected %d, got %u\n", i, keys[i].err, GetLastError() ); } - ok( intfield == keys[i].value, "Expected %d, got %d\n", keys[i].value, intfield ); + ok( intfield == keys[i].value, "%u: Expected %d, got %d\n", i, keys[i].value, intfield ); SetupCloseInfFile( hinf ); } diff --git a/dlls/shdocvw/oleobject.c b/dlls/shdocvw/oleobject.c index 198ff2a7d0f..a38d03d0e22 100644 --- a/dlls/shdocvw/oleobject.c +++ b/dlls/shdocvw/oleobject.c @@ -718,6 +718,11 @@ static HRESULT WINAPI OleControl_OnAmbientPropertyChange(IOleControl *iface, DIS TRACE("(%p)->(%d)\n", This, dispID); switch(dispID) { + case DISPID_UNKNOWN: + /* Unknown means multiple properties changed, so check them all. + * BUT the Webbrowser OleControl object doesnt appear to do this. + */ + return S_OK; case DISPID_AMBIENT_OFFLINEIFNOTCONNECTED: return on_offlineconnected_change(This); case DISPID_AMBIENT_SILENT: diff --git a/dlls/shdocvw/tests/webbrowser.c b/dlls/shdocvw/tests/webbrowser.c index 5b041195823..64c5bab2f6f 100644 --- a/dlls/shdocvw/tests/webbrowser.c +++ b/dlls/shdocvw/tests/webbrowser.c @@ -69,6 +69,9 @@ DEFINE_GUID(GUID_NULL,0,0,0,0,0,0,0,0,0,0,0); expect_ ## func = called_ ## func = FALSE; \ }while(0) +#define CLEAR_CALLED(func) \ + expect_ ## func = called_ ## func = FALSE + DEFINE_EXPECT(GetContainer); DEFINE_EXPECT(Site_GetWindow); DEFINE_EXPECT(ShowObject); @@ -1773,6 +1776,35 @@ static void test_Offline(IWebBrowser2 *wb, IOleControl *control, BOOL is_clients ok(b == VARIANT_FALSE, "b=%x\n", b); } +static void test_ambient_unknown(IWebBrowser2 *wb, IOleControl *control, BOOL is_clientsite) +{ + HRESULT hres; + + SET_EXPECT(Invoke_AMBIENT_OFFLINEIFNOTCONNECTED); + SET_EXPECT(Invoke_AMBIENT_SILENT); + SET_EXPECT(Invoke_AMBIENT_USERMODE); + SET_EXPECT(Invoke_AMBIENT_DLCONTROL); + SET_EXPECT(Invoke_AMBIENT_USERAGENT); + SET_EXPECT(Invoke_AMBIENT_PALETTE); + + hres = IOleControl_OnAmbientPropertyChange(control, DISPID_UNKNOWN); + ok(hres == S_OK, "OnAmbientPropertyChange failed %08x\n", hres); + + CHECK_EXPECT(Invoke_AMBIENT_OFFLINEIFNOTCONNECTED); + CHECK_EXPECT(Invoke_AMBIENT_SILENT); + CHECK_EXPECT(Invoke_AMBIENT_USERMODE); + CHECK_EXPECT(Invoke_AMBIENT_DLCONTROL); + CHECK_EXPECT(Invoke_AMBIENT_USERAGENT); + CHECK_EXPECT(Invoke_AMBIENT_PALETTE); + + CLEAR_CALLED(Invoke_AMBIENT_OFFLINEIFNOTCONNECTED); + CLEAR_CALLED(Invoke_AMBIENT_SILENT); + CLEAR_CALLED(Invoke_AMBIENT_USERMODE); + CLEAR_CALLED(Invoke_AMBIENT_DLCONTROL); + CLEAR_CALLED(Invoke_AMBIENT_USERAGENT); + CLEAR_CALLED(Invoke_AMBIENT_PALETTE); +} + static void test_wb_funcs(IUnknown *unk, BOOL is_clientsite) { IWebBrowser2 *wb; @@ -1787,6 +1819,7 @@ static void test_wb_funcs(IUnknown *unk, BOOL is_clientsite) test_Silent(wb, control, is_clientsite); test_Offline(wb, control, is_clientsite); + test_ambient_unknown(wb, control, is_clientsite); IWebBrowser_Release(wb); IOleControl_Release(control); diff --git a/dlls/shell32/shlexec.c b/dlls/shell32/shlexec.c index 8a656364387..1fbaabb2e37 100644 --- a/dlls/shell32/shlexec.c +++ b/dlls/shell32/shlexec.c @@ -935,6 +935,8 @@ static UINT_PTR execute_from_key(LPCWSTR key, LPCWSTR lpFile, WCHAR *env, LPCWST /* Is there a replace() function anywhere? */ cmdlen /= sizeof(WCHAR); + if (cmdlen >= sizeof(cmd)/sizeof(WCHAR)) + cmdlen = sizeof(cmd)/sizeof(WCHAR)-1; cmd[cmdlen] = '\0'; SHELL_ArgifyW(param, sizeof(param)/sizeof(WCHAR), cmd, lpFile, psei->lpIDList, szCommandline, &resultLen); if (resultLen > sizeof(param)/sizeof(WCHAR)) diff --git a/dlls/shell32/tests/shellpath.c b/dlls/shell32/tests/shellpath.c index 7c7cc524f45..71c236bcbbf 100644 --- a/dlls/shell32/tests/shellpath.c +++ b/dlls/shell32/tests/shellpath.c @@ -19,9 +19,6 @@ * This is a test program for the SHGet{Special}Folder{Path|Location} functions * of shell32, that get either a filesystem path or a LPITEMIDLIST (shell * namespace) path for a given folder (CSIDL value). - * - * FIXME: - * - Need to verify on more systems. */ #define COBJMACROS @@ -74,9 +71,9 @@ static GUID CLSID_CommonDocuments = { 0x0000000c, 0x0000, 0x0000, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x74, 0x1a } }; struct shellExpectedValues { - int folder; - BYTE pidlType; - BYTE altPidlType; + int folder; + int numTypes; + const BYTE *types; }; static HRESULT (WINAPI *pDllGetVersion)(DLLVERSIONINFO *); @@ -90,75 +87,85 @@ static int (WINAPI *pSHFileOperationA)(LPSHFILEOPSTRUCTA); static HRESULT (WINAPI *pSHGetMalloc)(LPMALLOC *); static DLLVERSIONINFO shellVersion = { 0 }; static LPMALLOC pMalloc; +static const BYTE guidType[] = { PT_GUID }; +static const BYTE controlPanelType[] = { PT_SHELLEXT, PT_GUID }; +static const BYTE folderType[] = { PT_FOLDER }; +static const BYTE favoritesType[] = { PT_FOLDER, 0 }; +static const BYTE folderOrSpecialType[] = { PT_FOLDER, PT_IESPECIAL2 }; +static const BYTE personalType[] = { PT_FOLDER, PT_GUID, PT_DRIVE, 0xff /* Win9x */ }; +/* FIXME: don't know the type of 0x71 returned by Vista/2008 for printers */ +static const BYTE printersType[] = { PT_YAGUID, PT_SHELLEXT, 0x71 }; +static const BYTE ieSpecialType[] = { PT_IESPECIAL2 }; +static const BYTE shellExtType[] = { PT_SHELLEXT }; +static const BYTE workgroupType[] = { PT_WORKGRP }; +#define DECLARE_TYPE(x, y) { x, sizeof(y) / sizeof(y[0]), y } static const struct shellExpectedValues requiredShellValues[] = { - { CSIDL_BITBUCKET, PT_GUID, 0 }, - { CSIDL_CONTROLS, PT_SHELLEXT, PT_GUID }, - { CSIDL_COOKIES, PT_FOLDER, 0 }, - { CSIDL_DESKTOPDIRECTORY, PT_FOLDER, 0 }, - { CSIDL_DRIVES, PT_GUID, 0 }, -/* Note that 0 is an expected type for CSIDL_FAVORITES. Inverting the order - * will cause the test to fail, as it'll only check for PT_FOLDER. - */ - { CSIDL_FAVORITES, 0, PT_FOLDER }, - { CSIDL_FONTS, PT_FOLDER, PT_IESPECIAL2 }, + DECLARE_TYPE(CSIDL_BITBUCKET, guidType), + DECLARE_TYPE(CSIDL_CONTROLS, controlPanelType), + DECLARE_TYPE(CSIDL_COOKIES, folderType), + DECLARE_TYPE(CSIDL_DESKTOPDIRECTORY, folderType), + DECLARE_TYPE(CSIDL_DRIVES, guidType), + DECLARE_TYPE(CSIDL_FAVORITES, favoritesType), + DECLARE_TYPE(CSIDL_FONTS, folderOrSpecialType), /* FIXME: the following fails in Wine, returns type PT_FOLDER - { CSIDL_HISTORY, PT_IESPECIAL2, 0 }, + DECLARE_TYPE(CSIDL_HISTORY, ieSpecialType), */ - { CSIDL_INTERNET, PT_GUID, 0 }, - { CSIDL_NETHOOD, PT_FOLDER, 0 }, - { CSIDL_NETWORK, PT_GUID, 0 }, -/* FIXME: don't know the type of 0x71 returned by Vista/2008 for printers */ - { CSIDL_PRINTERS, PT_YAGUID, 0x71 }, - { CSIDL_PRINTHOOD, PT_FOLDER, 0 }, - { CSIDL_PROGRAMS, PT_FOLDER, 0 }, - { CSIDL_RECENT, PT_FOLDER, PT_IESPECIAL2 }, - { CSIDL_SENDTO, PT_FOLDER, 0 }, - { CSIDL_STARTMENU, PT_FOLDER, 0 }, - { CSIDL_STARTUP, PT_FOLDER, 0 }, - { CSIDL_TEMPLATES, PT_FOLDER, 0 }, + DECLARE_TYPE(CSIDL_INTERNET, guidType), + DECLARE_TYPE(CSIDL_NETHOOD, folderType), + DECLARE_TYPE(CSIDL_NETWORK, guidType), + DECLARE_TYPE(CSIDL_PERSONAL, personalType), + DECLARE_TYPE(CSIDL_PRINTERS, printersType), + DECLARE_TYPE(CSIDL_PRINTHOOD, folderType), + DECLARE_TYPE(CSIDL_PROGRAMS, folderType), + DECLARE_TYPE(CSIDL_RECENT, folderOrSpecialType), + DECLARE_TYPE(CSIDL_SENDTO, folderType), + DECLARE_TYPE(CSIDL_STARTMENU, folderType), + DECLARE_TYPE(CSIDL_STARTUP, folderType), + DECLARE_TYPE(CSIDL_TEMPLATES, folderType), }; static const struct shellExpectedValues optionalShellValues[] = { /* FIXME: the following only semi-succeed; they return NULL PIDLs on XP.. hmm. - { CSIDL_ALTSTARTUP, PT_FOLDER, 0 }, - { CSIDL_COMMON_ALTSTARTUP, PT_FOLDER, 0 }, - { CSIDL_COMMON_OEM_LINKS, PT_FOLDER, 0 }, + DECLARE_TYPE(CSIDL_ALTSTARTUP, folderType), + DECLARE_TYPE(CSIDL_COMMON_ALTSTARTUP, folderType), + DECLARE_TYPE(CSIDL_COMMON_OEM_LINKS, folderType), */ /* Windows NT-only: */ - { CSIDL_COMMON_DESKTOPDIRECTORY, PT_FOLDER, 0 }, - { CSIDL_COMMON_DOCUMENTS, PT_SHELLEXT, 0 }, - { CSIDL_COMMON_FAVORITES, PT_FOLDER, 0 }, - { CSIDL_COMMON_PROGRAMS, PT_FOLDER, 0 }, - { CSIDL_COMMON_STARTMENU, PT_FOLDER, 0 }, - { CSIDL_COMMON_STARTUP, PT_FOLDER, 0 }, - { CSIDL_COMMON_TEMPLATES, PT_FOLDER, 0 }, + DECLARE_TYPE(CSIDL_COMMON_DESKTOPDIRECTORY, folderType), + DECLARE_TYPE(CSIDL_COMMON_DOCUMENTS, shellExtType), + DECLARE_TYPE(CSIDL_COMMON_FAVORITES, folderType), + DECLARE_TYPE(CSIDL_COMMON_PROGRAMS, folderType), + DECLARE_TYPE(CSIDL_COMMON_STARTMENU, folderType), + DECLARE_TYPE(CSIDL_COMMON_STARTUP, folderType), + DECLARE_TYPE(CSIDL_COMMON_TEMPLATES, folderType), /* first appearing in shell32 version 4.71: */ - { CSIDL_APPDATA, PT_FOLDER, 0 }, + DECLARE_TYPE(CSIDL_APPDATA, folderType), /* first appearing in shell32 version 4.72: */ - { CSIDL_INTERNET_CACHE, PT_IESPECIAL2, 0 }, + DECLARE_TYPE(CSIDL_INTERNET_CACHE, ieSpecialType), /* first appearing in shell32 version 5.0: */ - { CSIDL_ADMINTOOLS, PT_FOLDER, 0 }, - { CSIDL_COMMON_APPDATA, PT_FOLDER, 0 }, - { CSIDL_LOCAL_APPDATA, PT_FOLDER, 0 }, - { OLD_CSIDL_MYDOCUMENTS, PT_FOLDER, 0 }, - { CSIDL_MYMUSIC, PT_FOLDER, 0 }, - { CSIDL_MYPICTURES, PT_FOLDER, 0 }, - { CSIDL_MYVIDEO, PT_FOLDER, 0 }, - { CSIDL_PROFILE, PT_FOLDER, 0 }, - { CSIDL_PROGRAM_FILES, PT_FOLDER, 0 }, - { CSIDL_PROGRAM_FILESX86, PT_FOLDER, 0 }, - { CSIDL_PROGRAM_FILES_COMMON, PT_FOLDER, 0 }, - { CSIDL_PROGRAM_FILES_COMMONX86, PT_FOLDER, 0 }, - { CSIDL_SYSTEM, PT_FOLDER, 0 }, - { CSIDL_WINDOWS, PT_FOLDER, 0 }, + DECLARE_TYPE(CSIDL_ADMINTOOLS, folderType), + DECLARE_TYPE(CSIDL_COMMON_APPDATA, folderType), + DECLARE_TYPE(CSIDL_LOCAL_APPDATA, folderType), + DECLARE_TYPE(OLD_CSIDL_MYDOCUMENTS, folderType), + DECLARE_TYPE(CSIDL_MYMUSIC, folderType), + DECLARE_TYPE(CSIDL_MYPICTURES, folderType), + DECLARE_TYPE(CSIDL_MYVIDEO, folderType), + DECLARE_TYPE(CSIDL_PROFILE, folderType), + DECLARE_TYPE(CSIDL_PROGRAM_FILES, folderType), + DECLARE_TYPE(CSIDL_PROGRAM_FILESX86, folderType), + DECLARE_TYPE(CSIDL_PROGRAM_FILES_COMMON, folderType), + DECLARE_TYPE(CSIDL_PROGRAM_FILES_COMMONX86, folderType), + DECLARE_TYPE(CSIDL_SYSTEM, folderType), + DECLARE_TYPE(CSIDL_WINDOWS, folderType), /* first appearing in shell32 6.0: */ - { CSIDL_CDBURN_AREA, PT_FOLDER, 0 }, - { CSIDL_COMMON_MUSIC, PT_FOLDER, 0 }, - { CSIDL_COMMON_PICTURES, PT_FOLDER, 0 }, - { CSIDL_COMMON_VIDEO, PT_FOLDER, 0 }, - { CSIDL_COMPUTERSNEARME, PT_WORKGRP, 0 }, - { CSIDL_RESOURCES, PT_FOLDER, 0 }, - { CSIDL_RESOURCES_LOCALIZED, PT_FOLDER, 0 }, + DECLARE_TYPE(CSIDL_CDBURN_AREA, folderType), + DECLARE_TYPE(CSIDL_COMMON_MUSIC, folderType), + DECLARE_TYPE(CSIDL_COMMON_PICTURES, folderType), + DECLARE_TYPE(CSIDL_COMMON_VIDEO, folderType), + DECLARE_TYPE(CSIDL_COMPUTERSNEARME, workgroupType), + DECLARE_TYPE(CSIDL_RESOURCES, folderType), + DECLARE_TYPE(CSIDL_RESOURCES_LOCALIZED, folderType), }; +#undef DECLARE_TYPE static void loadShell32(void) { @@ -419,7 +426,9 @@ static BYTE testSHGetSpecialFolderLocation(BOOL optional, int folder) pidl = NULL; hr = pSHGetSpecialFolderLocation(NULL, folder, &pidl); - ok(SUCCEEDED(hr) || optional, + ok(SUCCEEDED(hr) || optional || + broken((folder == CSIDL_COOKIES || folder == CSIDL_INTERNET) && + hr == E_INVALIDARG) /* NT4 */, "SHGetSpecialFolderLocation(NULL, %s, &pidl) failed: 0x%08x\n", getFolderName(folder), hr); if (SUCCEEDED(hr)) { @@ -474,40 +483,27 @@ static void testShellValues(const struct shellExpectedValues testEntries[], for (i = 0; i < numEntries; i++) { BYTE type; + int j; + BOOL foundTypeMatch = FALSE; if (pSHGetFolderLocation) { type = testSHGetFolderLocation(optional, testEntries[i].folder); - if (!testEntries[i].altPidlType) - ok(type == testEntries[i].pidlType || optional || - broken(type == 0xff) /* Win9x */, - "%s has type %d (0x%02x), expected %d (0x%02x)\n", - getFolderName(testEntries[i].folder), type, type, - testEntries[i].pidlType, testEntries[i].pidlType); - else - ok(type == testEntries[i].pidlType || - type == testEntries[i].altPidlType || - optional || broken(type == 0xff) /* Win9x */, - "%s has type %d (0x%02x), expected %d (0x%02x) or %d (0x%02x)\n", - getFolderName(testEntries[i].folder), type, type, - testEntries[i].pidlType, testEntries[i].pidlType, - testEntries[i].altPidlType, testEntries[i].altPidlType); + for (j = 0; !foundTypeMatch && j < testEntries[i].numTypes; j++) + if (testEntries[i].types[j] == type) + foundTypeMatch = TRUE; + ok(foundTypeMatch || optional || broken(type == 0xff) /* Win9x */, + "%s has unexpected type %d (0x%02x)\n", + getFolderName(testEntries[i].folder), type, type); } type = testSHGetSpecialFolderLocation(optional, testEntries[i].folder); - if (!testEntries[i].altPidlType) - ok(type == testEntries[i].pidlType || optional || - broken(type == 0xff) /* Win9x */, - "%s has type %d (0x%02x), expected %d (0x%02x)\n", - getFolderName(testEntries[i].folder), type, type, - testEntries[i].pidlType, testEntries[i].pidlType); - else - ok(type == testEntries[i].pidlType || - type == testEntries[i].altPidlType || - optional || broken(type == 0xff) /* Win9x */, - "%s has type %d (0x%02x), expected %d (0x%02x) or %d (0x%02x)\n", - getFolderName(testEntries[i].folder), type, type, - testEntries[i].pidlType, testEntries[i].pidlType, - testEntries[i].altPidlType, testEntries[i].altPidlType); + for (j = 0, foundTypeMatch = FALSE; !foundTypeMatch && + j < testEntries[i].numTypes; j++) + if (testEntries[i].types[j] == type) + foundTypeMatch = TRUE; + ok(foundTypeMatch || optional || broken(type == 0xff) /* Win9x */, + "%s has unexpected type %d (0x%02x)\n", + getFolderName(testEntries[i].folder), type, type); switch (type) { case PT_FOLDER: @@ -590,36 +586,10 @@ static void testDesktop(void) testSHGetSpecialFolderLocation(FALSE, CSIDL_DESKTOP); } -static void testPersonal(void) -{ - BYTE type; - - /* The pidl may be a real folder, or a virtual directory, or a drive if the - * home directory is set to the root directory of a drive. - */ - if (pSHGetFolderLocation) - { - type = testSHGetFolderLocation(FALSE, CSIDL_PERSONAL); - ok(type == PT_FOLDER || type == PT_GUID || type == PT_DRIVE || - broken(type == 0xff) /* Win9x */, - "CSIDL_PERSONAL returned invalid type 0x%02x, " - "expected PT_FOLDER or PT_GUID or PT_DRIVE\n", type); - if (type == PT_FOLDER) - testSHGetFolderPath(FALSE, CSIDL_PERSONAL); - } - type = testSHGetSpecialFolderLocation(FALSE, CSIDL_PERSONAL); - ok(type == PT_FOLDER || type == PT_GUID || type == PT_DRIVE, - "CSIDL_PERSONAL returned invalid type 0x%02x, " - "expected PT_FOLDER or PT_GUID\n", type); - if (type == PT_FOLDER) - testSHGetSpecialFolderPath(FALSE, CSIDL_PERSONAL); -} - /* Checks the PIDL type of all the known values. */ static void testPidlTypes(void) { testDesktop(); - testPersonal(); testShellValues(requiredShellValues, ARRAY_SIZE(requiredShellValues), FALSE); testShellValues(optionalShellValues, ARRAY_SIZE(optionalShellValues), @@ -696,8 +666,8 @@ static void testWinDir(void) } } -/* Verifies the shell path for CSIDL_SYSTEM and CSIDL_SYSTEMX86 matches the - * return from GetSystemDirectory. If SHGetSpecialFolderPath fails, no harm, +/* Verifies the shell path for CSIDL_SYSTEM matches the return from + * GetSystemDirectory. If SHGetSpecialFolderPath fails, no harm, * no foul--not every shell32 version supports CSIDL_SYSTEM. */ static void testSystemDir(void) @@ -715,16 +685,10 @@ static void testSystemDir(void) "GetSystemDirectory returns %s SHGetSpecialFolderPath returns %s\n", systemDir, systemShellPath); } - /* check CSIDL_SYSTEMX86; note that this isn't always present, so don't - * worry if it fails + /* CSIDL_SYSTEMX86 isn't checked in the same way, since it's different + * on Win64 (and non-x86 Windows systems, if there are any still in + * existence) than on Win32. */ - if (pSHGetSpecialFolderPathA(NULL, systemShellPath, CSIDL_SYSTEMX86, FALSE)) - { - myPathRemoveBackslashA(systemShellPath); - ok(!lstrcmpiA(systemDir, systemShellPath), - "GetSystemDirectory returns %s SHGetSpecialFolderPath returns %s\n", - systemDir, systemShellPath); - } } /* Globals used by subprocesses */ diff --git a/dlls/shell32/tests/shlfolder.c b/dlls/shell32/tests/shlfolder.c index 9d563e05d38..b8a78f80003 100644 --- a/dlls/shell32/tests/shlfolder.c +++ b/dlls/shell32/tests/shlfolder.c @@ -96,7 +96,7 @@ static void test_ParseDisplayName(void) hr = IShellFolder_ParseDisplayName(IDesktopFolder, NULL, NULL, cTestDirW, NULL, &newPIDL, 0); todo_wine ok((SUCCEEDED(hr) || broken(hr == E_FAIL) /* NT4 */), - "ParseDisplayName returned %08x, expected SUCCESS or E_FAIL \n", hr); + "ParseDisplayName returned %08x, expected SUCCESS or E_FAIL\n", hr); if (SUCCEEDED(hr)) { ok(pILFindLastID(newPIDL)->mkid.abID[0] == 0x61, "Last pidl should be of type " @@ -108,7 +108,7 @@ static void test_ParseDisplayName(void) hr = IShellFolder_ParseDisplayName(IDesktopFolder, NULL, NULL, cTestDirW, NULL, &newPIDL, 0); todo_wine ok((SUCCEEDED(hr) || broken(hr == E_FAIL) /* NT4 */), - "ParseDisplayName returned %08x, expected SUCCESS or E_FAIL \n", hr); + "ParseDisplayName returned %08x, expected SUCCESS or E_FAIL\n", hr); if (SUCCEEDED(hr)) { ok(pILFindLastID(newPIDL)->mkid.abID[0] == 0x61, "Last pidl should be of type " diff --git a/dlls/twain_32/tests/dsm.c b/dlls/twain_32/tests/dsm.c index 278ea7cd4ee..78b4c852a57 100644 --- a/dlls/twain_32/tests/dsm.c +++ b/dlls/twain_32/tests/dsm.c @@ -57,6 +57,217 @@ static void get_condition_code(TW_IDENTITY *appid, TW_IDENTITY *source, TW_STATU ok(rc == TWRC_SUCCESS, "Condition code not available, rc %d\n", rc); } +static BOOL get_onevalue(TW_HANDLE hcontainer, TW_UINT32 *ret, TW_UINT16 *type) +{ + TW_ONEVALUE *onev; + onev = GlobalLock(hcontainer); + if (onev) + { + *ret = onev->Item; + if (type) + *type = onev->ItemType; + GlobalUnlock(hcontainer); + return TRUE; + } + return FALSE; +} + +static TW_HANDLE alloc_and_set_onevalue(TW_UINT32 val, TW_UINT16 type) +{ + TW_HANDLE hcontainer; + TW_ONEVALUE *onev; + hcontainer = GlobalAlloc(0, sizeof(*onev)); + if (hcontainer) + { + onev = GlobalLock(hcontainer); + if (onev) + { + onev->ItemType = type; + onev->Item = val; + GlobalUnlock(hcontainer); + } + else + { + GlobalFree(hcontainer); + hcontainer = 0; + } + } + return hcontainer; +} + +static void check_get(TW_CAPABILITY *pCapability, + TW_UINT32 orig_value, TW_UINT32 default_value, TW_UINT32 *suggested_set_value) +{ + void *p; + if (suggested_set_value) + *suggested_set_value = orig_value + 1; + p = GlobalLock(pCapability->hContainer); + if (p) + { + if (pCapability->ConType == TWON_ONEVALUE) + { + TW_ONEVALUE *onev = (TW_ONEVALUE *) p; + ok(onev->Item == orig_value, "MSG_GET of 0x%x returned 0x%x, expecting 0x%x\n", + pCapability->Cap, onev->Item, orig_value); + } + else if (pCapability->ConType == TWON_ENUMERATION) + { + int i; + TW_UINT8 *p8; + TW_UINT16 *p16; + TW_UINT32 *p32; + TW_ENUMERATION *enumv = (TW_ENUMERATION *) p; + p8 = enumv->ItemList; + p16 = (TW_UINT16 *) p8; + p32 = (TW_UINT32 *) p8; + trace("MSG_GET of 0x%x returned %d items:\n", pCapability->Cap, enumv->NumItems); + for (i = 0; i < enumv->NumItems; i++) + { + if (enumv->ItemType == TWTY_UINT8 || enumv->ItemType == TWTY_INT8) + trace(" %d: 0x%x\n", i, p8[i]); + if (enumv->ItemType == TWTY_UINT16 || enumv->ItemType == TWTY_INT16) + trace(" %d: 0x%x\n", i, p16[i]); + if (enumv->ItemType == TWTY_UINT32 || enumv->ItemType == TWTY_INT32) + trace(" %d: 0x%x\n", i, p32[i]); + } + if (enumv->ItemType == TWTY_UINT16 || enumv->ItemType == TWTY_INT16) + { + ok(p16[enumv->CurrentIndex] == orig_value, + "Type 0x%x, values from MSG_GET (0x%x) and MSG_GETCURRENT (0x%x) do not match.\n", + pCapability->Cap, p16[enumv->CurrentIndex], orig_value); + ok(p16[enumv->DefaultIndex] == default_value, + "Type 0x%x, values from MSG_GET (0x%x) and MSG_GETDEFAULT (0x%x) do not match.\n", + pCapability->Cap, p16[enumv->DefaultIndex], default_value); + if (suggested_set_value) + *suggested_set_value = p16[(enumv->CurrentIndex + 1) % enumv->NumItems]; + } + if (enumv->ItemType == TWTY_UINT32 || enumv->ItemType == TWTY_INT32) + { + ok(p32[enumv->CurrentIndex] == orig_value, + "Type 0x%x, values from MSG_GET (0x%x) and MSG_GETCURRENT (0x%x) do not match.\n", + pCapability->Cap, p32[enumv->CurrentIndex], orig_value); + ok(p32[enumv->DefaultIndex] == default_value, + "Type 0x%x, values from MSG_GET (0x%x) and MSG_GETDEFAULT (0x%x) do not match.\n", + pCapability->Cap, p32[enumv->DefaultIndex], default_value); + if (suggested_set_value) + *suggested_set_value = p32[(enumv->CurrentIndex + 1) % enumv->NumItems]; + } + } + else + trace("MSG_GET on type 0x%x returned type 0x%x, which we didn't check.\n", pCapability->Cap, pCapability->ConType); + GlobalUnlock(pCapability->hContainer); + } +} + +static void test_onevalue_cap(TW_IDENTITY *appid, TW_IDENTITY *source, TW_UINT16 captype, TW_UINT16 type, TW_INT32 expected_support) +{ + TW_UINT16 rc; + TW_UINT16 rtype; + TW_STATUS status; + TW_CAPABILITY cap; + TW_UINT32 orig_value = 0; + TW_UINT32 new_value; + TW_UINT32 default_value = 0; + TW_INT32 actual_support; + + memset(&cap, 0, sizeof(cap)); + cap.Cap = captype; + cap.ConType = TWON_DONTCARE16; + + rc = pDSM_Entry(appid, source, DG_CONTROL, DAT_CAPABILITY, MSG_QUERYSUPPORT, &cap); + get_condition_code(appid, source, &status); + ok(rc == TWRC_SUCCESS && status.ConditionCode == TWCC_SUCCESS, + "Error [rc %d|cc %d] doing MSG_QUERYSUPPORT for type 0x%x\n", rc, status.ConditionCode, captype); + if (rc != TWRC_SUCCESS) + return; + ok(get_onevalue(cap.hContainer, (TW_UINT32 *) &actual_support, NULL), "Returned cap.hContainer invalid for QuerySupport on type 0x%x\n", captype); + ok(actual_support == expected_support, + "Error: expected support 0x%x for type 0x%x, got 0x%x\n", expected_support, + captype, actual_support); + + + if (actual_support & TWQC_GETCURRENT) + { + memset(&cap, 0, sizeof(cap)); + cap.Cap = captype; + cap.ConType = TWON_DONTCARE16; + + rc = pDSM_Entry(appid, source, DG_CONTROL, DAT_CAPABILITY, MSG_GETCURRENT, &cap); + get_condition_code(appid, source, &status); + ok(rc == TWRC_SUCCESS && status.ConditionCode == TWCC_SUCCESS, + "Error [rc %d|cc %d] doing MSG_GETCURRENT for type 0x%x\n", rc, status.ConditionCode, captype); + if (rc == TWRC_SUCCESS) + { + ok(get_onevalue(cap.hContainer, &orig_value, &rtype), "Returned cap.hContainer invalid for GETCURRENT on type 0x%x\n", captype); + ok(rtype == type, "Returned GETCURRENT type 0x%x for cap 0x%x is not expected 0x%x\n", rtype, captype, type); + GlobalFree(cap.hContainer); + } + } + + if (actual_support & TWQC_GETDEFAULT) + { + memset(&cap, 0, sizeof(cap)); + cap.Cap = captype; + cap.ConType = TWON_DONTCARE16; + + rc = pDSM_Entry(appid, source, DG_CONTROL, DAT_CAPABILITY, MSG_GETDEFAULT, &cap); + get_condition_code(appid, source, &status); + ok(rc == TWRC_SUCCESS && status.ConditionCode == TWCC_SUCCESS, + "Error [rc %d|cc %d] doing MSG_GETDEFAULT for type 0x%x\n", rc, status.ConditionCode, captype); + if (rc == TWRC_SUCCESS) + { + ok(get_onevalue(cap.hContainer, &default_value, &rtype), "Returned cap.hContainer invalid for GETDEFAULT on type 0x%x\n", captype); + ok(rtype == type, "Returned GETDEFAULT type 0x%x for cap 0x%x is not expected 0x%x\n", rtype, captype, type); + GlobalFree(cap.hContainer); + } + } + + new_value = orig_value; + if (actual_support & TWQC_GET) + { + memset(&cap, 0, sizeof(cap)); + cap.Cap = captype; + cap.ConType = TWON_DONTCARE16; + + rc = pDSM_Entry(appid, source, DG_CONTROL, DAT_CAPABILITY, MSG_GET, &cap); + get_condition_code(appid, source, &status); + ok(rc == TWRC_SUCCESS && status.ConditionCode == TWCC_SUCCESS, + "Error [rc %d|cc %d] doing MSG_GET for type 0x%x\n", rc, status.ConditionCode, captype); + check_get(&cap, orig_value, default_value, &new_value); + if (rc == TWRC_SUCCESS) + GlobalFree(cap.hContainer); + } + + if (actual_support & TWQC_SET) + { + memset(&cap, 0, sizeof(cap)); + cap.Cap = captype; + cap.ConType = TWON_ONEVALUE; + cap.hContainer = alloc_and_set_onevalue(new_value, type); + + rc = pDSM_Entry(appid, source, DG_CONTROL, DAT_CAPABILITY, MSG_SET, &cap); + get_condition_code(appid, source, &status); + ok(rc == TWRC_SUCCESS && status.ConditionCode == TWCC_SUCCESS, + "Error [rc %d|cc %d] doing MSG_SET for type 0x%x\n", rc, status.ConditionCode, captype); + GlobalFree(cap.hContainer); + } + + if (actual_support & TWQC_RESET) + { + memset(&cap, 0, sizeof(cap)); + cap.Cap = captype; + cap.ConType = TWON_DONTCARE16; + + rc = pDSM_Entry(appid, source, DG_CONTROL, DAT_CAPABILITY, MSG_RESET, &cap); + get_condition_code(appid, source, &status); + ok(rc == TWRC_SUCCESS && status.ConditionCode == TWCC_SUCCESS, + "Error [rc %d|cc %d] doing MSG_RESET for type 0x%x\n", rc, status.ConditionCode, captype); + if (rc == TWRC_SUCCESS) + GlobalFree(cap.hContainer); + } +} + + static void test_single_source(TW_IDENTITY *appid, TW_IDENTITY *source) { TW_UINT16 rc; @@ -133,6 +344,9 @@ static void test_single_source(TW_IDENTITY *appid, TW_IDENTITY *source) todo_wine ok(capabilities[ICAP_UNITS], "ICAP_UNITS not supported\n"); ok(capabilities[ICAP_XFERMECH], "ICAP_XFERMECH not supported\n"); + if (capabilities[ICAP_XFERMECH]) + test_onevalue_cap(appid, source, ICAP_XFERMECH, TWTY_UINT16, + TWQC_GET | TWQC_SET | TWQC_GETDEFAULT | TWQC_GETCURRENT | TWQC_RESET); todo_wine ok(capabilities[ICAP_XRESOLUTION], "ICAP_XRESOLUTION not supported\n"); todo_wine diff --git a/dlls/urlmon/umon.c b/dlls/urlmon/umon.c index 521cfc2d14f..bbaed5b7a2a 100644 --- a/dlls/urlmon/umon.c +++ b/dlls/urlmon/umon.c @@ -1185,7 +1185,7 @@ HRESULT WINAPI URLDownloadToCacheFileA(LPUNKNOWN lpUnkCaller, LPCSTR szURL, LPST if(szURL) { len = MultiByteToWideChar(CP_ACP, 0, szURL, -1, NULL, 0); url = heap_alloc(len*sizeof(WCHAR)); - MultiByteToWideChar(CP_ACP, 0, szURL, -1, url, -1); + MultiByteToWideChar(CP_ACP, 0, szURL, -1, url, len); } if(szFileName) diff --git a/dlls/user32/tests/class.c b/dlls/user32/tests/class.c index 7e596f0af73..f2711a41601 100644 --- a/dlls/user32/tests/class.c +++ b/dlls/user32/tests/class.c @@ -279,7 +279,7 @@ struct class_info static DWORD WINAPI thread_proc(void *param) { - struct class_info *class_info = (struct class_info *)param; + struct class_info *class_info = param; check_instance(class_info->name, class_info->inst, class_info->info_inst, class_info->gcl_inst); @@ -415,7 +415,7 @@ static void test_instances(void) cls.style = 3; ok( RegisterClassA( &cls ), "Failed to register local class for deadbeef\n" ); hwnd2 = CreateWindowExA( 0, name, "test_window", 0, 0, 0, 0, 0, 0, 0, NULL, 0 ); - ok( (HINSTANCE)GetClassLongPtrA( hwnd2, GCLP_HMODULE ) == (HINSTANCE)0xdeadbeef, + ok( GetClassLongPtrA( hwnd2, GCLP_HMODULE ) == 0xdeadbeef, "Didn't get deadbeef class for null instance\n" ); DestroyWindow( hwnd2 ); ok( UnregisterClassA( name, (HINSTANCE)0xdeadbeef ), "Unregister failed for deadbeef\n" ); @@ -592,8 +592,8 @@ static void test_builtinproc(void) HWND hwnd; int i; - pDefWindowProcA = (void *)GetProcAddress(GetModuleHandle("user32.dll"), "DefWindowProcA"); - pDefWindowProcW = (void *)GetProcAddress(GetModuleHandle("user32.dll"), "DefWindowProcW"); + pDefWindowProcA = GetProcAddress(GetModuleHandle("user32.dll"), "DefWindowProcA"); + pDefWindowProcW = GetProcAddress(GetModuleHandle("user32.dll"), "DefWindowProcW"); for (i = 0; i < 4; i++) { @@ -800,10 +800,8 @@ static BOOL RegisterTestDialog(HINSTANCE hInstance) wcx.hbrBackground = GetStockObject(WHITE_BRUSH); wcx.lpszClassName = "TestDialog"; wcx.lpszMenuName = "TestDialog"; - wcx.hIconSm = (HICON)LoadImage(hInstance, MAKEINTRESOURCE(5), - IMAGE_ICON, - GetSystemMetrics(SM_CXSMICON), - GetSystemMetrics(SM_CYSMICON), + wcx.hIconSm = LoadImage(hInstance, MAKEINTRESOURCE(5), IMAGE_ICON, + GetSystemMetrics(SM_CXSMICON), GetSystemMetrics(SM_CYSMICON), LR_DEFAULTCOLOR); atom = RegisterClassEx(&wcx); diff --git a/dlls/user32/tests/dde.c b/dlls/user32/tests/dde.c index 3598342f12d..e7f09f1b20d 100644 --- a/dlls/user32/tests/dde.c +++ b/dlls/user32/tests/dde.c @@ -736,7 +736,7 @@ static HDDEDATA CALLBACK server_ddeml_callback(UINT uType, UINT uFmt, HCONV hcon { ok(!lstrcmpA(ptr, "[BadCommand(Var)]"), "Expected '[BadCommand(Var)]', got %s\n", ptr); ok(size == 18, "Expected 18, got %d\n", size); - ret = (HDDEDATA)DDE_FNOTPROCESSED; + ret = DDE_FNOTPROCESSED; } DdeUnaccessData(hdata); diff --git a/dlls/user32/tests/listbox.c b/dlls/user32/tests/listbox.c index f05b1a4df0f..ea13dac1633 100644 --- a/dlls/user32/tests/listbox.c +++ b/dlls/user32/tests/listbox.c @@ -59,10 +59,10 @@ create_listbox (DWORD add_style, HWND parent) parent, (HMENU)ctl_id, NULL, 0); assert (handle); - SendMessage (handle, LB_ADDSTRING, 0, (LPARAM) (LPCTSTR) strings[0]); - SendMessage (handle, LB_ADDSTRING, 0, (LPARAM) (LPCTSTR) strings[1]); - SendMessage (handle, LB_ADDSTRING, 0, (LPARAM) (LPCTSTR) strings[2]); - SendMessage (handle, LB_ADDSTRING, 0, (LPARAM) (LPCTSTR) strings[3]); + SendMessage (handle, LB_ADDSTRING, 0, (LPARAM) strings[0]); + SendMessage (handle, LB_ADDSTRING, 0, (LPARAM) strings[1]); + SendMessage (handle, LB_ADDSTRING, 0, (LPARAM) strings[2]); + SendMessage (handle, LB_ADDSTRING, 0, (LPARAM) strings[3]); #ifdef VISIBLE ShowWindow (handle, SW_SHOW); diff --git a/dlls/user32/tests/menu.c b/dlls/user32/tests/menu.c index 6ee28a3c8a0..64d3b13516d 100644 --- a/dlls/user32/tests/menu.c +++ b/dlls/user32/tests/menu.c @@ -169,8 +169,8 @@ static LRESULT WINAPI menu_ownerdraw_wnd_proc(HWND hwnd, UINT msg, RECT rc; GetMenuItemRect( hwnd, (HMENU)pdis->hwndItem, pdis->itemData ,&rc); trace("WM_DRAWITEM received hwnd %p hmenu %p itemdata %ld item %d rc %d,%d-%d,%d itemrc: %d,%d-%d,%d\n", - hwnd, (HMENU)pdis->hwndItem, pdis->itemData, - pdis->itemID, pdis->rcItem.left, pdis->rcItem.top, + hwnd, pdis->hwndItem, pdis->itemData, pdis->itemID, + pdis->rcItem.left, pdis->rcItem.top, pdis->rcItem.right,pdis->rcItem.bottom, rc.left,rc.top,rc.right,rc.bottom); oldpen=SelectObject( pdis->hDC, GetStockObject( @@ -633,7 +633,7 @@ static void test_menu_add_string( void ) ok (!strcmp( strback, "Dummy string" ), "Menu text from Ansi version incorrect\n"); SetLastError(0xdeadbeef); - ret = GetMenuStringW( hmenu, 0, (WCHAR *)strbackW, 99, MF_BYPOSITION); + ret = GetMenuStringW( hmenu, 0, strbackW, 99, MF_BYPOSITION ); if (GetLastError() == ERROR_CALL_NOT_IMPLEMENTED) skip("GetMenuStringW is not implemented\n"); else @@ -827,7 +827,7 @@ static void modify_menu( int line, HMENU hmenu, BOOL ansi, UINT flags, UINT_PTR SetLastError( 0xdeadbeef ); if (ansi) ret = ModifyMenuA( hmenu, 0, flags, id, data ); - else ret = ModifyMenuW( hmenu, 0, flags, id, (WCHAR *)data ); + else ret = ModifyMenuW( hmenu, 0, flags, id, data ); ok_(__FILE__,line)( ret, "ModifyMenuA failed, err %u\n", GetLastError()); } @@ -864,8 +864,8 @@ static void set_menu_item_info( int line, HMENU hmenu, BOOL ansi, UINT mask, UIN #define TMII_INSMI( c1,d1,e1,f1,g1,h1,i1,j1,k1,l1,m1,eret1 )\ hmenu = CreateMenu();\ submenu = CreateMenu();\ - if(ansi)strcpy( string, init);\ - else strcpyW( (WCHAR*)string, (WCHAR*)init);\ + if(ansi)strcpy( string, init );\ + else strcpyW( string, init );\ insert_menu_item( __LINE__, hmenu, ansi, c1, d1, e1, f1, g1, h1, i1, j1, k1, l1, m1, eret1 ) /* GetMenuItemInfo + GetMenuString */ @@ -2248,7 +2248,7 @@ static void test_menu_resource_layout(void) "%u: expected wID %04x, got %04x\n", i, menu_data[i].id, mii.wID); ok(mii.cch == strlen(menu_data[i].str), "%u: expected cch %u, got %u\n", i, (UINT)strlen(menu_data[i].str), mii.cch); - ok(!strcmp((LPCSTR)mii.dwTypeData, menu_data[i].str), + ok(!strcmp(mii.dwTypeData, menu_data[i].str), "%u: expected dwTypeData %s, got %s\n", i, menu_data[i].str, (LPCSTR)mii.dwTypeData); } @@ -2320,7 +2320,7 @@ static void compare_menu_data(HMENU hmenu, const struct menu_data *item, INT ite { ok(mii.cch == strlen(item[i].str), "%u: expected cch %u, got %u\n", i, (UINT)strlen(item[i].str), mii.cch); - ok(!strcmp((LPCSTR)mii.dwTypeData, item[i].str), + ok(!strcmp(mii.dwTypeData, item[i].str), "%u: expected dwTypeData %s, got %s\n", i, item[i].str, (LPCSTR)mii.dwTypeData); } } diff --git a/dlls/user32/tests/msg.c b/dlls/user32/tests/msg.c index 298757aeb5c..ededb3c41e0 100644 --- a/dlls/user32/tests/msg.c +++ b/dlls/user32/tests/msg.c @@ -6240,7 +6240,7 @@ struct wnd_event static DWORD WINAPI thread_proc(void *param) { MSG msg; - struct wnd_event *wnd_event = (struct wnd_event *)param; + struct wnd_event *wnd_event = param; wnd_event->hwnd = CreateWindowExA(0, "TestWindowClass", "window caption text", WS_OVERLAPPEDWINDOW, 100, 100, 200, 200, 0, 0, 0, NULL); @@ -7877,7 +7877,7 @@ static void test_winevents(void) hevent = CreateEventA(NULL, 0, 0, NULL); assert(hevent); - hwnd2 = (HWND)hevent; + hwnd2 = hevent; hthread = CreateThread(NULL, 0, cbt_global_hook_thread_proc, &hwnd2, 0, &tid); ok(hthread != NULL, "CreateThread failed, error %d\n", GetLastError()); @@ -7930,7 +7930,7 @@ static void test_winevents(void) ok_sequence(WmWinEventsSeq, "notify winevents", FALSE); /****** start of event filtering test *************/ - hhook = (HWINEVENTHOOK)pSetWinEventHook( + hhook = pSetWinEventHook( EVENT_OBJECT_SHOW, /* 0x8002 */ EVENT_OBJECT_LOCATIONCHANGE, /* 0x800B */ GetModuleHandleA(0), win_event_global_hook_proc, @@ -7940,7 +7940,7 @@ static void test_winevents(void) hevent = CreateEventA(NULL, 0, 0, NULL); assert(hevent); - hwnd2 = (HWND)hevent; + hwnd2 = hevent; hthread = CreateThread(NULL, 0, win_event_global_thread_proc, &hwnd2, 0, &tid); ok(hthread != NULL, "CreateThread failed, error %d\n", GetLastError()); @@ -7969,16 +7969,14 @@ static void test_winevents(void) /****** end of event filtering test *************/ /****** start of out of context event test *************/ - hhook = (HWINEVENTHOOK)pSetWinEventHook( - EVENT_MIN, EVENT_MAX, - 0, win_event_global_hook_proc, - GetCurrentProcessId(), 0, + hhook = pSetWinEventHook(EVENT_MIN, EVENT_MAX, 0, + win_event_global_hook_proc, GetCurrentProcessId(), 0, WINEVENT_OUTOFCONTEXT); ok(hhook != 0, "SetWinEventHook error %d\n", GetLastError()); hevent = CreateEventA(NULL, 0, 0, NULL); assert(hevent); - hwnd2 = (HWND)hevent; + hwnd2 = hevent; flush_sequence(); @@ -8025,7 +8023,7 @@ static void test_winevents(void) hevent = CreateEventA(NULL, 0, 0, NULL); assert(hevent); - hwnd2 = (HWND)hevent; + hwnd2 = hevent; hthread = CreateThread(NULL, 0, mouse_ll_global_thread_proc, &hwnd2, 0, &tid); ok(hthread != NULL, "CreateThread failed, error %d\n", GetLastError()); @@ -8092,8 +8090,8 @@ static void test_set_hook(void) /* even process local incontext hooks require hmodule */ SetLastError(0xdeadbeef); - hwinevent_hook = (HWINEVENTHOOK)pSetWinEventHook(EVENT_MIN, EVENT_MAX, - 0, win_event_proc, GetCurrentProcessId(), 0, WINEVENT_INCONTEXT); + hwinevent_hook = pSetWinEventHook(EVENT_MIN, EVENT_MAX, 0, win_event_proc, + GetCurrentProcessId(), 0, WINEVENT_INCONTEXT); ok(!hwinevent_hook, "WINEVENT_INCONTEXT requires hModule != 0\n"); ok(GetLastError() == ERROR_HOOK_NEEDS_HMOD || /* Win2k */ GetLastError() == 0xdeadbeef, /* Win9x */ @@ -8101,8 +8099,8 @@ static void test_set_hook(void) /* even thread local incontext hooks require hmodule */ SetLastError(0xdeadbeef); - hwinevent_hook = (HWINEVENTHOOK)pSetWinEventHook(EVENT_MIN, EVENT_MAX, - 0, win_event_proc, GetCurrentProcessId(), GetCurrentThreadId(), WINEVENT_INCONTEXT); + hwinevent_hook = pSetWinEventHook(EVENT_MIN, EVENT_MAX, 0, win_event_proc, + GetCurrentProcessId(), GetCurrentThreadId(), WINEVENT_INCONTEXT); ok(!hwinevent_hook, "WINEVENT_INCONTEXT requires hModule != 0\n"); ok(GetLastError() == ERROR_HOOK_NEEDS_HMOD || /* Win2k */ GetLastError() == 0xdeadbeef, /* Win9x */ @@ -8112,27 +8110,27 @@ static void test_set_hook(void) { /* these 3 tests don't pass under Win9x */ SetLastError(0xdeadbeef); - hwinevent_hook = (HWINEVENTHOOK)pSetWinEventHook(1, 0, - 0, win_event_proc, GetCurrentProcessId(), 0, WINEVENT_OUTOFCONTEXT); + hwinevent_hook = pSetWinEventHook(1, 0, 0, win_event_proc, + GetCurrentProcessId(), 0, WINEVENT_OUTOFCONTEXT); ok(!hwinevent_hook, "SetWinEventHook with invalid event range should fail\n"); ok(GetLastError() == ERROR_INVALID_HOOK_FILTER, "unexpected error %d\n", GetLastError()); SetLastError(0xdeadbeef); - hwinevent_hook = (HWINEVENTHOOK)pSetWinEventHook(-1, 1, - 0, win_event_proc, GetCurrentProcessId(), 0, WINEVENT_OUTOFCONTEXT); + hwinevent_hook = pSetWinEventHook(-1, 1, 0, win_event_proc, + GetCurrentProcessId(), 0, WINEVENT_OUTOFCONTEXT); ok(!hwinevent_hook, "SetWinEventHook with invalid event range should fail\n"); ok(GetLastError() == ERROR_INVALID_HOOK_FILTER, "unexpected error %d\n", GetLastError()); SetLastError(0xdeadbeef); - hwinevent_hook = (HWINEVENTHOOK)pSetWinEventHook(EVENT_MIN, EVENT_MAX, - 0, win_event_proc, 0, 0xdeadbeef, WINEVENT_OUTOFCONTEXT); + hwinevent_hook = pSetWinEventHook(EVENT_MIN, EVENT_MAX, 0, win_event_proc, + 0, 0xdeadbeef, WINEVENT_OUTOFCONTEXT); ok(!hwinevent_hook, "SetWinEventHook with invalid tid should fail\n"); ok(GetLastError() == ERROR_INVALID_THREAD_ID, "unexpected error %d\n", GetLastError()); } SetLastError(0xdeadbeef); - hwinevent_hook = (HWINEVENTHOOK)pSetWinEventHook(0, 0, - 0, win_event_proc, GetCurrentProcessId(), 0, WINEVENT_OUTOFCONTEXT); + hwinevent_hook = pSetWinEventHook(0, 0, 0, win_event_proc, + GetCurrentProcessId(), 0, WINEVENT_OUTOFCONTEXT); ok(hwinevent_hook != 0, "SetWinEventHook error %d\n", GetLastError()); ok(GetLastError() == 0xdeadbeef, "unexpected error %d\n", GetLastError()); ret = pUnhookWinEvent(hwinevent_hook); @@ -8142,8 +8140,8 @@ todo_wine { /* This call succeeds under win2k SP4, but fails under Wine. Does win2k test/use passed process id? */ SetLastError(0xdeadbeef); - hwinevent_hook = (HWINEVENTHOOK)pSetWinEventHook(EVENT_MIN, EVENT_MAX, - 0, win_event_proc, 0xdeadbeef, 0, WINEVENT_OUTOFCONTEXT); + hwinevent_hook = pSetWinEventHook(EVENT_MIN, EVENT_MAX, 0, win_event_proc, + 0xdeadbeef, 0, WINEVENT_OUTOFCONTEXT); ok(hwinevent_hook != 0, "SetWinEventHook error %d\n", GetLastError()); ok(GetLastError() == 0xdeadbeef, "unexpected error %d\n", GetLastError()); ret = pUnhookWinEvent(hwinevent_hook); @@ -11336,12 +11334,10 @@ START_TEST(msg) if (pSetWinEventHook) { - hEvent_hook = (HWINEVENTHOOK)pSetWinEventHook(EVENT_MIN, EVENT_MAX, - GetModuleHandleA(0), - win_event_proc, - 0, - GetCurrentThreadId(), - WINEVENT_INCONTEXT); + hEvent_hook = pSetWinEventHook(EVENT_MIN, EVENT_MAX, + GetModuleHandleA(0), win_event_proc, + 0, GetCurrentThreadId(), + WINEVENT_INCONTEXT); assert(hEvent_hook); if (pIsWinEventHookInstalled) diff --git a/dlls/user32/tests/text.c b/dlls/user32/tests/text.c index fc554ae3632..47f52743562 100644 --- a/dlls/user32/tests/text.c +++ b/dlls/user32/tests/text.c @@ -316,6 +316,23 @@ static void test_DrawTextCalcRect(void) ok(textheight==0,"Got textheight from DrawTextExA\n"); ok(dtp.uiLengthDrawn==1337, "invalid dtp.uiLengthDrawn = %i\n",dtp.uiLengthDrawn); + /* Margin calculations */ + dtp.cbSize = sizeof(dtp); + dtp.iLeftMargin = 0; + dtp.iRightMargin = 0; + SetRect( &rect, 0, 0, 0, 0); + DrawTextExA(hdc, text, -1, &rect, DT_CALCRECT, &dtp); + textlen = rect.right; /* Width without margin */ + dtp.iLeftMargin = 8; + SetRect( &rect, 0, 0, 0, 0); + DrawTextExA(hdc, text, -1, &rect, DT_CALCRECT, &dtp); + ok(rect.right==dtp.iLeftMargin+textlen ,"Incorrect left margin calculated rc(%d,%d)\n", rect.left, rect.right); + dtp.iLeftMargin = 0; + dtp.iRightMargin = 8; + SetRect( &rect, 0, 0, 0, 0); + DrawTextExA(hdc, text, -1, &rect, DT_CALCRECT, &dtp); + ok(rect.right==dtp.iRightMargin+textlen ,"Incorrect right margin calculated rc(%d,%d)\n", rect.left, rect.right); + /* Wide char versions */ SetRect( &rect, 10,10, 100, 100); SetLastError( 0); diff --git a/dlls/user32/tests/win.c b/dlls/user32/tests/win.c index dcfe1036266..f3befc43634 100644 --- a/dlls/user32/tests/win.c +++ b/dlls/user32/tests/win.c @@ -1228,7 +1228,7 @@ static void test_MDI_create(HWND parent, HWND mdi_client, INT_PTR first_id) CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, mdi_client, 0, GetModuleHandle(0), - (LPVOID)mdi_lParam_test_message); + mdi_lParam_test_message); ok(mdi_child != 0, "MDI child creation failed\n"); id = GetWindowLongPtrA(mdi_child, GWLP_ID); ok(id == first_id, "wrong child id %ld\n", id); @@ -1240,7 +1240,7 @@ static void test_MDI_create(HWND parent, HWND mdi_client, INT_PTR first_id) CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, mdi_client, 0, GetModuleHandle(0), - (LPVOID)mdi_lParam_test_message); + mdi_lParam_test_message); ok(mdi_child != 0, "MDI child creation failed\n"); id = GetWindowLongPtrA(mdi_child, GWLP_ID); ok(id == first_id, "wrong child id %ld\n", id); @@ -1252,7 +1252,7 @@ static void test_MDI_create(HWND parent, HWND mdi_client, INT_PTR first_id) CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, mdi_client, 0, GetModuleHandle(0), - (LPVOID)mdi_lParam_test_message); + mdi_lParam_test_message); if (GetWindowLongA(mdi_client, GWL_STYLE) & MDIS_ALLCHILDSTYLES) { ok(!mdi_child, "MDI child with WS_POPUP and with MDIS_ALLCHILDSTYLES should fail\n"); @@ -1273,7 +1273,7 @@ static void test_MDI_create(HWND parent, HWND mdi_client, INT_PTR first_id) CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, mdi_client, 0, GetModuleHandle(0), - (LPVOID)mdi_lParam_test_message); + mdi_lParam_test_message); if (!mdi_child) { if (GetLastError() == ERROR_CALL_NOT_IMPLEMENTED) @@ -1297,7 +1297,7 @@ static void test_MDI_create(HWND parent, HWND mdi_client, INT_PTR first_id) CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, parent, 0, GetModuleHandle(0), - (LPVOID)mdi_lParam_test_message); + mdi_lParam_test_message); ok(!mdi_child, "WS_EX_MDICHILD with a not MDIClient parent should fail\n"); } @@ -1306,7 +1306,7 @@ static void test_MDI_create(HWND parent, HWND mdi_client, INT_PTR first_id) CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, mdi_client, 0, GetModuleHandle(0), - (LPVOID)mdi_lParam_test_message); + mdi_lParam_test_message); ok(mdi_child != 0, "MDI child creation failed\n"); id = GetWindowLongPtrA(mdi_child, GWLP_ID); ok(id == 0, "wrong child id %ld\n", id); @@ -1317,7 +1317,7 @@ static void test_MDI_create(HWND parent, HWND mdi_client, INT_PTR first_id) CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, mdi_client, 0, GetModuleHandle(0), - (LPVOID)mdi_lParam_test_message); + mdi_lParam_test_message); ok(mdi_child != 0, "MDI child creation failed\n"); id = GetWindowLongPtrA(mdi_child, GWLP_ID); ok(id == 0, "wrong child id %ld\n", id); @@ -1329,7 +1329,7 @@ static void test_MDI_create(HWND parent, HWND mdi_client, INT_PTR first_id) CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, mdi_client, 0, GetModuleHandle(0), - (LPVOID)mdi_lParam_test_message); + mdi_lParam_test_message); ok(mdi_child != 0, "MDI child creation failed\n"); id = GetWindowLongPtrA(mdi_child, GWLP_ID); ok(id == 0, "wrong child id %ld\n", id); @@ -1341,7 +1341,7 @@ static void test_MDI_create(HWND parent, HWND mdi_client, INT_PTR first_id) CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, mdi_client, 0, GetModuleHandle(0), - (LPVOID)mdi_lParam_test_message); + mdi_lParam_test_message); ok(mdi_child != 0, "MDI child creation failed\n"); id = GetWindowLongPtrA(mdi_child, GWLP_ID); ok(id == 0, "wrong child id %ld\n", id); @@ -1353,7 +1353,7 @@ static void test_MDI_create(HWND parent, HWND mdi_client, INT_PTR first_id) CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, mdi_client, 0, GetModuleHandle(0), - (LPVOID)mdi_lParam_test_message); + mdi_lParam_test_message); ok(mdi_child != 0, "MDI child creation failed\n"); id = GetWindowLongPtrA(mdi_child, GWLP_ID); ok(id == 0, "wrong child id %ld\n", id); @@ -1394,7 +1394,7 @@ static LRESULT WINAPI mdi_child_wnd_proc_1(HWND hwnd, UINT msg, WPARAM wparam, L case WM_CREATE: { CREATESTRUCTA *cs = (CREATESTRUCTA *)lparam; - MDICREATESTRUCTA *mdi_cs = (MDICREATESTRUCTA *)cs->lpCreateParams; + MDICREATESTRUCTA *mdi_cs = cs->lpCreateParams; ok(cs->dwExStyle & WS_EX_MDICHILD, "WS_EX_MDICHILD should be set\n"); ok(mdi_cs->lParam == (LPARAM)mdi_lParam_test_message, "wrong mdi_cs->lParam\n"); @@ -1625,7 +1625,7 @@ static LRESULT WINAPI mdi_main_wnd_procA(HWND hwnd, UINT msg, WPARAM wparam, LPA /* tests depend on a not zero MDIClient size */ 0, 0, rc.right, rc.bottom, hwnd, 0, GetModuleHandle(0), - (LPVOID)&client_cs); + &client_cs); assert(mdi_client); test_MDI_create(hwnd, mdi_client, client_cs.idFirstChild); DestroyWindow(mdi_client); @@ -1637,7 +1637,7 @@ static LRESULT WINAPI mdi_main_wnd_procA(HWND hwnd, UINT msg, WPARAM wparam, LPA /* tests depend on a not zero MDIClient size */ 0, 0, rc.right, rc.bottom, hwnd, 0, GetModuleHandle(0), - (LPVOID)&client_cs); + &client_cs); assert(mdi_client); test_MDI_create(hwnd, mdi_client, client_cs.idFirstChild); DestroyWindow(mdi_client); @@ -3066,7 +3066,7 @@ static LRESULT WINAPI StyleCheckProc(HWND hwnd, UINT msg, WPARAM wparam, LPARAM case WM_NCCREATE: case WM_CREATE: lpcs = (LPCREATESTRUCT)lparam; - lpss = (LPSTYLESTRUCT)lpcs->lpCreateParams; + lpss = lpcs->lpCreateParams; if (lpss) { if ((lpcs->dwExStyle & WS_EX_DLGMODALFRAME) || @@ -5395,7 +5395,7 @@ static void test_thick_child_size(HWND parentWindow) cls.cbWndExtra = 0; cls.hInstance = GetModuleHandleA(0); cls.hIcon = 0; - cls.hCursor = LoadCursorA(0, (LPSTR)IDC_ARROW); + cls.hCursor = LoadCursorA(0, IDC_ARROW); cls.hbrBackground = GetStockObject(WHITE_BRUSH); cls.lpszMenuName = NULL; cls.lpszClassName = className; diff --git a/dlls/user32/text.c b/dlls/user32/text.c index 2b864a2856e..b8aad0b6f26 100644 --- a/dlls/user32/text.c +++ b/dlls/user32/text.c @@ -900,8 +900,8 @@ INT WINAPI DrawTextExW( HDC hdc, LPWSTR str, INT i_count, if (dtp) { - lmargin = dtp->iLeftMargin * tm.tmAveCharWidth; - rmargin = dtp->iRightMargin * tm.tmAveCharWidth; + lmargin = dtp->iLeftMargin; + rmargin = dtp->iRightMargin; if (!(flags & (DT_CENTER | DT_RIGHT))) x += lmargin; dtp->uiLengthDrawn = 0; /* This param RECEIVES number of chars processed */ diff --git a/dlls/uuid/uuid.c b/dlls/uuid/uuid.c index 1196080d36a..f3af92e7949 100644 --- a/dlls/uuid/uuid.c +++ b/dlls/uuid/uuid.c @@ -110,3 +110,5 @@ DEFINE_GUID(CLSID_ManualResetEvent, 0x0000032c,0x0000,0x0000,0xc0,0x00,0x0 DEFINE_GUID(CLSID_SynchronizeContainer, 0x0000032d,0x0000,0x0000,0xc0,0x00,0x00,0x00,0x00,0x00,0x00,0x46); DEFINE_GUID(CLSID_InProcFreeMarshaler, 0x0000033a,0x0000,0x0000,0xc0,0x00,0x00,0x00,0x00,0x00,0x00,0x46); DEFINE_GUID(CLSID_TF_ThreadMgr, 0x529a9e6b,0x6587,0x4f23,0xab,0x9e,0x9c,0x7d,0x68,0x3e,0x3c,0x50); +DEFINE_GUID(CLSID_TF_InputProcessorProfiles, 0x33c53a50,0xf456,0x4884,0xb0,0x49,0x85,0xfd,0x64,0x3e,0xcf,0xed); +DEFINE_GUID(CLSID_TF_CategoryMgr, 0xA4B544A1,0x438D,0x4B41,0x93,0x25,0x86,0x95,0x23,0xE2,0xD6,0xC7); diff --git a/dlls/wined3d/arb_program_shader.c b/dlls/wined3d/arb_program_shader.c index cf434a6086c..1ffc2bd5497 100644 --- a/dlls/wined3d/arb_program_shader.c +++ b/dlls/wined3d/arb_program_shader.c @@ -1741,7 +1741,7 @@ static GLuint create_arb_blt_fragment_program(const WineD3D_GL_Info *gl_info, en static void shader_arb_select(IWineD3DDevice *iface, BOOL usePS, BOOL useVS) { IWineD3DDeviceImpl *This = (IWineD3DDeviceImpl *)iface; - struct shader_arb_priv *priv = (struct shader_arb_priv *) This->shader_priv; + struct shader_arb_priv *priv = This->shader_priv; const WineD3D_GL_Info *gl_info = &This->adapter->gl_info; if (useVS) { @@ -1794,7 +1794,7 @@ static void shader_arb_select(IWineD3DDevice *iface, BOOL usePS, BOOL useVS) { static void shader_arb_select_depth_blt(IWineD3DDevice *iface, enum tex_types tex_type) { IWineD3DDeviceImpl *This = (IWineD3DDeviceImpl *)iface; - struct shader_arb_priv *priv = (struct shader_arb_priv *) This->shader_priv; + struct shader_arb_priv *priv = This->shader_priv; GLuint *blt_fprogram = &priv->depth_blt_fprogram_id[tex_type]; const WineD3D_GL_Info *gl_info = &This->adapter->gl_info; @@ -1809,7 +1809,7 @@ static void shader_arb_select_depth_blt(IWineD3DDevice *iface, enum tex_types te static void shader_arb_deselect_depth_blt(IWineD3DDevice *iface) { IWineD3DDeviceImpl *This = (IWineD3DDeviceImpl *)iface; - struct shader_arb_priv *priv = (struct shader_arb_priv *) This->shader_priv; + struct shader_arb_priv *priv = This->shader_priv; const WineD3D_GL_Info *gl_info = &This->adapter->gl_info; if (priv->current_vprogram_id) { @@ -1879,7 +1879,7 @@ static HRESULT shader_arb_alloc(IWineD3DDevice *iface) { static void shader_arb_free(IWineD3DDevice *iface) { IWineD3DDeviceImpl *This = (IWineD3DDeviceImpl *)iface; const WineD3D_GL_Info *gl_info = &This->adapter->gl_info; - struct shader_arb_priv *priv = (struct shader_arb_priv *) This->shader_priv; + struct shader_arb_priv *priv = This->shader_priv; int i; if(priv->depth_blt_vprogram_id) { @@ -2295,7 +2295,7 @@ static HRESULT arbfp_alloc(IWineD3DDevice *iface) { This->fragment_priv = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(struct shader_arb_priv)); if(!This->fragment_priv) return E_OUTOFMEMORY; } - priv = (struct shader_arb_priv *) This->fragment_priv; + priv = This->fragment_priv; priv->fragment_shaders = hash_table_create(ffp_frag_program_key_hash, ffp_frag_program_key_compare); priv->use_arbfp_fixed_func = TRUE; return WINED3D_OK; @@ -2314,7 +2314,7 @@ static void arbfp_free_ffpshader(void *value, void *gli) { static void arbfp_free(IWineD3DDevice *iface) { IWineD3DDeviceImpl *This = (IWineD3DDeviceImpl *) iface; - struct shader_arb_priv *priv = (struct shader_arb_priv *) This->fragment_priv; + struct shader_arb_priv *priv = This->fragment_priv; hash_table_destroy(priv->fragment_shaders, arbfp_free_ffpshader, &This->adapter->gl_info); priv->use_arbfp_fixed_func = FALSE; @@ -2953,7 +2953,7 @@ static GLuint gen_arbfp_ffp_shader(const struct ffp_frag_settings *settings, IWi static void fragment_prog_arbfp(DWORD state, IWineD3DStateBlockImpl *stateblock, WineD3DContext *context) { IWineD3DDeviceImpl *device = stateblock->wineD3DDevice; - struct shader_arb_priv *priv = (struct shader_arb_priv *) device->fragment_priv; + struct shader_arb_priv *priv = device->fragment_priv; BOOL use_pshader = use_ps(stateblock); BOOL use_vshader = use_vs(stateblock); struct ffp_frag_settings settings; @@ -3259,7 +3259,7 @@ static HRESULT arbfp_blit_alloc(IWineD3DDevice *iface) { } static void arbfp_blit_free(IWineD3DDevice *iface) { IWineD3DDeviceImpl *device = (IWineD3DDeviceImpl *) iface; - struct arbfp_blit_priv *priv = (struct arbfp_blit_priv *) device->blit_priv; + struct arbfp_blit_priv *priv = device->blit_priv; ENTER_GL(); GL_EXTCALL(glDeleteProgramsARB(1, &priv->yuy2_rect_shader)); @@ -3510,7 +3510,7 @@ static GLuint gen_yuv_shader(IWineD3DDeviceImpl *device, enum yuv_fixup yuv_fixu GLenum shader; SHADER_BUFFER buffer; char luminance_component; - struct arbfp_blit_priv *priv = (struct arbfp_blit_priv *) device->blit_priv; + struct arbfp_blit_priv *priv = device->blit_priv; /* Shader header */ shader_buffer_init(&buffer); @@ -3645,7 +3645,7 @@ static HRESULT arbfp_blit_set(IWineD3DDevice *iface, WINED3DFORMAT fmt, GLenum t GLenum shader; IWineD3DDeviceImpl *device = (IWineD3DDeviceImpl *) iface; float size[4] = {width, height, 1, 1}; - struct arbfp_blit_priv *priv = (struct arbfp_blit_priv *) device->blit_priv; + struct arbfp_blit_priv *priv = device->blit_priv; const struct GlPixelFormatDesc *glDesc; enum yuv_fixup yuv_fixup; diff --git a/dlls/wined3d/ati_fragment_shader.c b/dlls/wined3d/ati_fragment_shader.c index c01ec1aee21..4fe543045fc 100644 --- a/dlls/wined3d/ati_fragment_shader.c +++ b/dlls/wined3d/ati_fragment_shader.c @@ -803,7 +803,7 @@ static void set_tex_op_atifs(DWORD state, IWineD3DStateBlockImpl *stateblock, Wi IWineD3DDeviceImpl *This = stateblock->wineD3DDevice; const struct atifs_ffp_desc *desc; struct ffp_frag_settings settings; - struct atifs_private_data *priv = (struct atifs_private_data *) This->fragment_priv; + struct atifs_private_data *priv = This->fragment_priv; DWORD mapped_stage; unsigned int i; @@ -1107,7 +1107,7 @@ static HRESULT atifs_alloc(IWineD3DDevice *iface) { ERR("Out of memory\n"); return E_OUTOFMEMORY; } - priv = (struct atifs_private_data *) This->fragment_priv; + priv = This->fragment_priv; priv->fragment_shaders = hash_table_create(ffp_frag_program_key_hash, ffp_frag_program_key_compare); return WINED3D_OK; } @@ -1126,7 +1126,7 @@ static void atifs_free_ffpshader(void *value, void *device) { static void atifs_free(IWineD3DDevice *iface) { IWineD3DDeviceImpl *This = (IWineD3DDeviceImpl *) iface; - struct atifs_private_data *priv = (struct atifs_private_data *) This->fragment_priv; + struct atifs_private_data *priv = This->fragment_priv; hash_table_destroy(priv->fragment_shaders, atifs_free_ffpshader, This); diff --git a/dlls/wined3d/baseshader.c b/dlls/wined3d/baseshader.c index a270b0c49cb..8ecc4550ef0 100644 --- a/dlls/wined3d/baseshader.c +++ b/dlls/wined3d/baseshader.c @@ -31,8 +31,6 @@ WINE_DEFAULT_DEBUG_CHANNEL(d3d_shader); WINE_DECLARE_DEBUG_CHANNEL(d3d); -#define GLNAME_REQUIRE_GLSL ((const char *)1) - static void shader_dump_param(const DWORD param, const DWORD addr_token, int input, DWORD shader_version); static inline BOOL shader_is_version_token(DWORD token) { diff --git a/dlls/wined3d/device.c b/dlls/wined3d/device.c index d4a57c9eec3..71e69e30298 100644 --- a/dlls/wined3d/device.c +++ b/dlls/wined3d/device.c @@ -2104,7 +2104,7 @@ static void IWineD3DDeviceImpl_LoadLogo(IWineD3DDeviceImpl *This, const char *fi HDC dcb = NULL, dcs = NULL; WINEDDCOLORKEY colorkey; - hbm = (HBITMAP) LoadImageA(NULL, filename, IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE | LR_CREATEDIBSECTION); + hbm = LoadImageA(NULL, filename, IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE | LR_CREATEDIBSECTION); if(hbm) { GetObjectA(hbm, sizeof(BITMAP), &bm); @@ -6765,7 +6765,7 @@ static HRESULT WINAPI IWineD3DDeviceImpl_SetCursorProperties(IWineD3DDevice* i { const struct GlPixelFormatDesc *glDesc; const StaticPixelFormatDesc *tableEntry = getFormatDescEntry(WINED3DFMT_A8R8G8B8, &GLINFO_LOCATION, &glDesc); - char *mem, *bits = (char *)rect.pBits; + char *mem, *bits = rect.pBits; GLint intfmt = glDesc->glInternal; GLint format = glDesc->glFormat; GLint type = glDesc->glType; diff --git a/dlls/wined3d/drawprim.c b/dlls/wined3d/drawprim.c index c9a8f4a26a3..37f43b4a3b2 100644 --- a/dlls/wined3d/drawprim.c +++ b/dlls/wined3d/drawprim.c @@ -964,7 +964,7 @@ void drawPrimitive(IWineD3DDevice *iface, int PrimitiveType, long NumPrimitives, sprintf(buffer, "/tmp/texture_%p_%ld_%d.tga", This->stateBlock->textures[textureNo], primCounter, textureNo); TRACE("Saving texture %s\n", buffer); if (IWineD3DBaseTexture_GetType(This->stateBlock->textures[textureNo]) == WINED3DRTYPE_TEXTURE) { - IWineD3DTexture_GetSurfaceLevel((IWineD3DTexture *)This->stateBlock->textures[textureNo], 0, &pSur); + IWineD3DTexture_GetSurfaceLevel(This->stateBlock->textures[textureNo], 0, &pSur); IWineD3DSurface_SaveSnapshot(pSur, buffer); IWineD3DSurface_Release(pSur); } else { diff --git a/dlls/wined3d/glsl_shader.c b/dlls/wined3d/glsl_shader.c index 40242698ab7..efc00e6d445 100644 --- a/dlls/wined3d/glsl_shader.c +++ b/dlls/wined3d/glsl_shader.c @@ -484,7 +484,7 @@ static void shader_glsl_load_constants( char useVertexShader) { IWineD3DDeviceImpl* deviceImpl = (IWineD3DDeviceImpl*) device; - struct shader_glsl_priv *priv = (struct shader_glsl_priv *)deviceImpl->shader_priv; + struct shader_glsl_priv *priv = deviceImpl->shader_priv; IWineD3DStateBlockImpl* stateBlock = deviceImpl->stateBlock; const WineD3D_GL_Info *gl_info = &deviceImpl->adapter->gl_info; @@ -621,7 +621,7 @@ static inline void update_heap_entry(struct constant_heap *heap, unsigned int id static void shader_glsl_update_float_vertex_constants(IWineD3DDevice *iface, UINT start, UINT count) { IWineD3DDeviceImpl *This = (IWineD3DDeviceImpl *)iface; - struct shader_glsl_priv *priv = (struct shader_glsl_priv *)This->shader_priv; + struct shader_glsl_priv *priv = This->shader_priv; struct constant_heap *heap = &priv->vconst_heap; UINT i; @@ -637,7 +637,7 @@ static void shader_glsl_update_float_vertex_constants(IWineD3DDevice *iface, UIN static void shader_glsl_update_float_pixel_constants(IWineD3DDevice *iface, UINT start, UINT count) { IWineD3DDeviceImpl *This = (IWineD3DDeviceImpl *)iface; - struct shader_glsl_priv *priv = (struct shader_glsl_priv *)This->shader_priv; + struct shader_glsl_priv *priv = This->shader_priv; struct constant_heap *heap = &priv->pconst_heap; UINT i; @@ -2931,7 +2931,7 @@ static struct glsl_shader_prog_link *get_glsl_program_entry(struct shader_glsl_p key.pshader = pshader; key.ps_args = *ps_args; - return (struct glsl_shader_prog_link *)hash_table_get(priv->glsl_program_lookup, &key); + return hash_table_get(priv->glsl_program_lookup, &key); } static void delete_glsl_program_entry(struct shader_glsl_priv *priv, const WineD3D_GL_Info *gl_info, @@ -3248,7 +3248,7 @@ static GLhandleARB generate_param_reorder_function(IWineD3DVertexShader *vertexs ret = GL_EXTCALL(glCreateShaderObjectARB(GL_VERTEX_SHADER_ARB)); checkGLcall("glCreateShaderObjectARB(GL_VERTEX_SHADER_ARB)"); GL_EXTCALL(glShaderSourceARB(ret, 1, (const char**)&buffer.buffer, NULL)); - checkGLcall("glShaderSourceARB(ret, 1, (const char**)&buffer.buffer, NULL)"); + checkGLcall("glShaderSourceARB(ret, 1, &buffer.buffer, NULL)"); GL_EXTCALL(glCompileShaderARB(ret)); checkGLcall("glCompileShaderARB(ret)"); @@ -3283,7 +3283,7 @@ static void hardcode_local_constants(IWineD3DBaseShaderImpl *shader, const WineD */ static void set_glsl_shader_program(IWineD3DDevice *iface, BOOL use_ps, BOOL use_vs) { IWineD3DDeviceImpl *This = (IWineD3DDeviceImpl *)iface; - struct shader_glsl_priv *priv = (struct shader_glsl_priv *)This->shader_priv; + struct shader_glsl_priv *priv = This->shader_priv; const WineD3D_GL_Info *gl_info = &This->adapter->gl_info; IWineD3DPixelShader *pshader = This->stateBlock->pixelShader; IWineD3DVertexShader *vshader = This->stateBlock->vertexShader; @@ -3543,7 +3543,7 @@ static GLhandleARB create_glsl_blt_shader(const WineD3D_GL_Info *gl_info, enum t static void shader_glsl_select(IWineD3DDevice *iface, BOOL usePS, BOOL useVS) { IWineD3DDeviceImpl *This = (IWineD3DDeviceImpl *)iface; - struct shader_glsl_priv *priv = (struct shader_glsl_priv *)This->shader_priv; + struct shader_glsl_priv *priv = This->shader_priv; const WineD3D_GL_Info *gl_info = &This->adapter->gl_info; GLhandleARB program_id = 0; GLenum old_vertex_color_clamp, current_vertex_color_clamp; @@ -3573,7 +3573,7 @@ static void shader_glsl_select(IWineD3DDevice *iface, BOOL usePS, BOOL useVS) { static void shader_glsl_select_depth_blt(IWineD3DDevice *iface, enum tex_types tex_type) { IWineD3DDeviceImpl *This = (IWineD3DDeviceImpl *)iface; const WineD3D_GL_Info *gl_info = &This->adapter->gl_info; - struct shader_glsl_priv *priv = (struct shader_glsl_priv *) This->shader_priv; + struct shader_glsl_priv *priv = This->shader_priv; GLhandleARB *blt_program = &priv->depth_blt_program[tex_type]; if (!*blt_program) { @@ -3590,7 +3590,7 @@ static void shader_glsl_select_depth_blt(IWineD3DDevice *iface, enum tex_types t static void shader_glsl_deselect_depth_blt(IWineD3DDevice *iface) { IWineD3DDeviceImpl *This = (IWineD3DDeviceImpl *)iface; const WineD3D_GL_Info *gl_info = &This->adapter->gl_info; - struct shader_glsl_priv *priv = (struct shader_glsl_priv *) This->shader_priv; + struct shader_glsl_priv *priv = This->shader_priv; GLhandleARB program_id; program_id = priv->glsl_program ? priv->glsl_program->programId : 0; @@ -3604,7 +3604,7 @@ static void shader_glsl_destroy(IWineD3DBaseShader *iface) { const struct list *linked_programs; IWineD3DBaseShaderImpl *This = (IWineD3DBaseShaderImpl *) iface; IWineD3DDeviceImpl *device = (IWineD3DDeviceImpl *)This->baseShader.device; - struct shader_glsl_priv *priv = (struct shader_glsl_priv *)device->shader_priv; + struct shader_glsl_priv *priv = device->shader_priv; const WineD3D_GL_Info *gl_info = &device->adapter->gl_info; IWineD3DPixelShaderImpl *ps = NULL; IWineD3DVertexShaderImpl *vs = NULL; @@ -3753,7 +3753,7 @@ static HRESULT shader_glsl_alloc(IWineD3DDevice *iface) { static void shader_glsl_free(IWineD3DDevice *iface) { IWineD3DDeviceImpl *This = (IWineD3DDeviceImpl *)iface; const WineD3D_GL_Info *gl_info = &This->adapter->gl_info; - struct shader_glsl_priv *priv = (struct shader_glsl_priv *)This->shader_priv; + struct shader_glsl_priv *priv = This->shader_priv; int i; for (i = 0; i < tex_type_count; ++i) diff --git a/dlls/wined3d/pixelshader.c b/dlls/wined3d/pixelshader.c index daea9dfcd5f..0be352c1adf 100644 --- a/dlls/wined3d/pixelshader.c +++ b/dlls/wined3d/pixelshader.c @@ -34,8 +34,6 @@ WINE_DEFAULT_DEBUG_CHANNEL(d3d_shader); #define GLINFO_LOCATION ((IWineD3DDeviceImpl *) This->baseShader.device)->adapter->gl_info -#define GLNAME_REQUIRE_GLSL ((const char *)1) - static HRESULT WINAPI IWineD3DPixelShaderImpl_QueryInterface(IWineD3DPixelShader *iface, REFIID riid, LPVOID *ppobj) { TRACE("iface %p, riid %s, ppobj %p\n", iface, debugstr_guid(riid), ppobj); diff --git a/dlls/wined3d/query.c b/dlls/wined3d/query.c index 05e114c1b5a..481177f4e72 100644 --- a/dlls/wined3d/query.c +++ b/dlls/wined3d/query.c @@ -133,7 +133,7 @@ static HRESULT WINAPI IWineD3DQueryImpl_GetData(IWineD3DQuery* iface, void* pDa case WINED3DQUERYTYPE_VCACHE: { - WINED3DDEVINFO_VCACHE *data = (WINED3DDEVINFO_VCACHE *)pData; + WINED3DDEVINFO_VCACHE *data = pData; FIXME("(%p): Unimplemented query WINED3DQUERYTYPE_VCACHE\n", This); if(pData == NULL || dwSize == 0) break; data->Pattern = WINEMAKEFOURCC('C','A','C','H'); @@ -145,7 +145,7 @@ static HRESULT WINAPI IWineD3DQueryImpl_GetData(IWineD3DQuery* iface, void* pDa break; case WINED3DQUERYTYPE_RESOURCEMANAGER: { - WINED3DDEVINFO_RESOURCEMANAGER *data = (WINED3DDEVINFO_RESOURCEMANAGER *)pData; + WINED3DDEVINFO_RESOURCEMANAGER *data = pData; int i; FIXME("(%p): Unimplemented query WINED3DQUERYTYPE_RESOURCEMANAGER\n", This); if(pData == NULL || dwSize == 0) break; @@ -169,7 +169,7 @@ static HRESULT WINAPI IWineD3DQueryImpl_GetData(IWineD3DQuery* iface, void* pDa break; case WINED3DQUERYTYPE_VERTEXSTATS: { - WINED3DDEVINFO_VERTEXSTATS *data = (WINED3DDEVINFO_VERTEXSTATS *)pData; + WINED3DDEVINFO_VERTEXSTATS *data = pData; FIXME("(%p): Unimplemented query WINED3DQUERYTYPE_VERTEXSTATS\n", This); if(pData == NULL || dwSize == 0) break; data->NumRenderedTriangles = 1; @@ -203,7 +203,7 @@ static HRESULT WINAPI IWineD3DQueryImpl_GetData(IWineD3DQuery* iface, void* pDa break; case WINED3DQUERYTYPE_PIPELINETIMINGS: { - WINED3DDEVINFO_PIPELINETIMINGS *data = (WINED3DDEVINFO_PIPELINETIMINGS *)pData; + WINED3DDEVINFO_PIPELINETIMINGS *data = pData; FIXME("(%p): Unimplemented query WINED3DQUERYTYPE_PIPELINETIMINGS\n", This); if(pData == NULL || dwSize == 0) break; @@ -215,7 +215,7 @@ static HRESULT WINAPI IWineD3DQueryImpl_GetData(IWineD3DQuery* iface, void* pDa break; case WINED3DQUERYTYPE_INTERFACETIMINGS: { - WINED3DDEVINFO_INTERFACETIMINGS *data = (WINED3DDEVINFO_INTERFACETIMINGS *)pData; + WINED3DDEVINFO_INTERFACETIMINGS *data = pData; FIXME("(%p): Unimplemented query WINED3DQUERYTYPE_INTERFACETIMINGS\n", This); if(pData == NULL || dwSize == 0) break; @@ -229,7 +229,7 @@ static HRESULT WINAPI IWineD3DQueryImpl_GetData(IWineD3DQuery* iface, void* pDa break; case WINED3DQUERYTYPE_VERTEXTIMINGS: { - WINED3DDEVINFO_STAGETIMINGS *data = (WINED3DDEVINFO_STAGETIMINGS *)pData; + WINED3DDEVINFO_STAGETIMINGS *data = pData; FIXME("(%p): Unimplemented query WINED3DQUERYTYPE_VERTEXTIMINGS\n", This); if(pData == NULL || dwSize == 0) break; @@ -240,7 +240,7 @@ static HRESULT WINAPI IWineD3DQueryImpl_GetData(IWineD3DQuery* iface, void* pDa break; case WINED3DQUERYTYPE_PIXELTIMINGS: { - WINED3DDEVINFO_STAGETIMINGS *data = (WINED3DDEVINFO_STAGETIMINGS *)pData; + WINED3DDEVINFO_STAGETIMINGS *data = pData; FIXME("(%p): Unimplemented query WINED3DQUERYTYPE_PIXELTIMINGS\n", This); if(pData == NULL || dwSize == 0) break; @@ -250,7 +250,7 @@ static HRESULT WINAPI IWineD3DQueryImpl_GetData(IWineD3DQuery* iface, void* pDa break; case WINED3DQUERYTYPE_BANDWIDTHTIMINGS: { - WINED3DDEVINFO_BANDWIDTHTIMINGS *data = (WINED3DDEVINFO_BANDWIDTHTIMINGS *)pData; + WINED3DDEVINFO_BANDWIDTHTIMINGS *data = pData; FIXME("(%p): Unimplemented query WINED3DQUERYTYPE_BANDWIDTHTIMINGS\n", This); if(pData == NULL || dwSize == 0) break; @@ -263,7 +263,7 @@ static HRESULT WINAPI IWineD3DQueryImpl_GetData(IWineD3DQuery* iface, void* pDa break; case WINED3DQUERYTYPE_CACHEUTILIZATION: { - WINED3DDEVINFO_CACHEUTILIZATION *data = (WINED3DDEVINFO_CACHEUTILIZATION *)pData; + WINED3DDEVINFO_CACHEUTILIZATION *data = pData; FIXME("(%p): Unimplemented query WINED3DQUERYTYPE_CACHEUTILIZATION\n", This); if(pData == NULL || dwSize == 0) break; diff --git a/dlls/wined3d/resource.c b/dlls/wined3d/resource.c index 1231b34a988..b4e49b1a322 100644 --- a/dlls/wined3d/resource.c +++ b/dlls/wined3d/resource.c @@ -25,7 +25,6 @@ #include "wined3d_private.h" WINE_DEFAULT_DEBUG_CHANNEL(d3d); -#define GLINFO_LOCATION ((IWineD3DImpl *)(((IWineD3DDeviceImpl *)This->resource.wineD3DDevice)->wineD3D))->gl_info HRESULT resource_init(struct IWineD3DResourceClass *resource, WINED3DRESOURCETYPE resource_type, IWineD3DDeviceImpl *device, UINT size, DWORD usage, WINED3DFORMAT format, WINED3DPOOL pool, IUnknown *parent) diff --git a/dlls/wined3d/surface.c b/dlls/wined3d/surface.c index 03d483a2ad0..c3d56ee40e5 100644 --- a/dlls/wined3d/surface.c +++ b/dlls/wined3d/surface.c @@ -2228,7 +2228,7 @@ static void d3dfmt_p8_upload_palette(IWineD3DSurface *iface, CONVERT_TYPES conve glEnable(GL_FRAGMENT_PROGRAM_ARB); GL_EXTCALL(glGenProgramsARB(1, &device->paletteConversionShader)); GL_EXTCALL(glBindProgramARB(GL_FRAGMENT_PROGRAM_ARB, device->paletteConversionShader)); - GL_EXTCALL(glProgramStringARB(GL_FRAGMENT_PROGRAM_ARB, GL_PROGRAM_FORMAT_ASCII_ARB, strlen(fragment_palette_conversion), (const GLbyte *)fragment_palette_conversion)); + GL_EXTCALL(glProgramStringARB(GL_FRAGMENT_PROGRAM_ARB, GL_PROGRAM_FORMAT_ASCII_ARB, strlen(fragment_palette_conversion), fragment_palette_conversion)); glDisable(GL_FRAGMENT_PROGRAM_ARB); } diff --git a/dlls/wined3d/surface_base.c b/dlls/wined3d/surface_base.c index 70dee04c21b..12917019cb8 100644 --- a/dlls/wined3d/surface_base.c +++ b/dlls/wined3d/surface_base.c @@ -1144,7 +1144,7 @@ HRESULT WINAPI IWineD3DBaseSurfaceImpl_Blt(IWineD3DSurface *iface, const RECT *D assert(width <= dlock.Pitch); if (DestRect && Src != This) - dbuf = (BYTE*)dlock.pBits; + dbuf = dlock.pBits; else dbuf = (BYTE*)dlock.pBits+(xdst.top*dlock.Pitch)+(xdst.left*bpp); diff --git a/dlls/wined3d/utils.c b/dlls/wined3d/utils.c index 1d79ef875a7..808b8c7d2cf 100644 --- a/dlls/wined3d/utils.c +++ b/dlls/wined3d/utils.c @@ -1365,8 +1365,6 @@ void set_texture_matrix(const float *smat, DWORD flags, BOOL calculatedCoords, B } #undef GLINFO_LOCATION -#define GLINFO_LOCATION ((IWineD3DImpl *)(This->wineD3D))->gl_info - /* This small helper function is used to convert a bitmask into the number of masked bits */ unsigned int count_bits(unsigned int mask) { @@ -1457,8 +1455,6 @@ BOOL getDepthStencilBits(WINED3DFORMAT fmt, short *depthSize, short *stencilSize return TRUE; } -#undef GLINFO_LOCATION - /* DirectDraw stuff */ WINED3DFORMAT pixelformat_for_depth(DWORD depth) { switch(depth) { @@ -2136,7 +2132,7 @@ void gen_ffp_frag_op(IWineD3DStateBlockImpl *stateblock, struct ffp_frag_setting const struct ffp_frag_desc *find_ffp_frag_shader(const struct hash_table_t *fragment_shaders, const struct ffp_frag_settings *settings) { - return (const struct ffp_frag_desc *)hash_table_get(fragment_shaders, settings); + return hash_table_get(fragment_shaders, settings); } void add_ffp_frag_shader(struct hash_table_t *shaders, struct ffp_frag_desc *desc) { diff --git a/dlls/wined3d/vertexshader.c b/dlls/wined3d/vertexshader.c index 339d955e230..d51ab9f18bd 100644 --- a/dlls/wined3d/vertexshader.c +++ b/dlls/wined3d/vertexshader.c @@ -37,8 +37,6 @@ WINE_DEFAULT_DEBUG_CHANNEL(d3d_shader); /* TODO: Vertex and Pixel shaders are almost identical, the only exception being the way that some of the data is looked up or the availability of some of the data i.e. some instructions are only valid for pshaders and some for vshaders because of this the bulk of the software pipeline can be shared between pixel and vertex shaders... and it wouldn't surprise me if the program can be cross compiled using a large body of shared code */ -#define GLNAME_REQUIRE_GLSL ((const char *)1) - CONST SHADER_OPCODE IWineD3DVertexShaderImpl_shader_ins[] = { /* This table is not order or position dependent. */ diff --git a/dlls/winedos/int10.c b/dlls/winedos/int10.c index fbe04eb4c85..d49eef1e058 100644 --- a/dlls/winedos/int10.c +++ b/dlls/winedos/int10.c @@ -133,90 +133,6 @@ struct _ModeInfoBlock { #include "poppack.h" -/* VGA VESA definitions */ -enum modetype {TEXT=0, GRAPHIC=1}; -/* - * Wine internal information about video modes. - */ -typedef struct { - WORD Mode; - BOOL ModeType; - WORD TextCols; /* columns of text in display */ - WORD TextRows; /* rows of text in display */ - WORD CharWidth; - WORD CharHeight; - WORD Width; /* width of display in pixels */ - WORD Height; /* height of display in pixels */ - WORD Depth; /* bits per pixel */ - WORD Colors; /* total available colors */ - WORD ScreenPages; - BOOL Supported; -} INT10_MODE; - - -/* - * List of supported video modes. - * - * should be expanded to contain most or all information - * as required for SVGA VESA mode info block for VESA BIOS subsystem 1 (see _ModeInfoBlock) - * this will allow proper support for FIXME items in VGA/VESA mode configuration - * - * FIXME - verify and define support for VESA modes - * FIXME - add # bit planes, # video memory banks, & memory model - */ -static const INT10_MODE INT10_modelist[] = -{ - /* VGA modes */ - {0x0000, TEXT, 40, 25, 9, 16, 360, 400, 0, 16, 8, TRUE}, /* VGA text mode 0 */ - {0x0001, TEXT, 40, 25, 9, 16, 360, 400, 0, 16, 8, TRUE}, /* VGA text mode 1 */ - {0x0002, TEXT, 80, 25, 9, 16, 360, 400, 0, 16, 8, TRUE}, /* VGA text mode 2 */ - {0x0003, TEXT, 80, 25, 9, 16, 360, 400, 0, 16, 8, TRUE}, /* VGA text mode 3 */ - {0x0004, GRAPHIC, 40, 25, 8, 8, 320, 200, 2, 4, 1, TRUE}, /* VGA graphics mode 4 */ - {0x0005, GRAPHIC, 40, 25, 8, 8, 320, 200, 2, 4, 1, FALSE}, /* VGA graphics mode 5 */ - {0x0006, GRAPHIC, 80, 25, 8, 8, 640, 200, 1, 2, 1, FALSE}, /* VGA graphics mode 6 */ - {0x0007, TEXT, 80, 25, 9, 16, 720, 400, 0, 0, 8, FALSE}, /* VGA text mode 7 - FIXME bad default address */ - {0x000d, GRAPHIC, 40, 25, 8, 8, 320, 200, 4, 16, 8, FALSE}, /* VGA graphics mode 13 */ - {0x000e, GRAPHIC, 80, 25, 8, 8, 640, 200, 4, 16, 4, FALSE}, /* VGA graphics mode 14 */ - {0x000f, GRAPHIC, 80, 25, 8, 14, 640, 350, 0, 0, 2, FALSE}, /* VGA graphics mode 15 */ - {0x0010, GRAPHIC, 80, 25, 8, 14, 640, 350, 4, 16, 2, FALSE}, /* VGA graphics mode 16 */ - {0x0012, GRAPHIC, 80, 30, 8, 16, 640, 480, 1, 2, 1, FALSE}, /* VGA graphics mode 17 */ - {0x0012, GRAPHIC, 80, 30, 8, 16, 640, 480, 4, 16, 1, FALSE}, /* VGA graphics mode 18 */ - {0x0013, GRAPHIC, 40, 25, 8, 8, 320, 200, 8, 256, 1, TRUE}, /* VGA graphics mode 19 */ - /* VESA 7-bit modes */ - {0x006a, GRAPHIC, 0, 0, 0, 0, 800, 600, 4, 16, 1, TRUE}, /* VESA graphics mode, same as 0x102 */ - /* VESA 15-bit modes */ - {0x0100, GRAPHIC, 0, 0, 0, 0, 640, 400, 8, 256, 1, TRUE}, /* VESA graphics mode */ - {0x0101, GRAPHIC, 0, 0, 0, 0, 640, 480, 8, 256, 1, TRUE}, /* VESA graphics mode */ - {0x0102, GRAPHIC, 0, 0, 0, 0, 800, 600, 4, 16, 1, TRUE}, /* VESA graphics mode */ - {0x0103, GRAPHIC, 0, 0, 0, 0, 800, 600, 8, 256, 1, TRUE}, /* VESA graphics mode */ - {0x0104, GRAPHIC, 0, 0, 0, 0, 1024, 768, 4, 16, 1, TRUE}, /* VESA graphics mode */ - {0x0105, GRAPHIC, 0, 0, 0, 0, 1024, 768, 8, 256, 1, TRUE}, /* VESA graphics mode */ - {0x0106, GRAPHIC, 0, 0, 0, 0, 1280, 1024, 4, 16, 1, TRUE}, /* VESA graphics mode */ - {0x0107, GRAPHIC, 0, 0, 0, 0, 1280, 1024, 8, 256, 1, TRUE}, /* VESA graphics mode */ - {0x0108, TEXT, 0, 0, 0, 0, 80, 60, 0, 0, 1, TRUE}, /* VESA text mode */ - {0x0109, TEXT, 0, 0, 0, 0, 132, 25, 0, 0, 1, TRUE}, /* VESA text mode */ - {0x010a, TEXT, 0, 0, 0, 0, 132, 43, 0, 0, 1, TRUE}, /* VESA text mode */ - {0x010b, TEXT, 0, 0, 0, 0, 132, 50, 0, 0, 1, TRUE}, /* VESA text mode */ - {0x010c, TEXT, 0, 0, 0, 0, 132, 60, 0, 0, 1, TRUE}, /* VESA text mode */ - /* VESA 1.2 modes */ - {0x010d, GRAPHIC, 0, 0, 0, 0, 320, 200, 15, 0, 1, TRUE}, /* VESA graphics mode, 32K colors */ - {0x010e, GRAPHIC, 0, 0, 0, 0, 320, 200, 16, 0, 1, TRUE}, /* VESA graphics mode, 64K colors */ - {0x010f, GRAPHIC, 0, 0, 0, 0, 320, 200, 24, 0, 1, TRUE}, /* VESA graphics mode, 16.8 Million colors */ - {0x0110, GRAPHIC, 0, 0, 0, 0, 640, 480, 15, 0, 1, TRUE}, /* VESA graphics mode, 32K colors */ - {0x0111, GRAPHIC, 0, 0, 0, 0, 640, 480, 16, 0, 1, TRUE}, /* VESA graphics mode, 64K colors */ - {0x0112, GRAPHIC, 0, 0, 0, 0, 640, 480, 24, 0, 1, TRUE}, /* VESA graphics mode, 16.8 Million colors */ - {0x0113, GRAPHIC, 0, 0, 0, 0, 800, 600, 15, 0, 1, TRUE}, /* VESA graphics mode, 32K colors */ - {0x0114, GRAPHIC, 0, 0, 0, 0, 800, 600, 16, 0, 1, TRUE}, /* VESA graphics mode, 64K colors */ - {0x0115, GRAPHIC, 0, 0, 0, 0, 800, 600, 24, 0, 1, TRUE}, /* VESA graphics mode, 16.8 Million colors */ - {0x0116, GRAPHIC, 0, 0, 0, 0, 1024, 768, 15, 0, 1, TRUE}, /* VESA graphics mode, 32K colors */ - {0x0117, GRAPHIC, 0, 0, 0, 0, 1024, 768, 16, 0, 1, TRUE}, /* VESA graphics mode, 64K colors */ - {0x0118, GRAPHIC, 0, 0, 0, 0, 1024, 768, 24, 0, 1, TRUE}, /* VESA graphics mode, 16.8 Million colors */ - {0x0119, GRAPHIC, 0, 0, 0, 0, 1280, 1024, 15, 0, 1, TRUE}, /* VESA graphics mode, 32K colors */ - {0x011a, GRAPHIC, 0, 0, 0, 0, 1280, 1024, 16, 0, 1, TRUE}, /* VESA graphics mode, 64K colors */ - {0x011b, GRAPHIC, 0, 0, 0, 0, 1280, 1024, 24, 0, 1, TRUE}, /* VESA graphics mode, 16.8 Million colors */ - {0xffff, TEXT, 0, 0, 0, 0, 0, 0, 0, 0, 1, FALSE} -}; - /* True if video mode is a vesa mode, false otherwise. * More correct would be to use something like (x > 0xff || x == 0x6a) * but as long as we have only the standard VGA and VESA modes this is ok too */ @@ -226,30 +142,6 @@ static const INT10_MODE INT10_modelist[] = static INT10_HEAP *INT10_GetHeap(void); static void INT10_SetCursorPos(BIOSDATA*, unsigned, unsigned, unsigned); - -/********************************************************************** - * INT10_FindMode - */ -static const INT10_MODE *INT10_FindMode( WORD mode ) -{ - const INT10_MODE *ptr = INT10_modelist; - - /* - * Filter out flags. - */ - mode &= 0x17f; - - while (ptr->Mode != 0xffff) - { - if (ptr->Mode == mode) - return ptr; - ptr++; - } - - return NULL; -} - - /********************************************************************** * INT10_FillControllerInformation * @@ -342,7 +234,7 @@ static void INT10_FillControllerInformation( BYTE *buffer ) */ static BOOL INT10_FillModeInformation( struct _ModeInfoBlock *mib, WORD mode ) { - const INT10_MODE *ptr = INT10_FindMode( mode ); + const VGA_MODE *ptr = VGA_GetModeInfo( mode ); if (!ptr) return FALSE; @@ -754,8 +646,8 @@ INT10_HEAP *INT10_GetHeap( void ) for (i=0; TRUE; i++) { - heap_pointer->VesaModeList[i] = INT10_modelist[i].Mode; - if (INT10_modelist[i].Mode == 0xffff) + heap_pointer->VesaModeList[i] = VGA_modelist[i].Mode; + if (VGA_modelist[i].Mode == 0xffff) break; } @@ -797,7 +689,7 @@ INT10_HEAP *INT10_GetHeap( void ) */ static BOOL INT10_SetVideoMode( BIOSDATA *data, WORD mode ) { - const INT10_MODE *ptr = INT10_FindMode( mode ); + const VGA_MODE *ptr = VGA_GetModeInfo( mode ); INT10_HEAP *heap = INT10_GetHeap(); BOOL clearScreen = TRUE; @@ -858,7 +750,7 @@ static BOOL INT10_SetVideoMode( BIOSDATA *data, WORD mode ) ptr->Width, ptr->Height, ptr->Depth, clearScreen ? "cleared" : "preserved" ); - if (VGA_SetMode( ptr->Width, ptr->Height, ptr->Depth )) + if ( VGA_SetMode(mode) ) return FALSE; } diff --git a/dlls/winedos/ioports.c b/dlls/winedos/ioports.c index 2de1b1587e3..e9a825fdd0b 100644 --- a/dlls/winedos/ioports.c +++ b/dlls/winedos/ioports.c @@ -50,18 +50,26 @@ WINE_DEFAULT_DEBUG_CHANNEL(int); static struct { WORD countmax; - BOOL16 byte_toggle; /* if TRUE, then hi byte has already been written */ WORD latch; - BOOL16 latched; BYTE ctrlbyte_ch; - WORD oldval; + BYTE flags; + LONG64 start_time; } tmr_8253[3] = { - {0xFFFF, FALSE, 0, FALSE, 0x36, 0}, - {0x0012, FALSE, 0, FALSE, 0x74, 0}, - {0x0001, FALSE, 0, FALSE, 0xB6, 0}, + {0xFFFF, 0, 0x36, 0, 0}, + {0x0012, 0, 0x74, 0, 0}, + {0x0001, 0, 0xB6, 0, 0}, }; +/* two byte read in progress */ +#define TMR_RTOGGLE 0x01 +/* two byte write in progress */ +#define TMR_WTOGGLE 0x02 +/* latch contains data */ +#define TMR_LATCHED 0x04 +/* counter is in update phase */ +#define TMR_UPDATE 0x08 +/* readback status request */ +#define TMR_STATUS 0x10 -static int dummy_ctr = 0; static BYTE parport_8255[4] = {0x4f, 0x20, 0xff, 0xff}; @@ -165,11 +173,26 @@ static int do_pp_port_access = -1; /* -1: uninitialized, 1: not available 0: available);*/ #endif -static void set_timer_maxval(unsigned timer, unsigned maxval) +#define BCD2BIN(a) \ +((a)%10 + ((a)>>4)%10*10 + ((a)>>8)%10*100 + ((a)>>12)%10*1000) +#define BIN2BCD(a) \ +((a)%10 | (a)/10%10<<4 | (a)/100%10<<8 | (a)/1000%10<<12) + + +static void set_timer(unsigned timer) { + DWORD val = tmr_8253[timer].countmax; + + if (tmr_8253[timer].ctrlbyte_ch & 0x01) + val = BCD2BIN(val); + + tmr_8253[timer].flags &= ~TMR_UPDATE; + if (!QueryPerformanceCounter((LARGE_INTEGER*)&tmr_8253[timer].start_time)) + WARN("QueryPerformanceCounter should not fail!\n"); + switch (timer) { case 0: /* System timer counter divisor */ - DOSVM_SetTimer(maxval); + DOSVM_SetTimer(val); break; case 1: /* RAM refresh */ FIXME("RAM refresh counter handling not implemented !\n"); @@ -178,14 +201,60 @@ static void set_timer_maxval(unsigned timer, unsigned maxval) /* speaker on ? */ if ((parport_8255[1] & 3) == 3) { - TRACE("Beep (freq: %d) !\n", 1193180 / maxval ); - Beep(1193180 / maxval, 20); + TRACE("Beep (freq: %d) !\n", 1193180 / val); + Beep(1193180 / val, 20); } break; } } +static WORD get_timer_val(unsigned timer) +{ + LARGE_INTEGER time; + WORD maxval, val = tmr_8253[timer].countmax; + BYTE mode = tmr_8253[timer].ctrlbyte_ch >> 1 & 0x07; + + /* This is not strictly correct. In most cases the old countdown should + * finish normally (by counting down to 0) or halt and not jump to 0. + * But we are calculating and not countig, so this seems to be a good + * solution and should work well with most (all?) programs + */ + if (tmr_8253[timer].flags & TMR_UPDATE) + return 0; + + if (!QueryPerformanceCounter(&time)) + WARN("QueryPerformanceCounter should not fail!\n"); + + time.QuadPart -= tmr_8253[timer].start_time; + if (tmr_8253[timer].ctrlbyte_ch & 0x01) + val = BCD2BIN(val); + + switch ( mode ) + { + case 0: + case 1: + case 4: + case 5: + maxval = tmr_8253[timer].ctrlbyte_ch & 0x01 ? 9999 : 0xFFFF; + break; + case 2: + case 3: + maxval = val; + break; + default: + ERR("Invalid PIT mode: %d\n", mode); + return 0; + } + + val = (val - time.QuadPart) % (maxval + 1); + if (tmr_8253[timer].ctrlbyte_ch & 0x01) + val = BIN2BCD(val); + + return val; +} + + /********************************************************************** * IO_port_init */ @@ -401,24 +470,22 @@ DWORD WINAPI DOSVM_inport( int port, int size ) case 0x42: { BYTE chan = port & 3; - WORD tempval = 0; - if (tmr_8253[chan].latched) - tempval = tmr_8253[chan].latch; - else + WORD tempval = tmr_8253[chan].flags & TMR_LATCHED + ? tmr_8253[chan].latch : get_timer_val(chan); + + if (tmr_8253[chan].flags & TMR_STATUS) { - dummy_ctr -= 1 + (int)(10.0 * rand() / (RAND_MAX + 1.0)); - if (chan == 0) /* System timer counter divisor */ - { - /* FIXME: DOSVM_GetTimer() returns quite rigid values */ - tempval = dummy_ctr + (WORD)DOSVM_GetTimer(); - } - else - { - /* FIXME: intelligent hardware timer emulation needed */ - tempval = dummy_ctr; - } + WARN("Read-back status\n"); + /* We differ slightly from the spec: + * - TMR_UPDATE is already set with the first write + * of a two byte counter update + * - 0x80 should be set if OUT signal is 1 (high) + */ + tmr_8253[chan].flags &= ~TMR_STATUS; + res = (tmr_8253[chan].ctrlbyte_ch & 0x3F) | + (tmr_8253[chan].flags & TMR_UPDATE ? 0x40 : 0x00); + break; } - switch ((tmr_8253[chan].ctrlbyte_ch & 0x30) >> 4) { case 0: @@ -426,11 +493,11 @@ DWORD WINAPI DOSVM_inport( int port, int size ) break; case 1: /* read lo byte */ res = (BYTE)tempval; - tmr_8253[chan].latched = FALSE; + tmr_8253[chan].flags &= ~TMR_LATCHED; break; case 3: /* read lo byte, then hi byte */ - tmr_8253[chan].byte_toggle ^= 1; /* toggle */ - if (tmr_8253[chan].byte_toggle) + tmr_8253[chan].flags ^= TMR_RTOGGLE; /* toggle */ + if (tmr_8253[chan].flags & TMR_RTOGGLE) { res = (BYTE)tempval; break; @@ -438,7 +505,7 @@ DWORD WINAPI DOSVM_inport( int port, int size ) /* else [fall through if read hi byte !] */ case 2: /* read hi byte */ res = (BYTE)(tempval >> 8); - tmr_8253[chan].latched = FALSE; + tmr_8253[chan].flags &= ~TMR_LATCHED; break; } } @@ -601,10 +668,7 @@ void WINAPI DOSVM_outport( int port, int size, DWORD value ) { BYTE chan = port & 3; - /* we need to get the oldval before any lo/hi byte change has been made */ - if (((tmr_8253[chan].ctrlbyte_ch & 0x30) != 0x30) || - !tmr_8253[chan].byte_toggle) - tmr_8253[chan].oldval = tmr_8253[chan].countmax; + tmr_8253[chan].flags |= TMR_UPDATE; switch ((tmr_8253[chan].ctrlbyte_ch & 0x30) >> 4) { case 0: @@ -614,8 +678,8 @@ void WINAPI DOSVM_outport( int port, int size, DWORD value ) (tmr_8253[chan].countmax & 0xff00) | (BYTE)value; break; case 3: /* write lo byte, then hi byte */ - tmr_8253[chan].byte_toggle ^= TRUE; /* toggle */ - if (tmr_8253[chan].byte_toggle) + tmr_8253[chan].flags ^= TMR_WTOGGLE; /* toggle */ + if (tmr_8253[chan].flags & TMR_WTOGGLE) { tmr_8253[chan].countmax = (tmr_8253[chan].countmax & 0xff00) | (BYTE)value; @@ -627,12 +691,10 @@ void WINAPI DOSVM_outport( int port, int size, DWORD value ) (tmr_8253[chan].countmax & 0x00ff) | ((BYTE)value << 8); break; } - /* if programming is finished and value has changed - then update to new value */ - if ((((tmr_8253[chan].ctrlbyte_ch & 0x30) != 0x30) || - !tmr_8253[chan].byte_toggle) && - (tmr_8253[chan].countmax != tmr_8253[chan].oldval)) - set_timer_maxval(chan, tmr_8253[chan].countmax); + /* if programming is finished, update to new value */ + if ((tmr_8253[chan].ctrlbyte_ch & 0x30) && + !(tmr_8253[chan].flags & TMR_WTOGGLE)) + set_timer(chan); } break; case 0x43: @@ -641,28 +703,51 @@ void WINAPI DOSVM_outport( int port, int size, DWORD value ) /* ctrl byte for specific timer channel */ if (chan == 3) { - FIXME("8254 timer readback not implemented yet\n"); + if ( !(value & 0x20) ) + { + if (value & 0x02 && !(tmr_8253[0].flags & TMR_LATCHED)) + { + tmr_8253[0].flags |= TMR_LATCHED; + tmr_8253[0].latch = get_timer_val(chan); + } + if (value & 0x04 && !(tmr_8253[1].flags & TMR_LATCHED)) + { + tmr_8253[1].flags |= TMR_LATCHED; + tmr_8253[1].latch = get_timer_val(chan); + } + if (value & 0x08 && !(tmr_8253[2].flags & TMR_LATCHED)) + { + tmr_8253[2].flags |= TMR_LATCHED; + tmr_8253[2].latch = get_timer_val(chan); + } + } + + if ( !(value & 0x10) ) + { + if (value & 0x02) + tmr_8253[0].flags |= TMR_STATUS; + if (value & 0x04) + tmr_8253[1].flags |= TMR_STATUS; + if (value & 0x08) + tmr_8253[2].flags |= TMR_STATUS; + } break; } switch (((BYTE)value & 0x30) >> 4) { case 0: /* latch timer */ - tmr_8253[chan].latched = TRUE; - dummy_ctr -= 1 + (int)(10.0 * rand() / (RAND_MAX + 1.0)); - if (chan == 0) /* System timer divisor */ - tmr_8253[chan].latch = dummy_ctr + (WORD)DOSVM_GetTimer(); - else + if ( !(tmr_8253[chan].flags & TMR_LATCHED) ) { - /* FIXME: intelligent hardware timer emulation needed */ - tmr_8253[chan].latch = dummy_ctr; + tmr_8253[chan].flags |= TMR_LATCHED; + tmr_8253[chan].latch = get_timer_val(chan); } break; - case 3: /* write lo byte, then hi byte */ - tmr_8253[chan].byte_toggle = FALSE; /* init */ - /* fall through */ case 1: /* write lo byte only */ case 2: /* write hi byte only */ + case 3: /* write lo byte, then hi byte */ tmr_8253[chan].ctrlbyte_ch = (BYTE)value; + tmr_8253[chan].countmax = 0; + tmr_8253[chan].flags = TMR_UPDATE; break; } } diff --git a/dlls/winedos/vga.c b/dlls/winedos/vga.c index 6f71cf576ef..6c9085efc98 100644 --- a/dlls/winedos/vga.c +++ b/dlls/winedos/vga.c @@ -145,6 +145,73 @@ static BYTE vga_index_3d4; static BOOL vga_address_3c0 = TRUE; /* + * List of supported video modes. + * + * should be expanded to contain most or all information + * as required for SVGA VESA mode info block for VESA BIOS subsystem 1 (see _ModeInfoBlock) + * this will allow proper support for FIXME items in VGA/VESA mode configuration + * + * FIXME - verify and define support for VESA modes + * FIXME - add # bit planes, # video memory banks, & memory model + */ +static WORD VGA_CurrentMode; +static BOOL CGA_ColorComposite = FALSE; /* behave like composite monitor */ + +const VGA_MODE VGA_modelist[] = +{ + /* Mode, ModeType, TextCols, TextRows, CharWidth, CharHeight, Width, Height, Depth, Colors, ScreenPages, Supported*/ + /* VGA modes */ + {0x0000, TEXT, 40, 25, 9, 16, 360, 400, 0, 16, 8, TRUE}, /* VGA/CGA text mode 0 */ + {0x0001, TEXT, 40, 25, 9, 16, 360, 400, 0, 16, 8, TRUE}, /* VGA/CGA text mode 1 */ + {0x0002, TEXT, 80, 25, 9, 16, 360, 400, 0, 16, 8, TRUE}, /* VGA/CGA text mode 2 */ + {0x0003, TEXT, 80, 25, 9, 16, 360, 400, 0, 16, 8, TRUE}, /* VGA/CGA text mode 3 */ + {0x0004, GRAPHIC, 40, 25, 8, 8, 320, 200, 2, 4, 1, TRUE}, /* VGA/CGA graphics mode 4 */ + {0x0005, GRAPHIC, 40, 25, 8, 8, 320, 200, 2, 4, 1, TRUE}, /* VGA/CGA graphics mode 5 */ + {0x0006, GRAPHIC, 80, 25, 8, 8, 640, 200, 1, 2, 1, TRUE}, /* VGA/CGA graphics mode 6 */ + {0x0007, TEXT, 80, 25, 9, 16, 720, 400, 0, 0, 8, FALSE}, /* VGA text mode 7 - FIXME bad default address */ + {0x000d, GRAPHIC, 40, 25, 8, 8, 320, 200, 4, 16, 8, FALSE}, /* VGA graphics mode 13 */ + {0x000e, GRAPHIC, 80, 25, 8, 8, 640, 200, 4, 16, 4, FALSE}, /* VGA graphics mode 14 */ + {0x000f, GRAPHIC, 80, 25, 8, 14, 640, 350, 0, 0, 2, FALSE}, /* VGA graphics mode 15 */ + {0x0010, GRAPHIC, 80, 25, 8, 14, 640, 350, 4, 16, 2, FALSE}, /* VGA graphics mode 16 */ + {0x0012, GRAPHIC, 80, 30, 8, 16, 640, 480, 1, 2, 1, FALSE}, /* VGA graphics mode 17 */ + {0x0012, GRAPHIC, 80, 30, 8, 16, 640, 480, 4, 16, 1, FALSE}, /* VGA graphics mode 18 */ + {0x0013, GRAPHIC, 40, 25, 8, 8, 320, 200, 8, 256, 1, TRUE}, /* VGA graphics mode 19 */ + /* VESA 7-bit modes */ + {0x006a, GRAPHIC, 0, 0, 0, 0, 800, 600, 4, 16, 1, TRUE}, /* VESA graphics mode, same as 0x102 */ + /* VESA 15-bit modes */ + {0x0100, GRAPHIC, 0, 0, 0, 0, 640, 400, 8, 256, 1, TRUE}, /* VESA graphics mode */ + {0x0101, GRAPHIC, 0, 0, 0, 0, 640, 480, 8, 256, 1, TRUE}, /* VESA graphics mode */ + {0x0102, GRAPHIC, 0, 0, 0, 0, 800, 600, 4, 16, 1, TRUE}, /* VESA graphics mode */ + {0x0103, GRAPHIC, 0, 0, 0, 0, 800, 600, 8, 256, 1, TRUE}, /* VESA graphics mode */ + {0x0104, GRAPHIC, 0, 0, 0, 0, 1024, 768, 4, 16, 1, TRUE}, /* VESA graphics mode */ + {0x0105, GRAPHIC, 0, 0, 0, 0, 1024, 768, 8, 256, 1, TRUE}, /* VESA graphics mode */ + {0x0106, GRAPHIC, 0, 0, 0, 0, 1280, 1024, 4, 16, 1, TRUE}, /* VESA graphics mode */ + {0x0107, GRAPHIC, 0, 0, 0, 0, 1280, 1024, 8, 256, 1, TRUE}, /* VESA graphics mode */ + {0x0108, TEXT, 0, 0, 0, 0, 80, 60, 0, 0, 1, TRUE}, /* VESA text mode */ + {0x0109, TEXT, 0, 0, 0, 0, 132, 25, 0, 0, 1, TRUE}, /* VESA text mode */ + {0x010a, TEXT, 0, 0, 0, 0, 132, 43, 0, 0, 1, TRUE}, /* VESA text mode */ + {0x010b, TEXT, 0, 0, 0, 0, 132, 50, 0, 0, 1, TRUE}, /* VESA text mode */ + {0x010c, TEXT, 0, 0, 0, 0, 132, 60, 0, 0, 1, TRUE}, /* VESA text mode */ + /* VESA 1.2 modes */ + {0x010d, GRAPHIC, 0, 0, 0, 0, 320, 200, 15, 0, 1, TRUE}, /* VESA graphics mode, 32K colors */ + {0x010e, GRAPHIC, 0, 0, 0, 0, 320, 200, 16, 0, 1, TRUE}, /* VESA graphics mode, 64K colors */ + {0x010f, GRAPHIC, 0, 0, 0, 0, 320, 200, 24, 0, 1, TRUE}, /* VESA graphics mode, 16.8 Million colors */ + {0x0110, GRAPHIC, 0, 0, 0, 0, 640, 480, 15, 0, 1, TRUE}, /* VESA graphics mode, 32K colors */ + {0x0111, GRAPHIC, 0, 0, 0, 0, 640, 480, 16, 0, 1, TRUE}, /* VESA graphics mode, 64K colors */ + {0x0112, GRAPHIC, 0, 0, 0, 0, 640, 480, 24, 0, 1, TRUE}, /* VESA graphics mode, 16.8 Million colors */ + {0x0113, GRAPHIC, 0, 0, 0, 0, 800, 600, 15, 0, 1, TRUE}, /* VESA graphics mode, 32K colors */ + {0x0114, GRAPHIC, 0, 0, 0, 0, 800, 600, 16, 0, 1, TRUE}, /* VESA graphics mode, 64K colors */ + {0x0115, GRAPHIC, 0, 0, 0, 0, 800, 600, 24, 0, 1, TRUE}, /* VESA graphics mode, 16.8 Million colors */ + {0x0116, GRAPHIC, 0, 0, 0, 0, 1024, 768, 15, 0, 1, TRUE}, /* VESA graphics mode, 32K colors */ + {0x0117, GRAPHIC, 0, 0, 0, 0, 1024, 768, 16, 0, 1, TRUE}, /* VESA graphics mode, 64K colors */ + {0x0118, GRAPHIC, 0, 0, 0, 0, 1024, 768, 24, 0, 1, TRUE}, /* VESA graphics mode, 16.8 Million colors */ + {0x0119, GRAPHIC, 0, 0, 0, 0, 1280, 1024, 15, 0, 1, TRUE}, /* VESA graphics mode, 32K colors */ + {0x011a, GRAPHIC, 0, 0, 0, 0, 1280, 1024, 16, 0, 1, TRUE}, /* VESA graphics mode, 64K colors */ + {0x011b, GRAPHIC, 0, 0, 0, 0, 1280, 1024, 24, 0, 1, TRUE}, /* VESA graphics mode, 16.8 Million colors */ + {0xffff, TEXT, 0, 0, 0, 0, 0, 0, 0, 0, 1, FALSE} +}; + +/* * This mutex is used to protect VGA state during asynchronous * screen updates (see VGA_Poll). It makes sure that VGA state changes * are atomic and the user interface is protected from flicker and @@ -216,14 +283,13 @@ static PALETTEENTRY cga_palette2_bright[] = { }; /* - * VGA Palette Registers, in actual 18 bit color + * VGA Palette Registers, in actual 16 bit color * port 3C0H - 6 bit rgbRGB format * * 16 color accesses will use these pointers and insert * entries from the 64-color palette (mode 18) into the default * palette. --Robert 'Admiral' Coeyman */ - static char vga_16_palette[17]={ 0x00, /* 0 - Black */ 0x01, /* 1 - Blue */ @@ -795,18 +861,87 @@ static void WINAPI VGA_DoSetMode(ULONG_PTR arg) return; } -int VGA_SetMode(unsigned Xres,unsigned Yres,unsigned Depth) +/**********************************************************************\ +* VGA_GetModeInfo +* +* Returns mode information, given mode number +\**********************************************************************/ +const VGA_MODE *VGA_GetModeInfo(WORD mode) +{ + const VGA_MODE *ModeInfo = VGA_modelist; + + /* + * Filter out flags. + */ + mode &= 0x17f; + + while (ModeInfo->Mode != 0xffff) + { + if (ModeInfo->Mode == mode) + return ModeInfo; + ModeInfo++; + } + return NULL; +} + +const VGA_MODE *VGA_GetModeInfoList(void) +{ + return VGA_modelist; +} + +int VGA_SetMode(WORD mode) +{ + const VGA_MODE *ModeInfo; + /* get info on VGA mode & set appropriately */ + VGA_CurrentMode = mode; + ModeInfo = VGA_GetModeInfo(VGA_CurrentMode); + + /* check if mode is supported */ + if (ModeInfo->Supported) + { + FIXME("Setting VGA mode %i - Supported mode - Improve reporting of missing capabilities for modes & modetypes.\n", mode); + } + else + { + FIXME("Setting VGA mode %i - Unsupported mode - Will doubtfully work at all, but we'll try anyways.\n", mode); + } + + /* set up graphic or text display */ + if (ModeInfo->ModeType == TEXT) + { + VGA_SetAlphaMode(ModeInfo->TextCols, ModeInfo->TextRows); + } + else + { + return VGA_SetGraphicMode(mode); + } + return 0; /* assume all good & return zero */ +} + +int VGA_SetGraphicMode(WORD mode) { ModeSet par; int newSize; - vga_fb_width = Xres; - vga_fb_height = Yres; - vga_fb_depth = Depth; + /* get info on VGA mode & set appropriately */ + const VGA_MODE *ModeInfo = VGA_GetModeInfo(VGA_CurrentMode); + /* check if we're assuming composite display */ + if ((mode == 6) && (CGA_ColorComposite)) + { + vga_fb_width = (ModeInfo->Width / 4); + vga_fb_height = ModeInfo->Height; + vga_fb_depth = (ModeInfo->Depth * 4); + } + else + { + vga_fb_width = ModeInfo->Width; + vga_fb_height = ModeInfo->Height; + vga_fb_depth = ModeInfo->Depth; + } vga_fb_offset = 0; - vga_fb_pitch = Xres * ((Depth + 7) / 8); + vga_fb_pitch = vga_fb_width * ((vga_fb_depth + 7) / 8); - newSize = Xres * Yres * ((Depth + 7) / 8); + newSize = vga_fb_width * vga_fb_height * ((vga_fb_depth + 7) / 8); if(newSize < 256 * 1024) newSize = 256 * 1024; @@ -816,9 +951,9 @@ int VGA_SetMode(unsigned Xres,unsigned Yres,unsigned Depth) vga_fb_size = newSize; } - if(Xres >= 640 || Yres >= 480) { - par.Xres = Xres; - par.Yres = Yres; + if(vga_fb_width >= 640 || vga_fb_height >= 480) { + par.Xres = vga_fb_width; + par.Yres = vga_fb_height; } else { par.Xres = 640; par.Yres = 480; @@ -836,7 +971,7 @@ int VGA_SetMode(unsigned Xres,unsigned Yres,unsigned Depth) { vga_fb_window_data = CGA_WINDOW_START; vga_fb_window_size = CGA_WINDOW_SIZE; - if(Depth == 2) + if(vga_fb_depth == 2) { /* Select default 2 bit CGA palette */ vga_fb_palette = cga_palette1; @@ -859,7 +994,7 @@ int VGA_SetMode(unsigned Xres,unsigned Yres,unsigned Depth) /* Reset window start */ VGA_SetWindowStart(0); - par.Depth = (Depth < 8) ? 8 : Depth; + par.Depth = (vga_fb_depth < 8) ? 8 : vga_fb_depth; MZ_RunInThread(VGA_DoSetMode, (ULONG_PTR)&par); return par.ret; @@ -1267,10 +1402,18 @@ void VGA_GetCursorPos(unsigned*X,unsigned*Y) static void VGA_PutCharAt(unsigned x, unsigned y, BYTE ascii, int attr) { - char *dat = VGA_AlphaBuffer() + ((vga_text_width * y + x) * 2); - dat[0] = ascii; - if (attr>=0) - dat[1] = attr; + const VGA_MODE *ModeInfo = VGA_GetModeInfo(VGA_CurrentMode); + if ( ModeInfo->ModeType == TEXT ) + { + char *dat = VGA_AlphaBuffer() + ((vga_text_width * y + x) * 2); + dat[0] = ascii; + if (attr>=0) + dat[1] = attr; + } + else + { + FIXME("Write %c at (%i,%i) - not yet supported in graphic modes.\n", (char)ascii, x, y); + } } void VGA_WriteChars(unsigned X,unsigned Y,unsigned ch,int attr,int count) @@ -1441,7 +1584,7 @@ static void VGA_Poll_Graphics(void) VGA_SyncWindow( TRUE ); /* - * CGA framebuffer (160x200) + * CGA framebuffer (160x200) - CGA_ColorComposite, special subtype of mode 6 * This buffer is encoded as following: * - 4 bit pr. pixel, 2 pixels per byte * - 80 bytes per row @@ -1511,6 +1654,9 @@ static void VGA_Poll_Graphics(void) surf[X*2+Pitch] = value; surf[X*2+Pitch+1] = value; } + /* + * Linear Buffer, including mode 19 + */ else for (Y=0; YdwCallback, dwFlags); + TRACE("(%u, %p[cb=%08lx], %08X);\n", wDevID, lpDesc, lpDesc->dwCallback, dwFlags); if (lpDesc == NULL) { WARN("Invalid Parameter !\n"); return MMSYSERR_INVALPARAM; diff --git a/dlls/wineps.drv/type1.c b/dlls/wineps.drv/type1.c index fe8c8bac913..f82fc089e0b 100644 --- a/dlls/wineps.drv/type1.c +++ b/dlls/wineps.drv/type1.c @@ -192,7 +192,7 @@ BOOL T1_download_glyph(PSDRV_PDEVICE *physDev, DOWNLOAD *pdl, DWORD index, TTPOLYCURVE *ppc; LOGFONTW lf; RECT rc; - + static const MAT2 identity = { {0,1},{0,0},{0,0},{0,1} }; static const char glyph_def_begin[] = "/%s findfont dup\n" "/Private get begin\n" @@ -226,11 +226,11 @@ BOOL T1_download_glyph(PSDRV_PDEVICE *physDev, DOWNLOAD *pdl, DWORD index, unscaled_font = CreateFontIndirectW(&lf); old_font = SelectObject(physDev->hdc, unscaled_font); len = GetGlyphOutlineW(physDev->hdc, index, GGO_GLYPH_INDEX | GGO_BEZIER, - &gm, 0, NULL, NULL); + &gm, 0, NULL, &identity); if(len == GDI_ERROR) return FALSE; glyph_buf = HeapAlloc(GetProcessHeap(), 0, len); GetGlyphOutlineW(physDev->hdc, index, GGO_GLYPH_INDEX | GGO_BEZIER, - &gm, len, glyph_buf, NULL); + &gm, len, glyph_buf, &identity); SelectObject(physDev->hdc, old_font); DeleteObject(unscaled_font); diff --git a/dlls/winex11.drv/opengl.c b/dlls/winex11.drv/opengl.c index 2aa5afaf4b8..d43f03e94a0 100644 --- a/dlls/winex11.drv/opengl.c +++ b/dlls/winex11.drv/opengl.c @@ -1902,7 +1902,8 @@ static BOOL internal_wglUseFontBitmaps(HDC hdc, DWORD first, DWORD count, DWORD wine_tsx11_unlock(); for (glyph = first; glyph < first + count; glyph++) { - unsigned int needed_size = GetGlyphOutline_ptr(hdc, glyph, GGO_BITMAP, &gm, 0, NULL, NULL); + static const MAT2 identity = { {0,1},{0,0},{0,0},{0,1} }; + unsigned int needed_size = GetGlyphOutline_ptr(hdc, glyph, GGO_BITMAP, &gm, 0, NULL, &identity); unsigned int height, width_int; TRACE("Glyph : %3d / List : %d\n", glyph, listBase); @@ -1920,7 +1921,8 @@ static BOOL internal_wglUseFontBitmaps(HDC hdc, DWORD first, DWORD count, DWORD bitmap = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, size); gl_bitmap = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, size); } - if (GetGlyphOutline_ptr(hdc, glyph, GGO_BITMAP, &gm, size, bitmap, NULL) == GDI_ERROR) goto error; + if (GetGlyphOutline_ptr(hdc, glyph, GGO_BITMAP, &gm, size, bitmap, &identity) == GDI_ERROR) + goto error; if (TRACE_ON(wgl)) { unsigned int height, width, bitmask; unsigned char *bitmap_ = bitmap; diff --git a/dlls/winex11.drv/xrandr.c b/dlls/winex11.drv/xrandr.c index fd2116914b8..4884e1fc042 100644 --- a/dlls/winex11.drv/xrandr.c +++ b/dlls/winex11.drv/xrandr.c @@ -307,12 +307,4 @@ void X11DRV_XRandR_Init(void) TRACE("Enabling XRandR\n"); } -void X11DRV_XRandR_Cleanup(void) -{ - HeapFree(GetProcessHeap(), 0, real_xrandr_rates); - real_xrandr_rates = NULL; - HeapFree(GetProcessHeap(), 0, real_xrandr_rates_count); - real_xrandr_rates_count = NULL; -} - #endif /* SONAME_LIBXRANDR */ diff --git a/dlls/winex11.drv/xrandr.h b/dlls/winex11.drv/xrandr.h index 9686c87ca0b..af3d70e894b 100644 --- a/dlls/winex11.drv/xrandr.h +++ b/dlls/winex11.drv/xrandr.h @@ -27,7 +27,6 @@ #ifdef SONAME_LIBXRANDR void X11DRV_XRandR_Init(void); -void X11DRV_XRandR_Cleanup(void); #endif /* SONAME_LIBXRANDR */ #endif /* __WINE_XRANDR_H */ diff --git a/dlls/winex11.drv/xrender.c b/dlls/winex11.drv/xrender.c index fd405beff63..a7414a6033b 100644 --- a/dlls/winex11.drv/xrender.c +++ b/dlls/winex11.drv/xrender.c @@ -666,6 +666,7 @@ static BOOL UploadGlyph(X11DRV_PDEVICE *physDev, int glyph, AA_Type format) XRenderPictFormat pf; unsigned long pf_mask; static const char zero[4]; + static const MAT2 identity = { {0,1},{0,0},{0,0},{0,1} }; switch(format) { case AA_Grey: @@ -691,15 +692,13 @@ static BOOL UploadGlyph(X11DRV_PDEVICE *physDev, int glyph, AA_Type format) break; } - buflen = GetGlyphOutlineW(physDev->hdc, glyph, ggo_format, &gm, 0, NULL, - NULL); + buflen = GetGlyphOutlineW(physDev->hdc, glyph, ggo_format, &gm, 0, NULL, &identity); if(buflen == GDI_ERROR) { if(format != AA_None) { format = AA_None; entry->aa_default = AA_None; ggo_format = GGO_GLYPH_INDEX | GGO_BITMAP; - buflen = GetGlyphOutlineW(physDev->hdc, glyph, ggo_format, &gm, 0, NULL, - NULL); + buflen = GetGlyphOutlineW(physDev->hdc, glyph, ggo_format, &gm, 0, NULL, &identity); } if(buflen == GDI_ERROR) { WARN("GetGlyphOutlineW failed\n"); @@ -800,7 +799,7 @@ static BOOL UploadGlyph(X11DRV_PDEVICE *physDev, int glyph, AA_Type format) buf = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, buflen); - GetGlyphOutlineW(physDev->hdc, glyph, ggo_format, &gm, buflen, buf, NULL); + GetGlyphOutlineW(physDev->hdc, glyph, ggo_format, &gm, buflen, buf, &identity); formatEntry->realized[glyph] = TRUE; TRACE("buflen = %d. Got metrics: %dx%d adv=%d,%d origin=%d,%d\n", diff --git a/dlls/winex11.drv/xvidmode.c b/dlls/winex11.drv/xvidmode.c index 19b9909a61e..b178d2679cb 100644 --- a/dlls/winex11.drv/xvidmode.c +++ b/dlls/winex11.drv/xvidmode.c @@ -263,15 +263,6 @@ void X11DRV_XF86VM_Cleanup(void) wine_tsx11_unlock(); } -void X11DRV_XF86VM_SetExclusiveMode(int lock) -{ - if (!dd_modes) return; /* no XVidMode */ - - wine_tsx11_lock(); - pXF86VidModeLockModeSwitch(gdi_display, DefaultScreen(gdi_display), lock); - wine_tsx11_unlock(); -} - /***** GAMMA CONTROL *****/ /* (only available in XF86VidMode 2.x) */ diff --git a/dlls/winhttp/net.c b/dlls/winhttp/net.c index 2e37b1c3054..201a1cb50d3 100644 --- a/dlls/winhttp/net.c +++ b/dlls/winhttp/net.c @@ -607,7 +607,7 @@ BOOL netconn_resolve( WCHAR *hostnameW, INTERNET_PORT port, struct sockaddr_in * return FALSE; } memset( sa, 0, sizeof(struct sockaddr_in) ); - memcpy( (char *)&sa->sin_addr, he->h_addr, he->h_length ); + memcpy( &sa->sin_addr, he->h_addr, he->h_length ); sa->sin_family = he->h_addrtype; sa->sin_port = htons( port ); diff --git a/dlls/winhttp/request.c b/dlls/winhttp/request.c index 29969bab7fd..ddfac13c449 100644 --- a/dlls/winhttp/request.c +++ b/dlls/winhttp/request.c @@ -566,7 +566,7 @@ static BOOL query_headers( request_t *request, DWORD level, LPCWSTR name, LPVOID } else if (buffer) { - for (p = headers, q = (WCHAR *)buffer; *p; p++, q++) + for (p = headers, q = buffer; *p; p++, q++) { if (*p != '\r') *q = *p; else @@ -576,7 +576,7 @@ static BOOL query_headers( request_t *request, DWORD level, LPCWSTR name, LPVOID } } *q = 0; - TRACE("returning data: %s\n", debugstr_wn((WCHAR *)buffer, len)); + TRACE("returning data: %s\n", debugstr_wn(buffer, len)); ret = TRUE; } *buflen = len * sizeof(WCHAR); diff --git a/dlls/wininet/http.c b/dlls/wininet/http.c index 5bf3388fdae..7d4f8a65046 100644 --- a/dlls/wininet/http.c +++ b/dlls/wininet/http.c @@ -125,8 +125,9 @@ static BOOL HTTP_HandleRedirect(LPWININETHTTPREQW lpwhr, LPCWSTR lpszUrl); static UINT HTTP_DecodeBase64(LPCWSTR base64, LPSTR bin); static BOOL HTTP_VerifyValidHeader(LPWININETHTTPREQW lpwhr, LPCWSTR field); static void HTTP_DrainContent(WININETHTTPREQW *req); +static BOOL HTTP_FinishedReading(LPWININETHTTPREQW lpwhr); -LPHTTPHEADERW HTTP_GetHeader(LPWININETHTTPREQW req, LPCWSTR head) +static LPHTTPHEADERW HTTP_GetHeader(LPWININETHTTPREQW req, LPCWSTR head) { int HeaderIndex = 0; HeaderIndex = HTTP_GetCustomHeaderIndex(req, head, 0, TRUE); @@ -4206,7 +4207,7 @@ static BOOL HTTP_ProcessHeader(LPWININETHTTPREQW lpwhr, LPCWSTR field, LPCWSTR v * Called when all content from server has been read by client. * */ -BOOL HTTP_FinishedReading(LPWININETHTTPREQW lpwhr) +static BOOL HTTP_FinishedReading(LPWININETHTTPREQW lpwhr) { WCHAR szVersion[10]; WCHAR szConnectionResponse[20]; diff --git a/dlls/wininet/internet.h b/dlls/wininet/internet.h index dc572149b20..fad69bd3f9f 100644 --- a/dlls/wininet/internet.h +++ b/dlls/wininet/internet.h @@ -379,7 +379,6 @@ INTERNETAPI HINTERNET WINAPI HTTP_HttpOpenRequestW(LPWININETHTTPSESSIONW lpwhs, LPCWSTR lpszVerb, LPCWSTR lpszObjectName, LPCWSTR lpszVersion, LPCWSTR lpszReferrer , LPCWSTR *lpszAcceptTypes, DWORD dwFlags, DWORD_PTR dwContext); -BOOL HTTP_FinishedReading(LPWININETHTTPREQW lpwhr); VOID SendAsyncCallback(LPWININETHANDLEHEADER hdr, DWORD_PTR dwContext, DWORD dwInternetStatus, LPVOID lpvStatusInfo, @@ -389,8 +388,6 @@ VOID INTERNET_SendCallback(LPWININETHANDLEHEADER hdr, DWORD_PTR dwContext, DWORD dwInternetStatus, LPVOID lpvStatusInfo, DWORD dwStatusInfoLength); -LPHTTPHEADERW HTTP_GetHeader(LPWININETHTTPREQW lpwhr, LPCWSTR header); - BOOL NETCON_connected(WININET_NETCONNECTION *connection); BOOL NETCON_init(WININET_NETCONNECTION *connnection, BOOL useSSL); BOOL NETCON_create(WININET_NETCONNECTION *connection, int domain, diff --git a/dlls/wininet/tests/internet.c b/dlls/wininet/tests/internet.c index 13a5f5cbb80..f3277d33ab3 100644 --- a/dlls/wininet/tests/internet.c +++ b/dlls/wininet/tests/internet.c @@ -546,7 +546,9 @@ static void test_IsDomainLegalCookieDomainW(void) SetLastError(0xdeadbeef); ret = pIsDomainLegalCookieDomainW(NULL, NULL); error = GetLastError(); - ok(!ret, "IsDomainLegalCookieDomainW succeeded\n"); + ok(!ret || + broken(ret), /* Win98, NT4, W2K, XP (some) */ + "IsDomainLegalCookieDomainW succeeded\n"); ok(error == ERROR_INVALID_PARAMETER, "got %u expected ERROR_INVALID_PARAMETER\n", error); SetLastError(0xdeadbeef); @@ -565,25 +567,33 @@ static void test_IsDomainLegalCookieDomainW(void) ret = pIsDomainLegalCookieDomainW(empty, gmail_com); error = GetLastError(); ok(!ret, "IsDomainLegalCookieDomainW succeeded\n"); - ok(error == ERROR_INVALID_NAME, "got %u expected ERROR_INVALID_NAME\n", error); + ok(error == ERROR_INVALID_NAME || + broken(error == ERROR_INVALID_PARAMETER), /* Win98, NT4, W2K, XP (some) */ + "got %u expected ERROR_INVALID_NAME\n", error); SetLastError(0xdeadbeef); ret = pIsDomainLegalCookieDomainW(com, empty); error = GetLastError(); ok(!ret, "IsDomainLegalCookieDomainW succeeded\n"); - ok(error == ERROR_INVALID_NAME, "got %u expected ERROR_INVALID_NAME\n", error); + ok(error == ERROR_INVALID_NAME || + broken(error == ERROR_INVALID_PARAMETER), /* Win98, NT4, W2K, XP (some) */ + "got %u expected ERROR_INVALID_NAME\n", error); SetLastError(0xdeadbeef); ret = pIsDomainLegalCookieDomainW(gmail_com, dot); error = GetLastError(); ok(!ret, "IsDomainLegalCookieDomainW succeeded\n"); - ok(error == ERROR_INVALID_NAME, "got %u expected ERROR_INVALID_NAME\n", error); + ok(error == ERROR_INVALID_NAME || + broken(error == 0xdeadbeef), /* Win98, NT4, W2K, XP (some) */ + "got %u expected ERROR_INVALID_NAME\n", error); SetLastError(0xdeadbeef); ret = pIsDomainLegalCookieDomainW(dot, gmail_com); error = GetLastError(); ok(!ret, "IsDomainLegalCookieDomainW succeeded\n"); - ok(error == ERROR_INVALID_NAME, "got %u expected ERROR_INVALID_NAME\n", error); + ok(error == ERROR_INVALID_NAME || + broken(error == 0xdeadbeef), /* Win98, NT4, W2K, XP (some) */ + "got %u expected ERROR_INVALID_NAME\n", error); SetLastError(0xdeadbeef); ret = pIsDomainLegalCookieDomainW(com, com); @@ -595,13 +605,17 @@ static void test_IsDomainLegalCookieDomainW(void) ret = pIsDomainLegalCookieDomainW(com, dot_com); error = GetLastError(); ok(!ret, "IsDomainLegalCookieDomainW succeeded\n"); - ok(error == ERROR_INVALID_NAME, "got %u expected ERROR_INVALID_NAME\n", error); + ok(error == ERROR_INVALID_NAME || + broken(error == 0xdeadbeef), /* Win98, NT4, W2K, XP (some) */ + "got %u expected ERROR_INVALID_NAME\n", error); SetLastError(0xdeadbeef); ret = pIsDomainLegalCookieDomainW(dot_com, com); error = GetLastError(); ok(!ret, "IsDomainLegalCookieDomainW succeeded\n"); - ok(error == ERROR_INVALID_NAME, "got %u expected ERROR_INVALID_NAME\n", error); + ok(error == ERROR_INVALID_NAME || + broken(error == 0xdeadbeef), /* Win98, NT4, W2K, XP (some) */ + "got %u expected ERROR_INVALID_NAME\n", error); SetLastError(0xdeadbeef); ret = pIsDomainLegalCookieDomainW(com, gmail_com); @@ -615,7 +629,7 @@ static void test_IsDomainLegalCookieDomainW(void) SetLastError(0xdeadbeef); ret = pIsDomainLegalCookieDomainW(gmail_co_uk, co_uk); error = GetLastError(); - ok(!ret, "IsDomainLegalCookieDomainW failed\n"); + ok(!ret, "IsDomainLegalCookieDomainW succeeded\n"); ok(error == 0xdeadbeef, "got %u expected 0xdeadbeef\n", error); ret = pIsDomainLegalCookieDomainW(uk, co_uk); @@ -633,8 +647,10 @@ static void test_IsDomainLegalCookieDomainW(void) SetLastError(0xdeadbeef); ret = pIsDomainLegalCookieDomainW(dot_gmail_com, mail_gmail_com); error = GetLastError(); - ok(!ret, "IsDomainLegalCookieDomainW failed\n"); - ok(error == ERROR_INVALID_NAME, "got %u expected ERROR_INVALID_NAME\n", error); + ok(!ret, "IsDomainLegalCookieDomainW succeeded\n"); + ok(error == ERROR_INVALID_NAME || + broken(error == 0xdeadbeef), /* Win98, NT4, W2K, XP (some) */ + "got %u expected ERROR_INVALID_NAME\n", error); ret = pIsDomainLegalCookieDomainW(gmail_com, mail_gmail_com); ok(ret, "IsDomainLegalCookieDomainW failed\n"); diff --git a/dlls/winmm/mci.c b/dlls/winmm/mci.c index b0d90e7597f..b231159342b 100644 --- a/dlls/winmm/mci.c +++ b/dlls/winmm/mci.c @@ -85,6 +85,8 @@ static const WCHAR wszSystemIni[] = {'s','y','s','t','e','m','.','i','n','i',0}; static WINE_MCIDRIVER *MciDrivers; +static UINT WINAPI MCI_DefYieldProc(MCIDEVICEID wDevID, DWORD data); + /* dup a string and uppercase it */ static inline LPWSTR str_dup_upper( LPCWSTR str ) { @@ -117,7 +119,7 @@ LPWINE_MCIDRIVER MCI_GetDriver(UINT16 wDevID) /************************************************************************** * MCI_GetDriverFromString [internal] */ -UINT MCI_GetDriverFromString(LPCWSTR lpstrName) +static UINT MCI_GetDriverFromString(LPCWSTR lpstrName) { LPWINE_MCIDRIVER wmd; UINT ret = 0; @@ -931,6 +933,41 @@ errCleanUp: } /************************************************************************** + * MCI_SendCommandFrom32 [internal] + */ +static DWORD MCI_SendCommandFrom32(MCIDEVICEID wDevID, UINT16 wMsg, DWORD_PTR dwParam1, DWORD_PTR dwParam2) +{ + DWORD dwRet = MCIERR_INVALID_DEVICE_ID; + LPWINE_MCIDRIVER wmd = MCI_GetDriver(wDevID); + + if (wmd) { + if (wmd->bIs32) { + dwRet = SendDriverMessage(wmd->hDriver, wMsg, dwParam1, dwParam2); + } else if (pFnMciMapMsg32WTo16) { + WINMM_MapType res; + + switch (res = pFnMciMapMsg32WTo16(wmd->wType, wMsg, dwParam1, &dwParam2)) { + case WINMM_MAP_MSGERROR: + TRACE("Not handled yet (%s)\n", MCI_MessageToString(wMsg)); + dwRet = MCIERR_DRIVER_INTERNAL; + break; + case WINMM_MAP_NOMEM: + TRACE("Problem mapping msg=%s from 32a to 16\n", MCI_MessageToString(wMsg)); + dwRet = MCIERR_OUT_OF_MEMORY; + break; + case WINMM_MAP_OK: + case WINMM_MAP_OKMEM: + dwRet = SendDriverMessage(wmd->hDriver, wMsg, dwParam1, dwParam2); + if (res == WINMM_MAP_OKMEM) + pFnMciUnMapMsg32WTo16(wmd->wType, wMsg, dwParam1, dwParam2); + break; + } + } + } + return dwRet; +} + +/************************************************************************** * MCI_FinishOpen [internal] */ static DWORD MCI_FinishOpen(LPWINE_MCIDRIVER wmd, LPMCI_OPEN_PARMSW lpParms, @@ -1551,44 +1588,9 @@ BOOL WINAPI mciFreeCommandResource(UINT uTable) } /************************************************************************** - * MCI_SendCommandFrom32 [internal] - */ -DWORD MCI_SendCommandFrom32(MCIDEVICEID wDevID, UINT16 wMsg, DWORD_PTR dwParam1, DWORD_PTR dwParam2) -{ - DWORD dwRet = MCIERR_INVALID_DEVICE_ID; - LPWINE_MCIDRIVER wmd = MCI_GetDriver(wDevID); - - if (wmd) { - if (wmd->bIs32) { - dwRet = SendDriverMessage(wmd->hDriver, wMsg, dwParam1, dwParam2); - } else if (pFnMciMapMsg32WTo16) { - WINMM_MapType res; - - switch (res = pFnMciMapMsg32WTo16(wmd->wType, wMsg, dwParam1, &dwParam2)) { - case WINMM_MAP_MSGERROR: - TRACE("Not handled yet (%s)\n", MCI_MessageToString(wMsg)); - dwRet = MCIERR_DRIVER_INTERNAL; - break; - case WINMM_MAP_NOMEM: - TRACE("Problem mapping msg=%s from 32a to 16\n", MCI_MessageToString(wMsg)); - dwRet = MCIERR_OUT_OF_MEMORY; - break; - case WINMM_MAP_OK: - case WINMM_MAP_OKMEM: - dwRet = SendDriverMessage(wmd->hDriver, wMsg, dwParam1, dwParam2); - if (res == WINMM_MAP_OKMEM) - pFnMciUnMapMsg32WTo16(wmd->wType, wMsg, dwParam1, dwParam2); - break; - } - } - } - return dwRet; -} - -/************************************************************************** * MCI_SendCommandFrom16 [internal] */ -DWORD MCI_SendCommandFrom16(MCIDEVICEID wDevID, UINT16 wMsg, DWORD_PTR dwParam1, DWORD_PTR dwParam2) +static DWORD MCI_SendCommandFrom16(MCIDEVICEID wDevID, UINT16 wMsg, DWORD_PTR dwParam1, DWORD_PTR dwParam2) { DWORD dwRet = MCIERR_INVALID_DEVICE_ID; LPWINE_MCIDRIVER wmd = MCI_GetDriver(wDevID); @@ -1805,7 +1807,7 @@ static DWORD MCI_Close(UINT16 wDevID, DWORD dwParam, LPMCI_GENERIC_PARMS lpParms /************************************************************************** * MCI_WriteString [internal] */ -DWORD MCI_WriteString(LPWSTR lpDstStr, DWORD dstSize, LPCWSTR lpSrcStr) +static DWORD MCI_WriteString(LPWSTR lpDstStr, DWORD dstSize, LPCWSTR lpSrcStr) { DWORD ret = 0; @@ -2183,7 +2185,7 @@ BOOL WINAPI mciDriverNotify(HWND hWndCallBack, MCIDEVICEID wDevID, UINT wStatus) /************************************************************************** * mciGetDriverData [WINMM.@] */ -DWORD WINAPI mciGetDriverData(MCIDEVICEID uDeviceID) +DWORD_PTR WINAPI mciGetDriverData(MCIDEVICEID uDeviceID) { LPWINE_MCIDRIVER wmd; @@ -2202,11 +2204,11 @@ DWORD WINAPI mciGetDriverData(MCIDEVICEID uDeviceID) /************************************************************************** * mciSetDriverData [WINMM.@] */ -BOOL WINAPI mciSetDriverData(MCIDEVICEID uDeviceID, DWORD data) +BOOL WINAPI mciSetDriverData(MCIDEVICEID uDeviceID, DWORD_PTR data) { LPWINE_MCIDRIVER wmd; - TRACE("(%04x, %08x)\n", uDeviceID, data); + TRACE("(%04x, %08lx)\n", uDeviceID, data); wmd = MCI_GetDriver(uDeviceID); @@ -2301,7 +2303,7 @@ static void MyUserYield(void) /************************************************************************** * MCI_DefYieldProc [internal] */ -UINT WINAPI MCI_DefYieldProc(MCIDEVICEID wDevID, DWORD data) +static UINT WINAPI MCI_DefYieldProc(MCIDEVICEID wDevID, DWORD data) { INT16 ret; diff --git a/dlls/winmm/winemm.h b/dlls/winmm/winemm.h index dcd2290a12b..ce6a649f0bf 100644 --- a/dlls/winmm/winemm.h +++ b/dlls/winmm/winemm.h @@ -141,7 +141,7 @@ typedef struct tagWINE_MCIDRIVER { LPWSTR lpstrDeviceType; LPWSTR lpstrAlias; HDRVR hDriver; - DWORD dwPrivate; + DWORD_PTR dwPrivate; YIELDPROC lpfnYieldProc; DWORD dwYieldData; BOOL bIs32; @@ -202,14 +202,9 @@ void MMDRV_InstallMap(unsigned int, MMDRV_MAPFUNC, MMDRV_UNMAPFUNC, MMDRV_MAPFUNC, MMDRV_UNMAPFUNC, LPDRVCALLBACK); WINE_MCIDRIVER* MCI_GetDriver(UINT16 uDevID); -UINT MCI_GetDriverFromString(LPCWSTR str); -DWORD MCI_WriteString(LPWSTR lpDstStr, DWORD dstSize, LPCWSTR lpSrcStr); const char* MCI_MessageToString(UINT wMsg); -UINT WINAPI MCI_DefYieldProc(MCIDEVICEID wDevID, DWORD data); LRESULT MCI_CleanUp(LRESULT dwRet, UINT wMsg, DWORD dwParam2); DWORD MCI_SendCommand(UINT wDevID, UINT16 wMsg, DWORD_PTR dwParam1, DWORD_PTR dwParam2, BOOL bFrom32); -DWORD MCI_SendCommandFrom32(UINT wDevID, UINT16 wMsg, DWORD_PTR dwParam1, DWORD_PTR dwParam2); -DWORD MCI_SendCommandFrom16(UINT wDevID, UINT16 wMsg, DWORD_PTR dwParam1, DWORD_PTR dwParam2); UINT MCI_SetCommandTable(void *table, UINT uDevType); BOOL MCI_DeleteCommandTable(UINT uTbl, BOOL delete); LPWSTR MCI_strdupAtoW(LPCSTR str); diff --git a/dlls/winmm/winmm.c b/dlls/winmm/winmm.c index d9bd190ffa2..02dd5ed76fa 100644 --- a/dlls/winmm/winmm.c +++ b/dlls/winmm/winmm.c @@ -2096,7 +2096,7 @@ UINT WAVE_Open(HANDLE* lphndl, UINT uDeviceID, UINT uType, wod.dwInstance = dwInstance; wod.dnDevNode = 0L; - TRACE("cb=%08x\n", wod.dwCallback); + TRACE("cb=%08lx\n", wod.dwCallback); for (;;) { if (dwFlags & WAVE_MAPPED) { diff --git a/dlls/winspool.drv/info.c b/dlls/winspool.drv/info.c index 6212cc8339d..bc688f49332 100644 --- a/dlls/winspool.drv/info.c +++ b/dlls/winspool.drv/info.c @@ -195,8 +195,10 @@ static const WCHAR WinNT_CV_PrinterPortsW[] = { 'S','o','f','t','w','a','r','e', static const WCHAR DefaultEnvironmentW[] = {'W','i','n','e',0}; static const WCHAR envname_win40W[] = {'W','i','n','d','o','w','s',' ','4','.','0',0}; +static const WCHAR envname_x64W[] = {'W','i','n','d','o','w','s',' ','x','6','4',0}; static const WCHAR envname_x86W[] = {'W','i','n','d','o','w','s',' ','N','T',' ','x','8','6',0}; static const WCHAR subdir_win40W[] = {'w','i','n','4','0',0}; +static const WCHAR subdir_x64W[] = {'x','6','4',0}; static const WCHAR subdir_x86W[] = {'w','3','2','x','8','6',0}; static const WCHAR Version0_RegPathW[] = {'\\','V','e','r','s','i','o','n','-','0',0}; static const WCHAR Version0_SubdirW[] = {'\\','0',0}; @@ -283,12 +285,14 @@ static const DWORD pi_sizeof[] = {0, sizeof(PRINTER_INFO_1W), sizeof(PRINTER_INF static const printenv_t * validate_envW(LPCWSTR env) { + static const printenv_t env_x64 = {envname_x64W, subdir_x64W, + 3, Version3_RegPathW, Version3_SubdirW}; static const printenv_t env_x86 = {envname_x86W, subdir_x86W, 3, Version3_RegPathW, Version3_SubdirW}; static const printenv_t env_win40 = {envname_win40W, subdir_win40W, 0, Version0_RegPathW, Version0_SubdirW}; - static const printenv_t * const all_printenv[]={&env_x86, &env_win40}; + static const printenv_t * const all_printenv[]={&env_x86, &env_x64, &env_win40}; const printenv_t *result = NULL; unsigned int i; diff --git a/dlls/winspool.drv/tests/info.c b/dlls/winspool.drv/tests/info.c index fb6dc4073c9..1e479831f26 100644 --- a/dlls/winspool.drv/tests/info.c +++ b/dlls/winspool.drv/tests/info.c @@ -41,6 +41,7 @@ static CHAR does_not_exist_dll[]= "does_not_exist.dll"; static CHAR does_not_exist[] = "does_not_exist"; static CHAR empty[] = ""; +static CHAR env_x64[] = "Windows x64"; static CHAR env_x86[] = "Windows NT x86"; static CHAR env_win9x_case[] = "windowS 4.0"; static CHAR illegal_name[] = "illegal,name"; @@ -176,6 +177,7 @@ static struct monitor_entry * find_installed_monitor(void) static struct monitor_entry monitor_table[] = { {env_win9x_case, "localspl.dll"}, {env_x86, "localspl.dll"}, + {env_x64, "localspl.dll"}, {env_win9x_case, "localmon.dll"}, {env_x86, "localmon.dll"}, {env_win9x_case, "tcpmon.dll"}, @@ -196,6 +198,7 @@ static struct monitor_entry * find_installed_monitor(void) num_tests = (sizeof(monitor_table)/sizeof(struct monitor_entry)); /* cleanup */ + DeleteMonitorA(NULL, env_x64, winetest); DeleteMonitorA(NULL, env_x86, winetest); DeleteMonitorA(NULL, env_win9x_case, winetest); diff --git a/dlls/wintrust/asn.c b/dlls/wintrust/asn.c index e9d3a7f2d12..e776cba2704 100644 --- a/dlls/wintrust/asn.c +++ b/dlls/wintrust/asn.c @@ -969,7 +969,7 @@ static BOOL CRYPT_AsnEncodeInteger(DWORD dwCertEncodingType, return ret; } -BOOL WINAPI CRYPT_AsnEncodeInt(DWORD dwCertEncodingType, +static BOOL WINAPI CRYPT_AsnEncodeInt(DWORD dwCertEncodingType, LPCSTR lpszStructType, const void *pvStructInfo, BYTE *pbEncoded, DWORD *pcbEncoded) { diff --git a/dlls/wintrust/tests/crypt.c b/dlls/wintrust/tests/crypt.c index 64211f18394..1d7f30e35fe 100644 --- a/dlls/wintrust/tests/crypt.c +++ b/dlls/wintrust/tests/crypt.c @@ -1079,7 +1079,7 @@ START_TEST(crypt) { int myARGC; char** myARGV; - char windir[MAX_PATH]; + char sysdir[MAX_PATH]; InitFunctionPtrs(); @@ -1089,11 +1089,11 @@ START_TEST(crypt) return; } - GetWindowsDirectoryA(windir, MAX_PATH); - lstrcpyA(catroot, windir); - lstrcatA(catroot, "\\system32\\CatRoot"); - lstrcpyA(catroot2, windir); - lstrcatA(catroot2, "\\system32\\CatRoot2"); + GetSystemDirectoryA(sysdir, MAX_PATH); + lstrcpyA(catroot, sysdir); + lstrcatA(catroot, "\\CatRoot"); + lstrcpyA(catroot2, sysdir); + lstrcatA(catroot2, "\\CatRoot2"); myARGC = winetest_get_mainargs(&myARGV); strcpy(selfname, myARGV[0]); diff --git a/dlls/wnaspi32/aspi.c b/dlls/wnaspi32/aspi.c index a0658e754f2..e03b767979a 100644 --- a/dlls/wnaspi32/aspi.c +++ b/dlls/wnaspi32/aspi.c @@ -148,7 +148,7 @@ int ASPI_GetNumControllers(void) return num_ha; } -BOOL SCSI_GetDeviceName( int h, int c, int t, int d, LPSTR devstr, LPDWORD lpcbData ) +static BOOL SCSI_GetDeviceName( int h, int c, int t, int d, LPSTR devstr, LPDWORD lpcbData ) { char buffer[200]; HKEY hkeyScsi; diff --git a/dlls/wnaspi32/winaspi16.c b/dlls/wnaspi32/winaspi16.c index 17d6a6c948f..74297808ca8 100644 --- a/dlls/wnaspi32/winaspi16.c +++ b/dlls/wnaspi32/winaspi16.c @@ -385,7 +385,7 @@ WORD WINAPI GetASPISupportInfo16(void) } -DWORD ASPI_SendASPICommand(DWORD ptrSRB, UINT16 mode) +static DWORD ASPI_SendASPICommand(DWORD ptrSRB, UINT16 mode) { #ifdef linux LPSRB16 lpSRB = PTR_TO_LIN( ptrSRB, mode ); @@ -440,11 +440,7 @@ adapter name */ */ WORD WINAPI SendASPICommand16(SEGPTR segptr_srb) { -#ifdef linux return ASPI_SendASPICommand(segptr_srb, ASPI_WIN16); -#else - return 0; -#endif } diff --git a/dlls/wnaspi32/winescsi.h b/dlls/wnaspi32/winescsi.h index a82014169bb..be1d5f6c1f3 100644 --- a/dlls/wnaspi32/winescsi.h +++ b/dlls/wnaspi32/winescsi.h @@ -79,9 +79,6 @@ void SCSI_Fix_CMD_LEN( int fd, int cmd, int len ); #endif -BOOL -SCSI_GetDeviceName(int h, int c, int t, int d, LPSTR devstr, LPDWORD lpcbData); - DWORD ASPI_GetHCforController( int controller ); diff --git a/include/Makefile.in b/include/Makefile.in index 5056c3f6cc4..5411cc0510c 100644 --- a/include/Makefile.in +++ b/include/Makefile.in @@ -70,6 +70,7 @@ PUBLIC_IDL_H_SRCS = \ shobjidl.idl \ shtypes.idl \ strmif.idl \ + textstor.idl \ tom.idl \ unknwn.idl \ urlhist.idl \ @@ -143,6 +144,7 @@ SRCDIR_INCLUDES = \ d3dx9core.h \ d3dx9math.h \ d3dx9math.inl \ + d3dx9mesh.h \ d3dx9shader.h \ d3dx9tex.h \ dbghelp.h \ diff --git a/include/activscp.idl b/include/activscp.idl index 6775f8a3562..3fe6d622861 100644 --- a/include/activscp.idl +++ b/include/activscp.idl @@ -268,7 +268,7 @@ object, uuid(BB1A2AE2-A4F9-11cf-8F20-00805F2CD064), pointer_default(unique) ] -interface IActiveScriptParse : IUnknown +interface IActiveScriptParse32 : IUnknown { HRESULT InitNew(void); @@ -299,6 +299,50 @@ interface IActiveScriptParse : IUnknown ); } +[ + object, + uuid(c7ef7658-e1ee-480e-97ea-d52cb4d76d17), + pointer_default(unique) +] +interface IActiveScriptParse64 : IUnknown +{ + HRESULT InitNew(void); + + HRESULT AddScriptlet( + [in] LPCOLESTR pstrDefaultName, + [in] LPCOLESTR pstrCode, + [in] LPCOLESTR pstrItemName, + [in] LPCOLESTR pstrSubItemName, + [in] LPCOLESTR pstrEventName, + [in] LPCOLESTR pstrDelimiter, + [in] DWORDLONG dwSourceContextCookie, + [in] ULONG ulStartingLineNumber, + [in] DWORD dwFlags, + [out] BSTR *pbstrName, + [out] EXCEPINFO *pexcepinfo + ); + + HRESULT ParseScriptText( + [in] LPCOLESTR pstrCode, + [in] LPCOLESTR pstrItemName, + [in] IUnknown *punkContext, + [in] LPCOLESTR pstrDelimiter, + [in] DWORDLONG dwSourceContextCookie, + [in] ULONG ulStartingLineNumber, + [in] DWORD dwFlags, + [out] VARIANT *pvarResult, + [out] EXCEPINFO *pexcepinfo + ); +} + +cpp_quote("#ifdef _WIN64") +cpp_quote("#define IActiveScriptParse IActiveScriptParse64") +cpp_quote("#define IID_IActiveScriptParse IID_IActiveScriptParse64") +cpp_quote("#else") +cpp_quote("#define IActiveScriptParse IActiveScriptParse32") +cpp_quote("#define IID_IActiveScriptParse IID_IActiveScriptParse32") +cpp_quote("#endif") + cpp_quote("typedef IActiveScriptParse *PIActiveScriptParse;") [ diff --git a/include/config.h.in b/include/config.h.in index 036b5fb87c2..f1c4194b535 100644 --- a/include/config.h.in +++ b/include/config.h.in @@ -2,9 +2,6 @@ #define __WINE_CONFIG_H -/* Specifies the compiler flag that forces a short wchar_t */ -#undef CC_FLAG_SHORT_WCHAR - /* Define to 1 if you have the header file. */ #undef HAVE_ALIAS_H @@ -723,6 +720,9 @@ /* Define to 1 if `direction' is member of `struct ff_effect'. */ #undef HAVE_STRUCT_FF_EFFECT_DIRECTION +/* Define to 1 if `icps_outhist' is member of `struct icmpstat'. */ +#undef HAVE_STRUCT_ICMPSTAT_ICPS_OUTHIST + /* Define to 1 if `msg_accrights' is member of `struct msghdr'. */ #undef HAVE_STRUCT_MSGHDR_MSG_ACCRIGHTS diff --git a/include/d3dx8math.h b/include/d3dx8math.h index 88da2b05f74..ee5c220dd0e 100644 --- a/include/d3dx8math.h +++ b/include/d3dx8math.h @@ -271,6 +271,8 @@ extern "C" { D3DXCOLOR* WINAPI D3DXColorAdjustContrast(D3DXCOLOR *pout, CONST D3DXCOLOR *pc, FLOAT s); D3DXCOLOR* WINAPI D3DXColorAdjustSaturation(D3DXCOLOR *pout, CONST D3DXCOLOR *pc, FLOAT s); +FLOAT WINAPI D3DXFresnelTerm(FLOAT costheta, FLOAT refractionindex); + D3DXMATRIX* WINAPI D3DXMatrixAffineTransformation(D3DXMATRIX *pout, FLOAT scaling, CONST D3DXVECTOR3 *rotationcenter, CONST D3DXQUATERNION *rotation, CONST D3DXVECTOR3 *translation); FLOAT WINAPI D3DXMatrixfDeterminant(CONST D3DXMATRIX *pm); D3DXMATRIX* WINAPI D3DXMatrixInverse(D3DXMATRIX *pout, FLOAT *pdeterminant, CONST D3DXMATRIX *pm); diff --git a/include/d3dx8mesh.h b/include/d3dx8mesh.h index 0d399ea529e..8cdb166b69a 100644 --- a/include/d3dx8mesh.h +++ b/include/d3dx8mesh.h @@ -30,6 +30,7 @@ HRESULT WINAPI D3DXCreateBuffer(DWORD,LPD3DXBUFFER*); UINT WINAPI D3DXGetFVFVertexSize(DWORD); BOOL WINAPI D3DXBoxBoundProbe(CONST D3DXVECTOR3 *, CONST D3DXVECTOR3 *, CONST D3DXVECTOR3 *, CONST D3DXVECTOR3 *); BOOL WINAPI D3DXSphereBoundProbe(CONST D3DXVECTOR3 *,FLOAT,CONST D3DXVECTOR3 *,CONST D3DXVECTOR3 *); +BOOL CDECL D3DXIntersectTri(CONST D3DXVECTOR3 *, CONST D3DXVECTOR3 *, CONST D3DXVECTOR3 *, CONST D3DXVECTOR3 *, CONST D3DXVECTOR3 *, FLOAT *, FLOAT *, FLOAT *); #ifdef __cplusplus } diff --git a/include/d3dx8mesh.h b/include/d3dx9mesh.h similarity index 75% copy from include/d3dx8mesh.h copy to include/d3dx9mesh.h index 0d399ea529e..c337ad249c5 100644 --- a/include/d3dx8mesh.h +++ b/include/d3dx9mesh.h @@ -1,5 +1,5 @@ /* - * Copyright (C) 2008 Francois Gouget + * Copyright (C) 2009 David Adam * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public @@ -16,23 +16,23 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ -#ifndef __WINE_D3DX8MESH_H -#define __WINE_D3DX8MESH_H +#ifndef __WINE_D3DX9MESH_H +#define __WINE_D3DX9MESH_H -#include -#include +#include #ifdef __cplusplus extern "C" { #endif -HRESULT WINAPI D3DXCreateBuffer(DWORD,LPD3DXBUFFER*); +HRESULT WINAPI D3DXCreateBuffer(DWORD, LPD3DXBUFFER*); UINT WINAPI D3DXGetFVFVertexSize(DWORD); BOOL WINAPI D3DXBoxBoundProbe(CONST D3DXVECTOR3 *, CONST D3DXVECTOR3 *, CONST D3DXVECTOR3 *, CONST D3DXVECTOR3 *); BOOL WINAPI D3DXSphereBoundProbe(CONST D3DXVECTOR3 *,FLOAT,CONST D3DXVECTOR3 *,CONST D3DXVECTOR3 *); +BOOL WINAPI D3DXIntersectTri(CONST D3DXVECTOR3 *, CONST D3DXVECTOR3 *, CONST D3DXVECTOR3 *, CONST D3DXVECTOR3 *, CONST D3DXVECTOR3*, FLOAT *, FLOAT *, FLOAT *); #ifdef __cplusplus } #endif -#endif /* __WINE_D3DX8MESH_H */ +#endif /* __WINE_D3DX9MESH_H */ diff --git a/include/dimm.idl b/include/dimm.idl index 07e04b2e22f..851ec90cfd1 100644 --- a/include/dimm.idl +++ b/include/dimm.idl @@ -24,8 +24,6 @@ cpp_quote("#include ") cpp_quote("#if 0") -typedef WORD LANGID; - typedef struct { LPSTR lpReading; LPSTR lpWord; diff --git a/include/gdiplusflat.h b/include/gdiplusflat.h index 1a39dee4055..56540cda22d 100644 --- a/include/gdiplusflat.h +++ b/include/gdiplusflat.h @@ -49,6 +49,7 @@ GpStatus WINGDIPAPI GdipCreateBitmapFromFileICM(GDIPCONST WCHAR*,GpBitmap**); GpStatus WINGDIPAPI GdipCreateBitmapFromGdiDib(GDIPCONST BITMAPINFO*,VOID*,GpBitmap**); GpStatus WINGDIPAPI GdipCreateBitmapFromGraphics(INT,INT,GpGraphics*,GpBitmap**); GpStatus WINGDIPAPI GdipCreateBitmapFromHBITMAP(HBITMAP, HPALETTE, GpBitmap**); +GpStatus WINGDIPAPI GdipCreateBitmapFromHICON(HICON, GpBitmap**); GpStatus WINGDIPAPI GdipCreateBitmapFromResource(HINSTANCE,GDIPCONST WCHAR*,GpBitmap**); GpStatus WINGDIPAPI GdipCreateBitmapFromScan0(INT,INT,INT,PixelFormat,BYTE*, GpBitmap**); @@ -189,6 +190,8 @@ GpStatus WINGDIPAPI GdipFillRectangles(GpGraphics*,GpBrush*,GDIPCONST GpRectF*,I GpStatus WINGDIPAPI GdipFillRectanglesI(GpGraphics*,GpBrush*,GDIPCONST GpRect*,INT); GpStatus WINGDIPAPI GdipFillRegion(GpGraphics*,GpBrush*,GpRegion*); GpStatus WINGDIPAPI GdipGetClip(GpGraphics*,GpRegion*); +GpStatus WINGDIPAPI GdipGetClipBounds(GpGraphics*,GpRectF*); +GpStatus WINGDIPAPI GdipGetClipBoundsI(GpGraphics*,GpRect*); GpStatus WINGDIPAPI GdipGetCompositingMode(GpGraphics*,CompositingMode*); GpStatus WINGDIPAPI GdipGetCompositingQuality(GpGraphics*,CompositingQuality*); GpStatus WINGDIPAPI GdipGetDC(GpGraphics*,HDC*); @@ -221,6 +224,7 @@ GpStatus WINGDIPAPI GdipRestoreGraphics(GpGraphics*,GraphicsState); GpStatus WINGDIPAPI GdipRotateWorldTransform(GpGraphics*,REAL,GpMatrixOrder); GpStatus WINGDIPAPI GdipSaveGraphics(GpGraphics*,GraphicsState*); GpStatus WINGDIPAPI GdipScaleWorldTransform(GpGraphics*,REAL,REAL,GpMatrixOrder); +GpStatus WINGDIPAPI GdipSetClipHrgn(GpGraphics*,HRGN,CombineMode); GpStatus WINGDIPAPI GdipSetClipPath(GpGraphics*,GpPath*,CombineMode); GpStatus WINGDIPAPI GdipSetClipRect(GpGraphics*,REAL,REAL,REAL,REAL,CombineMode); GpStatus WINGDIPAPI GdipSetClipRectI(GpGraphics*,INT,INT,INT,INT,CombineMode); @@ -239,6 +243,8 @@ GpStatus WINGDIPAPI GdipTransformPoints(GpGraphics*, GpCoordinateSpace, GpCoordi GpPointF *, INT); GpStatus WINGDIPAPI GdipTransformPointsI(GpGraphics*, GpCoordinateSpace, GpCoordinateSpace, GpPoint *, INT); +GpStatus WINGDIPAPI GdipTranslateClip(GpGraphics*,REAL,REAL); +GpStatus WINGDIPAPI GdipTranslateClipI(GpGraphics*,INT,INT); GpStatus WINGDIPAPI GdipTranslateWorldTransform(GpGraphics*,REAL,REAL,GpMatrixOrder); /* GraphicsPath */ @@ -561,6 +567,7 @@ GpStatus WINGDIPAPI GdipSetStringFormatMeasurableCharacterRanges( GpStringFormat*, INT, GDIPCONST CharacterRange*); GpStatus WINGDIPAPI GdipSetStringFormatTabStops(GpStringFormat*,REAL,INT,GDIPCONST REAL*); GpStatus WINGDIPAPI GdipSetStringFormatTrimming(GpStringFormat*,StringTrimming); +GpStatus WINGDIPAPI GdipSetStringFormatFlags(GpStringFormat*, INT); GpStatus WINGDIPAPI GdipStringFormatGetGenericDefault(GpStringFormat **); GpStatus WINGDIPAPI GdipStringFormatGetGenericTypographic(GpStringFormat **); diff --git a/include/mlang.idl b/include/mlang.idl index bcc09170423..ca89711acbb 100644 --- a/include/mlang.idl +++ b/include/mlang.idl @@ -22,11 +22,6 @@ import "unknwn.idl"; interface IStream; -/* FIXME: LANGID is defined in winnt.h and mlang.h in the platform SDK */ -cpp_quote("#ifndef _WINNT_") -typedef WORD LANGID; -cpp_quote("#endif") - cpp_quote("#define CPIOD_PEEK 0x40000000") cpp_quote("#define CPIOD_FORCE_PROMPT 0x80000000") diff --git a/include/mmddk.h b/include/mmddk.h index c2ed4fcd415..826aefb8e57 100644 --- a/include/mmddk.h +++ b/include/mmddk.h @@ -380,19 +380,12 @@ typedef JOYDEVMSGPROC *LPJOYDEVMSGPROC; #define MAKEMCIRESOURCE(wRet, wRes) MAKELRESULT((wRet), (wRes)) typedef struct { - DWORD dwCallback; - DWORD dwInstance; - HMIDIOUT hMidi; - DWORD dwFlags; -} PORTALLOC, *LPPORTALLOC; - -typedef struct { HWAVE hWave; LPWAVEFORMATEX lpFormat; - DWORD dwCallback; - DWORD dwInstance; + DWORD_PTR dwCallback; + DWORD_PTR dwInstance; UINT uMappedDeviceID; - DWORD dnDevNode; + DWORD_PTR dnDevNode; } WAVEOPENDESC, *LPWAVEOPENDESC; typedef struct { @@ -402,9 +395,9 @@ typedef struct { typedef struct { HMIDI hMidi; - DWORD dwCallback; - DWORD dwInstance; - DWORD dnDevNode; + DWORD_PTR dwCallback; + DWORD_PTR dwInstance; + DWORD_PTR dnDevNode; DWORD cIds; MIDIOPENSTRMID rgIds; } MIDIOPENDESC, *LPMIDIOPENDESC; @@ -415,6 +408,7 @@ typedef struct tMIXEROPENDESC LPVOID pReserved0; DWORD_PTR dwCallback; DWORD_PTR dwInstance; + DWORD_PTR dnDevNode; } MIXEROPENDESC, *LPMIXEROPENDESC; typedef struct { @@ -433,8 +427,8 @@ typedef struct { DECL_WINELIB_TYPE_AW(MCI_OPEN_DRIVER_PARMS) DECL_WINELIB_TYPE_AW(LPMCI_OPEN_DRIVER_PARMS) -DWORD WINAPI mciGetDriverData(UINT uDeviceID); -BOOL WINAPI mciSetDriverData(UINT uDeviceID, DWORD dwData); +DWORD_PTR WINAPI mciGetDriverData(UINT uDeviceID); +BOOL WINAPI mciSetDriverData(UINT uDeviceID, DWORD_PTR dwData); UINT WINAPI mciDriverYield(UINT uDeviceID); BOOL WINAPI mciDriverNotify(HWND hwndCallback, UINT uDeviceID, UINT uStatus); @@ -453,7 +447,7 @@ BOOL WINAPI mciFreeCommandResource(UINT uTable); BOOL WINAPI DriverCallback(DWORD_PTR dwCallBack, DWORD uFlags, HDRVR hDev, DWORD wMsg, DWORD_PTR dwUser, DWORD_PTR dwParam1, DWORD_PTR dwParam2); -typedef VOID (*LPTASKCALLBACK)(DWORD dwInst); +typedef VOID (*LPTASKCALLBACK)(DWORD_PTR dwInst); #define TASKERR_NOTASKSUPPORT 1 #define TASKERR_OUTOFMEMORY 2 diff --git a/include/msacm.h b/include/msacm.h index c4da171719f..73788feab9a 100644 --- a/include/msacm.h +++ b/include/msacm.h @@ -242,7 +242,7 @@ typedef HACMOBJ *PHACMOBJ, *LPHACMOBJ; */ typedef BOOL (CALLBACK *ACMDRIVERENUMCB)( - HACMDRIVERID hadid, DWORD dwInstance, DWORD fdwSupport + HACMDRIVERID hadid, DWORD_PTR dwInstance, DWORD fdwSupport ); typedef UINT (CALLBACK *ACMFILTERCHOOSEHOOKPROCA)( @@ -539,70 +539,78 @@ DECL_WINELIB_TYPE_AW(ACMFORMATTAGDETAILS) DECL_WINELIB_TYPE_AW(PACMFORMATTAGDETAILS) DECL_WINELIB_TYPE_AW(LPACMFORMATTAGDETAILS) +#ifdef _WIN64 +# define _ACMSTREAMHEADERRESERVE 15 +#else +# define _ACMSTREAMHEADERRESERVE 10 +#endif + typedef struct _ACMSTREAMHEADER { - DWORD cbStruct; - DWORD fdwStatus; - DWORD dwUser; - LPBYTE pbSrc; - DWORD cbSrcLength; - DWORD cbSrcLengthUsed; - DWORD dwSrcUser; - LPBYTE pbDst; - DWORD cbDstLength; - DWORD cbDstLengthUsed; - DWORD dwDstUser; - DWORD dwReservedDriver[10]; + DWORD cbStruct; + DWORD fdwStatus; + DWORD_PTR dwUser; + LPBYTE pbSrc; + DWORD cbSrcLength; + DWORD cbSrcLengthUsed; + DWORD_PTR dwSrcUser; + LPBYTE pbDst; + DWORD cbDstLength; + DWORD cbDstLengthUsed; + DWORD_PTR dwDstUser; + DWORD dwReservedDriver[_ACMSTREAMHEADERRESERVE]; } ACMSTREAMHEADER, *PACMSTREAMHEADER, *LPACMSTREAMHEADER; +#undef _ACMSTREAMHEADERRESERVE + /*********************************************************************** * Callbacks 2 */ typedef BOOL (CALLBACK *ACMFILTERENUMCBA)( HACMDRIVERID hadid, PACMFILTERDETAILSA pafd, - DWORD dwInstance, DWORD fdwSupport + DWORD_PTR dwInstance, DWORD fdwSupport ); typedef BOOL (CALLBACK *ACMFILTERENUMCBW)( HACMDRIVERID hadid, PACMFILTERDETAILSW pafd, - DWORD dwInstance, DWORD fdwSupport + DWORD_PTR dwInstance, DWORD fdwSupport ); #define ACMFILTERENUMCB WINELIB_NAME_AW(ACMFILTERENUMCB) typedef BOOL (CALLBACK *ACMFILTERTAGENUMCBA)( HACMDRIVERID hadid, PACMFILTERTAGDETAILSA paftd, - DWORD dwInstance, DWORD fdwSupport + DWORD_PTR dwInstance, DWORD fdwSupport ); typedef BOOL (CALLBACK *ACMFILTERTAGENUMCBW)( HACMDRIVERID hadid, PACMFILTERTAGDETAILSW paftd, - DWORD dwInstance, DWORD fdwSupport + DWORD_PTR dwInstance, DWORD fdwSupport ); #define ACMFILTERTAGENUMCB WINELIB_NAME_AW(ACMFILTERTAGENUMCB) typedef BOOL (CALLBACK *ACMFORMATENUMCBA)( HACMDRIVERID hadid, PACMFORMATDETAILSA pafd, - DWORD dwInstance, DWORD fdwSupport + DWORD_PTR dwInstance, DWORD fdwSupport ); typedef BOOL (CALLBACK *ACMFORMATENUMCBW)( HACMDRIVERID hadid, PACMFORMATDETAILSW pafd, - DWORD dwInstance, DWORD fdwSupport + DWORD_PTR dwInstance, DWORD fdwSupport ); #define ACMFORMATENUMCB WINELIB_NAME_AW(ACMFORMATENUMCB) typedef BOOL (CALLBACK *ACMFORMATTAGENUMCBA)( HACMDRIVERID hadid, PACMFORMATTAGDETAILSA paftd, - DWORD dwInstance, DWORD fdwSupport + DWORD_PTR dwInstance, DWORD fdwSupport ); typedef BOOL (CALLBACK *ACMFORMATTAGENUMCBW)( HACMDRIVERID hadid, PACMFORMATTAGDETAILSW paftd, - DWORD dwInstance, DWORD fdwSupport + DWORD_PTR dwInstance, DWORD fdwSupport ); #define ACMFORMATTAGENUMCB WINELIB_NAME_AW(ACMFORMATTAGENUMCB) @@ -633,7 +641,7 @@ MMRESULT WINAPI acmDriverDetailsW( #define acmDriverDetails WINELIB_NAME_AW(acmDriverDetails) MMRESULT WINAPI acmDriverEnum( - ACMDRIVERENUMCB fnCallback, DWORD dwInstance, DWORD fdwEnum + ACMDRIVERENUMCB fnCallback, DWORD_PTR dwInstance, DWORD fdwEnum ); MMRESULT WINAPI acmDriverID( HACMOBJ hao, PHACMDRIVERID phadid, DWORD fdwDriverID @@ -668,11 +676,11 @@ MMRESULT WINAPI acmFilterDetailsW( MMRESULT WINAPI acmFilterEnumA( HACMDRIVER had, PACMFILTERDETAILSA pafd, - ACMFILTERENUMCBA fnCallback, DWORD dwInstance, DWORD fdwEnum + ACMFILTERENUMCBA fnCallback, DWORD_PTR dwInstance, DWORD fdwEnum ); MMRESULT WINAPI acmFilterEnumW( HACMDRIVER had, PACMFILTERDETAILSW pafd, - ACMFILTERENUMCBW fnCallback, DWORD dwInstance, DWORD fdwEnum + ACMFILTERENUMCBW fnCallback, DWORD_PTR dwInstance, DWORD fdwEnum ); #define acmFilterEnum WINELIB_NAME_AW(acmFilterEnum) @@ -686,11 +694,11 @@ MMRESULT WINAPI acmFilterTagDetailsW( MMRESULT WINAPI acmFilterTagEnumA( HACMDRIVER had, PACMFILTERTAGDETAILSA paftd, - ACMFILTERTAGENUMCBA fnCallback, DWORD dwInstance, DWORD fdwEnum + ACMFILTERTAGENUMCBA fnCallback, DWORD_PTR dwInstance, DWORD fdwEnum ); MMRESULT WINAPI acmFilterTagEnumW( HACMDRIVER had, PACMFILTERTAGDETAILSW paftd, - ACMFILTERTAGENUMCBW fnCallback, DWORD dwInstance, DWORD fdwEnum + ACMFILTERTAGENUMCBW fnCallback, DWORD_PTR dwInstance, DWORD fdwEnum ); #define acmFilterTagEnum WINELIB_NAME_AW(acmFilterTagEnum) @@ -712,11 +720,11 @@ MMRESULT WINAPI acmFormatDetailsW( MMRESULT WINAPI acmFormatEnumA( HACMDRIVER had, PACMFORMATDETAILSA pafd, - ACMFORMATENUMCBA fnCallback, DWORD dwInstance, DWORD fdwEnum + ACMFORMATENUMCBA fnCallback, DWORD_PTR dwInstance, DWORD fdwEnum ); MMRESULT WINAPI acmFormatEnumW( HACMDRIVER had, PACMFORMATDETAILSW pafd, - ACMFORMATENUMCBW fnCallback, DWORD dwInstance, DWORD fdwEnum + ACMFORMATENUMCBW fnCallback, DWORD_PTR dwInstance, DWORD fdwEnum ); #define acmFormatEnum WINELIB_NAME_AW(acmFormatEnum) @@ -734,11 +742,11 @@ MMRESULT WINAPI acmFormatTagDetailsW( MMRESULT WINAPI acmFormatTagEnumA( HACMDRIVER had, PACMFORMATTAGDETAILSA paftd, - ACMFORMATTAGENUMCBA fnCallback, DWORD dwInstance, DWORD fdwEnum + ACMFORMATTAGENUMCBA fnCallback, DWORD_PTR dwInstance, DWORD fdwEnum ); MMRESULT WINAPI acmFormatTagEnumW( HACMDRIVER had, PACMFORMATTAGDETAILSW paftd, - ACMFORMATTAGENUMCBW fnCallback, DWORD dwInstance, DWORD fdwEnum + ACMFORMATTAGENUMCBW fnCallback, DWORD_PTR dwInstance, DWORD fdwEnum ); #define acmFormatTagEnum WINELIB_NAME_AW(acmFormatTagEnum) @@ -758,8 +766,8 @@ MMRESULT WINAPI acmStreamMessage( ); MMRESULT WINAPI acmStreamOpen( PHACMSTREAM phas, HACMDRIVER had, PWAVEFORMATEX pwfxSrc, - PWAVEFORMATEX pwfxDst, PWAVEFILTER pwfltr, DWORD dwCallback, - DWORD dwInstance, DWORD fdwOpen + PWAVEFORMATEX pwfxDst, PWAVEFILTER pwfltr, DWORD_PTR dwCallback, + DWORD_PTR dwInstance, DWORD fdwOpen ); MMRESULT WINAPI acmStreamPrepareHeader( HACMSTREAM has, PACMSTREAMHEADER pash, DWORD fdwPrepare diff --git a/include/msacmdrv.h b/include/msacmdrv.h index 46e8ba57c04..6436404835a 100644 --- a/include/msacmdrv.h +++ b/include/msacmdrv.h @@ -100,40 +100,40 @@ typedef struct _ACMDRVSTREAMINSTANCE PWAVEFORMATEX pwfxSrc; PWAVEFORMATEX pwfxDst; PWAVEFILTER pwfltr; - DWORD dwCallback; - DWORD dwInstance; + DWORD_PTR dwCallback; + DWORD_PTR dwInstance; DWORD fdwOpen; DWORD fdwDriver; - DWORD dwDriver; + DWORD_PTR dwDriver; HACMSTREAM has; } ACMDRVSTREAMINSTANCE, *PACMDRVSTREAMINSTANCE; typedef struct _ACMDRVSTREAMHEADER *PACMDRVSTREAMHEADER; typedef struct _ACMDRVSTREAMHEADER { - DWORD cbStruct; - DWORD fdwStatus; - DWORD dwUser; - LPBYTE pbSrc; - DWORD cbSrcLength; - DWORD cbSrcLengthUsed; - DWORD dwSrcUser; - LPBYTE pbDst; - DWORD cbDstLength; - DWORD cbDstLengthUsed; - DWORD dwDstUser; - - DWORD fdwConvert; + DWORD cbStruct; + DWORD fdwStatus; + DWORD_PTR dwUser; + LPBYTE pbSrc; + DWORD cbSrcLength; + DWORD cbSrcLengthUsed; + DWORD_PTR dwSrcUser; + LPBYTE pbDst; + DWORD cbDstLength; + DWORD cbDstLengthUsed; + DWORD_PTR dwDstUser; + + DWORD fdwConvert; PACMDRVSTREAMHEADER *padshNext; - DWORD fdwDriver; - DWORD dwDriver; + DWORD fdwDriver; + DWORD_PTR dwDriver; /* Internal fields for ACM */ - DWORD fdwPrepared; - DWORD dwPrepared; - LPBYTE pbPreparedSrc; - DWORD cbPreparedSrcLength; - LPBYTE pbPreparedDst; - DWORD cbPreparedDstLength; + DWORD fdwPrepared; + DWORD_PTR dwPrepared; + LPBYTE pbPreparedSrc; + DWORD cbPreparedSrcLength; + LPBYTE pbPreparedDst; + DWORD cbPreparedDstLength; } ACMDRVSTREAMHEADER; typedef struct _ACMDRVSTREAMSIZE diff --git a/include/msctf.idl b/include/msctf.idl index 2ef8b074bfb..47bec7161a5 100644 --- a/include/msctf.idl +++ b/include/msctf.idl @@ -19,19 +19,36 @@ #ifndef DO_NO_IMPORTS import "oaidl.idl"; import "comcat.idl"; -/* import "textstor.idl"; */ +import "textstor.idl"; /* import "ctfutb.idl"; */ #endif +cpp_quote("#define TF_E_STACKFULL MAKE_HRESULT(SEVERITY_ERROR, FACILITY_ITF, 0x0501)") cpp_quote("EXTERN_C const CLSID CLSID_TF_ThreadMgr;") +cpp_quote("EXTERN_C const CLSID CLSID_TF_InputProcessorProfiles;") +cpp_quote("EXTERN_C const CLSID CLSID_TF_CategoryMgr;") +typedef [uuid(7213778c-7bb0-4270-b050-6189ee594e97)] DWORD TfEditCookie; typedef [uuid(de403c21-89fd-4f85-8b87-64584d063fbc)] DWORD TfClientId; +typedef [uuid(88a9c478-f3ec-4763-8345-cd9250443f8d)] DWORD TfGuidAtom; interface ITfDocumentMgr; +interface ITfContext; interface IEnumTfDocumentMgrs; +interface IEnumTfContexts; interface ITfFunctionProvider; interface IEnumTfFunctionProviders; interface ITfCompartmentMgr; +interface ITfEditSession; +interface ITfRange; +interface ITfContextView; +interface IEnumTfContextViews; +interface ITfProperty; +interface ITfReadOnlyProperty; +interface IEnumTfProperties; +interface ITfRangeBackup; +interface IEnumTfLanguageProfiles; +interface ITfEditRecord; [ object, @@ -75,3 +92,326 @@ interface ITfThreadMgr: IUnknown HRESULT GetGlobalCompartment( [out] ITfCompartmentMgr **ppCompMgr); }; + + +[ + object, + uuid(aa80e7f4-2021-11d2-93e0-0060b067b86e), + pointer_default(unique) +] +interface ITfDocumentMgr: IUnknown +{ + HRESULT CreateContext( + [in] TfClientId tidOwner, + [in] DWORD dwFlags, + [in, unique] IUnknown *punk, + [out] ITfContext **ppic, + [out] TfEditCookie *pecTextStore); + + HRESULT Push( + [in] ITfContext *pic); + + const DWORD TF_POPF_ALL = 0x0001; + + HRESULT Pop( + [in] DWORD dwFlags); + + HRESULT GetTop( + [out] ITfContext **ppic); + + HRESULT GetBase( + [out] ITfContext **ppic); + + HRESULT EnumContexts( + [out] IEnumTfContexts **ppEnum); +}; + +[ + object, + uuid(aa80e7fd-2021-11d2-93e0-0060b067b86e), + pointer_default(unique) +] +interface ITfContext : IUnknown +{ + const DWORD TF_ES_ASYNCDONTCARE = 0x0; + const DWORD TF_ES_SYNC = 0x1; + const DWORD TF_ES_READ = 0x2; + const DWORD TF_ES_READWRITE = 0x6; + const DWORD TF_ES_ASYNC = 0x8; + + HRESULT RequestEditSession( + [in] TfClientId tid, + [in] ITfEditSession *pes, + [in] DWORD dwFlags, + [out] HRESULT *phrSession); + + HRESULT InWriteSession( + [in] TfClientId tid, + [out] BOOL *pfWriteSession); + + typedef [uuid(1690be9b-d3e9-49f6-8d8b-51b905af4c43)] enum { TF_AE_NONE, TF_AE_START, TF_AE_END } TfActiveSelEnd; + + typedef [uuid(36ae42a4-6989-4bdc-b48a-6137b7bf2e42)] struct TF_SELECTIONSTYLE + { + TfActiveSelEnd ase; + BOOL fInterimChar; + } TF_SELECTIONSTYLE; + + typedef [uuid(75eb22f2-b0bf-46a8-8006-975a3b6efcf1)] struct TF_SELECTION + { + ITfRange *range; + TF_SELECTIONSTYLE style; + } TF_SELECTION; + + const ULONG TF_DEFAULT_SELECTION = TS_DEFAULT_SELECTION; + + HRESULT GetSelection( + [in] TfEditCookie ec, + [in] ULONG ulIndex, + [in] ULONG ulCount, + [out, size_is(ulCount), length_is(*pcFetched)] TF_SELECTION *pSelection, + [out] ULONG *pcFetched); + + HRESULT SetSelection( + [in] TfEditCookie ec, + [in] ULONG ulCount, + [in, size_is(ulCount)] const TF_SELECTION *pSelection); + + HRESULT GetStart( + [in] TfEditCookie ec, + [out] ITfRange **ppStart); + + HRESULT GetEnd( + [in] TfEditCookie ec, + [out] ITfRange **ppEnd); + + typedef [uuid(bc7d979a-846a-444d-afef-0a9bfa82b961)] TS_STATUS TF_STATUS; + const DWORD TF_SD_READONLY = TS_SD_READONLY; + const DWORD TF_SD_LOADING = TS_SD_LOADING; + const DWORD TF_SS_DISJOINTSEL = TS_SS_DISJOINTSEL; + const DWORD TF_SS_REGIONS = TS_SS_REGIONS; + const DWORD TF_SS_TRANSITORY = TS_SS_TRANSITORY; + + + HRESULT GetActiveView( + [out] ITfContextView **ppView); + + HRESULT EnumViews( + [out] IEnumTfContextViews **ppEnum); + + HRESULT GetStatus( + [out] TF_STATUS *pdcs); + + HRESULT GetProperty( + [in] REFGUID guidProp, + [out] ITfProperty **ppProp); + + HRESULT GetAppProperty( + [in] REFGUID guidProp, + [out] ITfReadOnlyProperty **ppProp); + + HRESULT TrackProperties( + [in, size_is(cProp)] const GUID **prgProp, + [in] ULONG cProp, + [in, size_is(cAppProp)] const GUID **prgAppProp, + [in] ULONG cAppProp, + [out] ITfReadOnlyProperty **ppProperty); + + HRESULT EnumProperties( + [out] IEnumTfProperties **ppEnum); + + HRESULT GetDocumentMgr( + [out] ITfDocumentMgr **ppDm); + + HRESULT CreateRangeBackup( + [in] TfEditCookie ec, + [in] ITfRange *pRange, + [out] ITfRangeBackup **ppBackup); + +}; + +[ + object, + uuid(4ea48a35-60ae-446f-8fd6-e6a8d82459f7), + pointer_default(unique) +] +interface ITfSource : IUnknown +{ + HRESULT AdviseSink( + [in] REFIID riid, + [in, iid_is(riid)] IUnknown *punk, + [out] DWORD *pdwCookie); + + HRESULT UnadviseSink( + [in] DWORD dwCookie); +}; + +[ + object, + local, + uuid(1F02B6C5-7842-4EE6-8A0B-9A24183A95CA), + pointer_default(unique) +] +interface ITfInputProcessorProfiles : IUnknown +{ + HRESULT Register( + [in] REFCLSID rclsid); + + HRESULT Unregister( + [in] REFCLSID rclsid); + + HRESULT AddLanguageProfile( + [in] REFCLSID rclsid, + [in] LANGID langid, + [in] REFGUID guidProfile, + [in, size_is(cchDesc)] const WCHAR *pchDesc, + [in] ULONG cchDesc, + [in, size_is(cchFile)] const WCHAR *pchIconFile, + [in] ULONG cchFile, + [in] ULONG uIconIndex); + + HRESULT RemoveLanguageProfile( + [in] REFCLSID rclsid, + [in] LANGID langid, + [in] REFGUID guidProfile); + + HRESULT EnumInputProcessorInfo( + [out] IEnumGUID **ppEnum); + + HRESULT GetDefaultLanguageProfile( + [in] LANGID langid, + [in] REFGUID catid, + [out] CLSID *pclsid, + [out] GUID *pguidProfile); + + HRESULT SetDefaultLanguageProfile( + [in] LANGID langid, + [in] REFCLSID rclsid, + [in] REFGUID guidProfiles); + + HRESULT ActivateLanguageProfile( + [in] REFCLSID rclsid, + [in] LANGID langid, + [in] REFGUID guidProfiles); + + HRESULT GetActiveLanguageProfile( + [in] REFCLSID rclsid, + [out] LANGID *plangid, + [out] GUID *pguidProfile); + + HRESULT GetLanguageProfileDescription( + [in] REFCLSID rclsid, + [in] LANGID langid, + [in] REFGUID guidProfile, + [out] BSTR *pbstrProfile); + + HRESULT GetCurrentLanguage( + [out] LANGID *plangid); + + HRESULT ChangeCurrentLanguage( + [in] LANGID langid); + + HRESULT GetLanguageList( + [out] LANGID **ppLangId, + [out] ULONG *pulCount); + + HRESULT EnumLanguageProfiles( + [in] LANGID langid, + [out] IEnumTfLanguageProfiles **ppEnum); + + HRESULT EnableLanguageProfile( + [in] REFCLSID rclsid, + [in] LANGID langid, + [in] REFGUID guidProfile, + [in] BOOL fEnable); + + HRESULT IsEnabledLanguageProfile( + [in] REFCLSID rclsid, + [in] LANGID langid, + [in] REFGUID guidProfile, + [out] BOOL *pfEnable); + + HRESULT EnableLanguageProfileByDefault( + [in] REFCLSID rclsid, + [in] LANGID langid, + [in] REFGUID guidProfile, + [in] BOOL fEnable); + + HRESULT SubstituteKeyboardLayout( + [in] REFCLSID rclsid, + [in] LANGID langid, + [in] REFGUID guidProfile, + [in] HKL hKL); +}; + +[ + object, + local, + uuid(c3acefb5-f69d-4905-938f-fcadcf4be830), + pointer_default(unique) +] +interface ITfCategoryMgr : IUnknown +{ + HRESULT RegisterCategory([in] REFCLSID rclsid, + [in] REFGUID rcatid, + [in] REFGUID rguid); + + HRESULT UnregisterCategory([in] REFCLSID rclsid, + [in] REFGUID rcatid, + [in] REFGUID rguid); + + HRESULT EnumCategoriesInItem([in] REFGUID rguid, + [out] IEnumGUID **ppEnum); + + HRESULT EnumItemsInCategory([in] REFGUID rcatid, + [out] IEnumGUID **ppEnum); + + HRESULT FindClosestCategory([in] REFGUID rguid, + [out] GUID *pcatid, + [in, size_is(ulCount)] const GUID **ppcatidList, + [in] ULONG ulCount); + + HRESULT RegisterGUIDDescription([in] REFCLSID rclsid, + [in] REFGUID rguid, + [in, size_is(cch)] const WCHAR *pchDesc, + [in] ULONG cch); + + HRESULT UnregisterGUIDDescription([in] REFCLSID rclsid, + [in] REFGUID rguid); + + HRESULT GetGUIDDescription([in] REFGUID rguid, + [out] BSTR *pbstrDesc); + + HRESULT RegisterGUIDDWORD([in] REFCLSID rclsid, + [in] REFGUID rguid, + [in] DWORD dw); + + HRESULT UnregisterGUIDDWORD([in] REFCLSID rclsid, + [in] REFGUID rguid); + + HRESULT GetGUIDDWORD([in] REFGUID rguid, + [out] DWORD *pdw); + + HRESULT RegisterGUID([in] REFGUID rguid, + [out] TfGuidAtom *pguidatom); + + HRESULT GetGUID([in] TfGuidAtom guidatom, + [out] GUID *pguid); + + HRESULT IsEqualTfGuidAtom([in] TfGuidAtom guidatom, + [in] REFGUID rguid, + [out] BOOL *pfEqual); +}; + +[ + object, + uuid(8127d409-ccd3-4683-967a-b43d5b482bf7), + pointer_default(unique) +] +interface ITfTextEditSink : IUnknown +{ + HRESULT OnEndEdit( + [in] ITfContext *pic, + [in] TfEditCookie ecReadOnly, + [in] ITfEditRecord *pEditRecord); +}; diff --git a/include/mshtmdid.h b/include/mshtmdid.h index c8c8b274fa2..75a72906bf1 100644 --- a/include/mshtmdid.h +++ b/include/mshtmdid.h @@ -74,8 +74,10 @@ #define DISPID_SCRIPT DISPID_NORMAL_FIRST #define DISPID_STYLESHEET DISPID_NORMAL_FIRST #define DISPID_STYLERULE DISPID_NORMAL_FIRST +#define DISPID_STYLEPAGE DISPID_NORMAL_FIRST #define DISPID_STYLESHEETS_COL DISPID_NORMAL_FIRST #define DISPID_STYLERULES_COL DISPID_NORMAL_FIRST +#define DISPID_STYLEPAGES_COL DISPID_NORMAL_FIRST #define DISPID_MIMETYPES_COL DISPID_NORMAL_FIRST #define DISPID_PLUGINS_COL DISPID_NORMAL_FIRST #define DISPID_2D DISPID_NORMAL_FIRST @@ -1798,10 +1800,22 @@ #define DISPID_IHTMLSTYLESHEET_RULES (DISPID_STYLESHEET+15) #define DISPID_IHTMLSTYLESHEET_DISABLED STDPROPID_XOBJ_DISABLED +/* IHTMLStyleSheet2 */ +#define DISPID_IHTMLSTYLESHEET2_PAGES (DISPID_STYLESHEET+16) +#define DISPID_IHTMLSTYLESHEET2_ADDPAGERULE (DISPID_STYLESHEET+17) + /* IHTMLStyleSheetRulesCollection */ #define DISPID_IHTMLSTYLESHEETRULESCOLLECTION_LENGTH (DISPID_STYLERULES_COL+1) #define DISPID_IHTMLSTYLESHEETRULESCOLLECTION_ITEM DISPID_VALUE +/* IHTMLStyleSheetPage */ +#define DISPID_IHTMLSTYLESHEETPAGE_SELECTOR (DISPID_STYLEPAGE+1) +#define DISPID_IHTMLSTYLESHEETPAGE_PSEUDOCLASS (DISPID_STYLEPAGE+2) + +/* IHTMLStyleSheetPagesCollection */ +#define DISPID_IHTMLSTYLESHEETPAGESCOLLECTION_LENGTH (DISPID_STYLEPAGES_COL+1) +#define DISPID_IHTMLSTYLESHEETPAGESCOLLECTION_ITEM DISPID_VALUE + /* IHTMLStyleSheetRule */ #define DISPID_IHTMLSTYLESHEETRULE_SELECTORTEXT (DISPID_STYLERULE+1) #define DISPID_IHTMLSTYLESHEETRULE_READONLY (DISPID_STYLERULE+2) diff --git a/include/mshtml.idl b/include/mshtml.idl index 1e178578b72..acbdde2b3a7 100644 --- a/include/mshtml.idl +++ b/include/mshtml.idl @@ -5393,6 +5393,38 @@ interface IHTMLStyleSheetRulesCollection : IDispatch [retval, out] IHTMLStyleSheetRule **ppHTMLStyleSheetRule); } +[ + odl, + oleautomation, + dual, + uuid(3050f7ee-98b5-11cf-bb82-00aa00bdce0b) +] +interface IHTMLStyleSheetPage : IDispatch +{ + [propget, id(DISPID_IHTMLSTYLESHEETPAGE_SELECTOR)] + HRESULT selector([retval, out] BSTR *p); + + [propget, id(DISPID_IHTMLSTYLESHEETPAGE_PSEUDOCLASS)] + HRESULT pseudoClass([retval, out] BSTR *p); +} + +[ + odl, + oleautomation, + dual, + uuid(3050f7f0-98b5-11cf-bb82-00aa00bdce0b) +] +interface IHTMLStyleSheetPagesCollection : IDispatch +{ + [propget, id(DISPID_IHTMLSTYLESHEETPAGESCOLLECTION_LENGTH)] + HRESULT length([retval, out] long *p); + + [id(DISPID_IHTMLSTYLESHEETPAGESCOLLECTION_ITEM)] + HRESULT item( + [in] long index, + [retval, out] IHTMLStyleSheetPage **ppHTMLStyleSheetPage); +} + /***************************************************************************** * IHTMLStyleSheet interface */ @@ -5476,6 +5508,125 @@ interface IHTMLStyleSheet : IDispatch } /***************************************************************************** + * IHTMLStyleSheet2 interface + */ +[ + odl, + oleautomation, + dual, + uuid(3050f3d1-98b5-11cf-bb82-00aa00bdce0b) +] +interface IHTMLStyleSheet2 : IDispatch +{ + [propget, id(DISPID_IHTMLSTYLESHEET2_PAGES)] + HRESULT pages([retval, out] IHTMLStyleSheetPagesCollection **p); + + [id(DISPID_IHTMLSTYLESHEET2_ADDPAGERULE)] + HRESULT addPageRule( + [in] BSTR bstrSelector, + [in] BSTR bstrStyle, + [defaultvalue(-1), in] long lIndex, + [retval, out] long *plNewIndex); +} + +[ + hidden, + uuid(3050f58d-98b5-11cf-bb82-00aa00bdce0b) +] +dispinterface DispHTMLStyleSheet +{ +properties: +methods: + [propput, id(DISPID_IHTMLSTYLESHEET_TITLE)] + void title(BSTR v); + + [propget, id(DISPID_IHTMLSTYLESHEET_TITLE)] + BSTR title(); + + [propget, id(DISPID_IHTMLSTYLESHEET_PARENTSTYLESHEET)] + IHTMLStyleSheet* parentStyleSheet(); + + [propget, id(DISPID_IHTMLSTYLESHEET_OWNINGELEMENT)] + IHTMLElement* owningElement(); + + [propput, id(DISPID_IHTMLSTYLESHEET_DISABLED)] + void disabled(VARIANT_BOOL v); + + [propget, id(DISPID_IHTMLSTYLESHEET_DISABLED)] + VARIANT_BOOL disabled(); + + [propget, id(DISPID_IHTMLSTYLESHEET_READONLY)] + VARIANT_BOOL readOnly(); + + [propget, id(DISPID_IHTMLSTYLESHEET_IMPORTS)] + IHTMLStyleSheetsCollection* imports(); + + [propput, id(DISPID_IHTMLSTYLESHEET_HREF)] + void href(BSTR v); + + [propget, id(DISPID_IHTMLSTYLESHEET_HREF)] + BSTR href(); + + [propget, id(DISPID_IHTMLSTYLESHEET_TYPE)] + BSTR type(); + + [propget, id(DISPID_IHTMLSTYLESHEET_ID)] + BSTR id(); + + [id(DISPID_IHTMLSTYLESHEET_ADDIMPORT)] + long addImport( + [in] BSTR bstrURL, + [defaultvalue(-1), in] long lIndex); + + [id(DISPID_IHTMLSTYLESHEET_ADDRULE)] + long addRule( + [in] BSTR bstrSelector, + [in] BSTR bstrStyle, + [defaultvalue(-1), in] long lIndex); + + [id(DISPID_IHTMLSTYLESHEET_REMOVEIMPORT)] + void removeImport([in] long lIndex); + + [id(DISPID_IHTMLSTYLESHEET_REMOVERULE)] + void removeRule([in] long lIndex); + + [propput, id(DISPID_IHTMLSTYLESHEET_MEDIA)] + void media(BSTR v); + + [propget, id(DISPID_IHTMLSTYLESHEET_MEDIA)] + BSTR media(); + + [propput, id(DISPID_IHTMLSTYLESHEET_CSSTEXT)] + void cssText(BSTR v); + + [propget, id(DISPID_IHTMLSTYLESHEET_CSSTEXT)] + BSTR cssText(); + + [propget, id(DISPID_IHTMLSTYLESHEET_RULES)] + IHTMLStyleSheetRulesCollection* rules(); + + [propget, id(DISPID_IHTMLSTYLESHEET2_PAGES)] + IHTMLStyleSheetPagesCollection* pages(); + + [id(DISPID_IHTMLSTYLESHEET2_ADDPAGERULE)] + long addPageRule( + [in] BSTR bstrSelector, + [in] BSTR bstrStyle, + [defaultvalue(-1), in] long lIndex); +} + +[ + noncreatable, + uuid(3050f2e4-98b5-11cf-bb82-00aa00bdce0b) +] +coclass HTMLStyleSheet +{ + [default] dispinterface DispHTMLStyleSheet; + interface IHTMLStyleSheet; + interface IHTMLStyleSheet2; +} + +/***************************************************************************** * IHTMLStyleSheetsCollection interface */ [ @@ -5646,6 +5797,15 @@ interface IHTMLTxtRange : IDispatch [retval, out] VARIANT_BOOL *pfRet); } +[ + noncreatable, + uuid(3050f37f-98b5-11cf-bb82-00aa00bdce0b) +] +coclass HTMLStyleSheetsCollection +{ + [default] interface IHTMLStyleSheetsCollection; +} + /***************************************************************************** * IHTMLFormElement interface */ @@ -12622,6 +12782,15 @@ interface IOmHistory : IDispatch HRESULT go([optional, in] VARIANT *pvargdistance); } +[ + noncreatable, + uuid(FECEAAA3-8405-11cf-8BA1-00AA00476DA6) +] +coclass HTMLHistory +{ + [default] interface IOmHistory; +} + /***************************************************************************** * IHTMLMimeTypesCollection interface */ @@ -12637,6 +12806,15 @@ interface IHTMLMimeTypesCollection : IDispatch HRESULT length([retval, out] long *p); } +[ + noncreatable, + uuid(3050f3fe-98b5-11cf-bb82-00aa00bdce0b) +] +coclass CMimeTypes +{ + [default] interface IHTMLMimeTypesCollection; +} + /***************************************************************************** * IHTMLPluginsCollection interface */ @@ -12655,6 +12833,15 @@ interface IHTMLPluginsCollection : IDispatch HRESULT refresh([defaultvalue(0), in] VARIANT_BOOL reload); } +[ + noncreatable, + uuid(3050f3ff-98b5-11cf-bb82-00aa00bdce0b) +] +coclass CPlugins +{ + [default] interface IHTMLPluginsCollection; +} + /***************************************************************************** * IHTMLOpsProfile interface */ @@ -12718,6 +12905,15 @@ interface IHTMLOpsProfile : IDispatch HRESULT doWriteRequest([retval, out] VARIANT_BOOL *success); } +[ + noncreatable, + uuid(3050f402-98b5-11cf-bb82-00aa00bdce0b) +] +coclass COpsProfile +{ + [default] interface IHTMLOpsProfile; +} + /***************************************************************************** * IOmNavigator interface */ @@ -12790,6 +12986,15 @@ interface IOmNavigator : IDispatch HRESULT userProfile([retval, out] IHTMLOpsProfile **p); } +[ + noncreatable, + uuid(FECEAAA6-8405-11cf-8BA1-00AA00476DA6) +] +coclass HTMLNavigator +{ + [default] interface IOmNavigator; +} + /***************************************************************************** * IHTMLLocation interface */ @@ -12863,6 +13068,15 @@ interface IHTMLLocation : IDispatch } [ + noncreatable, + uuid(163BB1E1-6E00-11cf-837A-48DC04C10000) +] +coclass HTMLLocation +{ + [default] interface IHTMLLocation; +} + +[ odl, oleautomation, dual, diff --git a/include/rpcndr.h b/include/rpcndr.h index 3383c8cf59b..10aac4c9f0a 100644 --- a/include/rpcndr.h +++ b/include/rpcndr.h @@ -195,7 +195,7 @@ typedef struct _MIDL_STUB_MESSAGE ULONG_PTR MaxCount; ULONG Offset; ULONG ActualCount; - void * (__WINE_ALLOC_SIZE(1) __RPC_API *pfnAllocate)(size_t); + void * (__WINE_ALLOC_SIZE(1) __RPC_API *pfnAllocate)(SIZE_T); void (__RPC_API *pfnFree)(void *); unsigned char *StackTop; unsigned char *pPresentedType; @@ -322,7 +322,7 @@ typedef struct _USER_MARSHAL_CB typedef struct _MALLOC_FREE_STRUCT { - void * (__WINE_ALLOC_SIZE(1) __RPC_USER *pfnAllocate)(size_t); + void * (__WINE_ALLOC_SIZE(1) __RPC_USER *pfnAllocate)(SIZE_T); void (__RPC_USER *pfnFree)(void *); } MALLOC_FREE_STRUCT; @@ -335,7 +335,7 @@ typedef struct _COMM_FAULT_OFFSETS typedef struct _MIDL_STUB_DESC { void *RpcInterfaceInformation; - void * (__WINE_ALLOC_SIZE(1) __RPC_API *pfnAllocate)(size_t); + void * (__WINE_ALLOC_SIZE(1) __RPC_API *pfnAllocate)(SIZE_T); void (__RPC_API *pfnFree)(void *); union { handle_t *pAutoHandle; @@ -474,7 +474,7 @@ typedef struct _NDR_USER_MARSHAL_INFO_LEVEL1 { void *Buffer; ULONG BufferSize; - void * (__WINE_ALLOC_SIZE(1) __RPC_API *pfnAllocate)(size_t); + void * (__WINE_ALLOC_SIZE(1) __RPC_API *pfnAllocate)(SIZE_T); void (__RPC_API *pfnFree)(void *); struct IRpcChannelBuffer *pRpcChannelBuffer; ULONG_PTR Reserved[5]; @@ -678,7 +678,7 @@ RPCRTAPI RPC_STATUS RPC_ENTRY ULONG *pFaultStatus, RPC_STATUS Status_ ); RPCRTAPI void* RPC_ENTRY - NdrOleAllocate( size_t Size ) __WINE_ALLOC_SIZE(1); + NdrOleAllocate( SIZE_T Size ) __WINE_ALLOC_SIZE(1); RPCRTAPI void RPC_ENTRY NdrOleFree( void* NodeToFree ); @@ -739,11 +739,11 @@ RPCRTAPI void RPC_ENTRY RPCRTAPI void RPC_ENTRY NdrRpcSmSetClientToOsf( PMIDL_STUB_MESSAGE pMessage ); RPCRTAPI void * RPC_ENTRY - NdrRpcSmClientAllocate( size_t Size ) __WINE_ALLOC_SIZE(1); + NdrRpcSmClientAllocate( SIZE_T Size ) __WINE_ALLOC_SIZE(1); RPCRTAPI void RPC_ENTRY NdrRpcSmClientFree( void *NodeToFree ); RPCRTAPI void * RPC_ENTRY - NdrRpcSsDefaultAllocate( size_t Size ) __WINE_ALLOC_SIZE(1); + NdrRpcSsDefaultAllocate( SIZE_T Size ) __WINE_ALLOC_SIZE(1); RPCRTAPI void RPC_ENTRY NdrRpcSsDefaultFree( void *NodeToFree ); diff --git a/dlls/winex11.drv/xrandr.h b/include/textstor.idl similarity index 60% copy from dlls/winex11.drv/xrandr.h copy to include/textstor.idl index 9686c87ca0b..f9624f6a0f5 100644 --- a/dlls/winex11.drv/xrandr.h +++ b/include/textstor.idl @@ -1,7 +1,5 @@ /* - * Wine X11drv Xrandr interface - * - * Copyright 2003 Alexander James Pasadyn + * Copyright 2009 Aric Stewart, CodeWeavers * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public @@ -17,17 +15,23 @@ * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ -#ifndef __WINE_XRANDR_H -#define __WINE_XRANDR_H -#ifndef __WINE_CONFIG_H -# error You must include config.h to use this header +#ifndef DO_NO_IMPORTS +import "oaidl.idl"; #endif -#ifdef SONAME_LIBXRANDR +const ULONG TS_DEFAULT_SELECTION = ~0u; + +const DWORD TS_SD_READONLY = 0x001; +const DWORD TS_SD_LOADING = 0x002; -void X11DRV_XRandR_Init(void); -void X11DRV_XRandR_Cleanup(void); +const DWORD TS_SS_DISJOINTSEL = 0x001; +const DWORD TS_SS_REGIONS = 0x002; +const DWORD TS_SS_TRANSITORY = 0x004; +const DWORD TS_SS_NOHIDDENTEXT = 0x008; -#endif /* SONAME_LIBXRANDR */ -#endif /* __WINE_XRANDR_H */ +typedef [uuid(fec4f516-c503-45b1-a5fd-7a3d8ab07049)] struct TS_STATUS +{ + DWORD dwDynamicFlags; + DWORD dwStaticFlags; +} TS_STATUS; diff --git a/include/winnt.h b/include/winnt.h index 6dadf9ed819..69c4b10edf7 100644 --- a/include/winnt.h +++ b/include/winnt.h @@ -3885,6 +3885,14 @@ typedef struct _SID_AND_ATTRIBUTES { #define DOMAIN_GROUP_RID_ENTERPRISE_ADMINS 0x00000207L #define DOMAIN_GROUP_RID_POLICY_ADMINS 0x00000208L +#define SECURITY_MANDATORY_LABEL_AUTHORITY {0,0,0,0,0,16} +#define SECURITY_MANDATORY_UNTRUSTED_RID 0x00000000L +#define SECURITY_MANDATORY_LOW_RID 0x00001000L +#define SECURITY_MANDATORY_MEDIUM_RID 0x00002000L +#define SECURITY_MANDATORY_HIGH_RID 0x00003000L +#define SECURITY_MANDATORY_SYSTEM_RID 0x00004000L +#define SECURITY_MANDATORY_PROTECTED_PROCESS_RID 0x00005000L + #define DOMAIN_ALIAS_RID_ADMINS 0x00000220L #define DOMAIN_ALIAS_RID_USERS 0x00000221L #define DOMAIN_ALIAS_RID_GUESTS 0x00000222L @@ -3975,7 +3983,22 @@ typedef enum { WinBuiltinPerfLoggingUsersSid = 58, WinBuiltinAuthorizationAccessSid = 59, WinBuiltinTerminalServerLicenseServersSid = 60, - WinBuiltinDCOMUsersSid = 61 + WinBuiltinDCOMUsersSid = 61, + WinBuiltinIUsersSid = 62, + WinIUserSid = 63, + WinBuiltinCryptoOperatorsSid = 64, + WinUntrustedLabelSid = 65, + WinLowLabelSid = 66, + WinMediumLabelSid = 67, + WinHighLabelSid = 68, + WinSystemLabelSid = 69, + WinWriteRestrictedCodeSid = 70, + WinCreatorOwnerRightsSid = 71, + WinCacheablePrincipalsGroupSid = 72, + WinNonCacheablePrincipalsGroupSid = 73, + WinEnterpriseReadonlyControllersSid = 74, + WinAccountReadonlyControllersSid = 75, + WinBuiltinEventLogReadersGroup = 76, } WELL_KNOWN_SID_TYPE; /* diff --git a/include/wtypes.idl b/include/wtypes.idl index 8378012fd0e..c817d083f1c 100644 --- a/include/wtypes.idl +++ b/include/wtypes.idl @@ -87,6 +87,7 @@ typedef LONG_PTR LRESULT; typedef LONG HRESULT; typedef DWORD LCID; +typedef USHORT LANGID; typedef unsigned __int64 DWORDLONG; typedef __int64 LONGLONG; diff --git a/programs/progman/dialog.c b/programs/progman/dialog.c index f3c297479cc..f862b0888a5 100644 --- a/programs/progman/dialog.c +++ b/programs/progman/dialog.c @@ -25,43 +25,109 @@ #include "windows.h" #include "commdlg.h" #include "progman.h" -static BOOL DIALOG_BrowsePrograms(HWND, LPSTR, INT); -static BOOL DIALOG_BrowseSymbols(HWND, LPSTR, INT); -static INT_PTR CALLBACK DIALOG_NEW_DlgProc(HWND, UINT, WPARAM, LPARAM); -static INT_PTR CALLBACK DIALOG_COPY_MOVE_DlgProc(HWND, UINT, WPARAM, LPARAM); -static INT_PTR CALLBACK DIALOG_GROUP_DlgProc(HWND, UINT, WPARAM, LPARAM); -static INT_PTR CALLBACK DIALOG_PROGRAM_DlgProc(HWND, UINT, WPARAM, LPARAM); -static INT_PTR CALLBACK DIALOG_SYMBOL_DlgProc(HWND, UINT, WPARAM, LPARAM); -static INT_PTR CALLBACK DIALOG_EXECUTE_DlgProc(HWND, UINT, WPARAM, LPARAM); + /*********************************************************************** * - * DIALOG_New + * DIALOG_Browse */ -static struct +static BOOL DIALOG_Browse(HWND hDlg, LPCSTR lpszzFilter, + LPSTR lpstrFile, INT nMaxFile) + { - INT nDefault; -} New; + OPENFILENAME openfilename; -INT DIALOG_New(INT nDefault) + CHAR szDir[MAX_PATH]; + CHAR szDefaultExt[] = "exe"; + + ZeroMemory(&openfilename, sizeof(openfilename)); + + GetCurrentDirectory(sizeof(szDir), szDir); + + openfilename.lStructSize = sizeof(openfilename); + openfilename.hwndOwner = Globals.hMainWnd; + openfilename.hInstance = Globals.hInstance; + openfilename.lpstrFilter = lpszzFilter; + openfilename.lpstrFile = lpstrFile; + openfilename.nMaxFile = nMaxFile; + openfilename.lpstrInitialDir = szDir; + openfilename.Flags = 0; + openfilename.lpstrDefExt = szDefaultExt; + openfilename.lpstrCustomFilter = 0; + openfilename.nMaxCustFilter = 0; + openfilename.nFilterIndex = 0; + openfilename.lpstrFileTitle = 0; + openfilename.nMaxFileTitle = 0; + openfilename.lpstrInitialDir = 0; + openfilename.lpstrTitle = 0; + openfilename.nFileOffset = 0; + openfilename.nFileExtension = 0; + openfilename.lCustData = 0; + openfilename.lpfnHook = 0; + openfilename.lpTemplateName = 0; + + return GetOpenFileName(&openfilename); +} + +/*********************************************************************** + * + * DIALOG_AddFilterItem + */ + +static VOID DIALOG_AddFilterItem(LPSTR *p, UINT ids, LPCSTR filter) { - DLGPROC lpfnDlg = MakeProcInstance(DIALOG_NEW_DlgProc, Globals.hInstance); - INT ret; + LoadString(Globals.hInstance, ids, *p, MAX_STRING_LEN); + *p += strlen(*p) + 1; + lstrcpy(*p, filter); + *p += strlen(*p) + 1; + **p = '\0'; +} - New.nDefault = nDefault; +/*********************************************************************** + * + * DIALOG_BrowsePrograms + */ - ret = DialogBox(Globals.hInstance, STRING_NEW, - Globals.hMainWnd, lpfnDlg); - FreeProcInstance(lpfnDlg); - return ret; +static BOOL DIALOG_BrowsePrograms(HWND hDlg, LPSTR lpszFile, INT nMaxFile) +{ + CHAR szzFilter[2 * MAX_STRING_LEN + 100]; + LPSTR p = szzFilter; + + DIALOG_AddFilterItem(&p, IDS_PROGRAMS, "*.exe;*.pif;*.com;*.bat"); + DIALOG_AddFilterItem(&p, IDS_ALL_FILES, "*.*"); + + return(DIALOG_Browse(hDlg, szzFilter, lpszFile, nMaxFile)); +} + +/*********************************************************************** + * + * DIALOG_BrowseSymbols + */ + +static BOOL DIALOG_BrowseSymbols(HWND hDlg, LPSTR lpszFile, INT nMaxFile) +{ + CHAR szzFilter[5 * MAX_STRING_LEN + 100]; + LPSTR p = szzFilter; + + DIALOG_AddFilterItem(&p, IDS_SYMBOL_FILES, "*.ico;*.exe;*.dll"); + DIALOG_AddFilterItem(&p, IDS_PROGRAMS, "*.exe"); + DIALOG_AddFilterItem(&p, IDS_LIBRARIES_DLL, "*.dll"); + DIALOG_AddFilterItem(&p, IDS_SYMBOLS_ICO, "*.ico"); + DIALOG_AddFilterItem(&p, IDS_ALL_FILES, "*.*"); + + return(DIALOG_Browse(hDlg, szzFilter, lpszFile, nMaxFile)); } +static struct +{ + INT nDefault; +} New; + /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * DIALOG_NEW_DlgProc */ - static INT_PTR CALLBACK DIALOG_NEW_DlgProc(HWND hDlg, UINT msg, WPARAM wParam, LPARAM lParam) { switch (msg) @@ -93,38 +159,32 @@ static INT_PTR CALLBACK DIALOG_NEW_DlgProc(HWND hDlg, UINT msg, WPARAM wParam, L /*********************************************************************** * - * DIALOG_CopyMove + * DIALOG_New */ - -static struct -{ - LPCSTR lpszProgramName, lpszFromGroupName; - HLOCAL hToGroup; -} CopyMove; - -HLOCAL DIALOG_CopyMove(LPCSTR lpszProgramName, LPCSTR lpszFromGroupName, - BOOL bMove) +INT DIALOG_New(INT nDefault) { - DLGPROC lpfnDlg = MakeProcInstance(DIALOG_COPY_MOVE_DlgProc, Globals.hInstance); + DLGPROC lpfnDlg = MakeProcInstance(DIALOG_NEW_DlgProc, Globals.hInstance); INT ret; - CopyMove.lpszProgramName = lpszProgramName; - CopyMove.lpszFromGroupName = lpszFromGroupName; - CopyMove.hToGroup = 0; + New.nDefault = nDefault; - ret = DialogBox(Globals.hInstance, - bMove ? STRING_MOVE : STRING_COPY, + ret = DialogBox(Globals.hInstance, STRING_NEW, Globals.hMainWnd, lpfnDlg); FreeProcInstance(lpfnDlg); - - return((ret == IDOK) ? CopyMove.hToGroup : 0); + return ret; } + +static struct +{ + LPCSTR lpszProgramName, lpszFromGroupName; + HLOCAL hToGroup; +} CopyMove; + /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * DIALOG_COPY_MOVE_DlgProc */ - static INT_PTR CALLBACK DIALOG_COPY_MOVE_DlgProc(HWND hDlg, UINT msg, WPARAM wParam, LPARAM lParam) { HLOCAL hGroup; @@ -172,6 +232,28 @@ static INT_PTR CALLBACK DIALOG_COPY_MOVE_DlgProc(HWND hDlg, UINT msg, WPARAM wPa /*********************************************************************** * + * DIALOG_CopyMove + */ +HLOCAL DIALOG_CopyMove(LPCSTR lpszProgramName, LPCSTR lpszFromGroupName, + BOOL bMove) +{ + DLGPROC lpfnDlg = MakeProcInstance(DIALOG_COPY_MOVE_DlgProc, Globals.hInstance); + INT ret; + + CopyMove.lpszProgramName = lpszProgramName; + CopyMove.lpszFromGroupName = lpszFromGroupName; + CopyMove.hToGroup = 0; + + ret = DialogBox(Globals.hInstance, + bMove ? STRING_MOVE : STRING_COPY, + Globals.hMainWnd, lpfnDlg); + FreeProcInstance(lpfnDlg); + + return((ret == IDOK) ? CopyMove.hToGroup : 0); +} + +/*********************************************************************** + * * DIALOG_Delete */ @@ -182,37 +264,16 @@ BOOL DIALOG_Delete(UINT ids_text_s, LPCSTR lpszName) } -/*********************************************************************** - * - * DIALOG_GroupAttributes - */ - static struct { LPSTR lpszTitle, lpszGrpFile; INT nSize; } GroupAttributes; -BOOL DIALOG_GroupAttributes(LPSTR lpszTitle, LPSTR lpszGrpFile, INT nSize) -{ - DLGPROC lpfnDlg = MakeProcInstance(DIALOG_GROUP_DlgProc, Globals.hInstance); - INT ret; - - GroupAttributes.nSize = nSize; - GroupAttributes.lpszTitle = lpszTitle; - GroupAttributes.lpszGrpFile = lpszGrpFile; - - ret = DialogBox(Globals.hInstance, STRING_GROUP, - Globals.hMainWnd, lpfnDlg); - FreeProcInstance(lpfnDlg); - return(ret == IDOK); -} - /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * DIALOG_GROUP_DlgProc */ - static INT_PTR CALLBACK DIALOG_GROUP_DlgProc(HWND hDlg, UINT msg, WPARAM wParam, LPARAM lParam) { switch (msg) @@ -243,144 +304,100 @@ static INT_PTR CALLBACK DIALOG_GROUP_DlgProc(HWND hDlg, UINT msg, WPARAM wParam, /*********************************************************************** * - * DIALOG_ProgramAttributes + * DIALOG_GroupAttributes */ - -static struct -{ - LPSTR lpszTitle, lpszCmdLine, lpszWorkDir, lpszIconFile, lpszTmpIconFile; - INT nSize; - INT *lpnCmdShow; - INT *lpnHotKey; - HWND hSelGroupWnd; - HICON *lphIcon, hTmpIcon; - INT *lpnIconIndex, nTmpIconIndex; -} ProgramAttributes; - -BOOL DIALOG_ProgramAttributes(LPSTR lpszTitle, LPSTR lpszCmdLine, - LPSTR lpszWorkDir, LPSTR lpszIconFile, - HICON *lphIcon, INT *lpnIconIndex, - INT *lpnHotKey, INT *lpnCmdShow, INT nSize) +BOOL DIALOG_GroupAttributes(LPSTR lpszTitle, LPSTR lpszGrpFile, INT nSize) { - CHAR szTmpIconFile[MAX_PATHNAME_LEN]; - DLGPROC lpfnDlg = MakeProcInstance(DIALOG_PROGRAM_DlgProc, Globals.hInstance); + DLGPROC lpfnDlg = MakeProcInstance(DIALOG_GROUP_DlgProc, Globals.hInstance); INT ret; - ProgramAttributes.nSize = nSize; - ProgramAttributes.lpszTitle = lpszTitle; - ProgramAttributes.lpszCmdLine = lpszCmdLine; - ProgramAttributes.lpszWorkDir = lpszWorkDir; - ProgramAttributes.lpszIconFile = lpszIconFile; - ProgramAttributes.lpnCmdShow = lpnCmdShow; - ProgramAttributes.lpnHotKey = lpnHotKey; - ProgramAttributes.lphIcon = lphIcon; - ProgramAttributes.lpnIconIndex = lpnIconIndex; - -#if 0 - ProgramAttributes.hTmpIcon = 0; -#else - ProgramAttributes.hTmpIcon = *lphIcon; -#endif - ProgramAttributes.nTmpIconIndex = *lpnIconIndex; - ProgramAttributes.lpszTmpIconFile = szTmpIconFile; - lstrcpyn(ProgramAttributes.lpszTmpIconFile, lpszIconFile, MAX_PATHNAME_LEN); + GroupAttributes.nSize = nSize; + GroupAttributes.lpszTitle = lpszTitle; + GroupAttributes.lpszGrpFile = lpszGrpFile; - ret = DialogBox(Globals.hInstance, STRING_PROGRAM, + ret = DialogBox(Globals.hInstance, STRING_GROUP, Globals.hMainWnd, lpfnDlg); FreeProcInstance(lpfnDlg); - return(ret == IDOK); } + +static struct +{ + LPSTR lpszIconFile; + INT nSize; + HICON *lphIcon; + INT *lpnIconIndex; +} Symbol; + /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * - * DIALOG_PROGRAM_DlgProc + * DIALOG_SYMBOL_DlgProc */ - -static INT_PTR CALLBACK DIALOG_PROGRAM_DlgProc(HWND hDlg, UINT msg, WPARAM wParam, LPARAM lParam) +static INT_PTR CALLBACK DIALOG_SYMBOL_DlgProc(HWND hDlg, UINT msg, WPARAM wParam, LPARAM lParam) { - CHAR buffer[MAX_STRING_LEN]; switch (msg) { case WM_INITDIALOG: - SetDlgItemText(hDlg, PM_DESCRIPTION, ProgramAttributes.lpszTitle); - SetDlgItemText(hDlg, PM_COMMAND_LINE, ProgramAttributes.lpszCmdLine); - SetDlgItemText(hDlg, PM_DIRECTORY, ProgramAttributes.lpszWorkDir); - if (!*ProgramAttributes.lpnHotKey) - { - LoadString(Globals.hInstance, IDS_NO_HOT_KEY, buffer, sizeof(buffer)); - SetDlgItemText(hDlg, PM_HOT_KEY, buffer); - } - - CheckDlgButton(hDlg, PM_SYMBOL, - (*ProgramAttributes.lpnCmdShow == SW_SHOWMINIMIZED)); - SendDlgItemMessage(hDlg, PM_ICON, STM_SETICON, - (WPARAM) ProgramAttributes.hTmpIcon, 0); - break; + SetDlgItemText(hDlg, PM_ICON_FILE, Symbol.lpszIconFile); + SendDlgItemMessage(hDlg, PM_SYMBOL_LIST, CB_SETITEMHEIGHT, 0, (LPARAM) 32); + SendDlgItemMessage(hDlg, PM_SYMBOL_LIST, CB_ADDSTRING, 0, (LPARAM)*Symbol.lphIcon); + SendDlgItemMessage(hDlg, PM_SYMBOL_LIST, CB_ADDSTRING, 0, (LPARAM)Globals.hDefaultIcon); + SendDlgItemMessage(hDlg, PM_SYMBOL_LIST, CB_SETCURSEL, 0, 0); + return TRUE; + + case WM_MEASUREITEM: + { + PMEASUREITEMSTRUCT measure = (PMEASUREITEMSTRUCT) lParam; + measure->itemWidth = 32; + measure->itemHeight = 32; + return TRUE; + } + + case WM_DRAWITEM: + { + PDRAWITEMSTRUCT dis = (PDRAWITEMSTRUCT) lParam; + DrawIcon(dis->hDC, dis->rcItem.left, dis->rcItem.top, (HICON)dis->itemData); + return TRUE; + } case WM_COMMAND: switch (wParam) { - case PM_SYMBOL: - CheckDlgButton(hDlg, PM_SYMBOL, !IsDlgButtonChecked(hDlg, PM_SYMBOL)); - return TRUE; - case PM_BROWSE: { CHAR filename[MAX_PATHNAME_LEN]; filename[0] = 0; - if (DIALOG_BrowsePrograms(hDlg, filename, sizeof(filename))) - SetDlgItemText(hDlg, PM_COMMAND_LINE, filename); + if (DIALOG_BrowseSymbols(hDlg, filename, sizeof(filename))) + SetDlgItemText(hDlg, PM_ICON_FILE, filename); return TRUE; } - case PM_OTHER_SYMBOL: - { - DIALOG_Symbol(&ProgramAttributes.hTmpIcon, - ProgramAttributes.lpszTmpIconFile, - &ProgramAttributes.nTmpIconIndex, - MAX_PATHNAME_LEN); - - SendDlgItemMessage(hDlg, PM_ICON, STM_SETICON, - (WPARAM) ProgramAttributes.hTmpIcon, 0); - return TRUE; - } + case PM_HELP: + MAIN_MessageBoxIDS(IDS_NOT_IMPLEMENTED, IDS_ERROR, MB_OK); + return TRUE; case IDOK: - GetDlgItemText(hDlg, PM_DESCRIPTION, - ProgramAttributes.lpszTitle, - ProgramAttributes.nSize); - GetDlgItemText(hDlg, PM_COMMAND_LINE, - ProgramAttributes.lpszCmdLine, - ProgramAttributes.nSize); - GetDlgItemText(hDlg, PM_DIRECTORY, - ProgramAttributes.lpszWorkDir, - ProgramAttributes.nSize); + { + INT nCurSel = SendDlgItemMessage(hDlg, PM_SYMBOL_LIST, CB_GETCURSEL, 0, 0); - if (ProgramAttributes.hTmpIcon) - { + GetDlgItemText(hDlg, PM_ICON_FILE, Symbol.lpszIconFile, Symbol.nSize); + + *Symbol.lphIcon = (HICON)SendDlgItemMessage(hDlg, PM_SYMBOL_LIST, + CB_GETITEMDATA, + (WPARAM) nCurSel, 0); #if 0 - if (*ProgramAttributes.lphIcon) - DestroyIcon(*ProgramAttributes.lphIcon); + *Symbol.lphIcon = CopyIcon(*Symbol.lphIcon); #endif - *ProgramAttributes.lphIcon = ProgramAttributes.hTmpIcon; - *ProgramAttributes.lpnIconIndex = ProgramAttributes.nTmpIconIndex; - lstrcpyn(ProgramAttributes.lpszIconFile, - ProgramAttributes.lpszTmpIconFile, - ProgramAttributes.nSize); - } - *ProgramAttributes.lpnCmdShow = - IsDlgButtonChecked(hDlg, PM_SYMBOL) ? - SW_SHOWMINIMIZED : SW_SHOWNORMAL; - EndDialog(hDlg, IDOK); - return TRUE; + EndDialog(hDlg, IDOK); + return TRUE; + } case IDCANCEL: EndDialog(hDlg, IDCANCEL); return TRUE; } - return FALSE; } return FALSE; } @@ -389,15 +406,6 @@ static INT_PTR CALLBACK DIALOG_PROGRAM_DlgProc(HWND hDlg, UINT msg, WPARAM wPara * * DIALOG_Symbol */ - -static struct -{ - LPSTR lpszIconFile; - INT nSize; - HICON *lphIcon; - INT *lpnIconIndex; -} Symbol; - VOID DIALOG_Symbol(HICON *lphIcon, LPSTR lpszIconFile, INT *lpnIconIndex, INT nSize) { @@ -413,98 +421,154 @@ VOID DIALOG_Symbol(HICON *lphIcon, LPSTR lpszIconFile, FreeProcInstance(lpfnDlg); } + +static struct +{ + LPSTR lpszTitle, lpszCmdLine, lpszWorkDir, lpszIconFile, lpszTmpIconFile; + INT nSize; + INT *lpnCmdShow; + INT *lpnHotKey; + HWND hSelGroupWnd; + HICON *lphIcon, hTmpIcon; + INT *lpnIconIndex, nTmpIconIndex; +} ProgramAttributes; + /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * - * DIALOG_SYMBOL_DlgProc + * DIALOG_PROGRAM_DlgProc */ - -static INT_PTR CALLBACK DIALOG_SYMBOL_DlgProc(HWND hDlg, UINT msg, WPARAM wParam, LPARAM lParam) +static INT_PTR CALLBACK DIALOG_PROGRAM_DlgProc(HWND hDlg, UINT msg, WPARAM wParam, LPARAM lParam) { + CHAR buffer[MAX_STRING_LEN]; switch (msg) { case WM_INITDIALOG: - SetDlgItemText(hDlg, PM_ICON_FILE, Symbol.lpszIconFile); - SendDlgItemMessage(hDlg, PM_SYMBOL_LIST, CB_SETITEMHEIGHT, 0, (LPARAM) 32); - SendDlgItemMessage(hDlg, PM_SYMBOL_LIST, CB_ADDSTRING, 0, (LPARAM)*Symbol.lphIcon); - SendDlgItemMessage(hDlg, PM_SYMBOL_LIST, CB_ADDSTRING, 0, (LPARAM)Globals.hDefaultIcon); - SendDlgItemMessage(hDlg, PM_SYMBOL_LIST, CB_SETCURSEL, 0, 0); - return TRUE; - - case WM_MEASUREITEM: - { - PMEASUREITEMSTRUCT measure = (PMEASUREITEMSTRUCT) lParam; - measure->itemWidth = 32; - measure->itemHeight = 32; - return TRUE; - } + SetDlgItemText(hDlg, PM_DESCRIPTION, ProgramAttributes.lpszTitle); + SetDlgItemText(hDlg, PM_COMMAND_LINE, ProgramAttributes.lpszCmdLine); + SetDlgItemText(hDlg, PM_DIRECTORY, ProgramAttributes.lpszWorkDir); + if (!*ProgramAttributes.lpnHotKey) + { + LoadString(Globals.hInstance, IDS_NO_HOT_KEY, buffer, sizeof(buffer)); + SetDlgItemText(hDlg, PM_HOT_KEY, buffer); + } - case WM_DRAWITEM: - { - PDRAWITEMSTRUCT dis = (PDRAWITEMSTRUCT) lParam; - DrawIcon(dis->hDC, dis->rcItem.left, dis->rcItem.top, (HICON)dis->itemData); - return TRUE; - } + CheckDlgButton(hDlg, PM_SYMBOL, + (*ProgramAttributes.lpnCmdShow == SW_SHOWMINIMIZED)); + SendDlgItemMessage(hDlg, PM_ICON, STM_SETICON, + (WPARAM) ProgramAttributes.hTmpIcon, 0); + break; case WM_COMMAND: switch (wParam) { + case PM_SYMBOL: + CheckDlgButton(hDlg, PM_SYMBOL, !IsDlgButtonChecked(hDlg, PM_SYMBOL)); + return TRUE; + case PM_BROWSE: { CHAR filename[MAX_PATHNAME_LEN]; filename[0] = 0; - if (DIALOG_BrowseSymbols(hDlg, filename, sizeof(filename))) - SetDlgItemText(hDlg, PM_ICON_FILE, filename); + if (DIALOG_BrowsePrograms(hDlg, filename, sizeof(filename))) + SetDlgItemText(hDlg, PM_COMMAND_LINE, filename); return TRUE; } - case PM_HELP: - MAIN_MessageBoxIDS(IDS_NOT_IMPLEMENTED, IDS_ERROR, MB_OK); - return TRUE; - - case IDOK: + case PM_OTHER_SYMBOL: { - INT nCurSel = SendDlgItemMessage(hDlg, PM_SYMBOL_LIST, CB_GETCURSEL, 0, 0); + DIALOG_Symbol(&ProgramAttributes.hTmpIcon, + ProgramAttributes.lpszTmpIconFile, + &ProgramAttributes.nTmpIconIndex, + MAX_PATHNAME_LEN); - GetDlgItemText(hDlg, PM_ICON_FILE, Symbol.lpszIconFile, Symbol.nSize); + SendDlgItemMessage(hDlg, PM_ICON, STM_SETICON, + (WPARAM) ProgramAttributes.hTmpIcon, 0); + return TRUE; + } - *Symbol.lphIcon = (HICON)SendDlgItemMessage(hDlg, PM_SYMBOL_LIST, - CB_GETITEMDATA, - (WPARAM) nCurSel, 0); + case IDOK: + GetDlgItemText(hDlg, PM_DESCRIPTION, + ProgramAttributes.lpszTitle, + ProgramAttributes.nSize); + GetDlgItemText(hDlg, PM_COMMAND_LINE, + ProgramAttributes.lpszCmdLine, + ProgramAttributes.nSize); + GetDlgItemText(hDlg, PM_DIRECTORY, + ProgramAttributes.lpszWorkDir, + ProgramAttributes.nSize); + + if (ProgramAttributes.hTmpIcon) + { #if 0 - *Symbol.lphIcon = CopyIcon(*Symbol.lphIcon); + if (*ProgramAttributes.lphIcon) + DestroyIcon(*ProgramAttributes.lphIcon); #endif + *ProgramAttributes.lphIcon = ProgramAttributes.hTmpIcon; + *ProgramAttributes.lpnIconIndex = ProgramAttributes.nTmpIconIndex; + lstrcpyn(ProgramAttributes.lpszIconFile, + ProgramAttributes.lpszTmpIconFile, + ProgramAttributes.nSize); + } - EndDialog(hDlg, IDOK); - return TRUE; - } + *ProgramAttributes.lpnCmdShow = + IsDlgButtonChecked(hDlg, PM_SYMBOL) ? + SW_SHOWMINIMIZED : SW_SHOWNORMAL; + EndDialog(hDlg, IDOK); + return TRUE; case IDCANCEL: EndDialog(hDlg, IDCANCEL); return TRUE; } + return FALSE; } return FALSE; } /*********************************************************************** * - * DIALOG_Execute + * DIALOG_ProgramAttributes */ - -VOID DIALOG_Execute(void) +BOOL DIALOG_ProgramAttributes(LPSTR lpszTitle, LPSTR lpszCmdLine, + LPSTR lpszWorkDir, LPSTR lpszIconFile, + HICON *lphIcon, INT *lpnIconIndex, + INT *lpnHotKey, INT *lpnCmdShow, INT nSize) { - INT_PTR z; - DLGPROC lpfnDlg = MakeProcInstance(DIALOG_EXECUTE_DlgProc, Globals.hInstance); - z=DialogBox(Globals.hInstance, STRING_EXECUTE, - Globals.hMainWnd, lpfnDlg); - FreeProcInstance(lpfnDlg); + CHAR szTmpIconFile[MAX_PATHNAME_LEN]; + DLGPROC lpfnDlg = MakeProcInstance(DIALOG_PROGRAM_DlgProc, Globals.hInstance); + INT ret; + + ProgramAttributes.nSize = nSize; + ProgramAttributes.lpszTitle = lpszTitle; + ProgramAttributes.lpszCmdLine = lpszCmdLine; + ProgramAttributes.lpszWorkDir = lpszWorkDir; + ProgramAttributes.lpszIconFile = lpszIconFile; + ProgramAttributes.lpnCmdShow = lpnCmdShow; + ProgramAttributes.lpnHotKey = lpnHotKey; + ProgramAttributes.lphIcon = lphIcon; + ProgramAttributes.lpnIconIndex = lpnIconIndex; + +#if 0 + ProgramAttributes.hTmpIcon = 0; +#else + ProgramAttributes.hTmpIcon = *lphIcon; +#endif + ProgramAttributes.nTmpIconIndex = *lpnIconIndex; + ProgramAttributes.lpszTmpIconFile = szTmpIconFile; + lstrcpyn(ProgramAttributes.lpszTmpIconFile, lpszIconFile, MAX_PATHNAME_LEN); + + ret = DialogBox(Globals.hInstance, STRING_PROGRAM, + Globals.hMainWnd, lpfnDlg); + FreeProcInstance(lpfnDlg); + + return(ret == IDOK); } + /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * DIALOG_EXECUTE_DlgProc */ - static INT_PTR CALLBACK DIALOG_EXECUTE_DlgProc(HWND hDlg, UINT msg, WPARAM wParam, LPARAM lParam) { @@ -553,94 +617,16 @@ static INT_PTR CALLBACK DIALOG_EXECUTE_DlgProc(HWND hDlg, UINT msg, /*********************************************************************** * - * DIALOG_Browse - */ - -static BOOL DIALOG_Browse(HWND hDlg, LPCSTR lpszzFilter, - LPSTR lpstrFile, INT nMaxFile) - -{ - OPENFILENAME openfilename; - - CHAR szDir[MAX_PATH]; - CHAR szDefaultExt[] = "exe"; - - ZeroMemory(&openfilename, sizeof(openfilename)); - - GetCurrentDirectory(sizeof(szDir), szDir); - - openfilename.lStructSize = sizeof(openfilename); - openfilename.hwndOwner = Globals.hMainWnd; - openfilename.hInstance = Globals.hInstance; - openfilename.lpstrFilter = lpszzFilter; - openfilename.lpstrFile = lpstrFile; - openfilename.nMaxFile = nMaxFile; - openfilename.lpstrInitialDir = szDir; - openfilename.Flags = 0; - openfilename.lpstrDefExt = szDefaultExt; - openfilename.lpstrCustomFilter = 0; - openfilename.nMaxCustFilter = 0; - openfilename.nFilterIndex = 0; - openfilename.lpstrFileTitle = 0; - openfilename.nMaxFileTitle = 0; - openfilename.lpstrInitialDir = 0; - openfilename.lpstrTitle = 0; - openfilename.nFileOffset = 0; - openfilename.nFileExtension = 0; - openfilename.lCustData = 0; - openfilename.lpfnHook = 0; - openfilename.lpTemplateName = 0; - - return GetOpenFileName(&openfilename); -} - -/*********************************************************************** - * - * DIALOG_AddFilterItem - */ - -static VOID DIALOG_AddFilterItem(LPSTR *p, UINT ids, LPCSTR filter) -{ - LoadString(Globals.hInstance, ids, *p, MAX_STRING_LEN); - *p += strlen(*p) + 1; - lstrcpy(*p, filter); - *p += strlen(*p) + 1; - **p = '\0'; -} - -/*********************************************************************** - * - * DIALOG_BrowsePrograms - */ - -static BOOL DIALOG_BrowsePrograms(HWND hDlg, LPSTR lpszFile, INT nMaxFile) -{ - CHAR szzFilter[2 * MAX_STRING_LEN + 100]; - LPSTR p = szzFilter; - - DIALOG_AddFilterItem(&p, IDS_PROGRAMS, "*.exe;*.pif;*.com;*.bat"); - DIALOG_AddFilterItem(&p, IDS_ALL_FILES, "*.*"); - - return(DIALOG_Browse(hDlg, szzFilter, lpszFile, nMaxFile)); -} - -/*********************************************************************** - * - * DIALOG_BrowseSymbols + * DIALOG_Execute */ -static BOOL DIALOG_BrowseSymbols(HWND hDlg, LPSTR lpszFile, INT nMaxFile) +VOID DIALOG_Execute(void) { - CHAR szzFilter[5 * MAX_STRING_LEN + 100]; - LPSTR p = szzFilter; - - DIALOG_AddFilterItem(&p, IDS_SYMBOL_FILES, "*.ico;*.exe;*.dll"); - DIALOG_AddFilterItem(&p, IDS_PROGRAMS, "*.exe"); - DIALOG_AddFilterItem(&p, IDS_LIBRARIES_DLL, "*.dll"); - DIALOG_AddFilterItem(&p, IDS_SYMBOLS_ICO, "*.ico"); - DIALOG_AddFilterItem(&p, IDS_ALL_FILES, "*.*"); - - return(DIALOG_Browse(hDlg, szzFilter, lpszFile, nMaxFile)); + INT_PTR z; + DLGPROC lpfnDlg = MakeProcInstance(DIALOG_EXECUTE_DlgProc, Globals.hInstance); + z=DialogBox(Globals.hInstance, STRING_EXECUTE, + Globals.hMainWnd, lpfnDlg); + FreeProcInstance(lpfnDlg); } /* Local Variables: */ diff --git a/programs/rpcss/irotp.c b/programs/rpcss/irotp.c index 6f322059ac3..97a4a0e9c4b 100644 --- a/programs/rpcss/irotp.c +++ b/programs/rpcss/irotp.c @@ -368,7 +368,7 @@ void __RPC_USER IrotContextHandle_rundown(IrotContextHandle ctxt_handle) rot_entry_release(rot_entry); } -void * __RPC_USER MIDL_user_allocate(size_t size) +void * __RPC_USER MIDL_user_allocate(SIZE_T size) { return HeapAlloc(GetProcessHeap(), 0, size); } diff --git a/programs/services/rpc.c b/programs/services/rpc.c index 99180bb91e7..7c09f55cc8b 100644 --- a/programs/services/rpc.c +++ b/programs/services/rpc.c @@ -1234,7 +1234,7 @@ void __RPC_USER SC_RPC_HANDLE_rundown(SC_RPC_HANDLE handle) SC_RPC_HANDLE_destroy(handle); } -void __RPC_FAR * __RPC_USER MIDL_user_allocate(size_t len) +void __RPC_FAR * __RPC_USER MIDL_user_allocate(SIZE_T len) { return HeapAlloc(GetProcessHeap(), 0, len); } diff --git a/programs/services/services.c b/programs/services/services.c index 003771f0637..9bed78423b5 100644 --- a/programs/services/services.c +++ b/programs/services/services.c @@ -242,10 +242,12 @@ static void scmdatabase_autostart_services(struct scmdatabase *db) { if (i+1 >= size) { + struct service_entry **slist_new; size *= 2; - services_list = HeapReAlloc(GetProcessHeap(), 0, services_list, size * sizeof(services_list[0])); - if (!services_list) + slist_new = HeapReAlloc(GetProcessHeap(), 0, services_list, size * sizeof(services_list[0])); + if (!slist_new) break; + services_list = slist_new; } services_list[i] = service; service->ref_count++; diff --git a/programs/taskmgr/applpage.c b/programs/taskmgr/applpage.c index 20248d4d808..c7450ac7ca3 100644 --- a/programs/taskmgr/applpage.c +++ b/programs/taskmgr/applpage.c @@ -500,136 +500,6 @@ static void ApplicationPageOnNotify(WPARAM wParam, LPARAM lParam) } -INT_PTR CALLBACK -ApplicationPageWndProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) -{ - RECT rc; - int nXDifference; - int nYDifference; - int cx, cy; - LVCOLUMNW column; - - static const WCHAR wszTasks[] = {'T','a','s','k','s',0}; - static WCHAR wszTask[] = {'T','a','s','k',0}; - static WCHAR wszStatus[] = {'S','t','a','t','u','s',0}; - - switch (message) { - case WM_INITDIALOG: - - /* Save the width and height */ - GetClientRect(hDlg, &rc); - nApplicationPageWidth = rc.right; - nApplicationPageHeight = rc.bottom; - - /* Update window position */ - SetWindowPos(hDlg, NULL, 15, 30, 0, 0, SWP_NOACTIVATE|SWP_NOOWNERZORDER|SWP_NOSIZE|SWP_NOZORDER); - - /* Get handles to the controls */ - hApplicationPageListCtrl = GetDlgItem(hDlg, IDC_APPLIST); - hApplicationPageEndTaskButton = GetDlgItem(hDlg, IDC_ENDTASK); - hApplicationPageSwitchToButton = GetDlgItem(hDlg, IDC_SWITCHTO); - hApplicationPageNewTaskButton = GetDlgItem(hDlg, IDC_NEWTASK); - - SetWindowTextW(hApplicationPageListCtrl, wszTasks); - - /* Initialize the application page's controls */ - column.mask = LVCF_TEXT|LVCF_WIDTH; - column.pszText = wszTask; - column.cx = 250; - /* Add the "Task" column */ - SendMessageW(hApplicationPageListCtrl, LVM_INSERTCOLUMNW, 0, (LPARAM) &column); - column.mask = LVCF_TEXT|LVCF_WIDTH; - column.pszText = wszStatus; - column.cx = 95; - /* Add the "Status" column */ - SendMessageW(hApplicationPageListCtrl, LVM_INSERTCOLUMNW, 1, (LPARAM) &column); - - SendMessageW(hApplicationPageListCtrl, LVM_SETIMAGELIST, LVSIL_SMALL, - (LPARAM) ImageList_Create(16, 16, ILC_COLOR8|ILC_MASK, 0, 1)); - SendMessageW(hApplicationPageListCtrl, LVM_SETIMAGELIST, LVSIL_NORMAL, - (LPARAM) ImageList_Create(32, 32, ILC_COLOR8|ILC_MASK, 0, 1)); - - UpdateApplicationListControlViewSetting(); - - /* Start our refresh thread */ - CreateThread(NULL, 0, ApplicationPageRefreshThread, NULL, 0, NULL); - - return TRUE; - - case WM_DESTROY: - /* Close the event handle, this will make the */ - /* refresh thread exit when the wait fails */ - CloseHandle(hApplicationPageEvent); - break; - - case WM_COMMAND: - - /* Handle the button clicks */ - switch (LOWORD(wParam)) - { - case IDC_ENDTASK: - ApplicationPage_OnEndTask(); - break; - case IDC_SWITCHTO: - ApplicationPage_OnSwitchTo(); - break; - case IDC_NEWTASK: - SendMessageW(hMainWnd, WM_COMMAND, MAKEWPARAM(ID_FILE_NEW, 0), 0); - break; - } - - break; - - case WM_SIZE: - if (wParam == SIZE_MINIMIZED) - return 0; - - cx = LOWORD(lParam); - cy = HIWORD(lParam); - nXDifference = cx - nApplicationPageWidth; - nYDifference = cy - nApplicationPageHeight; - nApplicationPageWidth = cx; - nApplicationPageHeight = cy; - - /* Reposition the application page's controls */ - GetWindowRect(hApplicationPageListCtrl, &rc); - cx = (rc.right - rc.left) + nXDifference; - cy = (rc.bottom - rc.top) + nYDifference; - SetWindowPos(hApplicationPageListCtrl, NULL, 0, 0, cx, cy, SWP_NOACTIVATE|SWP_NOOWNERZORDER|SWP_NOMOVE|SWP_NOZORDER); - InvalidateRect(hApplicationPageListCtrl, NULL, TRUE); - - GetClientRect(hApplicationPageEndTaskButton, &rc); - MapWindowPoints(hApplicationPageEndTaskButton, hDlg, (LPPOINT)(&rc), (sizeof(RECT)/sizeof(POINT)) ); - cx = rc.left + nXDifference; - cy = rc.top + nYDifference; - SetWindowPos(hApplicationPageEndTaskButton, NULL, cx, cy, 0, 0, SWP_NOACTIVATE|SWP_NOOWNERZORDER|SWP_NOSIZE|SWP_NOZORDER); - InvalidateRect(hApplicationPageEndTaskButton, NULL, TRUE); - - GetClientRect(hApplicationPageSwitchToButton, &rc); - MapWindowPoints(hApplicationPageSwitchToButton, hDlg, (LPPOINT)(&rc), (sizeof(RECT)/sizeof(POINT)) ); - cx = rc.left + nXDifference; - cy = rc.top + nYDifference; - SetWindowPos(hApplicationPageSwitchToButton, NULL, cx, cy, 0, 0, SWP_NOACTIVATE|SWP_NOOWNERZORDER|SWP_NOSIZE|SWP_NOZORDER); - InvalidateRect(hApplicationPageSwitchToButton, NULL, TRUE); - - GetClientRect(hApplicationPageNewTaskButton, &rc); - MapWindowPoints(hApplicationPageNewTaskButton, hDlg, (LPPOINT)(&rc), (sizeof(RECT)/sizeof(POINT)) ); - cx = rc.left + nXDifference; - cy = rc.top + nYDifference; - SetWindowPos(hApplicationPageNewTaskButton, NULL, cx, cy, 0, 0, SWP_NOACTIVATE|SWP_NOOWNERZORDER|SWP_NOSIZE|SWP_NOZORDER); - InvalidateRect(hApplicationPageNewTaskButton, NULL, TRUE); - - break; - - case WM_NOTIFY: - ApplicationPageOnNotify(wParam, lParam); - break; - - } - - return 0; -} - void RefreshApplicationPage(void) { /* Signal the event so that our refresh thread */ @@ -957,3 +827,133 @@ void ApplicationPage_OnGotoProcess(void) } } } + +INT_PTR CALLBACK +ApplicationPageWndProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) +{ + RECT rc; + int nXDifference; + int nYDifference; + int cx, cy; + LVCOLUMNW column; + + static const WCHAR wszTasks[] = {'T','a','s','k','s',0}; + static WCHAR wszTask[] = {'T','a','s','k',0}; + static WCHAR wszStatus[] = {'S','t','a','t','u','s',0}; + + switch (message) { + case WM_INITDIALOG: + + /* Save the width and height */ + GetClientRect(hDlg, &rc); + nApplicationPageWidth = rc.right; + nApplicationPageHeight = rc.bottom; + + /* Update window position */ + SetWindowPos(hDlg, NULL, 15, 30, 0, 0, SWP_NOACTIVATE|SWP_NOOWNERZORDER|SWP_NOSIZE|SWP_NOZORDER); + + /* Get handles to the controls */ + hApplicationPageListCtrl = GetDlgItem(hDlg, IDC_APPLIST); + hApplicationPageEndTaskButton = GetDlgItem(hDlg, IDC_ENDTASK); + hApplicationPageSwitchToButton = GetDlgItem(hDlg, IDC_SWITCHTO); + hApplicationPageNewTaskButton = GetDlgItem(hDlg, IDC_NEWTASK); + + SetWindowTextW(hApplicationPageListCtrl, wszTasks); + + /* Initialize the application page's controls */ + column.mask = LVCF_TEXT|LVCF_WIDTH; + column.pszText = wszTask; + column.cx = 250; + /* Add the "Task" column */ + SendMessageW(hApplicationPageListCtrl, LVM_INSERTCOLUMNW, 0, (LPARAM) &column); + column.mask = LVCF_TEXT|LVCF_WIDTH; + column.pszText = wszStatus; + column.cx = 95; + /* Add the "Status" column */ + SendMessageW(hApplicationPageListCtrl, LVM_INSERTCOLUMNW, 1, (LPARAM) &column); + + SendMessageW(hApplicationPageListCtrl, LVM_SETIMAGELIST, LVSIL_SMALL, + (LPARAM) ImageList_Create(16, 16, ILC_COLOR8|ILC_MASK, 0, 1)); + SendMessageW(hApplicationPageListCtrl, LVM_SETIMAGELIST, LVSIL_NORMAL, + (LPARAM) ImageList_Create(32, 32, ILC_COLOR8|ILC_MASK, 0, 1)); + + UpdateApplicationListControlViewSetting(); + + /* Start our refresh thread */ + CreateThread(NULL, 0, ApplicationPageRefreshThread, NULL, 0, NULL); + + return TRUE; + + case WM_DESTROY: + /* Close the event handle, this will make the */ + /* refresh thread exit when the wait fails */ + CloseHandle(hApplicationPageEvent); + break; + + case WM_COMMAND: + + /* Handle the button clicks */ + switch (LOWORD(wParam)) + { + case IDC_ENDTASK: + ApplicationPage_OnEndTask(); + break; + case IDC_SWITCHTO: + ApplicationPage_OnSwitchTo(); + break; + case IDC_NEWTASK: + SendMessageW(hMainWnd, WM_COMMAND, MAKEWPARAM(ID_FILE_NEW, 0), 0); + break; + } + + break; + + case WM_SIZE: + if (wParam == SIZE_MINIMIZED) + return 0; + + cx = LOWORD(lParam); + cy = HIWORD(lParam); + nXDifference = cx - nApplicationPageWidth; + nYDifference = cy - nApplicationPageHeight; + nApplicationPageWidth = cx; + nApplicationPageHeight = cy; + + /* Reposition the application page's controls */ + GetWindowRect(hApplicationPageListCtrl, &rc); + cx = (rc.right - rc.left) + nXDifference; + cy = (rc.bottom - rc.top) + nYDifference; + SetWindowPos(hApplicationPageListCtrl, NULL, 0, 0, cx, cy, SWP_NOACTIVATE|SWP_NOOWNERZORDER|SWP_NOMOVE|SWP_NOZORDER); + InvalidateRect(hApplicationPageListCtrl, NULL, TRUE); + + GetClientRect(hApplicationPageEndTaskButton, &rc); + MapWindowPoints(hApplicationPageEndTaskButton, hDlg, (LPPOINT)(&rc), (sizeof(RECT)/sizeof(POINT)) ); + cx = rc.left + nXDifference; + cy = rc.top + nYDifference; + SetWindowPos(hApplicationPageEndTaskButton, NULL, cx, cy, 0, 0, SWP_NOACTIVATE|SWP_NOOWNERZORDER|SWP_NOSIZE|SWP_NOZORDER); + InvalidateRect(hApplicationPageEndTaskButton, NULL, TRUE); + + GetClientRect(hApplicationPageSwitchToButton, &rc); + MapWindowPoints(hApplicationPageSwitchToButton, hDlg, (LPPOINT)(&rc), (sizeof(RECT)/sizeof(POINT)) ); + cx = rc.left + nXDifference; + cy = rc.top + nYDifference; + SetWindowPos(hApplicationPageSwitchToButton, NULL, cx, cy, 0, 0, SWP_NOACTIVATE|SWP_NOOWNERZORDER|SWP_NOSIZE|SWP_NOZORDER); + InvalidateRect(hApplicationPageSwitchToButton, NULL, TRUE); + + GetClientRect(hApplicationPageNewTaskButton, &rc); + MapWindowPoints(hApplicationPageNewTaskButton, hDlg, (LPPOINT)(&rc), (sizeof(RECT)/sizeof(POINT)) ); + cx = rc.left + nXDifference; + cy = rc.top + nYDifference; + SetWindowPos(hApplicationPageNewTaskButton, NULL, cx, cy, 0, 0, SWP_NOACTIVATE|SWP_NOOWNERZORDER|SWP_NOSIZE|SWP_NOZORDER); + InvalidateRect(hApplicationPageNewTaskButton, NULL, TRUE); + + break; + + case WM_NOTIFY: + ApplicationPageOnNotify(wParam, lParam); + break; + + } + + return 0; +} diff --git a/programs/taskmgr/graphctl.c b/programs/taskmgr/graphctl.c index ea512932316..305b56cef70 100644 --- a/programs/taskmgr/graphctl.c +++ b/programs/taskmgr/graphctl.c @@ -124,66 +124,45 @@ TGraphCtrl::~TGraphCtrl(void) } #endif -BOOL GraphCtrl_Create(TGraphCtrl* this, HWND hWnd, HWND hParentWnd, UINT nID) +void GraphCtrl_Resize(TGraphCtrl* this) { - GraphCtrl_Init(this); - this->m_hParentWnd = hParentWnd; - this->m_hWnd = hWnd; - GraphCtrl_Resize(this); - return 0; -} + /* NOTE: Resize automatically gets called during the setup of the control */ + GetClientRect(this->m_hWnd, &this->m_rectClient); -void GraphCtrl_SetRange(TGraphCtrl* this, double dLower, double dUpper, int nDecimalPlaces) -{ - /* ASSERT(dUpper > dLower); */ - this->m_dLowerLimit = dLower; - this->m_dUpperLimit = dUpper; - this->m_nYDecimals = nDecimalPlaces; - this->m_dRange = this->m_dUpperLimit - this->m_dLowerLimit; - this->m_dVerticalFactor = (double)this->m_nPlotHeight / this->m_dRange; - /* clear out the existing garbage, re-start with a clean plot */ - GraphCtrl_InvalidateCtrl(this); -} + /* set some member variables to avoid multiple function calls */ + this->m_nClientHeight = this->m_rectClient.bottom - this->m_rectClient.top;/* m_rectClient.Height(); */ + this->m_nClientWidth = this->m_rectClient.right - this->m_rectClient.left;/* m_rectClient.Width(); */ + /* the "left" coordinate and "width" will be modified in */ + /* InvalidateCtrl to be based on the width of the y axis scaling */ #if 0 -void TGraphCtrl::SetXUnits(const char* string) -{ - lstrcpynA(m_strXUnitsString, string, sizeof(m_strXUnitsString)); - /* clear out the existing garbage, re-start with a clean plot */ - InvalidateCtrl(); -} - -void TGraphCtrl::SetYUnits(const char* string) -{ - lstrcpynA(m_strYUnitsString, string, sizeof(m_strYUnitsString)); - /* clear out the existing garbage, re-start with a clean plot */ - InvalidateCtrl(); -} + this->m_rectPlot.left = 20; + this->m_rectPlot.top = 10; + this->m_rectPlot.right = this->m_rectClient.right-10; + this->m_rectPlot.bottom = this->m_rectClient.bottom-25; +#else + this->m_rectPlot.left = 0; + this->m_rectPlot.top = -1; + this->m_rectPlot.right = this->m_rectClient.right-0; + this->m_rectPlot.bottom = this->m_rectClient.bottom-0; #endif -void GraphCtrl_SetGridColor(TGraphCtrl* this, COLORREF color) -{ - this->m_crGridColor = color; - /* clear out the existing garbage, re-start with a clean plot */ - GraphCtrl_InvalidateCtrl(this); -} + /* set some member variables to avoid multiple function calls */ + this->m_nPlotHeight = this->m_rectPlot.bottom - this->m_rectPlot.top;/* m_rectPlot.Height(); */ + this->m_nPlotWidth = this->m_rectPlot.right - this->m_rectPlot.left;/* m_rectPlot.Width(); */ -void GraphCtrl_SetPlotColor(TGraphCtrl* this, int plot, COLORREF color) -{ - this->m_crPlotColor[plot] = color; - DeleteObject(this->m_penPlot[plot]); - this->m_penPlot[plot] = CreatePen(PS_SOLID, 0, this->m_crPlotColor[plot]); - /* clear out the existing garbage, re-start with a clean plot */ - GraphCtrl_InvalidateCtrl(this); + /* set the scaling factor for now, this can be adjusted */ + /* in the SetRange functions */ + this->m_dVerticalFactor = (double)this->m_nPlotHeight / this->m_dRange; } -void GraphCtrl_SetBackgroundColor(TGraphCtrl* this, COLORREF color) +BOOL GraphCtrl_Create(TGraphCtrl* this, HWND hWnd, HWND hParentWnd, UINT nID) { - this->m_crBackColor = color; - DeleteObject(this->m_brushBack); - this->m_brushBack = CreateSolidBrush(this->m_crBackColor); - /* clear out the existing garbage, re-start with a clean plot */ - GraphCtrl_InvalidateCtrl(this); + GraphCtrl_Init(this); + this->m_hParentWnd = hParentWnd; + this->m_hWnd = hWnd; + GraphCtrl_Resize(this); + return 0; } void GraphCtrl_InvalidateCtrl(TGraphCtrl* this) @@ -342,57 +321,57 @@ void GraphCtrl_InvalidateCtrl(TGraphCtrl* this) ReleaseDC(this->m_hParentWnd, dc); } -double GraphCtrl_AppendPoint(TGraphCtrl* this, - double dNewPoint0, double dNewPoint1, - double dNewPoint2, double dNewPoint3) +void GraphCtrl_SetRange(TGraphCtrl* this, double dLower, double dUpper, int nDecimalPlaces) { - /* append a data point to the plot & return the previous point */ - double dPrevious; - - dPrevious = this->m_dCurrentPosition[0]; - this->m_dCurrentPosition[0] = dNewPoint0; - this->m_dCurrentPosition[1] = dNewPoint1; - this->m_dCurrentPosition[2] = dNewPoint2; - this->m_dCurrentPosition[3] = dNewPoint3; - GraphCtrl_DrawPoint(this); - /* Invalidate(); */ - return dPrevious; + /* ASSERT(dUpper > dLower); */ + this->m_dLowerLimit = dLower; + this->m_dUpperLimit = dUpper; + this->m_nYDecimals = nDecimalPlaces; + this->m_dRange = this->m_dUpperLimit - this->m_dLowerLimit; + this->m_dVerticalFactor = (double)this->m_nPlotHeight / this->m_dRange; + /* clear out the existing garbage, re-start with a clean plot */ + GraphCtrl_InvalidateCtrl(this); } -void GraphCtrl_Paint(TGraphCtrl* this, HWND hWnd, HDC dc) +#if 0 +void TGraphCtrl::SetXUnits(const char* string) { - HDC memDC; - HBITMAP memBitmap; - HBITMAP oldBitmap; /* bitmap originally found in CMemDC */ + lstrcpynA(m_strXUnitsString, string, sizeof(m_strXUnitsString)); + /* clear out the existing garbage, re-start with a clean plot */ + InvalidateCtrl(); +} -/* RECT rcClient; */ -/* GetClientRect(hWnd, &rcClient); */ -/* FillSolidRect(dc, &rcClient, RGB(255, 0, 255)); */ -/* m_nClientWidth = rcClient.right - rcClient.left; */ -/* m_nClientHeight = rcClient.bottom - rcClient.top; */ +void TGraphCtrl::SetYUnits(const char* string) +{ + lstrcpynA(m_strYUnitsString, string, sizeof(m_strYUnitsString)); + /* clear out the existing garbage, re-start with a clean plot */ + InvalidateCtrl(); +} +#endif - /* no real plotting work is performed here, */ - /* just putting the existing bitmaps on the client */ - - /* to avoid flicker, establish a memory dc, draw to it */ - /* and then BitBlt it to the client */ - memDC = CreateCompatibleDC(dc); - memBitmap = CreateCompatibleBitmap(dc, this->m_nClientWidth, this->m_nClientHeight); - oldBitmap = SelectObject(memDC, memBitmap); +void GraphCtrl_SetGridColor(TGraphCtrl* this, COLORREF color) +{ + this->m_crGridColor = color; + /* clear out the existing garbage, re-start with a clean plot */ + GraphCtrl_InvalidateCtrl(this); +} - if (memDC != NULL) - { - /* first drop the grid on the memory dc */ - BitBlt(memDC, 0, 0, this->m_nClientWidth, this->m_nClientHeight, this->m_dcGrid, 0, 0, SRCCOPY); - /* now add the plot on top as a "pattern" via SRCPAINT. */ - /* works well with dark background and a light plot */ - BitBlt(memDC, 0, 0, this->m_nClientWidth, this->m_nClientHeight, this->m_dcPlot, 0, 0, SRCPAINT); /* SRCPAINT */ - /* finally send the result to the display */ - BitBlt(dc, 0, 0, this->m_nClientWidth, this->m_nClientHeight, memDC, 0, 0, SRCCOPY); - } - SelectObject(memDC, oldBitmap); - DeleteObject(memBitmap); - DeleteDC(memDC); +void GraphCtrl_SetPlotColor(TGraphCtrl* this, int plot, COLORREF color) +{ + this->m_crPlotColor[plot] = color; + DeleteObject(this->m_penPlot[plot]); + this->m_penPlot[plot] = CreatePen(PS_SOLID, 0, this->m_crPlotColor[plot]); + /* clear out the existing garbage, re-start with a clean plot */ + GraphCtrl_InvalidateCtrl(this); +} + +void GraphCtrl_SetBackgroundColor(TGraphCtrl* this, COLORREF color) +{ + this->m_crBackColor = color; + DeleteObject(this->m_brushBack); + this->m_brushBack = CreateSolidBrush(this->m_crBackColor); + /* clear out the existing garbage, re-start with a clean plot */ + GraphCtrl_InvalidateCtrl(this); } void GraphCtrl_DrawPoint(TGraphCtrl* this) @@ -481,36 +460,57 @@ void GraphCtrl_DrawPoint(TGraphCtrl* this) } } -void GraphCtrl_Resize(TGraphCtrl* this) +double GraphCtrl_AppendPoint(TGraphCtrl* this, + double dNewPoint0, double dNewPoint1, + double dNewPoint2, double dNewPoint3) { - /* NOTE: Resize automatically gets called during the setup of the control */ - GetClientRect(this->m_hWnd, &this->m_rectClient); + /* append a data point to the plot & return the previous point */ + double dPrevious; - /* set some member variables to avoid multiple function calls */ - this->m_nClientHeight = this->m_rectClient.bottom - this->m_rectClient.top;/* m_rectClient.Height(); */ - this->m_nClientWidth = this->m_rectClient.right - this->m_rectClient.left;/* m_rectClient.Width(); */ + dPrevious = this->m_dCurrentPosition[0]; + this->m_dCurrentPosition[0] = dNewPoint0; + this->m_dCurrentPosition[1] = dNewPoint1; + this->m_dCurrentPosition[2] = dNewPoint2; + this->m_dCurrentPosition[3] = dNewPoint3; + GraphCtrl_DrawPoint(this); + /* Invalidate(); */ + return dPrevious; +} - /* the "left" coordinate and "width" will be modified in */ - /* InvalidateCtrl to be based on the width of the y axis scaling */ -#if 0 - this->m_rectPlot.left = 20; - this->m_rectPlot.top = 10; - this->m_rectPlot.right = this->m_rectClient.right-10; - this->m_rectPlot.bottom = this->m_rectClient.bottom-25; -#else - this->m_rectPlot.left = 0; - this->m_rectPlot.top = -1; - this->m_rectPlot.right = this->m_rectClient.right-0; - this->m_rectPlot.bottom = this->m_rectClient.bottom-0; -#endif +void GraphCtrl_Paint(TGraphCtrl* this, HWND hWnd, HDC dc) +{ + HDC memDC; + HBITMAP memBitmap; + HBITMAP oldBitmap; /* bitmap originally found in CMemDC */ - /* set some member variables to avoid multiple function calls */ - this->m_nPlotHeight = this->m_rectPlot.bottom - this->m_rectPlot.top;/* m_rectPlot.Height(); */ - this->m_nPlotWidth = this->m_rectPlot.right - this->m_rectPlot.left;/* m_rectPlot.Width(); */ +/* RECT rcClient; */ +/* GetClientRect(hWnd, &rcClient); */ +/* FillSolidRect(dc, &rcClient, RGB(255, 0, 255)); */ +/* m_nClientWidth = rcClient.right - rcClient.left; */ +/* m_nClientHeight = rcClient.bottom - rcClient.top; */ - /* set the scaling factor for now, this can be adjusted */ - /* in the SetRange functions */ - this->m_dVerticalFactor = (double)this->m_nPlotHeight / this->m_dRange; + /* no real plotting work is performed here, */ + /* just putting the existing bitmaps on the client */ + + /* to avoid flicker, establish a memory dc, draw to it */ + /* and then BitBlt it to the client */ + memDC = CreateCompatibleDC(dc); + memBitmap = CreateCompatibleBitmap(dc, this->m_nClientWidth, this->m_nClientHeight); + oldBitmap = SelectObject(memDC, memBitmap); + + if (memDC != NULL) + { + /* first drop the grid on the memory dc */ + BitBlt(memDC, 0, 0, this->m_nClientWidth, this->m_nClientHeight, this->m_dcGrid, 0, 0, SRCCOPY); + /* now add the plot on top as a "pattern" via SRCPAINT. */ + /* works well with dark background and a light plot */ + BitBlt(memDC, 0, 0, this->m_nClientWidth, this->m_nClientHeight, this->m_dcPlot, 0, 0, SRCPAINT); /* SRCPAINT */ + /* finally send the result to the display */ + BitBlt(dc, 0, 0, this->m_nClientWidth, this->m_nClientHeight, memDC, 0, 0, SRCCOPY); + } + SelectObject(memDC, oldBitmap); + DeleteObject(memBitmap); + DeleteDC(memDC); } #if 0 diff --git a/programs/taskmgr/graphctl.h b/programs/taskmgr/graphctl.h index 07d389473fe..cd7cec4140b 100644 --- a/programs/taskmgr/graphctl.h +++ b/programs/taskmgr/graphctl.h @@ -91,11 +91,7 @@ double GraphCtrl_AppendPoint(TGraphCtrl* this, double dNewPoint2, double dNewPoint3); BOOL GraphCtrl_Create(TGraphCtrl* this, HWND hWnd, HWND hParentWnd, UINT nID); -void GraphCtrl_DrawPoint(TGraphCtrl* this); -void GraphCtrl_InvalidateCtrl(TGraphCtrl* this); -void GraphCtrl_Paint(TGraphCtrl* this, HWND hWnd, HDC dc); void GraphCtrl_Reset(TGraphCtrl* this); -void GraphCtrl_Resize(TGraphCtrl* this); void GraphCtrl_SetBackgroundColor(TGraphCtrl* this, COLORREF color); void GraphCtrl_SetGridColor(TGraphCtrl* this, COLORREF color); diff --git a/programs/taskmgr/taskmgr.h b/programs/taskmgr/taskmgr.h index 3a3a9db0404..f6df582d57d 100644 --- a/programs/taskmgr/taskmgr.h +++ b/programs/taskmgr/taskmgr.h @@ -176,7 +176,6 @@ void ProcessPage_OnDebugChannels(void); #define WM_ONTRAYICON WM_USER + 5 -HICON TrayIcon_GetProcessorUsageIcon(void); BOOL TrayIcon_ShellAddTrayIcon(void); BOOL TrayIcon_ShellRemoveTrayIcon(void); BOOL TrayIcon_ShellUpdateTrayIcon(void); @@ -199,7 +198,6 @@ void ApplicationPage_OnEndTask(void); void ApplicationPage_OnGotoProcess(void); void RefreshApplicationPage(void); -void UpdateApplicationListControlViewSetting(void); void RefreshPerformancePage(void); void RefreshProcessPage(void); diff --git a/programs/taskmgr/trayicon.c b/programs/taskmgr/trayicon.c index 36a2bcc9d97..35740dd139d 100644 --- a/programs/taskmgr/trayicon.c +++ b/programs/taskmgr/trayicon.c @@ -33,7 +33,7 @@ #include "taskmgr.h" #include "perfdata.h" -HICON TrayIcon_GetProcessorUsageIcon(void) +static HICON TrayIcon_GetProcessorUsageIcon(void) { HICON hTrayIcon = NULL; HDC hScreenDC = NULL; diff --git a/programs/winedbg/symbol.c b/programs/winedbg/symbol.c index c4b09a3315c..03efac12ce4 100644 --- a/programs/winedbg/symbol.c +++ b/programs/winedbg/symbol.c @@ -102,7 +102,7 @@ static BOOL fill_sym_lvalue(const SYMBOL_INFO* sym, ULONG base, */ if (!types_get_info(&type, TI_GET_VALUE, &v) || (v.n1.n2.vt & VT_BYREF)) { - snprintf(buffer, sz, "Couldn't dereference pointer for const value"); + if (buffer) snprintf(buffer, sz, "Couldn't dereference pointer for const value"); return FALSE; } pdw = (DWORD*)lexeme_alloc_size(sizeof(*pdw)); diff --git a/programs/winefile/winefile.c b/programs/winefile/winefile.c index aefe7bdd63b..0193c7b7f44 100644 --- a/programs/winefile/winefile.c +++ b/programs/winefile/winefile.c @@ -4706,7 +4706,7 @@ static void InitInstance(HINSTANCE hinstance) } -static void show_frame(HWND hwndParent, int cmdshow, LPCTSTR path) +static BOOL show_frame(HWND hwndParent, int cmdshow, LPCTSTR path) { static const TCHAR sMDICLIENT[] = {'M','D','I','C','L','I','E','N','T','\0'}; @@ -4718,7 +4718,7 @@ static void show_frame(HWND hwndParent, int cmdshow, LPCTSTR path) CLIENTCREATESTRUCT ccs; if (Globals.hMainWnd) - return; + return TRUE; opts = load_registry_settings(); hMenuFrame = LoadMenu(Globals.hInstance, MAKEINTRESOURCE(IDM_WINEFILE)); @@ -4796,8 +4796,10 @@ static void show_frame(HWND hwndParent, int cmdshow, LPCTSTR path) child->pos.rcNormalPosition.right = 320; child->pos.rcNormalPosition.bottom = 280; - if (!create_child_window(child)) + if (!create_child_window(child)) { HeapFree(GetProcessHeap(), 0, child); + return FALSE; + } SetWindowPlacement(child->hwnd, &child->pos); @@ -4807,7 +4809,7 @@ static void show_frame(HWND hwndParent, int cmdshow, LPCTSTR path) UpdateWindow(Globals.hMainWnd); - if (path && path[0]) + if (child->hwnd && path && path[0]) { int index,count; TCHAR drv[_MAX_DRIVE+1], dir[_MAX_DIR], name[_MAX_FNAME], ext[_MAX_EXT]; @@ -4835,6 +4837,7 @@ static void show_frame(HWND hwndParent, int cmdshow, LPCTSTR path) } } } + return TRUE; } static void ExitInstance(void) @@ -4888,7 +4891,11 @@ static int winefile_main(HINSTANCE hinstance, int cmdshow, LPCTSTR path) InitInstance(hinstance); - show_frame(0, cmdshow, path); + if( !show_frame(0, cmdshow, path) ) + { + ExitInstance(); + return 1; + } while(GetMessage(&msg, 0, 0, 0)) { if (Globals.hmdiclient && TranslateMDISysAccel(Globals.hmdiclient, &msg)) diff --git a/programs/winetest/main.c b/programs/winetest/main.c index fc7a378f374..211ec2e65fd 100644 --- a/programs/winetest/main.c +++ b/programs/winetest/main.c @@ -55,6 +55,10 @@ static char build_id[64]; static char *filters[64]; static unsigned int nb_filters = 0; +/* Needed to check for .NET dlls */ +static HMODULE hmscoree; +static HRESULT (WINAPI *pLoadLibraryShim)(LPCWSTR, LPCWSTR, LPVOID, HMODULE *); + /* check if test is being filtered out */ static BOOL test_filtered_out( LPCSTR module, LPCSTR testname ) { @@ -494,6 +498,8 @@ extract_test_proc (HMODULE hModule, LPCTSTR lpszType, { const char *tempdir = (const char *)lParam; char dllname[MAX_PATH]; + char filename[MAX_PATH]; + WCHAR dllnameW[MAX_PATH]; HMODULE dll; DWORD err; @@ -505,15 +511,21 @@ extract_test_proc (HMODULE hModule, LPCTSTR lpszType, *strstr(dllname, testexe) = 0; dll = LoadLibraryExA(dllname, NULL, LOAD_LIBRARY_AS_DATAFILE); + if (!dll && pLoadLibraryShim) + { + MultiByteToWideChar(CP_ACP, 0, dllname, -1, dllnameW, MAX_PATH); + if (FAILED( pLoadLibraryShim(dllnameW, NULL, NULL, &dll) )) dll = 0; + } if (!dll) { xprintf (" %s=dll is missing\n", dllname); return TRUE; } + GetModuleFileNameA(dll, filename, MAX_PATH); FreeLibrary(dll); if (!(err = get_subtests( tempdir, &wine_tests[nr_of_files], lpszName ))) { - xprintf (" %s=%s\n", dllname, get_file_version(dllname)); + xprintf (" %s=%s\n", dllname, get_file_version(filename)); nr_of_tests += wine_tests[nr_of_files].subtest_count; nr_of_files++; } @@ -614,6 +626,12 @@ run_tests (char *logname) GetLastError ()); wine_tests = xmalloc (nr_of_files * sizeof wine_tests[0]); + /* Do this only once during extraction (and version checking) */ + hmscoree = LoadLibraryA("mscoree.dll"); + pLoadLibraryShim = NULL; + if (hmscoree) + pLoadLibraryShim = (void *)GetProcAddress(hmscoree, "LoadLibraryShim"); + report (R_STATUS, "Extracting tests"); report (R_PROGRESS, 0, nr_of_files); nr_of_files = 0; @@ -623,6 +641,8 @@ run_tests (char *logname) report (R_FATAL, "Can't enumerate test files: %d", GetLastError ()); + FreeLibrary(hmscoree); + xprintf ("Test output:\n" ); report (R_DELTA, 0, "Extracting: Done"); diff --git a/programs/winhlp32/winhelp.c b/programs/winhlp32/winhelp.c index 15e17f66e71..7a9e093e5d7 100644 --- a/programs/winhlp32/winhelp.c +++ b/programs/winhlp32/winhelp.c @@ -274,7 +274,7 @@ HLPFILE_WINDOWINFO* WINHELP_GetWindowInfo(HLPFILE* hlpfile, LPCSTR name) { strcpy(mwi.type, "primary"); strcpy(mwi.name, "main"); - if (!LoadString(Globals.hInstance, STID_WINE_HELP, + if (hlpfile && !LoadString(Globals.hInstance, STID_WINE_HELP, mwi.caption, sizeof(mwi.caption))) strcpy(mwi.caption, hlpfile->lpszTitle); mwi.origin.x = mwi.origin.y = mwi.size.cx = mwi.size.cy = CW_USEDEFAULT; diff --git a/tools/widl/header.c b/tools/widl/header.c index 4403ebc34db..b669ae2e7b5 100644 --- a/tools/widl/header.c +++ b/tools/widl/header.c @@ -990,7 +990,7 @@ static void write_rpc_interface_start(FILE *header, const type_t *iface) if (!allocate_written) { allocate_written = 1; - fprintf(header, "void * __RPC_USER MIDL_user_allocate(size_t);\n"); + fprintf(header, "void * __RPC_USER MIDL_user_allocate(SIZE_T);\n"); fprintf(header, "void __RPC_USER MIDL_user_free(void *);\n\n"); } diff --git a/tools/winebuild/build.h b/tools/winebuild/build.h index 0ee7bde0836..d9df1cee951 100644 --- a/tools/winebuild/build.h +++ b/tools/winebuild/build.h @@ -119,6 +119,7 @@ enum target_platform PLATFORM_UNSPECIFIED, PLATFORM_APPLE, PLATFORM_SOLARIS, PLATFORM_WINDOWS }; +extern char *target_alias; extern enum target_cpu target_cpu; extern enum target_platform target_platform; @@ -168,6 +169,9 @@ extern void warning( const char *msg, ... ) __attribute__ ((__format__ (__printf__, 1, 2))); extern int output( const char *format, ... ) __attribute__ ((__format__ (__printf__, 1, 2))); +extern const char *get_as_command(void); +extern const char *get_ld_command(void); +extern const char *get_nm_command(void); extern char *get_temp_file_name( const char *prefix, const char *suffix ); extern void output_standard_file_header(void); extern FILE *open_input_file( const char *srcdir, const char *name ); diff --git a/tools/winebuild/import.c b/tools/winebuild/import.c index dca18abefe5..bd56a00bdd0 100644 --- a/tools/winebuild/import.c +++ b/tools/winebuild/import.c @@ -527,21 +527,21 @@ static char *create_undef_symbols_file( DLLSPEC *spec ) static const char *ldcombine_files( DLLSPEC *spec, char **argv ) { unsigned int i, len = 0; + const char *prog = get_ld_command(); char *cmd, *p, *ld_tmp_file, *undef_file; int err; undef_file = create_undef_symbols_file( spec ); len += strlen(undef_file) + 1; ld_tmp_file = get_temp_file_name( output_file_name, ".o" ); - if (!ld_command) ld_command = xstrdup("ld"); for (i = 0; argv[i]; i++) len += strlen(argv[i]) + 1; - cmd = p = xmalloc( len + strlen(ld_tmp_file) + 8 + strlen(ld_command) ); - p += sprintf( cmd, "%s -r -o %s %s", ld_command, ld_tmp_file, undef_file ); + cmd = p = xmalloc( len + strlen(ld_tmp_file) + 8 + strlen(prog) ); + p += sprintf( cmd, "%s -r -o %s %s", prog, ld_tmp_file, undef_file ); for (i = 0; argv[i]; i++) p += sprintf( p, " %s", argv[i] ); if (verbose) fprintf( stderr, "%s\n", cmd ); err = system( cmd ); - if (err) fatal_error( "%s -r failed with status %d\n", ld_command, err ); + if (err) fatal_error( "%s -r failed with status %d\n", prog, err ); free( cmd ); return ld_tmp_file; } @@ -551,6 +551,7 @@ void read_undef_symbols( DLLSPEC *spec, char **argv ) { size_t prefix_len; FILE *f; + const char *prog = get_nm_command(); char *cmd, buffer[1024], name_prefix[16]; int err; const char *name; @@ -564,9 +565,8 @@ void read_undef_symbols( DLLSPEC *spec, char **argv ) name = ldcombine_files( spec, argv ); - if (!nm_command) nm_command = xstrdup("nm"); - cmd = xmalloc( strlen(nm_command) + strlen(name) + 5 ); - sprintf( cmd, "%s -u %s", nm_command, name ); + cmd = xmalloc( strlen(prog) + strlen(name) + 5 ); + sprintf( cmd, "%s -u %s", prog, name ); if (!(f = popen( cmd, "r" ))) fatal_error( "Cannot execute '%s'\n", cmd ); diff --git a/tools/winebuild/main.c b/tools/winebuild/main.c index 126b9992323..47cb266d906 100644 --- a/tools/winebuild/main.c +++ b/tools/winebuild/main.c @@ -74,6 +74,7 @@ enum target_platform target_platform = PLATFORM_WINDOWS; enum target_platform target_platform = PLATFORM_UNSPECIFIED; #endif +char *target_alias = NULL; char **lib_path = NULL; char *input_file_name = NULL; @@ -162,6 +163,8 @@ static void set_target( const char *target ) /* target specification is in the form CPU-MANUFACTURER-OS or CPU-MANUFACTURER-KERNEL-OS */ + target_alias = xstrdup( target ); + /* get the CPU part */ if (!(p = strchr( spec, '-' ))) fatal_error( "Invalid target specification '%s'\n", target ); @@ -184,25 +187,6 @@ static void set_target( const char *target ) } free( spec ); - - if (!as_command) - { - as_command = xmalloc( strlen(target) + sizeof("-as") ); - strcpy( as_command, target ); - strcat( as_command, "-as" ); - } - if (!ld_command) - { - ld_command = xmalloc( strlen(target) + sizeof("-ld") ); - strcpy( ld_command, target ); - strcat( ld_command, "-ld" ); - } - if (!nm_command) - { - nm_command = xmalloc( strlen(target) + sizeof("-nm") ); - strcpy( nm_command, target ); - strcat( nm_command, "-nm" ); - } } /* cleanup on program exit */ diff --git a/tools/winebuild/utils.c b/tools/winebuild/utils.c index 39162fa6fa9..b5ac1b915ca 100644 --- a/tools/winebuild/utils.c +++ b/tools/winebuild/utils.c @@ -193,6 +193,130 @@ int output( const char *format, ... ) return ret; } +/* find a build tool in the path, trying the various names */ +char *find_tool( const char * const *names ) +{ + static char **dirs; + static unsigned int count, maxlen; + + char *p, *file; + unsigned int i, len; + struct stat st; + + if (!dirs) + { + char *path; + + /* split the path in directories */ + + if (!getenv( "PATH" )) return NULL; + path = xstrdup( getenv( "PATH" )); + for (p = path, count = 2; *p; p++) if (*p == ':') count++; + dirs = xmalloc( count * sizeof(*dirs) ); + count = 0; + dirs[count++] = p = path; + while (*p) + { + while (*p && *p != ':') p++; + if (!*p) break; + *p++ = 0; + dirs[count++] = p; + } + for (i = 0; i < count; i++) maxlen = max( maxlen, strlen(dirs[i])+2 ); + } + + while (*names) + { + len = strlen(*names) + 1; + file = xmalloc( maxlen + len ); + + for (i = 0; i < count; i++) + { + strcpy( file, dirs[i] ); + p = file + strlen(file); + if (p == file) *p++ = '.'; + if (p[-1] != '/') *p++ = '/'; + strcpy( p, *names ); + + if (!stat( file, &st ) && S_ISREG(st.st_mode) && (st.st_mode & 0111)) return file; + } + free( file ); + names++; + } + return NULL; +} + +const char *get_as_command(void) +{ + if (!as_command) + { + if (target_alias) + { + as_command = xmalloc( strlen(target_alias) + sizeof("-as") ); + strcpy( as_command, target_alias ); + strcat( as_command, "-as" ); + } + else + { + static const char * const commands[] = { "gas", "as", NULL }; + if (!(as_command = find_tool( commands ))) as_command = xstrdup("as"); + } + + if (force_pointer_size) + { + const char *args = (force_pointer_size == 8) ? " --64" : " --32"; + as_command = xrealloc( as_command, strlen(as_command) + strlen(args) + 1 ); + strcat( as_command, args ); + } + } + return as_command; +} + +const char *get_ld_command(void) +{ + if (!ld_command) + { + if (target_alias) + { + ld_command = xmalloc( strlen(target_alias) + sizeof("-ld") ); + strcpy( ld_command, target_alias ); + strcat( ld_command, "-ld" ); + } + else + { + static const char * const commands[] = { "ld", "gld", NULL }; + if (!(ld_command = find_tool( commands ))) ld_command = xstrdup("ld"); + } + + if (force_pointer_size) + { + const char *args = (force_pointer_size == 8) ? " -m elf_x86_64" : " -m elf_i386"; + ld_command = xrealloc( ld_command, strlen(ld_command) + strlen(args) + 1 ); + strcat( ld_command, args ); + } + } + return ld_command; +} + +const char *get_nm_command(void) +{ + if (!nm_command) + { + if (target_alias) + { + nm_command = xmalloc( strlen(target_alias) + sizeof("-nm") ); + strcpy( nm_command, target_alias ); + strcat( nm_command, "-nm" ); + } + else + { + static const char * const commands[] = { "nm", "gnm", NULL }; + if (!(nm_command = find_tool( commands ))) nm_command = xstrdup("nm"); + } + } + return nm_command; +} + /* get a name for a temp file, automatically cleaned up on exit */ char *get_temp_file_name( const char *prefix, const char *suffix ) { @@ -315,15 +439,15 @@ int remove_stdcall_decoration( char *name ) */ void assemble_file( const char *src_file, const char *obj_file ) { + const char *prog = get_as_command(); char *cmd; int err; - if (!as_command) as_command = xstrdup("as"); - cmd = xmalloc( strlen(as_command) + strlen(obj_file) + strlen(src_file) + 6 ); - sprintf( cmd, "%s -o %s %s", as_command, obj_file, src_file ); + cmd = xmalloc( strlen(prog) + strlen(obj_file) + strlen(src_file) + 6 ); + sprintf( cmd, "%s -o %s %s", prog, obj_file, src_file ); if (verbose) fprintf( stderr, "%s\n", cmd ); err = system( cmd ); - if (err) fatal_error( "%s failed with status %d\n", as_command, err ); + if (err) fatal_error( "%s failed with status %d\n", prog, err ); free( cmd ); } diff --git a/tools/winegcc/utils.c b/tools/winegcc/utils.c index f30a8c32807..743f2e06c9e 100644 --- a/tools/winegcc/utils.c +++ b/tools/winegcc/utils.c @@ -66,6 +66,13 @@ void *xrealloc(void* p, size_t size) return p2; } +char *xstrdup( const char *str ) +{ + char *res = strdup( str ); + if (!res) error("Virtual memory exhausted.\n"); + return res; +} + int strendswith(const char* str, const char* end) { int l = strlen(str); diff --git a/tools/winegcc/utils.h b/tools/winegcc/utils.h index 4c8fec31173..a48bbf038c0 100644 --- a/tools/winegcc/utils.h +++ b/tools/winegcc/utils.h @@ -35,6 +35,7 @@ void error(const char* s, ...) DECLSPEC_NORETURN; void* xmalloc(size_t size); void* xrealloc(void* p, size_t size); +char *xstrdup( const char *str ); char* strmake(const char* fmt, ...); int strendswith(const char* str, const char* end); diff --git a/tools/winegcc/winegcc.c b/tools/winegcc/winegcc.c index 40dacf8fdde..b288ed02932 100644 --- a/tools/winegcc/winegcc.c +++ b/tools/winegcc/winegcc.c @@ -88,6 +88,7 @@ #include "config.h" #include "wine/port.h" +#include #include #include #include @@ -144,9 +145,53 @@ static sigset_t signal_mask; enum processor { proc_cc, proc_cxx, proc_cpp, proc_as }; -struct options +enum target_cpu +{ + CPU_x86, CPU_x86_64, CPU_SPARC, CPU_ALPHA, CPU_POWERPC +}; + +enum target_platform +{ + PLATFORM_UNSPECIFIED, PLATFORM_APPLE, PLATFORM_SOLARIS, PLATFORM_WINDOWS +}; + +static const struct +{ + const char *name; + enum target_cpu cpu; +} cpu_names[] = +{ + { "i386", CPU_x86 }, + { "i486", CPU_x86 }, + { "i586", CPU_x86 }, + { "i686", CPU_x86 }, + { "i786", CPU_x86 }, + { "x86_64", CPU_x86_64 }, + { "sparc", CPU_SPARC }, + { "alpha", CPU_ALPHA }, + { "powerpc", CPU_POWERPC } +}; + +static const struct +{ + const char *name; + enum target_platform platform; +} platform_names[] = +{ + { "macos", PLATFORM_APPLE }, + { "darwin", PLATFORM_APPLE }, + { "solaris", PLATFORM_SOLARIS }, + { "mingw32", PLATFORM_WINDOWS }, + { "windows", PLATFORM_WINDOWS }, + { "winnt", PLATFORM_WINDOWS } +}; + +struct options { enum processor processor; + enum target_cpu target_cpu; + enum target_platform target_platform; + const char *target; int shared; int use_msvcrt; int nostdinc; @@ -157,6 +202,7 @@ struct options int gui_app; int unicode_app; int compile_only; + int force_pointer_size; const char* wine_objdir; const char* output_name; const char* image_base; @@ -169,6 +215,30 @@ struct options strarray* files; }; +#ifdef __i386__ +static const enum target_cpu build_cpu = CPU_x86; +#elif defined(__x86_64__) +static const enum target_cpu build_cpu = CPU_x86_64; +#elif defined(__sparc__) +static const enum target_cpu build_cpu = CPU_SPARC; +#elif defined(__ALPHA__) +static const enum target_cpu build_cpu = CPU_ALPHA; +#elif defined(__powerpc__) +static const enum target_cpu build_cpu = CPU_POWERPC; +#else +#error Unsupported CPU +#endif + +#ifdef __APPLE__ +static enum target_platform build_platform = PLATFORM_APPLE; +#elif defined(__sun) +static enum target_platform build_platform = PLATFORM_SOLARIS; +#elif defined(_WINDOWS) +static enum target_platform build_platform = PLATFORM_WINDOWS; +#else +static enum target_platform build_platform = PLATFORM_UNSPECIFIED; +#endif + static void clean_temp_files(void) { unsigned int i; @@ -212,29 +282,20 @@ static char* get_temp_file(const char* prefix, const char* suffix) return tmp; } -static const strarray* get_translator(enum processor processor) +static const strarray* get_translator(struct options *opts) { - static strarray* cpp = 0; - static strarray* as = 0; - static strarray* cc = 0; - static strarray* cxx = 0; + const char *str; - switch(processor) + switch(opts->processor) { - case proc_cpp: - if (!cpp) cpp = strarray_fromstring(CPP, " "); - return cpp; - case proc_cc: - if (!cc) cc = strarray_fromstring(CC, " "); - return cc; - case proc_cxx: - if (!cxx) cxx = strarray_fromstring(CXX, " "); - return cxx; - case proc_as: - if (!as) as = strarray_fromstring(AS, " "); - return as; + case proc_cpp: str = CPP; break; + case proc_cc: str = CC; break; + case proc_cxx: str = CXX; break; + case proc_as: str = AS; break; + default: assert(0); } - error("Unknown processor\n"); + if (opts->target) str = strmake( "%s-%s", opts->target, str ); + return strarray_fromstring( str, " " ); } static void compile(struct options* opts, const char* lang) @@ -243,68 +304,72 @@ static void compile(struct options* opts, const char* lang) unsigned int j; int gcc_defs = 0; + strarray_addall(comp_args, get_translator(opts)); switch(opts->processor) { - case proc_cpp: gcc_defs = 1; break; -#ifdef __GNUC__ + case proc_cpp: gcc_defs = 1; break; + case proc_as: gcc_defs = 0; break; /* Note: if the C compiler is gcc we assume the C++ compiler is too */ /* mixing different C and C++ compilers isn't supported in configure anyway */ - case proc_cc: gcc_defs = 1; break; - case proc_cxx: gcc_defs = 1; break; -#else - case proc_cc: gcc_defs = 0; break; - case proc_cxx: gcc_defs = 0; break; -#endif - case proc_as: gcc_defs = 0; break; + case proc_cc: + case proc_cxx: + gcc_defs = strendswith(comp_args->base[0], "gcc") || strendswith(comp_args->base[0], "g++"); + break; } - strarray_addall(comp_args, get_translator(opts->processor)); + + if (opts->target_platform == PLATFORM_WINDOWS) goto no_compat_defines; if (opts->processor != proc_cpp) { -#ifdef CC_FLAG_SHORT_WCHAR - if (!opts->wine_objdir && !opts->noshortwchar) + if (gcc_defs && !opts->wine_objdir && !opts->noshortwchar) { - strarray_add(comp_args, CC_FLAG_SHORT_WCHAR); + strarray_add(comp_args, "-fshort-wchar"); strarray_add(comp_args, "-DWINE_UNICODE_NATIVE"); } -#endif strarray_addall(comp_args, strarray_fromstring(DLLFLAGS, " ")); } -#ifdef _WIN64 - strarray_add(comp_args, "-DWIN64"); - strarray_add(comp_args, "-D_WIN64"); - strarray_add(comp_args, "-D__WIN64"); - strarray_add(comp_args, "-D__WIN64__"); -#else + if (opts->target_cpu == CPU_x86_64) + { + strarray_add(comp_args, "-DWIN64"); + strarray_add(comp_args, "-D_WIN64"); + strarray_add(comp_args, "-D__WIN64"); + strarray_add(comp_args, "-D__WIN64__"); + } + strarray_add(comp_args, "-DWIN32"); strarray_add(comp_args, "-D_WIN32"); strarray_add(comp_args, "-D__WIN32"); strarray_add(comp_args, "-D__WIN32__"); -#endif strarray_add(comp_args, "-D__WINNT"); strarray_add(comp_args, "-D__WINNT__"); if (gcc_defs) { -#ifdef __x86_64__ - strarray_add(comp_args, "-D__stdcall=__attribute__((ms_abi))"); - strarray_add(comp_args, "-D__cdecl=__attribute__((ms_abi))"); - strarray_add(comp_args, "-D_stdcall=__attribute__((ms_abi))"); - strarray_add(comp_args, "-D_cdecl=__attribute__((ms_abi))"); - strarray_add(comp_args, "-D__fastcall=__attribute__((ms_abi))"); - strarray_add(comp_args, "-D_fastcall=__attribute__((ms_abi))"); -#elif defined(__APPLE__) /* Mac OS X uses a 16-byte aligned stack and not a 4-byte one */ - strarray_add(comp_args, "-D__stdcall=__attribute__((__stdcall__)) __attribute__((__force_align_arg_pointer__))"); - strarray_add(comp_args, "-D__cdecl=__attribute__((__cdecl__)) __attribute__((__force_align_arg_pointer__))"); - strarray_add(comp_args, "-D_stdcall=__attribute__((__stdcall__)) __attribute__((__force_align_arg_pointer__))"); - strarray_add(comp_args, "-D_cdecl=__attribute__((__cdecl__)) __attribute__((__force_align_arg_pointer__))"); -#else - strarray_add(comp_args, "-D__stdcall=__attribute__((__stdcall__))"); - strarray_add(comp_args, "-D__cdecl=__attribute__((__cdecl__))"); - strarray_add(comp_args, "-D_stdcall=__attribute__((__stdcall__))"); - strarray_add(comp_args, "-D_cdecl=__attribute__((__cdecl__))"); -#endif + if (opts->target_cpu == CPU_x86_64) + { + strarray_add(comp_args, "-D__stdcall=__attribute__((ms_abi))"); + strarray_add(comp_args, "-D__cdecl=__attribute__((ms_abi))"); + strarray_add(comp_args, "-D_stdcall=__attribute__((ms_abi))"); + strarray_add(comp_args, "-D_cdecl=__attribute__((ms_abi))"); + strarray_add(comp_args, "-D__fastcall=__attribute__((ms_abi))"); + strarray_add(comp_args, "-D_fastcall=__attribute__((ms_abi))"); + } + else if (opts->target_platform == PLATFORM_APPLE) + { + /* Mac OS X uses a 16-byte aligned stack and not a 4-byte one */ + strarray_add(comp_args, "-D__stdcall=__attribute__((__stdcall__)) __attribute__((__force_align_arg_pointer__))"); + strarray_add(comp_args, "-D__cdecl=__attribute__((__cdecl__)) __attribute__((__force_align_arg_pointer__))"); + strarray_add(comp_args, "-D_stdcall=__attribute__((__stdcall__)) __attribute__((__force_align_arg_pointer__))"); + strarray_add(comp_args, "-D_cdecl=__attribute__((__cdecl__)) __attribute__((__force_align_arg_pointer__))"); + } + else + { + strarray_add(comp_args, "-D__stdcall=__attribute__((__stdcall__))"); + strarray_add(comp_args, "-D__cdecl=__attribute__((__cdecl__))"); + strarray_add(comp_args, "-D_stdcall=__attribute__((__stdcall__))"); + strarray_add(comp_args, "-D_cdecl=__attribute__((__cdecl__))"); + } strarray_add(comp_args, "-D__fastcall=__attribute__((__fastcall__))"); strarray_add(comp_args, "-D_fastcall=__attribute__((__fastcall__))"); @@ -323,15 +388,16 @@ static void compile(struct options* opts, const char* lang) strarray_add(comp_args, "-D__declspec_thread=__thread"); } - /* Wine specific defines */ - strarray_add(comp_args, "-D__WINE__"); strarray_add(comp_args, "-D__int8=char"); strarray_add(comp_args, "-D__int16=short"); - /* FIXME: what about 64-bit platforms? */ strarray_add(comp_args, "-D__int32=int"); -#ifdef HAVE_LONG_LONG - strarray_add(comp_args, "-D__int64=long long"); -#endif + if (opts->target_cpu == CPU_x86_64) + strarray_add(comp_args, "-D__int64=long"); + else + strarray_add(comp_args, "-D__int64=long long"); + +no_compat_defines: + strarray_add(comp_args, "-D__WINE__"); /* options we handle explicitly */ if (opts->compile_only) @@ -358,21 +424,18 @@ static void compile(struct options* opts, const char* lang) } /* standard includes come last in the include search path */ -#ifdef __GNUC__ -#define SYS_INCLUDE "-isystem" -#else -#define SYS_INCLUDE "-I" -#endif if (!opts->wine_objdir && !opts->nostdinc) { if (opts->use_msvcrt) { - strarray_add(comp_args, SYS_INCLUDE INCLUDEDIR "/msvcrt"); + if (gcc_defs) strarray_add(comp_args, "-isystem" INCLUDEDIR "/msvcrt"); + else strarray_add(comp_args, "-I" INCLUDEDIR "/msvcrt"); strarray_add(comp_args, "-D__MSVCRT__"); } - strarray_add(comp_args, SYS_INCLUDE INCLUDEDIR "/windows"); + strarray_add(comp_args, gcc_defs ? "-isystem" INCLUDEDIR "/windows" : "-I" INCLUDEDIR "/windows" ); } -#undef SYS_INCLUDE + else if (opts->wine_objdir) + strarray_add(comp_args, strmake("-I%s/include", opts->wine_objdir) ); spawn(opts->prefix, comp_args, 0); } @@ -576,6 +639,13 @@ static void build(struct options* opts) strarray_add(spec_args, winebuild); if (verbose) strarray_add(spec_args, "-v"); if (keep_generated) strarray_add(spec_args, "--save-temps"); + if (opts->target) + { + strarray_add(spec_args, "--target"); + strarray_add(spec_args, opts->target); + } + if (opts->force_pointer_size) + strarray_add(spec_args, strmake("-m%u", 8 * opts->force_pointer_size )); strarray_add(spec_args, "--as-cmd"); strarray_add(spec_args, AS); strarray_add(spec_args, "--ld-cmd"); @@ -631,7 +701,7 @@ static void build(struct options* opts) /* link everything together now */ link_args = strarray_alloc(); - strarray_addall(link_args, get_translator(opts->processor)); + strarray_addall(link_args, get_translator(opts)); strarray_addall(link_args, strarray_fromstring(LDDLLFLAGS, " ")); strarray_add(link_args, "-o"); @@ -640,24 +710,28 @@ static void build(struct options* opts) for ( j = 0 ; j < opts->linker_args->size ; j++ ) strarray_add(link_args, opts->linker_args->base[j]); -#ifdef __APPLE__ - if (opts->image_base) - { - strarray_add(link_args, "-image_base"); - strarray_add(link_args, opts->image_base); - } -#endif - -#ifdef __sun + switch (opts->target_platform) { - char *mapfile = get_temp_file( output_name, ".map" ); - const char *align = opts->section_align ? opts->section_align : "0x1000"; + case PLATFORM_APPLE: + if (opts->image_base) + { + strarray_add(link_args, "-image_base"); + strarray_add(link_args, opts->image_base); + } + break; + case PLATFORM_SOLARIS: + { + char *mapfile = get_temp_file( output_name, ".map" ); + const char *align = opts->section_align ? opts->section_align : "0x1000"; - create_file( mapfile, 0644, "text = A%s;\ndata = A%s;\n", align, align ); - strarray_add(link_args, strmake("-Wl,-M,%s", mapfile)); - strarray_add(tmp_files, mapfile); + create_file( mapfile, 0644, "text = A%s;\ndata = A%s;\n", align, align ); + strarray_add(link_args, strmake("-Wl,-M,%s", mapfile)); + strarray_add(tmp_files, mapfile); + } + break; + default: + break; } -#endif for ( j = 0; j < lib_dirs->size; j++ ) strarray_add(link_args, strmake("-L%s", lib_dirs->base[j])); @@ -718,7 +792,7 @@ static void forward(int argc, char **argv, struct options* opts) strarray* args = strarray_alloc(); int j; - strarray_addall(args, get_translator(opts->processor)); + strarray_addall(args, get_translator(opts)); for( j = 1; j < argc; j++ ) strarray_add(args, argv[j]); @@ -801,6 +875,46 @@ static int is_mingw_arg(const char* arg) return 0; } +static void parse_target_option( struct options *opts, const char *target ) +{ + char *p, *platform, *spec = xstrdup( target ); + unsigned int i; + + /* target specification is in the form CPU-MANUFACTURER-OS or CPU-MANUFACTURER-KERNEL-OS */ + + /* get the CPU part */ + + if (!(p = strchr( spec, '-' ))) error( "Invalid target specification '%s'\n", target ); + *p++ = 0; + for (i = 0; i < sizeof(cpu_names)/sizeof(cpu_names[0]); i++) + { + if (!strcmp( cpu_names[i].name, spec )) + { + opts->target_cpu = cpu_names[i].cpu; + break; + } + } + if (i == sizeof(cpu_names)/sizeof(cpu_names[0])) + error( "Unrecognized CPU '%s'\n", spec ); + platform = p; + if ((p = strrchr( p, '-' ))) platform = p + 1; + + /* get the OS part */ + + opts->target_platform = PLATFORM_UNSPECIFIED; /* default value */ + for (i = 0; i < sizeof(platform_names)/sizeof(platform_names[0]); i++) + { + if (!strncmp( platform_names[i].name, platform, strlen(platform_names[i].name) )) + { + opts->target_platform = platform_names[i].platform; + break; + } + } + + free( spec ); + opts->target = xstrdup( target ); +} + int main(int argc, char **argv) { int i, c, next_is_arg = 0, linking = 1; @@ -828,6 +942,8 @@ int main(int argc, char **argv) /* initialize options */ memset(&opts, 0, sizeof(opts)); + opts.target_cpu = build_cpu; + opts.target_platform = build_platform; opts.lib_dirs = strarray_alloc(); opts.files = strarray_alloc(); opts.linker_args = strarray_alloc(); @@ -899,7 +1015,7 @@ int main(int argc, char **argv) raw_linker_arg = 0; if (argv[i][1] == 'c' || argv[i][1] == 'L') raw_compiler_arg = 0; - if (argv[i][1] == 'o') + if (argv[i][1] == 'o' || argv[i][1] == 'b') raw_compiler_arg = raw_linker_arg = 0; /* do a bit of semantic analysis */ @@ -919,6 +1035,9 @@ int main(int argc, char **argv) if (!opts.prefix) opts.prefix = strarray_alloc(); strarray_add(opts.prefix, str); break; + case 'b': + parse_target_option( &opts, option_arg ); + break; case 'c': /* compile or assemble */ if (argv[i][2] == 0) opts.compile_only = 1; /* fall through */ @@ -948,8 +1067,16 @@ int main(int argc, char **argv) opts.gui_app = 0; else if (strcmp("-municode", argv[i]) == 0) opts.unicode_app = 1; - else if (strcmp("-m32", argv[i]) == 0 || strcmp("-m64", argv[i]) == 0) + else if (strcmp("-m32", argv[i]) == 0) + { + opts.force_pointer_size = 4; raw_linker_arg = 1; + } + else if (strcmp("-m64", argv[i]) == 0) + { + opts.force_pointer_size = 8; + raw_linker_arg = 1; + } break; case 'n': if (strcmp("-nostdinc", argv[i]) == 0) diff --git a/tools/wrc/readres.c b/tools/wrc/readres.c index e3a4db74d25..f7aaba80c27 100644 --- a/tools/wrc/readres.c +++ b/tools/wrc/readres.c @@ -292,7 +292,10 @@ static resource_t *read_res32(FILE *fp) usrres = new_user(type, NULL, new_int(memopt)); } else + { + free (type); usrres = NULL; + } rsc = new_resource(res_type, usrres, memopt, -- 2.11.4.GIT