From 7206e1067378230648f7168690d30088cdb80323 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Miko=C5=82aj=20Zalewski?= Date: Mon, 5 Feb 2007 17:53:42 +0100 Subject: [PATCH] browseui: Implement and test ACLMulti. --- .gitignore | 4 + Makefile.in | 2 + configure | 3 +- configure.ac | 1 + dlls/Makefile.in | 1 + dlls/browseui/Makefile.in | 1 + dlls/browseui/aclmulti.c | 331 +++++++++++++++++++++++++++++ dlls/browseui/browseui.h | 28 +++ dlls/browseui/browseui_main.c | 5 + dlls/browseui/regsvr.c | 8 + dlls/browseui/tests/Makefile.in | 14 ++ dlls/browseui/tests/autocomplete.c | 321 ++++++++++++++++++++++++++++ programs/winetest/Makefile.in | 3 + programs/winetest/winetest.rc | 1 + 14 files changed, 722 insertions(+), 1 deletion(-) create mode 100644 dlls/browseui/aclmulti.c create mode 100644 dlls/browseui/browseui.h create mode 100644 dlls/browseui/tests/Makefile.in create mode 100644 dlls/browseui/tests/autocomplete.c diff --git a/.gitignore b/.gitignore index 8b752cd59da..2600d0335e2 100644 --- a/.gitignore +++ b/.gitignore @@ -30,6 +30,9 @@ dlls/avicap32/libavicap32.def dlls/avifil32/libavifil32.def dlls/avifil32/rsrc.res dlls/avifile.dll16 +dlls/browseui/tests/*.ok +dlls/browseui/tests/browseui_crosstest.exe +dlls/browseui/tests/testlist.c dlls/browseui/version.res dlls/cabinet/cabinet.res dlls/cabinet/libcabinet.def @@ -786,6 +789,7 @@ programs/winemine/winemine.ico programs/winepath/winepath programs/winetest/advapi32_test.exe programs/winetest/advpack_test.exe +programs/winetest/browseui_test.exe programs/winetest/cabinet_test.exe programs/winetest/comcat_test.exe programs/winetest/comctl32_test.exe diff --git a/Makefile.in b/Makefile.in index 2c83e544dd2..b555d9e7b78 100644 --- a/Makefile.in +++ b/Makefile.in @@ -165,6 +165,7 @@ ALL_MAKEFILES = \ dlls/avicap32/Makefile \ dlls/avifil32/Makefile \ dlls/browseui/Makefile \ + dlls/browseui/tests/Makefile \ dlls/cabinet/Makefile \ dlls/cabinet/tests/Makefile \ dlls/capi2032/Makefile \ @@ -495,6 +496,7 @@ dlls/atl/Makefile: dlls/atl/Makefile.in dlls/Makedll.rules dlls/avicap32/Makefile: dlls/avicap32/Makefile.in dlls/Makedll.rules dlls/avifil32/Makefile: dlls/avifil32/Makefile.in dlls/Makedll.rules dlls/browseui/Makefile: dlls/browseui/Makefile.in dlls/Makedll.rules +dlls/browseui/tests/Makefile: dlls/browseui/tests/Makefile.in dlls/Maketest.rules dlls/cabinet/Makefile: dlls/cabinet/Makefile.in dlls/Makedll.rules dlls/cabinet/tests/Makefile: dlls/cabinet/tests/Makefile.in dlls/Maketest.rules dlls/capi2032/Makefile: dlls/capi2032/Makefile.in dlls/Makedll.rules diff --git a/configure b/configure index d85a3960d9b..0125b9e40ea 100755 --- a/configure +++ b/configure @@ -20427,7 +20427,7 @@ MAKE_TEST_RULES=dlls/Maketest.rules MAKE_PROG_RULES=programs/Makeprog.rules -ac_config_files="$ac_config_files Make.rules dlls/Makedll.rules dlls/Makeimplib.rules dlls/Maketest.rules programs/Makeprog.rules Makefile dlls/Makefile dlls/activeds/Makefile dlls/advapi32/Makefile dlls/advapi32/tests/Makefile dlls/advpack/Makefile dlls/advpack/tests/Makefile dlls/amstream/Makefile dlls/atl/Makefile dlls/avicap32/Makefile dlls/avifil32/Makefile dlls/browseui/Makefile dlls/cabinet/Makefile dlls/cabinet/tests/Makefile dlls/capi2032/Makefile dlls/cards/Makefile dlls/cfgmgr32/Makefile dlls/clusapi/Makefile dlls/comcat/Makefile dlls/comcat/tests/Makefile dlls/comctl32/Makefile dlls/comctl32/tests/Makefile dlls/comdlg32/Makefile dlls/comdlg32/tests/Makefile dlls/compstui/Makefile dlls/credui/Makefile dlls/crtdll/Makefile dlls/crypt32/Makefile dlls/crypt32/tests/Makefile dlls/cryptdll/Makefile dlls/cryptnet/Makefile dlls/ctl3d32/Makefile dlls/d3d8/Makefile dlls/d3d8/tests/Makefile dlls/d3d9/Makefile dlls/d3d9/tests/Makefile dlls/d3dim/Makefile dlls/d3drm/Makefile dlls/d3dx8/Makefile dlls/d3dxof/Makefile dlls/dbghelp/Makefile dlls/dciman32/Makefile dlls/ddraw/Makefile dlls/ddraw/tests/Makefile dlls/ddrawex/Makefile dlls/devenum/Makefile dlls/dinput/Makefile dlls/dinput/tests/Makefile dlls/dinput8/Makefile dlls/dmband/Makefile dlls/dmcompos/Makefile dlls/dmime/Makefile dlls/dmloader/Makefile dlls/dmscript/Makefile dlls/dmstyle/Makefile dlls/dmsynth/Makefile dlls/dmusic/Makefile dlls/dmusic32/Makefile dlls/dnsapi/Makefile dlls/dnsapi/tests/Makefile dlls/dplay/Makefile dlls/dplayx/Makefile dlls/dpnet/Makefile dlls/dpnhpast/Makefile dlls/dsound/Makefile dlls/dsound/tests/Makefile dlls/dswave/Makefile dlls/dxdiagn/Makefile dlls/dxerr8/Makefile dlls/dxerr9/Makefile dlls/dxguid/Makefile dlls/gdi32/Makefile dlls/gdi32/tests/Makefile dlls/glu32/Makefile dlls/gphoto2.ds/Makefile dlls/hhctrl.ocx/Makefile dlls/hid/Makefile dlls/hlink/Makefile dlls/hlink/tests/Makefile dlls/iccvid/Makefile dlls/icmp/Makefile dlls/ifsmgr.vxd/Makefile dlls/imaadp32.acm/Makefile dlls/imagehlp/Makefile dlls/imm32/Makefile dlls/infosoft/Makefile dlls/infosoft/tests/Makefile dlls/inseng/Makefile dlls/iphlpapi/Makefile dlls/iphlpapi/tests/Makefile dlls/itss/Makefile dlls/itss/tests/Makefile dlls/kernel32/Makefile dlls/kernel32/tests/Makefile dlls/localspl/Makefile dlls/localspl/tests/Makefile dlls/lz32/Makefile dlls/lz32/tests/Makefile dlls/mapi32/Makefile dlls/mapi32/tests/Makefile dlls/mciavi32/Makefile dlls/mcicda/Makefile dlls/mciseq/Makefile dlls/mciwave/Makefile dlls/midimap/Makefile dlls/mlang/Makefile dlls/mlang/tests/Makefile dlls/mmdevldr.vxd/Makefile dlls/monodebg.vxd/Makefile dlls/mpr/Makefile dlls/mprapi/Makefile dlls/msacm32.drv/Makefile dlls/msacm32/Makefile dlls/msacm32/tests/Makefile dlls/msadp32.acm/Makefile dlls/mscms/Makefile dlls/mscms/tests/Makefile dlls/mscoree/Makefile dlls/msdmo/Makefile dlls/msftedit/Makefile dlls/msg711.acm/Makefile dlls/mshtml/Makefile dlls/mshtml/tests/Makefile dlls/msi/Makefile dlls/msi/tests/Makefile dlls/msimg32/Makefile dlls/msisys.ocx/Makefile dlls/msnet32/Makefile dlls/msrle32/Makefile dlls/msvcrt/Makefile dlls/msvcrt/tests/Makefile dlls/msvcrt20/Makefile dlls/msvcrt40/Makefile dlls/msvcrtd/Makefile dlls/msvcrtd/tests/Makefile dlls/msvfw32/Makefile dlls/msvidc32/Makefile dlls/mswsock/Makefile dlls/msxml3/Makefile dlls/msxml3/tests/Makefile dlls/nddeapi/Makefile dlls/netapi32/Makefile dlls/netapi32/tests/Makefile dlls/newdev/Makefile dlls/ntdll/Makefile dlls/ntdll/tests/Makefile dlls/ntdsapi/Makefile dlls/objsel/Makefile dlls/odbc32/Makefile dlls/odbccp32/Makefile dlls/odbccp32/tests/Makefile dlls/ole32/Makefile dlls/ole32/tests/Makefile dlls/oleacc/Makefile dlls/oleaut32/Makefile dlls/oleaut32/tests/Makefile dlls/olecli32/Makefile dlls/oledlg/Makefile dlls/olepro32/Makefile dlls/olesvr32/Makefile dlls/opengl32/Makefile dlls/powrprof/Makefile dlls/psapi/Makefile dlls/psapi/tests/Makefile dlls/pstorec/Makefile dlls/qcap/Makefile dlls/quartz/Makefile dlls/quartz/tests/Makefile dlls/query/Makefile dlls/rasapi32/Makefile dlls/resutils/Makefile dlls/riched20/Makefile dlls/riched20/tests/Makefile dlls/riched32/Makefile dlls/rpcrt4/Makefile dlls/rpcrt4/tests/Makefile dlls/rsabase/Makefile dlls/rsabase/tests/Makefile dlls/rsaenh/Makefile dlls/rsaenh/tests/Makefile dlls/sane.ds/Makefile dlls/secur32/Makefile dlls/secur32/tests/Makefile dlls/security/Makefile dlls/sensapi/Makefile dlls/serialui/Makefile dlls/setupapi/Makefile dlls/setupapi/tests/Makefile dlls/sfc/Makefile dlls/sfc_os/Makefile dlls/shdoclc/Makefile dlls/shdocvw/Makefile dlls/shdocvw/tests/Makefile dlls/shell32/Makefile dlls/shell32/tests/Makefile dlls/shfolder/Makefile dlls/shlwapi/Makefile dlls/shlwapi/tests/Makefile dlls/snmpapi/Makefile dlls/snmpapi/tests/Makefile dlls/spoolss/Makefile dlls/stdole2.tlb/Makefile dlls/stdole32.tlb/Makefile dlls/sti/Makefile dlls/strmiids/Makefile dlls/svrapi/Makefile dlls/tapi32/Makefile dlls/twain_32/Makefile dlls/unicows/Makefile dlls/url/Makefile dlls/urlmon/Makefile dlls/urlmon/tests/Makefile dlls/user32/Makefile dlls/user32/tests/Makefile dlls/userenv/Makefile dlls/usp10/Makefile dlls/usp10/tests/Makefile dlls/uuid/Makefile dlls/uxtheme/Makefile dlls/uxtheme/tests/Makefile dlls/vdhcp.vxd/Makefile dlls/vdmdbg/Makefile dlls/version/Makefile dlls/version/tests/Makefile dlls/vmm.vxd/Makefile dlls/vnbt.vxd/Makefile dlls/vnetbios.vxd/Makefile dlls/vtdapi.vxd/Makefile dlls/vwin32.vxd/Makefile dlls/w32skrnl/Makefile dlls/winealsa.drv/Makefile dlls/winearts.drv/Makefile dlls/wineaudioio.drv/Makefile dlls/winecoreaudio.drv/Makefile dlls/winecrt0/Makefile dlls/wined3d/Makefile dlls/winedos/Makefile dlls/wineesd.drv/Makefile dlls/winejack.drv/Makefile dlls/winejoystick.drv/Makefile dlls/winemp3.acm/Makefile dlls/winenas.drv/Makefile dlls/wineoss.drv/Makefile dlls/wineps.drv/Makefile dlls/winequartz.drv/Makefile dlls/winex11.drv/Makefile dlls/wininet/Makefile dlls/wininet/tests/Makefile dlls/winmm/Makefile dlls/winmm/tests/Makefile dlls/winnls32/Makefile dlls/winspool.drv/Makefile dlls/winspool.drv/tests/Makefile dlls/wintab32/Makefile dlls/wintrust/Makefile dlls/wintrust/tests/Makefile dlls/wldap32/Makefile dlls/wnaspi32/Makefile dlls/wow32/Makefile dlls/ws2_32/Makefile dlls/ws2_32/tests/Makefile dlls/wsock32/Makefile dlls/wtsapi32/Makefile documentation/Makefile fonts/Makefile include/Makefile libs/Makefile libs/port/Makefile libs/wine/Makefile libs/wpp/Makefile loader/Makefile programs/Makefile programs/clock/Makefile programs/cmd/Makefile programs/cmdlgtst/Makefile programs/control/Makefile programs/eject/Makefile programs/expand/Makefile programs/explorer/Makefile programs/hh/Makefile programs/icinfo/Makefile programs/iexplore/Makefile programs/msiexec/Makefile programs/notepad/Makefile programs/oleview/Makefile programs/progman/Makefile programs/regedit/Makefile programs/regsvr32/Makefile programs/rpcss/Makefile programs/rundll32/Makefile programs/start/Makefile programs/taskmgr/Makefile programs/uninstaller/Makefile programs/view/Makefile programs/wineboot/Makefile programs/winebrowser/Makefile programs/winecfg/Makefile programs/wineconsole/Makefile programs/winedbg/Makefile programs/winefile/Makefile programs/winemenubuilder/Makefile programs/winemine/Makefile programs/winepath/Makefile programs/winetest/Makefile programs/winevdm/Makefile programs/winhelp/Makefile programs/winver/Makefile programs/wordpad/Makefile server/Makefile tools/Makefile tools/widl/Makefile tools/winebuild/Makefile tools/winedump/Makefile tools/winegcc/Makefile tools/wmc/Makefile tools/wrc/Makefile" +ac_config_files="$ac_config_files Make.rules dlls/Makedll.rules dlls/Makeimplib.rules dlls/Maketest.rules programs/Makeprog.rules Makefile dlls/Makefile dlls/activeds/Makefile dlls/advapi32/Makefile dlls/advapi32/tests/Makefile dlls/advpack/Makefile dlls/advpack/tests/Makefile dlls/amstream/Makefile dlls/atl/Makefile dlls/avicap32/Makefile dlls/avifil32/Makefile dlls/browseui/Makefile dlls/browseui/tests/Makefile dlls/cabinet/Makefile dlls/cabinet/tests/Makefile dlls/capi2032/Makefile dlls/cards/Makefile dlls/cfgmgr32/Makefile dlls/clusapi/Makefile dlls/comcat/Makefile dlls/comcat/tests/Makefile dlls/comctl32/Makefile dlls/comctl32/tests/Makefile dlls/comdlg32/Makefile dlls/comdlg32/tests/Makefile dlls/compstui/Makefile dlls/credui/Makefile dlls/crtdll/Makefile dlls/crypt32/Makefile dlls/crypt32/tests/Makefile dlls/cryptdll/Makefile dlls/cryptnet/Makefile dlls/ctl3d32/Makefile dlls/d3d8/Makefile dlls/d3d8/tests/Makefile dlls/d3d9/Makefile dlls/d3d9/tests/Makefile dlls/d3dim/Makefile dlls/d3drm/Makefile dlls/d3dx8/Makefile dlls/d3dxof/Makefile dlls/dbghelp/Makefile dlls/dciman32/Makefile dlls/ddraw/Makefile dlls/ddraw/tests/Makefile dlls/ddrawex/Makefile dlls/devenum/Makefile dlls/dinput/Makefile dlls/dinput/tests/Makefile dlls/dinput8/Makefile dlls/dmband/Makefile dlls/dmcompos/Makefile dlls/dmime/Makefile dlls/dmloader/Makefile dlls/dmscript/Makefile dlls/dmstyle/Makefile dlls/dmsynth/Makefile dlls/dmusic/Makefile dlls/dmusic32/Makefile dlls/dnsapi/Makefile dlls/dnsapi/tests/Makefile dlls/dplay/Makefile dlls/dplayx/Makefile dlls/dpnet/Makefile dlls/dpnhpast/Makefile dlls/dsound/Makefile dlls/dsound/tests/Makefile dlls/dswave/Makefile dlls/dxdiagn/Makefile dlls/dxerr8/Makefile dlls/dxerr9/Makefile dlls/dxguid/Makefile dlls/gdi32/Makefile dlls/gdi32/tests/Makefile dlls/glu32/Makefile dlls/gphoto2.ds/Makefile dlls/hhctrl.ocx/Makefile dlls/hid/Makefile dlls/hlink/Makefile dlls/hlink/tests/Makefile dlls/iccvid/Makefile dlls/icmp/Makefile dlls/ifsmgr.vxd/Makefile dlls/imaadp32.acm/Makefile dlls/imagehlp/Makefile dlls/imm32/Makefile dlls/infosoft/Makefile dlls/infosoft/tests/Makefile dlls/inseng/Makefile dlls/iphlpapi/Makefile dlls/iphlpapi/tests/Makefile dlls/itss/Makefile dlls/itss/tests/Makefile dlls/kernel32/Makefile dlls/kernel32/tests/Makefile dlls/localspl/Makefile dlls/localspl/tests/Makefile dlls/lz32/Makefile dlls/lz32/tests/Makefile dlls/mapi32/Makefile dlls/mapi32/tests/Makefile dlls/mciavi32/Makefile dlls/mcicda/Makefile dlls/mciseq/Makefile dlls/mciwave/Makefile dlls/midimap/Makefile dlls/mlang/Makefile dlls/mlang/tests/Makefile dlls/mmdevldr.vxd/Makefile dlls/monodebg.vxd/Makefile dlls/mpr/Makefile dlls/mprapi/Makefile dlls/msacm32.drv/Makefile dlls/msacm32/Makefile dlls/msacm32/tests/Makefile dlls/msadp32.acm/Makefile dlls/mscms/Makefile dlls/mscms/tests/Makefile dlls/mscoree/Makefile dlls/msdmo/Makefile dlls/msftedit/Makefile dlls/msg711.acm/Makefile dlls/mshtml/Makefile dlls/mshtml/tests/Makefile dlls/msi/Makefile dlls/msi/tests/Makefile dlls/msimg32/Makefile dlls/msisys.ocx/Makefile dlls/msnet32/Makefile dlls/msrle32/Makefile dlls/msvcrt/Makefile dlls/msvcrt/tests/Makefile dlls/msvcrt20/Makefile dlls/msvcrt40/Makefile dlls/msvcrtd/Makefile dlls/msvcrtd/tests/Makefile dlls/msvfw32/Makefile dlls/msvidc32/Makefile dlls/mswsock/Makefile dlls/msxml3/Makefile dlls/msxml3/tests/Makefile dlls/nddeapi/Makefile dlls/netapi32/Makefile dlls/netapi32/tests/Makefile dlls/newdev/Makefile dlls/ntdll/Makefile dlls/ntdll/tests/Makefile dlls/ntdsapi/Makefile dlls/objsel/Makefile dlls/odbc32/Makefile dlls/odbccp32/Makefile dlls/odbccp32/tests/Makefile dlls/ole32/Makefile dlls/ole32/tests/Makefile dlls/oleacc/Makefile dlls/oleaut32/Makefile dlls/oleaut32/tests/Makefile dlls/olecli32/Makefile dlls/oledlg/Makefile dlls/olepro32/Makefile dlls/olesvr32/Makefile dlls/opengl32/Makefile dlls/powrprof/Makefile dlls/psapi/Makefile dlls/psapi/tests/Makefile dlls/pstorec/Makefile dlls/qcap/Makefile dlls/quartz/Makefile dlls/quartz/tests/Makefile dlls/query/Makefile dlls/rasapi32/Makefile dlls/resutils/Makefile dlls/riched20/Makefile dlls/riched20/tests/Makefile dlls/riched32/Makefile dlls/rpcrt4/Makefile dlls/rpcrt4/tests/Makefile dlls/rsabase/Makefile dlls/rsabase/tests/Makefile dlls/rsaenh/Makefile dlls/rsaenh/tests/Makefile dlls/sane.ds/Makefile dlls/secur32/Makefile dlls/secur32/tests/Makefile dlls/security/Makefile dlls/sensapi/Makefile dlls/serialui/Makefile dlls/setupapi/Makefile dlls/setupapi/tests/Makefile dlls/sfc/Makefile dlls/sfc_os/Makefile dlls/shdoclc/Makefile dlls/shdocvw/Makefile dlls/shdocvw/tests/Makefile dlls/shell32/Makefile dlls/shell32/tests/Makefile dlls/shfolder/Makefile dlls/shlwapi/Makefile dlls/shlwapi/tests/Makefile dlls/snmpapi/Makefile dlls/snmpapi/tests/Makefile dlls/spoolss/Makefile dlls/stdole2.tlb/Makefile dlls/stdole32.tlb/Makefile dlls/sti/Makefile dlls/strmiids/Makefile dlls/svrapi/Makefile dlls/tapi32/Makefile dlls/twain_32/Makefile dlls/unicows/Makefile dlls/url/Makefile dlls/urlmon/Makefile dlls/urlmon/tests/Makefile dlls/user32/Makefile dlls/user32/tests/Makefile dlls/userenv/Makefile dlls/usp10/Makefile dlls/usp10/tests/Makefile dlls/uuid/Makefile dlls/uxtheme/Makefile dlls/uxtheme/tests/Makefile dlls/vdhcp.vxd/Makefile dlls/vdmdbg/Makefile dlls/version/Makefile dlls/version/tests/Makefile dlls/vmm.vxd/Makefile dlls/vnbt.vxd/Makefile dlls/vnetbios.vxd/Makefile dlls/vtdapi.vxd/Makefile dlls/vwin32.vxd/Makefile dlls/w32skrnl/Makefile dlls/winealsa.drv/Makefile dlls/winearts.drv/Makefile dlls/wineaudioio.drv/Makefile dlls/winecoreaudio.drv/Makefile dlls/winecrt0/Makefile dlls/wined3d/Makefile dlls/winedos/Makefile dlls/wineesd.drv/Makefile dlls/winejack.drv/Makefile dlls/winejoystick.drv/Makefile dlls/winemp3.acm/Makefile dlls/winenas.drv/Makefile dlls/wineoss.drv/Makefile dlls/wineps.drv/Makefile dlls/winequartz.drv/Makefile dlls/winex11.drv/Makefile dlls/wininet/Makefile dlls/wininet/tests/Makefile dlls/winmm/Makefile dlls/winmm/tests/Makefile dlls/winnls32/Makefile dlls/winspool.drv/Makefile dlls/winspool.drv/tests/Makefile dlls/wintab32/Makefile dlls/wintrust/Makefile dlls/wintrust/tests/Makefile dlls/wldap32/Makefile dlls/wnaspi32/Makefile dlls/wow32/Makefile dlls/ws2_32/Makefile dlls/ws2_32/tests/Makefile dlls/wsock32/Makefile dlls/wtsapi32/Makefile documentation/Makefile fonts/Makefile include/Makefile libs/Makefile libs/port/Makefile libs/wine/Makefile libs/wpp/Makefile loader/Makefile programs/Makefile programs/clock/Makefile programs/cmd/Makefile programs/cmdlgtst/Makefile programs/control/Makefile programs/eject/Makefile programs/expand/Makefile programs/explorer/Makefile programs/hh/Makefile programs/icinfo/Makefile programs/iexplore/Makefile programs/msiexec/Makefile programs/notepad/Makefile programs/oleview/Makefile programs/progman/Makefile programs/regedit/Makefile programs/regsvr32/Makefile programs/rpcss/Makefile programs/rundll32/Makefile programs/start/Makefile programs/taskmgr/Makefile programs/uninstaller/Makefile programs/view/Makefile programs/wineboot/Makefile programs/winebrowser/Makefile programs/winecfg/Makefile programs/wineconsole/Makefile programs/winedbg/Makefile programs/winefile/Makefile programs/winemenubuilder/Makefile programs/winemine/Makefile programs/winepath/Makefile programs/winetest/Makefile programs/winevdm/Makefile programs/winhelp/Makefile programs/winver/Makefile programs/wordpad/Makefile server/Makefile tools/Makefile tools/widl/Makefile tools/winebuild/Makefile tools/winedump/Makefile tools/winegcc/Makefile tools/wmc/Makefile tools/wrc/Makefile" cat >confcache <<\_ACEOF @@ -21012,6 +21012,7 @@ do "dlls/avicap32/Makefile") CONFIG_FILES="$CONFIG_FILES dlls/avicap32/Makefile" ;; "dlls/avifil32/Makefile") CONFIG_FILES="$CONFIG_FILES dlls/avifil32/Makefile" ;; "dlls/browseui/Makefile") CONFIG_FILES="$CONFIG_FILES dlls/browseui/Makefile" ;; + "dlls/browseui/tests/Makefile") CONFIG_FILES="$CONFIG_FILES dlls/browseui/tests/Makefile" ;; "dlls/cabinet/Makefile") CONFIG_FILES="$CONFIG_FILES dlls/cabinet/Makefile" ;; "dlls/cabinet/tests/Makefile") CONFIG_FILES="$CONFIG_FILES dlls/cabinet/tests/Makefile" ;; "dlls/capi2032/Makefile") CONFIG_FILES="$CONFIG_FILES dlls/capi2032/Makefile" ;; diff --git a/configure.ac b/configure.ac index 1e0297d3497..1f98f160794 100644 --- a/configure.ac +++ b/configure.ac @@ -1536,6 +1536,7 @@ dlls/atl/Makefile dlls/avicap32/Makefile dlls/avifil32/Makefile dlls/browseui/Makefile +dlls/browseui/tests/Makefile dlls/cabinet/Makefile dlls/cabinet/tests/Makefile dlls/capi2032/Makefile diff --git a/dlls/Makefile.in b/dlls/Makefile.in index bc708dcb7cf..a528ea9f818 100644 --- a/dlls/Makefile.in +++ b/dlls/Makefile.in @@ -221,6 +221,7 @@ IMPLIBSUBDIRS = \ TESTSUBDIRS = \ advapi32/tests \ advpack/tests \ + browseui/tests \ cabinet/tests \ comcat/tests \ comctl32/tests \ diff --git a/dlls/browseui/Makefile.in b/dlls/browseui/Makefile.in index f8374fb5cfc..9b97ff9f0ba 100644 --- a/dlls/browseui/Makefile.in +++ b/dlls/browseui/Makefile.in @@ -8,6 +8,7 @@ EXTRALIBS = -luuid EXTRADEFS = -DCOM_NO_WINDOWS_H C_SRCS = \ + aclmulti.c \ browseui_main.c \ regsvr.c diff --git a/dlls/browseui/aclmulti.c b/dlls/browseui/aclmulti.c new file mode 100644 index 00000000000..380d71b1499 --- /dev/null +++ b/dlls/browseui/aclmulti.c @@ -0,0 +1,331 @@ +/* + * Multisource AutoComplete list + * + * Copyright 2007 Mikolaj Zalewski + * + * 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 "shlguid.h" +#include "shlobj.h" + +#include "wine/unicode.h" + +#include "browseui.h" + +WINE_DEFAULT_DEBUG_CHANNEL(browseui); + +struct ACLMultiSublist { + IUnknown *punk; + IEnumString *pEnum; + IACList *pACL; +}; + +typedef struct tagACLMulti { + const IEnumStringVtbl *vtbl; + const IACListVtbl *aclVtbl; + const IObjMgrVtbl *objmgrVtbl; + LONG refCount; + INT nObjs; + INT currObj; + struct ACLMultiSublist *objs; +} ACLMulti; + +const static IEnumStringVtbl ACLMultiVtbl; +const static IACListVtbl ACLMulti_ACListVtbl; +const static IObjMgrVtbl ACLMulti_ObjMgrVtbl; + +static inline ACLMulti *impl_from_IACList(IACList *iface) +{ + return (ACLMulti *)((char *)iface - FIELD_OFFSET(ACLMulti, aclVtbl)); +} + +static inline ACLMulti *impl_from_IObjMgr(IObjMgr *iface) +{ + return (ACLMulti *)((char *)iface - FIELD_OFFSET(ACLMulti, objmgrVtbl)); +} + +static void release_obj(struct ACLMultiSublist *obj) +{ + IUnknown_Release(obj->punk); + if (obj->pEnum) + IEnumString_Release(obj->pEnum); + if (obj->pACL) + IACList_Release(obj->pACL); +} + +HRESULT WINAPI ACLMulti_Constructor(IUnknown *pUnkOuter, IUnknown **ppOut) +{ + ACLMulti *This; + if (pUnkOuter) + return CLASS_E_NOAGGREGATION; + + This = CoTaskMemAlloc(sizeof(ACLMulti)); + if (This == NULL) + return E_OUTOFMEMORY; + ZeroMemory(This, sizeof(*This)); + This->vtbl = &ACLMultiVtbl; + This->aclVtbl = &ACLMulti_ACListVtbl; + This->objmgrVtbl = &ACLMulti_ObjMgrVtbl; + This->refCount = 1; + + TRACE("returning %p\n", This); + *ppOut = (IUnknown *)This; + BROWSEUI_refCount++; + return S_OK; +} + +static void WINAPI ACLMulti_Destructor(ACLMulti *This) +{ + int i; + TRACE("destroying %p\n", This); + for (i = 0; i < This->nObjs; i++) + release_obj(&This->objs[i]); + CoTaskMemFree(This->objs); + CoTaskMemFree(This); + BROWSEUI_refCount--; +} + +static HRESULT WINAPI ACLMulti_QueryInterface(IEnumString *iface, REFIID iid, LPVOID *ppvOut) +{ + ACLMulti *This = (ACLMulti *)iface; + *ppvOut = NULL; + + if (IsEqualIID(iid, &IID_IUnknown) || IsEqualIID(iid, &IID_IEnumString)) + { + *ppvOut = This; + } + else if (IsEqualIID(iid, &IID_IACList)) + { + *ppvOut = &This->aclVtbl; + } + else if (IsEqualIID(iid, &IID_IObjMgr)) + { + *ppvOut = &This->objmgrVtbl; + } + + if (*ppvOut) + { + IUnknown_AddRef(iface); + return S_OK; + } + + WARN("unsupported interface: %s\n", debugstr_guid(iid)); + return E_NOINTERFACE; +} + +static ULONG WINAPI ACLMulti_AddRef(IEnumString *iface) +{ + ACLMulti *This = (ACLMulti *)iface; + return InterlockedIncrement(&This->refCount); +} + +static ULONG WINAPI ACLMulti_Release(IEnumString *iface) +{ + ACLMulti *This = (ACLMulti *)iface; + ULONG ret; + + ret = InterlockedDecrement(&This->refCount); + if (ret == 0) + ACLMulti_Destructor(This); + return ret; +} + +static HRESULT WINAPI ACLMulti_Append(IObjMgr *iface, IUnknown *obj) +{ + ACLMulti *This = impl_from_IObjMgr(iface); + + TRACE("(%p, %p)\n", This, obj); + if (obj == NULL) + return E_FAIL; + + This->objs = CoTaskMemRealloc(This->objs, sizeof(This->objs[0]) * (This->nObjs+1)); + This->objs[This->nObjs].punk = obj; + IUnknown_AddRef(obj); + if (FAILED(IUnknown_QueryInterface(obj, &IID_IEnumString, (LPVOID *)&This->objs[This->nObjs].pEnum))) + This->objs[This->nObjs].pEnum = NULL; + if (FAILED(IUnknown_QueryInterface(obj, &IID_IACList, (LPVOID *)&This->objs[This->nObjs].pACL))) + This->objs[This->nObjs].pACL = NULL; + This->nObjs++; + return S_OK; +} + +static HRESULT WINAPI ACLMulti_Remove(IObjMgr *iface, IUnknown *obj) +{ + ACLMulti *This = impl_from_IObjMgr(iface); + int i; + + TRACE("(%p, %p)\n", This, obj); + for (i = 0; i < This->nObjs; i++) + if (This->objs[i].punk == obj) + { + release_obj(&This->objs[i]); + memmove(&This->objs[i], &This->objs[i+1], (This->nObjs-i-1)*sizeof(struct ACLMultiSublist)); + This->nObjs--; + This->objs = CoTaskMemRealloc(This->objs, sizeof(This->objs[0]) * This->nObjs); + return S_OK; + } + + return E_FAIL; +} + +static HRESULT WINAPI ACLMulti_Next(IEnumString *iface, ULONG celt, LPOLESTR *rgelt, ULONG *pceltFetched) +{ + ACLMulti *This = (ACLMulti *)iface; + + TRACE("(%p, %d, %p, %p)\n", iface, celt, rgelt, pceltFetched); + while (This->currObj < This->nObjs) + { + if (This->objs[This->currObj].pEnum) + { + /* native browseui 6.0 also returns only one element */ + HRESULT ret = IEnumString_Next(This->objs[This->currObj].pEnum, 1, rgelt, pceltFetched); + if (ret != S_FALSE) + return ret; + } + This->currObj++; + } + + if (pceltFetched) + *pceltFetched = 0; + *rgelt = NULL; + return S_FALSE; +} + +static HRESULT WINAPI ACLMulti_Reset(IEnumString *iface) +{ + ACLMulti *This = (ACLMulti *)iface; + int i; + + This->currObj = 0; + for (i = 0; i < This->nObjs; i++) + { + if (This->objs[i].pEnum) + IEnumString_Reset(This->objs[i].pEnum); + } + return S_OK; +} + +static HRESULT WINAPI ACLMulti_Skip(IEnumString *iface, ULONG celt) +{ + /* native browseui 6.0 returns this: */ + return E_NOTIMPL; +} + +static HRESULT WINAPI ACLMulti_Clone(IEnumString *iface, IEnumString **ppOut) +{ + *ppOut = NULL; + /* native browseui 6.0 returns this: */ + return E_OUTOFMEMORY; +} + +static HRESULT WINAPI ACLMulti_Expand(IACList *iface, LPCWSTR wstr) +{ + ACLMulti *This = impl_from_IACList(iface); + HRESULT res = S_OK; + int i; + + for (i = 0; i < This->nObjs; i++) + { + if (!This->objs[i].pACL) + continue; + res = IACList_Expand(This->objs[i].pACL, wstr); + if (res == S_OK) + break; + } + return res; +} + +static const IEnumStringVtbl ACLMultiVtbl = +{ + ACLMulti_QueryInterface, + ACLMulti_AddRef, + ACLMulti_Release, + + ACLMulti_Next, + ACLMulti_Skip, + ACLMulti_Reset, + ACLMulti_Clone +}; + +static HRESULT WINAPI ACLMulti_IObjMgr_QueryInterface(IObjMgr *iface, REFIID iid, LPVOID *ppvOut) +{ + ACLMulti *This = impl_from_IObjMgr(iface); + return ACLMulti_QueryInterface((IEnumString *)This, iid, ppvOut); +} + +static ULONG WINAPI ACLMulti_IObjMgr_AddRef(IObjMgr *iface) +{ + ACLMulti *This = impl_from_IObjMgr(iface); + return ACLMulti_AddRef((IEnumString *)This); +} + +static ULONG WINAPI ACLMulti_IObjMgr_Release(IObjMgr *iface) +{ + ACLMulti *This = impl_from_IObjMgr(iface); + return ACLMulti_Release((IEnumString *)This); +} + +static const IObjMgrVtbl ACLMulti_ObjMgrVtbl = +{ + ACLMulti_IObjMgr_QueryInterface, + ACLMulti_IObjMgr_AddRef, + ACLMulti_IObjMgr_Release, + + ACLMulti_Append, + ACLMulti_Remove +}; + +static HRESULT WINAPI ACLMulti_IACList_QueryInterface(IACList *iface, REFIID iid, LPVOID *ppvOut) +{ + ACLMulti *This = impl_from_IACList(iface); + return ACLMulti_QueryInterface((IEnumString *)This, iid, ppvOut); +} + +static ULONG WINAPI ACLMulti_IACList_AddRef(IACList *iface) +{ + ACLMulti *This = impl_from_IACList(iface); + return ACLMulti_AddRef((IEnumString *)This); +} + +static ULONG WINAPI ACLMulti_IACList_Release(IACList *iface) +{ + ACLMulti *This = impl_from_IACList(iface); + return ACLMulti_Release((IEnumString *)This); +} + +static const IACListVtbl ACLMulti_ACListVtbl = +{ + ACLMulti_IACList_QueryInterface, + ACLMulti_IACList_AddRef, + ACLMulti_IACList_Release, + + ACLMulti_Expand +}; diff --git a/dlls/browseui/browseui.h b/dlls/browseui/browseui.h new file mode 100644 index 00000000000..2f44ac74914 --- /dev/null +++ b/dlls/browseui/browseui.h @@ -0,0 +1,28 @@ +/* + * Internal header for browseui.dll + * + * Copyright 2007 Mikolaj Zalewski + * + * 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 + */ + +#ifndef __WINE_BROWSEUI_H +#define __WINE_BROWSEUI_H + +extern LONG BROWSEUI_refCount; + +HRESULT WINAPI ACLMulti_Constructor(IUnknown *punkOuter, IUnknown **ppOut); + +#endif /* __WINE_SHDOCVW_H */ diff --git a/dlls/browseui/browseui_main.c b/dlls/browseui/browseui_main.c index 6c55943e3a9..27965547300 100644 --- a/dlls/browseui/browseui_main.c +++ b/dlls/browseui/browseui_main.c @@ -31,9 +31,12 @@ #include "winbase.h" #include "winreg.h" #include "shlwapi.h" +#include "shlguid.h" #include "initguid.h" +#include "browseui.h" + WINE_DEFAULT_DEBUG_CHANNEL(browseui); LONG BROWSEUI_refCount = 0; @@ -46,6 +49,7 @@ static const struct { REFCLSID clsid; LPFNCONSTRUCTOR ctor; } ClassesTable[] = { + {&CLSID_ACLMulti, ACLMulti_Constructor}, {NULL, NULL} }; @@ -194,5 +198,6 @@ HRESULT WINAPI DllGetClassObject(REFCLSID clsid, REFIID iid, LPVOID *ppvOut) if (IsEqualCLSID(ClassesTable[i].clsid, clsid)) { return ClassFactory_Constructor(ClassesTable[i].ctor, ppvOut); } + FIXME("CLSID %s not supported\n", debugstr_guid(clsid)); return CLASS_E_CLASSNOTAVAILABLE; } diff --git a/dlls/browseui/regsvr.c b/dlls/browseui/regsvr.c index 23c6d464c7e..34a434e51c8 100644 --- a/dlls/browseui/regsvr.c +++ b/dlls/browseui/regsvr.c @@ -29,6 +29,7 @@ #include "winerror.h" #include "ole2.h" +#include "shlguid.h" #include "wine/debug.h" @@ -502,6 +503,13 @@ static LONG recursive_delete_keyW(HKEY base, WCHAR const *name) * coclass list */ static struct regsvr_coclass const coclass_list[] = { + { + &CLSID_ACLMulti, + "Multiple AutoComplete List Container", + NULL, + "browseui.dll", + "Apartment" + }, { NULL } /* list terminator */ }; diff --git a/dlls/browseui/tests/Makefile.in b/dlls/browseui/tests/Makefile.in new file mode 100644 index 00000000000..1267aaa26aa --- /dev/null +++ b/dlls/browseui/tests/Makefile.in @@ -0,0 +1,14 @@ +TOPSRCDIR = @top_srcdir@ +TOPOBJDIR = ../../.. +SRCDIR = @srcdir@ +VPATH = @srcdir@ +TESTDLL = browseui.dll +IMPORTS = ole32 user32 kernel32 +EXTRALIBS = -luuid + +CTESTS = \ + autocomplete.c + +@MAKE_TEST_RULES@ + +@DEPENDENCIES@ # everything below this line is overwritten by make depend diff --git a/dlls/browseui/tests/autocomplete.c b/dlls/browseui/tests/autocomplete.c new file mode 100644 index 00000000000..63e444be6a2 --- /dev/null +++ b/dlls/browseui/tests/autocomplete.c @@ -0,0 +1,321 @@ +/* Unit tests for autocomplete + * + * Copyright 2007 Mikolaj Zalewski + * + * 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 +#include + +#include +#include +#include + +#include "wine/test.h" + +#define stop_on_error(exp) \ +{ \ + HRESULT res = (exp); \ + if (FAILED(res)) \ + { \ + ok(FALSE, #exp " failed: %x\n", res); \ + return; \ + } \ +} + +#define ole_ok(exp) \ +{ \ + HRESULT res = (exp); \ + if (res != S_OK) \ + ok(FALSE, #exp " failed: %x\n", res); \ +} + +LPWSTR strdup_AtoW(LPCSTR str) +{ + int size = MultiByteToWideChar(CP_ACP, 0, str, -1, NULL, 0); + LPWSTR wstr = (LPWSTR)CoTaskMemAlloc((size + 1)*sizeof(WCHAR)); + MultiByteToWideChar(CP_ACP, 0, str, -1, wstr, size+1); + return wstr; +} + +typedef struct +{ + IEnumStringVtbl *vtbl; + IACListVtbl *aclVtbl; + LONG ref; + HRESULT expret; + INT expcount; + INT pos; + INT limit; + const char **data; +} TestACL; + +extern IEnumStringVtbl TestACLVtbl; +extern IACListVtbl TestACL_ACListVtbl; + +TestACL *impl_from_IACList(IACList *iface) +{ + return (TestACL *)((char *)iface - FIELD_OFFSET(TestACL, aclVtbl)); +} + +TestACL *TestACL_Constructor(int limit, const char **strings) +{ + TestACL *This = CoTaskMemAlloc(sizeof(TestACL)); + ZeroMemory(This, sizeof(*This)); + This->vtbl = &TestACLVtbl; + This->aclVtbl = &TestACL_ACListVtbl; + This->ref = 1; + This->expret = S_OK; + This->limit = limit; + This->data = strings; + return This; +} + +ULONG STDMETHODCALLTYPE TestACL_AddRef(IEnumString *iface) +{ + TestACL *This = (TestACL *)iface; + trace("ACL(%p): addref (%d)\n", This, This->ref+1); + return InterlockedIncrement(&This->ref); +} + +ULONG STDMETHODCALLTYPE TestACL_Release(IEnumString *iface) +{ + TestACL *This = (TestACL *)iface; + ULONG res; + + res = InterlockedDecrement(&This->ref); + trace("ACL(%p): release (%d)\n", This, res); + return res; +} + +HRESULT STDMETHODCALLTYPE TestACL_QueryInterface(IEnumString *iface, REFIID iid, LPVOID *ppvOut) +{ + TestACL *This = (TestACL *)iface; + *ppvOut = NULL; + if (IsEqualGUID(iid, &IID_IUnknown) || IsEqualGUID(iid, &IID_IEnumString)) + { + *ppvOut = iface; + } + else if (IsEqualGUID(iid, &IID_IACList)) + { + *ppvOut = &This->aclVtbl; + } + + if (*ppvOut) + { + iface->lpVtbl->AddRef(iface); + return S_OK; + } + +#if 0 /* IID_IEnumACString not defined yet in wine */ + if (!IsEqualGUID(iid, &IID_IEnumACString)) + trace("unknown interface queried\n"); +#endif + return E_NOINTERFACE; +} + +HRESULT STDMETHODCALLTYPE TestACL_Next(IEnumString *iface, ULONG celt, LPOLESTR *rgelt, ULONG *pceltFetched) +{ + TestACL *This = (TestACL *)iface; + ULONG i; + + trace("ACL(%p): read %d item(s)\n", This, celt); + for (i = 0; i < celt; i++) + { + if (This->pos >= This->limit) + break; + rgelt[i] = strdup_AtoW(This->data[This->pos]); + This->pos++; + } + + if (pceltFetched) + *pceltFetched = i; + if (i == celt) + return S_OK; + return S_FALSE; +} + +HRESULT STDMETHODCALLTYPE TestACL_Skip(IEnumString *iface, ULONG celt) +{ + ok(FALSE, "Unexpected call to TestACL_Skip\n"); + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE TestACL_Clone(IEnumString *iface, IEnumString **out) +{ + ok(FALSE, "Unexpected call to TestACL_Clone\n"); + return E_OUTOFMEMORY; +} + +HRESULT STDMETHODCALLTYPE TestACL_Reset(IEnumString *iface) +{ + TestACL *This = (TestACL *)iface; + trace("ACL(%p): Reset\n", This); + This->pos = 0; + return S_OK; +} + +HRESULT STDMETHODCALLTYPE TestACL_Expand(IACList *iface, LPCOLESTR str) +{ + TestACL *This = impl_from_IACList(iface); + trace("ACL(%p): Expand\n", impl_from_IACList(iface)); + This->expcount++; + return This->expret; +} + +IEnumStringVtbl TestACLVtbl = +{ + TestACL_QueryInterface, + TestACL_AddRef, + TestACL_Release, + + TestACL_Next, + TestACL_Skip, + TestACL_Reset, + TestACL_Clone +}; + +ULONG STDMETHODCALLTYPE TestACL_ACList_AddRef(IACList *iface) +{ + return TestACL_AddRef((IEnumString *)impl_from_IACList(iface)); +} + +ULONG STDMETHODCALLTYPE TestACL_ACList_Release(IACList *iface) +{ + return TestACL_Release((IEnumString *)impl_from_IACList(iface)); +} + +HRESULT STDMETHODCALLTYPE TestACL_ACList_QueryInterface(IACList *iface, REFIID iid, LPVOID *ppvout) +{ + return TestACL_QueryInterface((IEnumString *)impl_from_IACList(iface), iid, ppvout); +} + +IACListVtbl TestACL_ACListVtbl = +{ + TestACL_ACList_QueryInterface, + TestACL_ACList_AddRef, + TestACL_ACList_Release, + + TestACL_Expand +}; + +#define expect_str(obj, str) \ +{ \ + ole_ok(obj->lpVtbl->Next(obj, 1, &wstr, &i)); \ + ok(i == 1, "Expected i == 1, got %d\n", i); \ + ok(str[0] == wstr[0], "String mismatch\n"); \ +} + +#define expect_end(obj) \ + ok(obj->lpVtbl->Next(obj, 1, &wstr, &i) == S_FALSE, "Unexpected return from Next\n"); + +void test_ACLMulti() +{ + const char *strings1[] = {"a", "c", "e"}; + const char *strings2[] = {"a", "b", "d"}; + WCHAR exp[] = {'A','B','C',0}; + IEnumString *obj; + TestACL *acl1, *acl2; + IACList *acl; + IObjMgr *mgr; + LPWSTR wstr; + LPWSTR wstrtab[15]; + LPVOID tmp; + UINT i; + + stop_on_error(CoCreateInstance(&CLSID_ACLMulti, NULL, CLSCTX_INPROC, &IID_IEnumString, (LPVOID *)&obj)); + stop_on_error(obj->lpVtbl->QueryInterface(obj, &IID_IACList, (LPVOID *)&acl)); + ok(obj->lpVtbl->QueryInterface(obj, &IID_IACList2, &tmp) == E_NOINTERFACE, + "Unexpected interface IACList2 in ACLMulti\n"); + stop_on_error(obj->lpVtbl->QueryInterface(obj, &IID_IObjMgr, (LPVOID *)&mgr)); +#if 0 /* IID_IEnumACString not defined yet in wine */ + ole_ok(obj->lpVtbl->QueryInterface(obj, &IID_IEnumACString, &unk)); + if (unk != NULL) + unk->lpVtbl->Release(unk); +#endif + + ok(obj->lpVtbl->Next(obj, 1, (LPOLESTR *)&tmp, &i) == S_FALSE, "Unexpected return from Next\n"); + ok(i == 0, "Unexpected fetched value %d\n", i); + ok(obj->lpVtbl->Next(obj, 44, (LPOLESTR *)&tmp, &i) == S_FALSE, "Unexpected return from Next\n"); + ok(obj->lpVtbl->Skip(obj, 1) == E_NOTIMPL, "Unexpected return from Skip\n"); + ok(obj->lpVtbl->Clone(obj, (IEnumString **)&tmp) == E_OUTOFMEMORY, "Unexpected return from Clone\n"); + ole_ok(acl->lpVtbl->Expand(acl, exp)); + + acl1 = TestACL_Constructor(3, strings1); + acl2 = TestACL_Constructor(3, strings2); + stop_on_error(mgr->lpVtbl->Append(mgr, (IUnknown *)acl1)); + stop_on_error(mgr->lpVtbl->Append(mgr, (IUnknown *)acl2)); + ok(mgr->lpVtbl->Append(mgr, NULL) == E_FAIL, "Unexpected return from Append\n"); + expect_str(obj, "a"); + expect_str(obj, "c"); + expect_str(obj, "e"); + expect_str(obj, "a"); + expect_str(obj, "b"); + expect_str(obj, "d"); + expect_end(obj); + + ole_ok(obj->lpVtbl->Reset(obj)); + ok(acl1->pos == 0, "acl1 not reset\n"); + ok(acl2->pos == 0, "acl2 not reset\n"); + + ole_ok(acl->lpVtbl->Expand(acl, exp)); + ok(acl1->expcount == 1, "expcount - expected 1, got %d\n", acl1->expcount); + ok(acl2->expcount == 0, "expcount - expected 0, got %d\n", acl2->expcount); + + ole_ok(obj->lpVtbl->Next(obj, 15, wstrtab, &i)); + ok(i == 1, "Expected i == 1, got %d\n", i); + ole_ok(obj->lpVtbl->Next(obj, 15, wstrtab, &i)); + ole_ok(obj->lpVtbl->Next(obj, 15, wstrtab, &i)); + ole_ok(obj->lpVtbl->Next(obj, 15, wstrtab, &i)); + ole_ok(acl->lpVtbl->Expand(acl, exp)); + ok(acl1->expcount == 2, "expcount - expected 1, got %d", acl1->expcount); + ok(acl2->expcount == 0, "expcount - expected 0, got %d", acl2->expcount); + acl1->expret = S_FALSE; + ole_ok(acl->lpVtbl->Expand(acl, exp)); + ok(acl1->expcount == 3, "expcount - expected 1, got %d", acl1->expcount); + ok(acl2->expcount == 1, "expcount - expected 0, got %d", acl2->expcount); + acl1->expret = E_NOTIMPL; + ole_ok(acl->lpVtbl->Expand(acl, exp)); + ok(acl1->expcount == 4, "expcount - expected 1, got %d", acl1->expcount); + ok(acl2->expcount == 2, "expcount - expected 0, got %d", acl2->expcount); + acl2->expret = E_OUTOFMEMORY; + ok(acl->lpVtbl->Expand(acl, exp) == E_OUTOFMEMORY, "Unexpected Expand return\n"); + acl2->expret = E_FAIL; + ok(acl->lpVtbl->Expand(acl, exp) == E_FAIL, "Unexpected Expand return\n"); + + ok(mgr->lpVtbl->Remove(mgr, (IUnknown *)0xdeadbeef) == E_FAIL, "Unexpected Remove return\n"); + stop_on_error(mgr->lpVtbl->Remove(mgr, (IUnknown *)acl1)); + ok(acl1->ref == 1, "acl1 not released\n"); + expect_end(obj); + obj->lpVtbl->Reset(obj); + expect_str(obj, "a"); + expect_str(obj, "b"); + expect_str(obj, "d"); + expect_end(obj); + + obj->lpVtbl->Release(obj); + acl->lpVtbl->Release(acl); + ok(mgr->lpVtbl->Release(mgr) == 0, "Unexpected references\n"); + ok(acl1->ref == 1, "acl1 not released\n"); + ok(acl2->ref == 1, "acl2 not released\n"); +} + +START_TEST(autocomplete) +{ + CoInitialize(NULL); + test_ACLMulti(); + CoUninitialize(); +} diff --git a/programs/winetest/Makefile.in b/programs/winetest/Makefile.in index 8ebff15ecfd..b4ab982d0a4 100644 --- a/programs/winetest/Makefile.in +++ b/programs/winetest/Makefile.in @@ -25,6 +25,7 @@ RC_BINARIES = wine.ico TESTBINS = \ advapi32_test.exe \ advpack_test.exe \ + browseui_test.exe \ cabinet_test.exe \ comcat_test.exe \ comctl32_test.exe \ @@ -85,6 +86,8 @@ advapi32_test.exe: $(DLLDIR)/advapi32/tests/advapi32_test.exe$(DLLEXT) cp $(DLLDIR)/advapi32/tests/advapi32_test.exe$(DLLEXT) $@ && $(STRIP) $@ advpack_test.exe: $(DLLDIR)/advpack/tests/advpack_test.exe$(DLLEXT) cp $(DLLDIR)/advpack/tests/advpack_test.exe$(DLLEXT) $@ && $(STRIP) $@ +browseui_test.exe: $(DLLDIR)/browseui/tests/browseui_test.exe$(DLLEXT) + cp $(DLLDIR)/browseui/tests/browseui_test.exe$(DLLEXT) $@ && $(STRIP) $@ cabinet_test.exe: $(DLLDIR)/cabinet/tests/cabinet_test.exe$(DLLEXT) cp $(DLLDIR)/cabinet/tests/cabinet_test.exe$(DLLEXT) $@ && $(STRIP) $@ comcat_test.exe: $(DLLDIR)/comcat/tests/comcat_test.exe$(DLLEXT) diff --git a/programs/winetest/winetest.rc b/programs/winetest/winetest.rc index 6d1a296f1f0..db1c87ea699 100644 --- a/programs/winetest/winetest.rc +++ b/programs/winetest/winetest.rc @@ -148,6 +148,7 @@ IDI_WINE ICON "wine.ico" advapi32_test.exe TESTRES "advapi32_test.exe" advpack_test.exe TESTRES "advpack_test.exe" +browseui_test.exe TESTRES "browseui_test.exe" cabinet_test.exe TESTRES "cabinet_test.exe" comcat_test.exe TESTRES "comcat_test.exe" comctl32_test.exe TESTRES "comctl32_test.exe"